本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Athena 中对 Amazon S3 存储桶的跨账户访问
一个常见的 Amazon Athena 方案是向账户中与存储桶所有者不同的用户授予访问权限,以便他们可以执行查询。在这种情况下,使用存储桶策略来授予访问权限。
有关使用 Athena 查询集中式 Data Catalog 的信息,请参阅 AWS 大数据博客文章使用 AWS Glue 数据目录 进行跨账户 Amazon Athena 访问
以下示例存储桶策略 (由存储桶所有者创建并应用到存储桶 s3://my-athena-data-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", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::my-athena-data-bucket", "arn:aws:s3:::my-athena-data-bucket/*" ] } ] }
要向账户中的特定用户授予访问权限,请将 Principal
密钥替换为指定用户的密钥,而不是 root
。 例如,对于用户配置文件 Dave
,请使用 arn:aws:iam::123456789123:user/Dave
。
跨账户访问使用自定义 AWS KMS 密钥加密的存储桶
如果您的 Amazon S3 存储桶使用自定义 AWS Key Management Service (AWS KMS) 密钥加密,则可能需要向其他 AWS 账户中的用户授予访问该存储桶的权限。
向账户 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
访问账户 ID 111122223333:{ "Id": "ExamplePolicy1", "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt1", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::awsexamplebucket/*", "Principal": { "AWS": [ "111122223333" ] } } ] }
从账户 A 中的 AWS KMS 密钥策略向账户 B 中的用户授予访问权限
-
在账户 A 的 AWS KMS 密钥策略中,向账户 B 中的用户授予执行以下操作的权限:
-
kms:Encrypt
-
kms:Decrypt
-
kms:ReEncrypt*
-
kms:GenerateDataKey*
-
kms:DescribeKey
以下示例仅向一个 IAM 用户或角色授予密钥访问权限。
{ "Sid": "Allow use of the key", "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 管理控制台策略视图查看密钥策略。
-
在密钥策略中,验证以下语句是否将账户 B 列为委托人。
"Sid": "Allow use of the key"
-
如果
"Sid": "Allow use of the key"
语句不存在,请执行以下步骤:-
切换到使用控制台默认视图查看密钥策略。
-
将账户 B 的账户 ID 添加为可访问密钥的外部账户。
-
从账户 B 的 IAM 用户策略授予对账户 A 中存储桶和密钥的访问权限
-
从账户 B 中,通过 https://console.amazonaws.cn/iam/
打开 IAM 控制台。 -
打开与账户 B 中的用户关联的 IAM 用户或角色。
-
查看应用于 IAM 用户或角色的权限策略列表。
-
确保应用授予对存储桶的访问权限的策略。
以下示例语句授予 IAM 用户对
awsexamplebucket
存储桶执行s3:GetObject
和s3:PutObject
操作的访问权限:{ "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt2", "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::awsexamplebucket/*" } ] }
-
确保应用授予对密钥的访问权限的策略。
注意 如果账户 B 中的 IAM 用户或角色已经具有管理员访问权限,则您不需要从用户的 IAM 策略授予对密钥的访问权限。
以下示例语句授予 IAM 用户使用密钥
arn:aws:kms:example-region-1: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:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd" } ] }
有关如何添加或更正 IAM 用户的权限的说明,请参阅更改 IAM 用户的权限。
跨账户访问存储桶对象
由存储桶拥有账户(账户 A)以外的账户(账户 C)上传的对象可能需要显式对象级 ACLs,以授予对查询账户(账户 B)的读取访问权限。为避免此要求,账户 C 在将对象放入账户
A 的存储桶之前应代入账户 A 中的角色。有关更多信息,请参阅如何提供对 Amazon S3 存储桶中的对象的跨账户访问权限?