Django应用中存储AWS凭证的最佳实践及安全方案咨询
Django + AWS 凭证存储最佳实践
核心底线
永远不要将硬编码的AWS凭证提交到版本控制系统(如Git),这是所有方案的前提。
推荐方案
1. 环境变量(通用首选)
boto3会自动读取系统环境变量中的AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,Django也可以通过os.environ.get()获取这些值。
- 本地开发:使用
.env文件配合python-dotenv包,将.env加入.gitignore避免提交。示例:# settings.py import os from dotenv import load_dotenv load_dotenv() # 加载本地.env文件 AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID') AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY') - 生产环境:直接在服务器、容器或部署平台的环境变量配置中设置凭证,无需修改代码。
2. IAM角色(AWS部署场景最优)
如果你的Django应用部署在AWS服务(EC2、ECS、EKS、Elastic Beanstalk等)上,完全不需要手动存储凭证:
- 给实例/服务分配具有S3访问权限的IAM角色,boto3会自动从AWS实例元数据服务(IMDS)获取临时凭证,且凭证会自动轮换。
- 代码无需任何凭证配置,直接初始化客户端即可:
boto3.client('s3') - 安全性最高,彻底避免了凭证泄露风险。
3. AWS本地凭证文件(本地开发便捷选项)
本地开发时,可使用默认路径~/.aws/credentials的文件存储凭证,boto3会自动读取:
- 文件格式示例:
[default] aws_access_key_id = YOUR_ACCESS_KEY aws_secret_access_key = YOUR_SECRET_KEY - 如需多环境切换,可配置多个profile,代码中指定即可:
boto3.client('s3', profile_name='dev')
4. AWS Secrets Manager(敏感场景集中管理)
虽然你认为它更适合其他密钥,但Secrets Manager也可用于存储AWS凭证,适合需要集中管理、自动轮换凭证的场景:
- 给应用分配访问Secrets Manager的IAM角色,避免硬编码凭证;
- 应用启动时从Secrets Manager拉取凭证,再初始化S3客户端。
关于settings.py的安全性说明
- 硬编码凭证到settings.py绝对不安全:一旦文件被提交到版本库或服务器被入侵,凭证直接泄露;
- 通过环境变量读取到settings.py是安全的:此时settings.py中仅包含读取逻辑,没有实际凭证内容,只要环境变量配置安全,就不存在风险。
内容的提问来源于stack exchange,提问作者Jaimee-lee Lincoln
相关产品推荐
相关产品推荐

