问题描述
我的AWS账户中有400多个存储桶,用户可以使用用户组 dev-user-group 和 prod-user-group 访问其中的一些存储桶。很少有S3存储桶的策略是这样的
"aws:arn": [
"arn:aws:sts::123XXXXX43:assumed-role/dev-user-group/*"
"arn:aws:sts::123XXXXX43:assumed-role/prod-user-group/*"
]
现在,我们要将其更改为以下内容
"aws:arn": [
"arn:aws:sts::123XXXXX43:assumed-role/dev-eid/*"
"arn:aws:sts::123XXXXX43:assumed-role/dev-p-eid/*"
"arn:aws:sts::123XXXXX43:assumed-role/prod-eid/*"
"arn:aws:sts::123XXXXX43:assumed-role/prod-p-eid/*"
]
很少有存储桶只有其中之一可以访问,很少有没有访问权限。 我们希望使用脚本来自动化更新存储桶策略的过程,以便脚本需要检查是否定义了 dev-user-group 和 prod-user-group 在存储桶策略中。如果是这样,它应该删除它们并添加新策略。
我希望我传达的更好。请给我一些建议。
解决方法
一般规则:
- 使用 IAM策略将存储桶权限分配给IAM实体(例如IAM用户,IAM角色,IAM组),或
- 使用 Amazon S3存储桶策略授予对内容的公共访问权限
通常,通过将策略放在该IAM实体上而不是在每个S3存储桶上添加权限来授予IAM实体权限要容易得多。
因此,您可以创建将IAM策略添加到四个IAM角色(dev-eid
,dev-p-eid
, prod-eid
,prod-p-eid
)授予他们对存储桶的权限。看起来像这样:
{
"Version": "2012-10-17","Statement": [
{
"Effect": "Allow","Action": [
"s3:ListBucket","s3:GetBucketLocation"
],"Resource": [
"arn:aws:s3:::bucket1","arn:aws:s3:::bucket2","arn:aws:s3:::bucket3","arn:aws:s3:::bucket4","arn:aws:s3:::bucket5","arn:aws:s3:::bucket6","arn:aws:s3:::bucket7","arn:aws:s3:::bucket8"
]
},{
"Effect": "Allow","Action": [
"s3:PutObject","s3:PutObjectAcl","s3:GetObject","s3:GetObjectAcl","s3:DeleteObject"
],"Resource": [
"arn:aws:s3:::bucket1/*","arn:aws:s3:::bucket2/*","arn:aws:s3:::bucket3/*","arn:aws:s3:::bucket4/*","arn:aws:s3:::bucket5/*","arn:aws:s3:::bucket6/*","arn:aws:s3:::bucket7/*","arn:aws:s3:::bucket8/*"
]
}
]
}
由于策略的允许大小,您可能会遇到限制,因此可能需要多个策略(或者,鉴于您有很多存储桶,它可能根本无法工作)。一种更简单的方法是按前缀引用存储桶,例如:
"arn:aws:s3:::dev-*"
通过这种方式,您可以授予以dev-*
开头的任何存储桶的权限,因此该策略实际上会很短(假定您可以通过这种方式轻松地对存储桶进行分组)。
您将需要创建快速脚本并为此使用aws cli。
该脚本将首先列出帐户aws s3 ls
中的所有存储桶,然后保存该列表并使用以下命令在存储桶列表上循环,该命令将策略输出为json文件:
aws s3api get-bucket-policy --bucket mybucket --query Policy --output text > policy.json
然后可以根据需要修改policy.json
文件。最后,您可以通过运行以下命令将此修改后的策略应用回S3存储桶:
aws s3api put-bucket-policy --bucket mybucket --policy file://policy.json