【发布时间】:2019-09-07 20:30:19
【问题描述】:
这是我想要的设置:
我想使用 Amazon S3 存储桶来存储用户上传的所有照片 在我的应用中。
这些照片都不应被公众访问。这些都是 受保护的照片,只有授权用户可以查看它们,没有用户 将能够直接从 S3 存储桶访问它们。
每次用户想要查看照片时,他们的 GET 请求都会到达 我的服务器的 api 路由,它将进行授权检查,如果 他们有权限,我的服务器将联系 S3 存储桶,获取 图像,然后我的服务器将此图像返回给用户。
基本上,我的应用用户永远不会直接访问 S3 存储桶,只有我的服务器有权访问 S3 存储桶进行 GET、PUT 和 DELETE,其他人应该无法看到我的 S3 存储桶中的任何内容。
这是我目前所做的:
使用
"AmazonS3FullAccess"策略创建 IAM 用户。在我的 S3 存储桶中禁用所有公共访问。
创建了以下存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::myapp"
],
"Principal": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::myapp/*"
],
"Principal": "*"
}
]
}
会发生什么?
当我粘贴上面的内容时,我收到
Access Denied错误。当我对此进行搜索时,答案建议我应该取消选中
"Block public access to buckets and objects granted through new public bucket policies"当我取消选中上述选项时,Amazon 控制台不断显示警告,指出提供对我的存储桶的公共访问是不安全的。
虽然我能够在启用公共访问后保存上述存储桶策略,但控制台中显示的有关具有公共访问权限的警告令人担忧。
所以,我真的不想在我的存储桶中允许公共访问。我只希望我的服务器中的 Laravel 应用程序使用 IAM 凭证来访问和获取图像,并且其他人不应有权访问此 S3 存储桶。
我已经阅读了很多关于此的链接,但我仍然对此感到困惑。
我的问题是:
在我的使用案例中,如果我只想允许 1 个 IAM 用户以编程方式访问存储桶列表,是否需要启用对我的存储桶的公开访问?
我还需要设置存储桶策略吗?由于我在创建 IAM 用户时已经设置了策略,这还不够吗?
如果我还需要添加存储桶策略,我应该将 Principal 保留为
*还是需要在此处添加User ARB?我能否在不启用公共访问权限的情况下添加存储桶策略?
我是否可以安全地执行上述步骤,还是我遗漏了什么?
【问题讨论】:
标签: amazon-web-services laravel-5 amazon-s3 amazon-iam