Amazon Redshift 中的基础设施安全性
作为一项托管式服务,Amazon Redshift 受 AWS 全球网络安全保护。有关 AWS 安全服务以及 AWS 如何保护基础设施的信息,请参阅 AWS 云安全
您可以使用 AWS 发布的 API 调用通过网络访问 Amazon Redshift。客户端必须支持以下内容:
-
传输层安全性协议 (TLS) 我们要求使用 TLS 1.2,建议使用 TLS 1.3。
-
具有完全向前保密 (PFS) 的密码套件,例如 DHE(临时 Diffie-Hellman)或 ECDHE(临时椭圆曲线 Diffie-Hellman)。大多数现代系统(如 Java 7 及更高版本)都支持这些模式。
此外,必须使用访问密钥 ID 和与 IAM 主体关联的秘密访问密钥来对请求进行签名。或者,您可以使用 AWS Security Token Service(AWS STS)生成临时安全凭证来对请求进行签名。
网络隔离
基于 Amazon VPC 服务的 Virtual Private Cloud (VPC) 是您在AWS云中的逻辑上隔离的私有网络。可以通过执行以下步骤,在 VPC 中部署 Amazon Redshift 集群或 Redshift Serverless 组:
-
在 AWS 区域中创建 VPC。有关更多信息,请参阅 Amazon VPC 用户指南中的什么是 Amazon VPC?。
-
创建两个或更多私有 VPC 子网。有关更多信息,请参阅 Amazon VPC 用户指南中的 VPC 和子网。
-
部署 Amazon Redshift 集群或 Redshift Serverless 工作组。有关更多信息,请参阅Redshift 资源的子网或工作组和命名空间。
预设情况下,Amazon Redshift 集群在预置时被锁定。要允许来自 Amazon Redshift 客户端的入站网络流量,请将 VPC 安全组与 Amazon Redshift 集群相关联。有关更多信息,请参阅 Redshift 资源的子网。
要仅允许来往于特定 IP 地址范围的流量,请使用 VPC 更新安全组。例如,仅允许来自或流入公司网络的流量。
在配置与您的 Amazon Redshift 集群标记的子网关联的网络访问控制列表时,请确保将相应的 AWS 区域的 S3 CIDR 范围添加到入口和出口规则的允许列表中。这样做可以让您在没有任何中断的情况下执行基于 S3 的操作,如 Redshift Spectrum、COPY 和 UNLOAD。
以下示例命令解析了 us-east-1 区域内的 Amazon S3 中使用的所有 IPv4 地址的 JSON 响应。
curl https://ip-ranges.amazonaws.com/ip-ranges.json | jq -r '.prefixes[] | select(.region=="us-east-1") | select(.service=="S3") | .ip_prefix' 54.231.0.0/17 52.92.16.0/20 52.216.0.0/15
有关如何获取特定区域的 S3 IP 范围的说明,请参阅 AWS IP 地址范围。
Amazon Redshift 支持将集群部署到专用租赁 VPC 中。有关更多信息,请参阅 Amazon EC2 用户指南中的专用实例。
Amazon Redshift 安全组
在您预置 Amazon Redshift 集群时,它默认处于锁定状态,因此任何人都无法访问。要为其他用户授予针对 Amazon Redshift 集群的入站访问权限,您可以将该集群与安全组关联起来。如果您处于 EC2-VPC 平台上,您可以使用现有的 Amazon VPC 安全组或者定义一个新的安全组,然后将其与集群关联。有关在 EC2-VPC 平台上管理集群的更多信息,请参阅VPC 中的 Redshift 资源。
接口 VPC 端点
可以使用虚拟私有云(VPC)中的接口 VPC 端点(AWS PrivateLink)直接连接到 Amazon Redshift 和 Amazon Redshift Serverless API 服务,而不是通过互联网进行连接。有关 Amazon Redshift API 操作的信息,请参阅 Amazon Redshift API 参考中的操作。有关 Redshift Serverless API 操作的信息,请参阅《Amazon Redshift Serverless API 参考》中的 Actions。有关 AWS PrivateLink 的更多信息,请参阅 Amazon VPC 用户指南中的接口 VPC 终端节点 (AWS PrivateLink)。请注意,与集群或工作区的 JDBC/ODBC 连接不是 Amazon Redshift API 服务的一部分。
使用接口 VPC 端点时,VPC 和 Amazon Redshift 或 Redshift Serverless 之间的通信完全在 AWS 网络内进行,从而可以提供更好的安全性。每个 VPC 终端节点都由您的 VPC 子网中一个或多个使用私有 IP 地址的弹性网络接口代表。有关弹性网络接口的更多信息,请参阅《Amazon EC2 用户指南》中的弹性网络接口。
一个接口 VPC 终端节点将您的 VPC 直接连接到 Amazon Redshift。它不使用互联网网关、网络地址转换 (NAT) 设备、虚拟专用网络 (VPN) 连接或 AWS Direct Connect 连接。VPC 中的实例不需要公有 IP 地址便可与 Amazon Redshift API 进行通信。
要在 VPC 中使用 Amazon Redshift 或 Redshift Serverless,您有两种选择。一种是从 VPC 内的实例进行连接。另一种方法是将您的私有网络连接到您的 VPC,方法是使用 AWS VPN 选项或 AWS Direct Connect。有关 AWS VPN 选项的更多信息,请参阅 Amazon VPC 用户指南中的 VPN 连接。有关 AWS Direct Connect 的信息,请参阅 AWS Direct Connect 用户指南中的创建连接。
您可以创建接口 VPC 终端节点以使用 AWS Management Console 或 AWS Command Line Interface (AWS CLI) 命令连接到 Amazon Redshift。有关更多信息,请参阅创建接口端点。
在创建接口 VPC 终端节点后,您可以为端点启用私有 DNS 主机名。当您启用时,默认端点如下所示:
-
Amazon Redshift 预置:
https://redshift.
.amazonaws.com.rproxy.goskope.comRegion
-
Amazon Redshift Serverless:
https://redshift-serverless.
.amazonaws.com.rproxy.goskope.comRegion
如果您不启用私有 DNS 主机名,Amazon VPC 将提供一个您可以使用的 DNS 端点名称,格式如下。
-
Amazon Redshift 预置:
VPC_endpoint_ID
.redshift.Region
.vpce.amazonaws.com -
Amazon Redshift Serverless:
VPC_endpoint_ID
.redshift-serverless.Region
.vpce.amazonaws.com
有关更多信息,请参阅《Amazon VPC 用户指南》中的接口 VPC 端点 (AWS PrivateLink)。
Amazon Redshift 和 Redshift Serverless 支持在 VPC 内调用所有 Amazon Redshift API operations 和 Redshift Serverless API operations。
您可以将 VPC 终端节点策略附加到 VPC 终端节点,以控制 AWS Identity and Access Management (IAM) 委托人的访问权限。您还可以将安全组与 VPC 终端节点关联,以便根据网络流量的源和目标控制入站和出站访问。示例为 IP 地址的范围。有关更多信息,请参阅《Amazon VPC 用户指南》中的使用 VPC 端点控制对服务的访问权限。
Amazon Redshift 的 VPC 端点策略
您可以为 Amazon Redshift 的 VPC 终端节点创建一个策略,在该策略中指定以下内容:
-
可以或不能执行操作的委托人
-
可执行的操作
-
可对其执行操作的资源
有关更多信息,请参阅《Amazon VPC 用户指南》中的使用 VPC 端点控制对服务的访问权限。
接下来,您可以查找 VPC 终端节点策略示例。
Amazon Redshift 预置端点策略示例
接下来,可以查找适用于 Amazon Redshift 预置的 VPC 端点策略示例。
示例:用于拒绝来自指定 AWS 账户的所有访问的 VPC 终端节点策略
以下 VPC 终端节点策略会拒绝 AWS 账户
使用此端点访问资源的所有权限。123456789012
{ "Statement": [ { "Action": "*", "Effect": "Allow", "Resource": "*", "Principal": "*" }, { "Action": "*", "Effect": "Deny", "Resource": "*", "Principal": { "AWS": [ "123456789012" ] } } ] }
示例:仅向指定的 IAM 角色授予 VPC 访问权限的 VPC 端点策略
以下 VPC 端点策略仅向 AWS 账户 123456789012
中的 IAM 角色
授予完全访问权限。使用终端节点拒绝所有其它 IAM 委托人进行访问。redshiftrole
{ "Statement": [ { "Action": "*", "Effect": "Allow", "Resource": "*", "Principal": { "AWS": [ "arn:aws:iam::123456789012:role/redshiftrole" ] } }] }
这只是一个示例。在大多数应用场景中,我们建议附加特定操作的权限,以缩小权限范围。
示例:仅允许 VPC 访问指定的 IAM 委托人(用户)的 VPC 终端节点策略
以下 VPC 终端节点策略仅允许对 AWS 账户 123456789012
中的 IAM 用户
进行完全访问。使用端点拒绝所有其他 IAM 委托人进行访问。redshiftadmin
{ "Statement": [ { "Action": "*", "Effect": "Allow", "Resource": "*", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/redshiftadmin" ] } }] }
这只是一个示例。在大多数应用场景中,我们建议在将权限分配给用户之前为角色附加权限。此外,我们建议使用特定操作来缩小权限范围。
示例:允许只读 Amazon Redshift 操作的 VPC 终端节点策略
以下 VPC 终端节点策略仅允许 AWS 账户
执行指定的 Amazon Redshift 操作。123456789012
指定的操作为 Amazon Redshift 提供等效的只读访问权限。针对指定账户拒绝 VPC 上的所有其它操作。同样,所有其他帐户都被拒绝进行任何访问。有关 Amazon Redshift 操作的列表,请参阅 IAM 用户指南中的 Amazon Redshift 的操作、资源和条件键。
{ "Statement": [ { "Action": [ "redshift:DescribeAccountAttributes", "redshift:DescribeClusterParameterGroups", "redshift:DescribeClusterParameters", "redshift:DescribeClusterSecurityGroups", "redshift:DescribeClusterSnapshots", "redshift:DescribeClusterSubnetGroups", "redshift:DescribeClusterVersions", "redshift:DescribeDefaultClusterParameters", "redshift:DescribeEventCategories", "redshift:DescribeEventSubscriptions", "redshift:DescribeHsmClientCertificates", "redshift:DescribeHsmConfigurations", "redshift:DescribeLoggingStatus", "redshift:DescribeOrderableClusterOptions", "redshift:DescribeQuery", "redshift:DescribeReservedNodeOfferings", "redshift:DescribeReservedNodes", "redshift:DescribeResize", "redshift:DescribeSavedQueries", "redshift:DescribeScheduledActions", "redshift:DescribeSnapshotCopyGrants", "redshift:DescribeSnapshotSchedules", "redshift:DescribeStorage", "redshift:DescribeTable", "redshift:DescribeTableRestoreStatus", "redshift:DescribeTags", "redshift:FetchResults", "redshift:GetReservedNodeExchangeOfferings" ], "Effect": "Allow", "Resource": "*", "Principal": { "AWS": [ "123456789012" ] } } ] }
示例:拒绝访问指定集群的 VPC 终端节点策略
以下 VPC 终端节点策略允许所有账户和委托人的完全访问权限。与此同时,它拒绝 AWS 账户
对于在具有集群 ID 123456789012
的 Amazon Redshift 集群上执行的操作的任何访问。仍然允许其他不支持集群资源级权限的 Amazon Redshift 操作。有关 Amazon Redshift 操作及其相应资源类型的列表,请参阅 IAM 用户指南中的 Amazon Redshift 的操作、资源和条件键。my-redshift-cluster
{ "Statement": [ { "Action": "*", "Effect": "Allow", "Resource": "*", "Principal": "*" }, { "Action": "*", "Effect": "Deny", "Resource": "arn:aws:redshift:us-east-1:123456789012:cluster:my-redshift-cluster", "Principal": { "AWS": [ "123456789012" ] } } ] }
Amazon Redshift Serverless 端点策略示例
接下来,可以查找适用于 Redshift Serverless 的 VPC 端点策略示例。
示例:支持只读 Redshift Serverless 操作的 VPC 端点策略
以下 VPC 端点策略仅支持 AWS 账户
执行指定的 Redshift Serverless 操作。123456789012
指定的操作为 Redshift Serverless 提供等效的只读访问权限。针对指定账户拒绝 VPC 上的所有其它操作。同样,所有其他帐户都被拒绝进行任何访问。有关 Redshift Serverless 操作的列表,请参阅《IAM 用户指南》中的 Actions, Resources, and Condition Keys for Redshift Serverless。
{ "Statement": [ { "Action": [ "redshift-serverless:DescribeOneTimeCredit", "redshift-serverless:GetCustomDomainAssociation", "redshift-serverless:GetEndpointAccess", "redshift-serverless:GetNamespace", "redshift-serverless:GetRecoveryPoint", "redshift-serverless:GetResourcePolicy", "redshift-serverless:GetScheduledAction", "redshift-serverless:GetSnapshot", "redshift-serverless:GetTableRestoreStatus", "redshift-serverless:GetUsageLimit", "redshift-serverless:GetWorkgroup" ], "Effect": "Allow", "Resource": "*", "Principal": { "AWS": [ "123456789012" ] } } ] }
示例:拒绝访问指定工作组的 VPC 端点策略
以下 VPC 终端节点策略允许所有账户和委托人的完全访问权限。同时,它拒绝 AWS 账户
对于在工作组 ID 为 123456789012
的 Amazon Redshift 工作组上执行的操作进行任何访问。仍然可以执行其它不支持工作组资源级权限的 Amazon Redshift 操作。有关 Redshift Serverless 操作及其相应资源类型的列表,请参阅《IAM 用户指南》中的 Actions, Resources, and Condition Keys for Redshift Serverless。my-redshift-workgroup
{ "Statement": [ { "Action": "*", "Effect": "Allow", "Resource": "*", "Principal": "*" }, { "Action": "*", "Effect": "Deny", "Resource": "arn:aws:redshift-serverless:us-east-1:123456789012:workgroup:my-redshift-workgroup", "Principal": { "AWS": [ "123456789012" ] } } ] }