出于安全原因,我们有一个pre-prod和prod AWS账户。我们现在开始使用IAM角色通过django-storage / boto对js / css文件进行S3访问。
虽然这在每个帐户的基础上正常工作,但现在需要增加QA实例需要访问prod帐户上的一个S3存储桶的位置。
有没有办法让一个IAM角色可以授予对pre-prod和prod S3存储桶的访问权限?我写作似乎不可能,但从来没有人问过这个问题!
答案 0 :(得分:4)
以下是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>"
]
}
]
}
这适用于只读访问,但写访问可能存在问题。主要是,编写对象的帐户仍然是该对象的所有者。在处理写入权限时,您通常希望确保拥有该存储桶的帐户仍然能够访问由另一个帐户写入的对象,这需要使用特定标头编写该对象:x-amz-grant-full-control
< / p>
您可以设置存储桶策略,以便存储桶不接受不提供此标头的跨帐户对象。这个页面底部有一个例子:http://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html(在“确保存储桶所有者完全控制时授予上传对象的跨帐户权限”下)
这在存储桶策略中使用了条件Deny子句,如下所示:
{
"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"]}
}
}
我通常会避免跨帐户对象写入,我自己......设置起来非常繁琐。