如何为 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 策略,以便每个人只能访问他们的个人存储桶文件夹?
Amazon S3 - 尽管有 GetObject 限制,但返回 403 错误而不是 404