我很难设置bucket策略,看起来我的bucket策略只适用于bucket中的一些对象。
我想要的很简单:我将视频文件存储在bucket中,并希望它们可以从我的webiste独家下载。
我的方法是默认阻止所有内容,然后添加允许规则:
- 将全部权限授予root和Alice用户
- 只允许特定的引用者(我的网站(公开访问我的bucket中的文件
注意:我手动将所有对象设置为"公共",并且我的"阻止公共访问"设置都设置为"关闭"。
有人能在我的bucket策略中看到任何明显的错误吗?我不明白为什么我的策略似乎只适用于某些文件。非常感谢
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::MY_BUCKET/*",
"Condition": {
"StringNotLike": {
"aws:Referer": [
"https://mywebsite1.com/*",
"https://mywebsite2.com/*"
]
}
}
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::MY_BUCKET/*",
"Condition": {
"StringLike": {
"aws:Referer": [
"https://mywebsite1.com/*",
"https://mywebsite2.com/*"
]
}
}
},
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::426873019732:root",
"arn:aws:iam::426873019732:user/alice"
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::MY_BUCKET",
"arn:aws:s3:::MY_BUCKET/*"
]
}
]
}
通过aws:Referer
控制访问是不安全的。它很容易克服。一个简单的网络搜索将提供许多可以实现这一点的工具。
更安全的方法是:
- 保持AmazonS3存储桶中的所有对象为私有对象(不要"公开"(
- 不要使用Bucket策略
- 用户应对您的应用程序进行身份验证
- 当用户希望访问其中一个视频时,或者当您的应用程序创建引用/嵌入视频的HTML页面时,应用程序应确定用户是否有权访问该对象
- 如果用户有权访问该对象,则应用程序会创建一个亚马逊S3预签名URL,该URL提供对私有对象的时间限制访问
- 当用户的浏览器请求通过预先签名的URL检索对象时,AmazonS3将验证URL的内容。如果URL是有效的,并且时间限制没有过期,AmazonS3将返回对象(例如视频(。如果时间已过期,则不会提供内容
预签名的URL可以在几行代码中创建,不需要API回调Amazon S3。
使用预先签名的URL的好处是您的应用程序确定谁有权查看对象。例如,用户可以选择与另一用户共享视频。您的应用程序将允许其他用户查看此共享视频。它不需要对IAM或bucket策略进行任何更改。
参见:亚马逊S3预签名URL
此外,如果您希望将对Amazon S3存储桶的访问权限授予特定IAM用户(即组织内的用户,而不是应用程序用户(,则最好在IAM用户上授予访问权限,而不是通过亚马逊S3存储桶。如果有多个用户,您可以创建一个包含多个IAM用户的IAM组,然后将策略放在IAM组上。Bucket策略通常应用于向"所有人"而非特定IAM用户授予访问权限。
通常,建议避免使用Deny
策略,因为它们可能很难正确写入,并且可能会无意中拒绝管理人员的访问权限。最好限制"允许"的内容,而不是必须将"允许"one_answers"拒绝"结合起来。