如何用几个逻辑“或”编写 s3 条件存储桶策略?

Posted

技术标签:

【中文标题】如何用几个逻辑“或”编写 s3 条件存储桶策略?【英文标题】:How to write s3 conditional bucket policy with several logical "OR"? 【发布时间】:2019-05-01 11:47:26 【问题描述】:

我正在设置一个基于 S3 的公共网站,并且我想拒绝我的 CloudFront 分配之外的用户直接访问我的 s3 存储桶。同时我希望自己(管理员)能够直接访问 s3 内容。我也想允许 CodeBuild 服务访问同一个存储桶。

亚马逊建议“添加一个允许 s3:GetObject 权限的存储桶策略,使用 aws:referer 键,获取请求必须来自特定网页。”:

https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-4

但如果我添加一个 Explicit Deny 部分:


        "Sid": "Explicit deny to ensure requests are allowed only from specific referer.",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::examplebucket/*",
        "Condition": 
          "StringNotLike": "aws:Referer": ["http://www.example.com/*","http://example.com/*"]

我失去了将文件直接上传到 s3 存储桶的机会,CodeBuild Service 也无法对我的存储桶执行任何操作。

如何在我的存储桶策略中实施条件以拒绝访问:

ONLY IF 

("StringNotLike": "aws:Referer": "https://www.example.com")
OR
("StringNotLike": "aws:userid": "my root user id")
OR
(my bucket is not requested by CodeBuild Service)

【问题讨论】:

【参考方案1】:

默认情况下,无法访问存储在 Amazon S3 中的对象。因此,您应该通过Allow 权限授予访问权限。因此,允许的任何内容都会被拒绝。

添加允许通过 CloudFront 源访问身份执行操作的存储桶策略 CodeBuild 似乎使用了正在使用 CodeBuild 的 IAM 用户的权限,因此将权限分配给那些 IAM 用户(我查看了文档并没有提及使用与服务相关的角色,但我在这里可能错了) 要允许进入存储桶,请将权限添加到您的 IAM 用户

以上都不需要使用Deny 策略。

见:Restricting Access to Amazon S3 Content by Using an Origin Access Identity - Amazon CloudFront

【讨论】:

谢谢你,约翰。是的,我已向我的 IAM 用户和 CodeBuild 角色添加了相应的允许权限。问题是,当我试图拒绝其他用户(我的网站访问者)直接从 S3 存储桶访问内容时,我在存储桶策略中的拒绝语句取代了附加到用户/角色的任何允许权限。所以我仍然需要找到一种方法来编写拒绝子句但有例外

以上是关于如何用几个逻辑“或”编写 s3 条件存储桶策略?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 IP 限制添加到已经有用户限制的 s3 存储桶(在存储桶策略中)

私有登台S3存储桶的策略

S3 云托管人

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

AWS S3 存储桶策略:如何授予对 EC2 实例的访问权限?

针对 Grafana 警报写入 s3 存储桶的 AWS IAM 策略问题