我希望能够以多种方式限制对S3存储桶中文件的访问。这是因为存储的文件可以以不同的方式访问。我们这样做是因为我们有TB文件,因此我们不想复制存储桶。
一种访问方法是通过标记化的CDN传递,它使用S3存储桶作为源。为了可以提取文件,我已经设置了文件的权限以允许每个人下载。使用存储桶策略,我可以限制可以获取存储桶中文件的IP地址。因此,我将它们限制在CDN IP块中,并且这些IP地址以外的任何人都无法获取该文件。
另一种是访问方法是使用我们的商店系统直接下载,生成S3时间到期的预签名URL。
由于CDN pull有效地需要文件可公开阅读,有没有办法:
首先检查有效的预签名网址,并在请求有效时提供该文件
如果无效,请回退到IP地址限制以防止进一步访问?
我有一个正在运行的IP限制存储分区策略,但是它会阻止预签名访问...删除存储桶策略会修复预先签名的访问权限,但文件是公开的。
答案 0 :(得分:7)
默认情况下,Amazon S3中的对象是私有的。然后可以通过以下任何方法授予访问权限:
尝试访问Amazon S3中的内容时,只要上述任何允许访问,就会授予访问权限。无法通过其他方法拒绝访问 - 例如,如果通过预先签名的URL授予访问权限,则Bucket Policy不会导致该访问被拒绝。
因此,系统会自动执行您所希望的操作...如果预签名URL有效,则授予访问权限。如果IP地址来自所需范围,则授予访问权限。它应该正常工作。
你说IP限制"踩踏预先签名的访问权限是非常奇怪的。 - 那是不可能的。
答案 1 :(得分:0)
问题解决了 - 这就是我最终的结果。我意识到我正在使用" deny"对于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"
]
}
}
}
]