You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:02:47