【问题标题】:Bucket policy that respects pre-signed URLs OR IP Address deny?尊重预签名 URL 或 IP 地址的存储桶策略拒绝?
【发布时间】:2016-03-12 23:57:57
【问题描述】:

我希望能够以多种方式限制对 S3 存储桶中文件的访问。这是因为可以以不同的方式访问存储的文件。我们这样做是因为我们有 TB 的文件,所以我们不想复制存储桶。

一种访问方法是通过使用 S3 存储桶作为源的令牌化 CDN 交付。为了可以提取文件,我已设置文件的权限以允许所有人下载。使用存储桶策略,我可以限制可以获取存储桶中文件的 IP 地址。所以我将它们限制在 CDN IP 块中,这些 IP 地址之外的任何人都无法获取该文件。

另一种访问方法是使用我们的商店系统直接下载,该系统会生成 S3 时间到期的预签名 URL。

由于 CDN 拉取实际上需要文件是公开可读的,有没有办法:

  1. 首先检查有效的预签名 URL,如果请求有效,则提供文件

  2. 如果无效,回退到 IP 地址限制以防止进一步访问?

我有一个有效的 IP 限制存储桶策略正在运行,但这会消除预签名的访问权限...删除存储桶策略会修复预签名的访问权限,但文件是公开的。

【问题讨论】:

  • 如果删除 IP 限制策略允许下载所有文件,则签名 URL 无法按预期工作 - 因为听起来各个对象无论如何都是公开的。他们不应该。如果操作正确,只需允许来自白名单 IP 的匿名访问,而不是拒绝来自“非”白名单 IP 的访问。
  • 您能否说明您的 CDN 是 CloudFront 还是其他?原因是 CloudFront 支持对象访问身份,可以专门允许 CloudFront 访问 S3 存储桶。
  • 您说 IP 限制“阻止了预签名访问”,这很奇怪——这应该是不可能的。您能否提供您创建的政策的(编辑)副本?
  • 问题在于我在 IP 地址中使用了拒绝...感谢您对此的见解,Michael。我在下面列出了我的最终代码,以供将来遇到此问题的人使用。

标签: amazon-s3


【解决方案1】:

默认情况下,Amazon S3 中的对象是私有的。然后可以通过以下任何一种方法授予访问权限:

  • 每个对象的 ACL(主要用于授予公共访问权限)
  • 包含规则的存储桶策略,用于定义在何种情况下允许哪些 API 调用(例如,仅来自给定 IP 地址范围)
  • IAM 策略 -- 类似于存储桶策略,但可以应用于特定用户或组
  • 预签名 URL,授予对对象的限时访问权限

当尝试访问 Amazon S3 中的内容时,只要上述任何项允许访问,就会授予访问权限。无法通过其他方法拒绝访问 - 例如,如果通过预签名 URL 授予访问权限,则存储桶策略不会导致该访问被拒绝。

因此,系统会自动执行您希望的操作...如果预签名 URL 有效,则授予访问权限。如果 IP 地址来自所需范围,则授予访问权限。它应该可以正常工作。

你说 IP 限制“阻止了预签名访问”,这很奇怪——这应该是不可能的。

【讨论】:

  • 非常感谢——这篇文章和另一篇文章对我帮助很大。我的问题是我使用拒绝来拒绝任何未在我的策略中列出的 IP 地址。拒绝总是覆盖允许,所以这就是发生的事情。将我的代码调整为上述内容可以解决问题。
【解决方案2】:

问题解决了——这就是我最终得到的结果。我意识到我在 IP 地址部分使用了“拒绝”(看到发布在某处的代码,它自己工作),它确实覆盖了任何允许,所以我需要翻转它。

我还确保我对存储桶中的对象也没有任何匿名权限。

{
"Version": "2012-10-17",
"Id": "S3PolicyId2",
"Statement": [
    {
        "Sid": "Allow our access key",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::123456789:user/myuser"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::mybucket/*"
    },
    {
        "Sid": "IPAllow",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::mybucket/*",
        "Condition": {
            "IpAddress": {
                "aws:SourceIp": [
                    "192.168.0.1/27",
                    "186.168.0.1//32",
                    "185.168.0.1/26"
                ]
            }
        }
    }
]

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 2017-12-04
    • 2018-01-10
    • 2023-03-29
    • 2022-01-14
    • 2020-01-16
    • 2021-03-28
    • 2019-11-09
    • 2019-04-20
    相关资源
    最近更新 更多