在 Athena 中配置对 Amazon S3 存储桶的跨账户存取
一个常见的 Amazon Athena 方案是向账户中与存储桶拥有者不同的用户授予访问权限,以便他们可以执行查询。在这种情况下,使用存储桶策略来授予访问权限。
注意
有关从 Athena 跨账户访问 AWS Glue 数据目录的信息,请参阅 配置 AWS Glue 数据目录的跨账户存取。
以下示例存储桶策略 (由存储桶所有者创建并应用到存储桶 s3://amzn-s3-demo-bucket
) 向账户 123456789123
(它是不同账户) 中的所有用户授予访问权限。
{ "Version": "2012-10-17", "Id": "MyPolicyID", "Statement": [ { "Sid": "MyStatementSid", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789123:root" }, "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/*" ] } ] }
要向账户中的特定用户授予访问权限,请将 Principal
密钥替换为用户指定的密钥,而不是 root
。例如,对于用户配置文件 Dave
,请使用 arn:aws:iam::123456789123:user/Dave
。
对使用自定义 AWS KMS 密钥加密的存储桶配置跨账户存取
如果您的 Amazon S3 存储桶使用自定义 AWS Key Management Service (AWS KMS) 密钥加密,则可能需要向其他 Amazon Web Services 账户中的用户授予访问该存储桶的权限。
向账户 B 中的用户授予对账户 A 中 AWS KMS 加密存储桶的访问权限需要以下权限:
-
账户 A 中的存储桶策略必须授予对账户 B 所担任角色的访问权限。
-
账户 A 中的 AWS KMS 密钥策略必须授予对账户 B 中用户所担任角色的访问权限。
-
账户 B 担任的 AWS Identity and Access Management(IAM)角色必须同时授予对账户 A 中存储桶和密钥的访问权限。
以下过程描述如何授予这些权限中的每个权限。
向账户 b 中的用户授予对账户 a 中存储桶的访问权限
-
在账户 A 中,查看 S3 存储桶策略并确认存在允许从账户 B 的账户 ID 访问的语句。
例如,以下存储桶策略允许
s3:GetObject
访问账户 ID111122223333
:{ "Id": "ExamplePolicy1", "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt1", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Principal": { "AWS": [ "111122223333" ] } } ] }
从账户 a 中的 AWS KMS 密钥策略向账户 b 中的用户授予访问权限
-
在账户 A 的 AWS KMS 密钥策略中,向账户 B 所担任的角色授予执行以下操作的权限:
-
kms:Encrypt
-
kms:Decrypt
-
kms:ReEncrypt*
-
kms:GenerateDataKey*
-
kms:DescribeKey
以下示例仅向一个 IAM 角色授予密钥访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "
AllowUseOfTheKey
", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333
:role/role_name
" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" } ] } -
-
在账户 A 中,使用 AWS Management Console 策略视图查看密钥策略。
-
在密钥策略中,验证以下语句是否将账户 B 列为委托人。
"Sid": "Allow use of the key"
-
如果
"Sid": "Allow use of the key"
语句不存在,请执行以下步骤:-
切换到使用控制台默认视图查看密钥策略。
-
将账户 B 的账户 ID 添加为可访问密钥的外部账户。
-
从账户 b 担任的 IAM 角色中授予对账户 a 中存储桶和密钥的访问权限
-
从账户 B 中,在 https://console.aws.amazon.com/iam/
开启 IAM 控制台。 -
打开与账户 B 中用户关联的 IAM 角色。
-
查看应用于 IAM 角色的权限策略列表。
-
确保应用授予对存储桶的访问权限的策略。
以下示例语句授予 IAM 角色对存储桶
amzn-s3-demo-bucket
执行s3:GetObject
和s3:PutObject
操作的访问权限:{ "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt2", "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }
-
确保应用授予对密钥的访问权限的策略。
注意
如果账户 B 所担任的 IAM 角色已经具有管理员访问权限,则您无需从用户的 IAM policy 授予对密钥的访问权限。
以下示例语句授予 IAM 角色使用密钥
arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd
的权限。{ "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt3", "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:Encrypt", "kms:GenerateDataKey", "kms:ReEncrypt*" ], "Effect": "Allow", "Resource": "arn:aws:kms:
us-west-2
:123456789098
:key/111aa2bb-333c-4d44-5555-a111bb2c33dd
" } ] }
对存储桶对象配置跨账户存取
由存储桶拥有账户(账户 A)以外的账户(账户 C)上载的对象可能需要明确的对象级 ACL,以向查询账户(账户 B)授予读取访问权限。为避免此要求,账户 C 在将对象放入账户 A 的存储桶之前应代入账户 A 中的角色。有关更多信息,请参阅如何提供对 Amazon S3 存储桶中的对象的跨账户访问权限?