Amazon S3 存储桶策略,我做错了啥?

Posted

技术标签:

【中文标题】Amazon S3 存储桶策略,我做错了啥?【英文标题】:Amazon S3 bucket policy, what am I doing wrong?Amazon S3 存储桶策略,我做错了什么? 【发布时间】:2018-04-19 15:22:00 【问题描述】:

我使用Policy Generator 为我的存储桶创建了一个简单的规则;规则应允许以下预期效果:

root 访问权限 限制对给定 IAM 用户的访问 允许所有人只读访问

为此,我编写了以下规则,但没有按预期工作,特别是,我完全失去了对存储桶元素的访问权限,在所有情况下都“拒绝访问”,包括根:

编辑:使用@jarmod 回答我可以设置预期的功能,但是它会触发警告,关于存储桶是公开的,我没有看到没有策略的区别,存储桶仍然以只读方式公开访问。有什么区别?

【问题讨论】:

显式拒绝 > 显式允许 > 隐式拒绝。您的第 1 条和第 2 条语句应该被删除,并且您缺少允许“所有人只读访问”的语句。 @jarmod 所以 root 是隐式允许的?我正在阅读this guide,在示例中,他们为其他所有人设置了deny *,并指定允许root 访问。 你不能有一个拒绝 * 和一个允许 x,因为拒绝 * 是明确的并且胜过每个允许。 Root 具有对所有内容的隐式访问权限,但您不应该对任何内容使用 root 凭证(请参阅 AWS 对 root 用户的最佳实践)。 您所指的指南中的拒绝示例(如果我阅读正确的示例)具有条件策略声明,拒绝除特定角色和 root 用户之外的所有访问。如果您特别想要覆盖 S3 存储桶的 IAM 级别权限(例如,您可以拒绝对实际拥有该存储桶权限的 IAM 用户的访问),您可以使用此选项。据我所知,这不是您想要做的,因此该政策不相关。 @jarmod 是的,先生!根据列表中的第二个点,我正在尝试限制对给定 IAM 用户的访问 【参考方案1】:

也许你可以这样做:

    对于所有用户,允许操作 s3:GetObject 对于除 root 和您的特定 IAM 用户之外的所有用户,拒绝除 s3:GetObject 之外的所有操作

您可以使用类似这样的策略来做到这一点:


    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::mybucket/*"
            ]
        ,
        
            "Effect": "Deny",
            "Principal": "*",
            "NotAction": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::mybucket/*"
            ],
            "Condition": 
                "StringNotLike": 
                    "aws:userId": [
                        "iam-userid-here",
                        "root-userid-here"
                    ]
                
            
        
    ]

要获取 iam-userid-here,请运行 aws iam list-users 并检索 IAM 用户的 UserId。

同样,要获得root-userid-here,只需从先前aws iam list-users 输出的Arn 中检索帐号。根账户 userId AWS 账号。

iam-userid-here 指示的 IAM 用户随后可以拥有允许 S3 访问的 IAM 策略。

【讨论】:

这是部分工作,通过允许只读给我的意思的每个人也没有登录的用户,比如公共客人。在存储桶中,我上传要共享的文件并提供 URL,而我的根和 IAM 用户可以访问存储桶,公共访问者被拒绝访问该文件。 我不确定您的评论是什么意思。您是说要提供对对象的公共读取访问权限,但不允许 IAM 用户(除了一个特定用户)读取它们吗?如果是这样,为什么?授予公共读取权限肯定意味着所有人。 我错过了您共享的代码,使用的工具我无法设置 NotAction 并且最初无法正常工作。我想创建一个共享文件夹来发送文件,IAM 用户是一个上传文件的应用程序。我只是想知道为什么它将存储桶标记为公共,而在没有策略的情况下也可以访问它。 我假设您指的是 AWS S3 控制台如何突出存储桶是公共的这一事实。如果没有某种形式的政策允许,存储桶内容将无法公开访问。 如果您说您可以访问s3.amazonaws.com/yourbucket/yourkey 并且浏览器成功下载或显示您的文件,则 S3 对象是公开的。它是公开的,因为您有一个将其公开的存储桶策略,或者您有使其公开的对象级 ACL。

以上是关于Amazon S3 存储桶策略,我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Amazon S3 存储桶策略引用

将多个子域映射到同一个 Amazon S3 存储桶

json 静态站点的Amazon S3存储桶策略。

Amazon S3 存储桶策略阻止用户代理

Amazon S3 存储桶策略只允许访问特定的 http

Amazon S3 存储桶策略:如何锁定仅访问您的 EC2 实例