如何为 IP 地址设置 Amazon S3 策略

Posted

技术标签:

【中文标题】如何为 IP 地址设置 Amazon S3 策略【英文标题】:How to setup Amazon S3 policy for ip address 【发布时间】: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 地址,而不是服务器。该政策正在阻止此类访问。 【参考方案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 地址

以上是关于如何为 IP 地址设置 Amazon S3 策略的主要内容,如果未能解决你的问题,请参考以下文章

如何为多个 IAM 用户设置 S3 策略,以便每个人只能访问他们的个人存储桶文件夹?

如何为CentOS 7配置静态IP地址

如何为 Amazon S3 存储桶配置 SSL

Amazon S3 - 尽管有 GetObject 限制,但返回 403 错误而不是 404

如何为查看基于 Amazon S3 的静态网站的用户提供目录列表?

如何为 Amazon CloudFront 签署 RTMP URL