S3权限配置:如何开放公共GetObject并授权EC2上的Django实例
解决AWS S3存储桶权限配置问题
问题根源分析
- 本地未配置密钥却能上传,核心原因是boto3默认凭证链机制在本地环境找到了有效凭证(比如本地AWS CLI配置的用户凭证、系统环境变量残留密钥、缓存的临时凭证等)。
- 当前桶策略仅允许公共
GetObject和IAM角色的写入/删除操作,但未明确拒绝公共用户的写入/删除权限,加上公共访问设置可能配置不当,导致权限逻辑存在漏洞。
正确配置步骤
1. 调整存储桶公共访问设置
进入S3存储桶「权限」→「阻止公共访问」页面,修改配置:
- 取消勾选「阻止所有公共访问」
- 勾选「阻止新的公共存储桶策略」(防止后续误配置全公开策略)
- 不勾选「拒绝公共访问通过任何存储桶策略」(否则公共
GetObject策略会被直接拒绝) - 勾选「阻止跨账户访问,如果存储桶有公共策略」(增强安全性,可选)
2. 修正存储桶策略
更新桶策略,明确拒绝公共用户的写入/删除操作,同时保留公共读权限和IAM角色的完整操作权限:
{ "Version": "2012-10-17", "Id": "Policy1683280060839", "Statement": [ // 允许所有用户执行GetObject { "Sid": "AllowPublicGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-project-bucket-2023/*" }, // 拒绝所有公共用户的写入/删除,仅指定IAM角色例外 { "Sid": "DenyPublicWriteDelete", "Effect": "Deny", "Principal": "*", "Action": [ "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::my-project-bucket-2023/*", "Condition": { "StringNotEquals": { "aws:PrincipalArn": "arn:aws:iam::667802944954:role/MyProject" } } }, // 允许指定IAM角色执行所有需要的操作 { "Sid": "AllowEC2RoleFullObjectAccess", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::667802944954:role/MyProject" }, "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::my-project-bucket-2023/*" } ] }
说明:拒绝语句优先级高于允许语句,能确保非授权用户无法执行写入/删除操作,仅指定IAM角色可例外。
3. 清理本地环境的意外凭证
boto3会自动从以下位置加载凭证,需彻底清理:
- 删除本地
~/.aws/credentials文件中的多余/无效凭证 - 检查系统环境变量,清除残留的
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY - 重启Django服务,确保新配置生效
4. 验证IAM角色权限
绑定到EC2实例的MyProject角色需同时拥有IAM层面的权限(桶策略+IAM策略为逻辑与关系),在IAM控制台编辑该角色的权限策略,添加:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::my-project-bucket-2023/*" } ] }
配置验证
- 公共访问测试:用浏览器或
curl访问存储桶对象URL,确认能正常下载 - 本地写入测试:清理本地凭证后尝试上传文件,应收到权限拒绝错误
- EC2 Django测试:在EC2实例中运行应用,确认能正常上传、下载、删除文件
内容的提问来源于stack exchange,提问作者BKO
相关产品推荐
相关产品推荐

