如何在django-storages中配置AWS短期凭证以提升安全性?
Django-Storages 结合 AWS 短期安全凭证的实现方案
很多开发者已经成功用 django-storages 实现了短期凭证模式,下面是具体的实现思路和建议:
关于 AWS_SESSION_TOKEN 的使用
这个配置就是用来传入短期凭证会话令牌的,需要和 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 配合使用。当你通过 IAM 角色获取到包含这三个值的短期凭证后,直接在 Django 配置中设置即可:
AWS_ACCESS_KEY_ID = "临时访问密钥ID" AWS_SECRET_ACCESS_KEY = "临时秘密访问密钥" AWS_SESSION_TOKEN = "会话令牌" AWS_STORAGE_BUCKET_NAME = "你的存储桶名称" DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
自动刷新过期凭证的方案
短期凭证会过期,手动更新配置不现实,推荐两种可行方式:
- 利用 AWS SDK 自动刷新:如果你的应用部署在 EC2/EKS/ECS 等 AWS 服务上,直接给实例或任务附加目标 IAM 角色即可。boto3(django-storages 底层依赖)会自动从元数据服务获取并刷新短期凭证,无需手动配置任何密钥,只需要设置存储桶名称和后端即可。
- 自定义存储后端实现刷新逻辑:如果必须通过 IAM 用户承担角色,可以继承
S3Boto3Storage,重写凭证获取逻辑,调用 STS 的assume_role接口获取凭证,并根据过期时间实现自动刷新。示例代码片段:
from storages.backends.s3boto3 import S3Boto3Storage import boto3 from botocore.exceptions import ClientError class AutoRefreshingS3Storage(S3Boto3Storage): def _get_session(self): sts_client = boto3.client('sts') try: response = sts_client.assume_role( RoleArn="你的IAM角色ARN", RoleSessionName="django-s3-session" ) # 更新凭证信息 self.access_key = response['Credentials']['AccessKeyId'] self.secret_key = response['Credentials']['SecretAccessKey'] self.session_token = response['Credentials']['SessionToken'] # 可根据 response['Credentials']['Expiration'] 实现定时刷新逻辑 except ClientError as e: raise RuntimeError(f"获取短期凭证失败: {e}") return super()._get_session()
之后在配置中指定自定义存储后端:DEFAULT_FILE_STORAGE = "你的应用模块.AutoRefreshingS3Storage"
关于 AWS_S3_SESSION_PROFILE 的说明
这个配置是用来指定本地 AWS 配置文件(~/.aws/credentials)中的会话配置文件,适合本地开发测试场景。如果你通过 aws sts assume-role 生成了会话配置并保存在本地凭证文件中,设置该参数可以让 django-storages 直接使用对应短期凭证,但不适合生产环境的自动刷新需求。
额外建议
- 生产环境优先使用 AWS 服务内置的 IAM 角色(如 EC2 实例角色),无需管理任何密钥,安全性最高,且凭证刷新完全自动化。
- 若必须使用 IAM 用户承担角色,要严格遵循最小权限原则,仅给该用户授予
sts:AssumeRole到目标 S3 访问角色的权限,无其他额外权限。 - 测试阶段可以先用 AWS CLI 手动执行
aws sts assume-role获取凭证,填入 Django 配置验证 S3 访问是否正常,再推进自动刷新逻辑的开发。
内容的提问来源于stack exchange,提问作者colioli
相关产品推荐
相关产品推荐

