与 CMK 跨账户集成考虑的注意事项
当尝试从 DynamoDB 集成到 Amazon Redshift 时,初始操作将从 Amazon Redshift 启动。如果没有适当的权限,此操作可能会导致静默失败。以下各节详细介绍此跨账户集成所需的权限。
所需的 Amazon KMS 角色和权限
替换示例中的以下占位符:
-
REDSHIFT_ACCOUNT_ID
:托管 Amazon Redshift 的 Amazon Web Services 账户 ID -
DYNAMODB_ACCOUNT_ID
:托管 DynamoDB 的 Amazon Web Services 账户 ID -
REDSHIFT_ROLE_NAME
:Amazon Redshift 使用的 IAM 角色名称 -
REGION
:您的资源所在的 Amazon Web Services 区域 -
TABLE_NAME
:DynamoDB 表的名称 -
KMS_KEY_ID
:KMS 密钥的 ID
DynamoDB 账户中的 KMS 密钥策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::DYNAMODB_ACCOUNT_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow Redshift to use the key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::REDSHIFT_ACCOUNT_ID:role/REDSHIFT_ROLE_NAME" }, "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:GenerateDataKey", "kms:GenerateDataKeyWithoutPlaintext" ], "Resource": "*" } ] }
Amazon Redshift 角色的 IAM 策略(在 Amazon Redshift 账户中)
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowDynamoDBAccess", "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:ParitalBatchGetItem", "dynamodb:Scan", "dynamodb:Query", "dynamodb:BatchGetItem", "dynamodb:GetItem", "dynamodb:GetRecords", "dynamodb:GetShardIterator", "dynamodb:DescribeStream", "dynamodb:ListStreams" ], "Resource": [ "arn:aws:dynamodb:REGION:DYNAMODB_ACCOUNT_ID:table/TABLE_NAME", "arn:aws:dynamodb:REGION:DYNAMODB_ACCOUNT_ID:table/TABLE_NAME/stream/*" ] }, { "Sid": "AllowKMSAccess", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:GenerateDataKey", "kms:GenerateDataKeyWithoutPlaintext" ], "Resource": "arn:aws:kms:REGION:DYNAMODB_ACCOUNT_ID:key/KMS_KEY_ID" } ] }
Amazon Redshift 角色的信任关系
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
DynamoDB 表策略(如果使用基于资源的策略)
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRedshiftAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::REDSHIFT_ACCOUNT_ID:role/REDSHIFT_ROLE_NAME" }, "Action": [ "dynamodb:DescribeTable", "dynamodb:ParitalBatchGetItem", "dynamodb:Scan", "dynamodb:Query", "dynamodb:BatchGetItem", "dynamodb:GetItem", "dynamodb:GetRecords", "dynamodb:GetShardIterator", "dynamodb:DescribeStream", "dynamodb:ListStreams" ], "Resource": [ "arn:aws:dynamodb:REGION:DYNAMODB_ACCOUNT_ID:table/TABLE_NAME", "arn:aws:dynamodb:REGION:DYNAMODB_ACCOUNT_ID:table/TABLE_NAME/stream/*" ] } ] }
重要注意事项
-
确保 KMS 密钥与 DynamoDB 表位于同一区域。
-
KMS 密钥必须是客户自主管理型密钥(CMK),而不是 Amazon 托管式密钥。
-
如果使用的是 DynamoDB 全局表,请为所有相关区域配置权限。
-
考虑添加条件语句以根据 VPC 端点或 IP 范围限制访问权限。
-
为了增强安全性,请考虑使用
aws:PrincipalOrgID
条件来限制组织的访问权限。 -
通过 CloudTrail 和 CloudWatch 指标监控 KMS 密钥使用情况。