【问题标题】:How to setup Amazon S3 policy for ip address如何为 IP 地址设置 Amazon S3 策略
【发布时间】:2021-06-29 08:29:05
【问题描述】:

我正在使用与 S3 兼容的存储(数字海洋空间)来托管来自我的 Web 应用程序的图像。 为了防止盗链并尽量减少直接下载,我应用了这个策略:

{
   "Id": ip referer policy example",
   "Statement": [
    {
       "Sid": "Allow get requests originating from my server.",
       "Effect": "Deny",
       "Principal": "*",
       "Action": "s3:GetObject",
       "Resource": "arn:aws:s3:::bucket-name/*",
       "Condition": {
         "NotIpAddress":  {
          "aws:SourceIp":  "server-ip-address"
        }
      }
    } 
  ]
}

这个技巧似乎奏效了,我现在无法直接访问这些文件,但是,我的 Web 应用程序也不能。我是不是做错了什么?

有没有办法调试引荐来源网址或其他东西?

【问题讨论】:

  • 是否正在检索内容以供 Web 应用程序本身使用,或者您是否在 HTML 页面中提供链接/引用?
  • @JohnRotenstein 网络应用程序具有 API 访问权限并获取未签名的 URL(在我应用策略之前它确实有效)
  • “未签名的 URL”是什么意思?它是对 Digital Ocean Spaces 进行 API 调用,还是对存储桶的公共 URL 进行 HTTP/S 调用?
  • 对不起,我的意思是“签名的 url”。 API 生成的用于查看私有文件的临时 URL。我想我现在明白了我的误解来自哪里......我正在调用存储桶 API 生成的 URL(临时 URL)。我实际上并没有打电话给GetObject(它应该下载文件内容,对吧?)
  • 如果“最终用户”正在使用预签名 URL 在他们的浏览器中查看文件,那么请求将来自他们的浏览器和他们的 IP 地址,而不是服务器。该政策正在阻止此类访问。

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


【解决方案1】:

默认情况下,内容是私有的。您的政策未通过 Allow 语句授予任何访问权限,因此无法访问内容。 Deny 可用于删除由Allow 授予的权限,但它本身并不授予访问权限。

您可以将其更改为Allow 策略,并将NotIpAddress 更改为IpAddress。这将授予访问您的服务器以下载内容的权限。但是,最好使用 S3 样式的 API 调用从您自己的存储桶中下载内容,而不是使用匿名 HTTP 请求。

如果您在 HTML 页面中放置对象的链接,则该策略将提供您期望的安全性,因为用户的浏览器将尝试访问该对象,并且由于请求不是来自您的服务器的 IP 地址。

【讨论】:

  • 是的,内容是私有的,它会获取未签名的 URL。在我应用该策略之前,一切正常(Web 应用程序可以访问 S3 API)。一旦我应用该策略 - 尽管从 API 获取 URL,图像将停止访问。
  • 如果您说应用程序发出 API 请求(例如 get_object())并且在添加此策略之前它一直在工作,那么它表明该应用程序正在使用一组已经被授予Allow 访问存储桶的权限。它现在被拒绝的事实表明服务器没有通过指定的 IP 地址进入。您提供的是公共 IP 地址还是私有 IP 地址?服务器是在公共子网中还是在私有子网中?
  • 是的,我用本地 IP 地址替换了 IP 字符串,现在我仍然无法直接访问公共 URL。很明显有些事情是不对的。说到服务器,我提供了它的公共 IP 地址
猜你喜欢
  • 2012-07-12
  • 2021-02-13
  • 2012-05-18
  • 1970-01-01
  • 2017-04-03
  • 2011-02-10
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多