跨多个 AWS 账户的一个 IAM 角色

One IAM Role across multiple AWS accounts

出于安全原因,我们有预生产和生产 AWS 帐户。我们现在开始使用 IAM 角色通过 django-storage / boto 对 js/css 文件进行 S3 访问。

虽然这在每个帐户的基础上都可以正常工作,但现在 QA 实例需要访问生产帐户上的一个 S3 存储桶的需求增加了。

有没有一种方法可以让一个 IAM 角色授予对预生产和生产 S3 存储桶的访问权限?在我写的时候这似乎是不可能的,但它永远不会问!

这是关于此的 AWS 文档:http://docs.aws.amazon.com/AmazonS3/latest/dev/example-walkthroughs-managing-access-example2.html

本质上,您必须使用 Bucket 的 IAM 策略的 Principal 块将权限从另一个账户委托给另一个账户,然后在第二个账户中正常设置您的 IAM 用户。

示例存储桶策略: { "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<Account-ID>:root" }, "Action": [ "s3:GetBucketLocation", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::<bucket-name>" ] } ] }

这适用于 read-only 访问,但写访问可能存在问题。首先,写入 object 的帐户仍将是 object 的所有者。在处理写入权限时,您通常会希望确保拥有存储桶的帐户仍然能够访问其他帐户写入的 object,这需要使用 object 写入特别 header: x-amz-grant-full-control

您可以设置存储桶策略,使存储桶不接受不提供此 header 的 cross-account object。本页底部有一个示例:http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html(在 "Granting Cross-Account Permissions to Upload Objects While Ensuring the Bucket Owner Has Full Control" 下)

这在存储桶策略中使用了条件拒绝子句,如下所示: { "Sid":"112", "Effect":"Deny", "Principal":{"AWS":"1111111111" }, "Action":"s3:PutObject", "Resource":"arn:aws:s3:::examplebucket/*", "Condition": { "StringNotEquals": {"s3:x-amz-grant-full-control":["emailAddress=xyz@amazon.com"]} } }

我通常避免 cross-account object 写,我自己...它们设置起来非常繁琐。