我在S3存储桶中有一个cloudformation模板(url遵循模式但不完全等于:https://s3.amazonaws.com/bucket-name/cloudform.yaml)。我需要能够从CLI访问它以获取bash脚本。我希望组织中的每个人(都在这个帐户中)都可以访问此模板,但组织外的其他人无权访问该模板。我试过的一个存储桶政策看起来像:
{
"Version": "2012-10-17",
"Id": "Policy11111111",
"Statement": [
{
"Sid": "Stmt111111111",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::7777777777:root"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/*"
}
]
}
根据此政策,我和我办公室的其他几个人无法访问该网址。即使我使用root帐户登录,我也会被拒绝访问。
此外,此更改(仅将Principal设置为*)使任何人都可以访问该存储桶:
{
"Version": "2012-10-17",
"Id": "Policy11111111",
"Statement": [
{
"Sid": "Stmt111111111",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/*"
}
]
}
显然有迹象表明我的校长领域配置错误。 777777777是我在“我的帐户”页面下看到的帐户ID的替代品。
那么,我是否需要在IAM方面担心这个问题?考虑到我以root用户身份登录,只要我放入存储桶策略,我猜我应该可以访问它。任何帮助将不胜感激。
答案 0 :(得分:1)
短而甜蜜:
由于Principal元素的通配符限制,存储桶策略不允许您执行所需操作。最好的办法是创建一个IAM组,并在需要访问权限时将所有IAM用户放入该组中。
长版:
为了说清楚,任何对https://s3.amazonaws.com/bucket-name/cloudform.yaml的请求必须签名并拥有必要的身份验证参数,否则请求将被拒绝访问。唯一的例外是存储桶策略或存储区ACL允许公共访问,但听起来并不像您想要的那样。
当您说“组织中的每个人(所有人都在此单一帐户中)”时,我假设您指的是从AWS控制台访问该文件的帐户下的IAM用户,或者正在使用其他代码或工具的IAM用户(例如,AWS CLI)来访问该文件。
所以你想要的是能够将Principal指定为
"Principal": {
"AWS": "arn:aws:iam::777777777777:user/*"
}
因为这是777777777777帐户ID下任何IAM用户的模式。不幸的是,这是不允许的,因为除非您使用全部通配符“*”,否则Principal中不允许使用通配符。换句话说,允许“*”,但“前缀*”或“*后缀”不是。 (我希望AWS更好地记录这一点。)
您可以在存储桶策略中指定您拥有的每个IAM用户,如下所示:
"Principal": {
"AWS": [
"arn:aws:iam::777777777777:user/alice",
"arn:aws:iam::777777777777:user/bob",
"arn:aws:iam::777777777777:user/carl",
...
"arn:aws:iam::777777777777:user/zed",
}
但您可能不希望为每个新用户更新策略。
最简单的方法是创建一个授予该文件访问权限的IAM组。然后,您将所有IAM用户添加到该组。如果您添加新用户,则必须手动将其添加到该组,因此它不如您最初想要的那样方便。