S3主要存储桶策略权限

时间:2017-04-18 22:43:31

标签: amazon-web-services amazon-s3 amazon-iam

我在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用户身份登录,只要我放入存储桶策略,我猜我应该可以访问它。任何帮助将不胜感激。

1 个答案:

答案 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用户添加到该组。如果您添加新用户,则必须手动将其添加到该组,因此它不如您最初想要的那样方便。