跨多个 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 写,我自己...它们设置起来非常繁琐。
出于安全原因,我们有预生产和生产 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 写,我自己...它们设置起来非常繁琐。