环境变量不是保险箱
把密码与令牌放进环境变量并不是安全的保管方式:容器的环境变量可以通过检查命令完整读出,宿主上对应进程的环境文件同样能读到,异常时的内存转储与应用日志也可能带出这些值。更稳妥的做法是只读文件挂载、编排平台的密钥机制,或构建期专用的密钥通道。
基本信息
| 风险面 | 检查命令输出、宿主进程环境文件、崩溃转储、日志 |
|---|---|
| 检测方式 | 用检查命令输出容器的环境变量清单 |
| 缓解手段 | 只读文件挂载、编排密钥机制、构建期密钥通道 |
| 构建期注意 | 不要用构建参数传密钥 |
| 适用平台 | 容器运行时与各编排平台 |
典型使用场景
- 上线前排查容器环境变量里是否含敏感值
- 把流水线中的密钥从构建参数改为专用密钥通道
- 事故复盘时确认凭据是否通过日志或转储外泄
- 制定密钥注入规范,统一走文件或密钥机制
- 审计存量服务,逐步替换环境变量里的密码
检查与替代
检查与替代
docker inspect -f '{{json .Config.Env}}' web # 看环境变量里有什么
docker exec web sh -c 'xargs -0 -n1 < /proc/1/environ | head -20' # 容器内进程环境
docker run -d --env-file ./app.env --name api app/api:1.4.2 # 至少改用文件注入
ls -l ./app.env # 注入文件本身也要控制权限泄露路径与控制
| 泄露路径 | 说明 | 控制方式 |
|---|---|---|
| 检查命令输出 | 环境变量明文可见 | 改用文件挂载或密钥机制 |
| 宿主进程环境 | 同宿主账号可读 | 限制登录权限并做审计 |
| 容器内环境文件 | 容器内进程可读 | 敏感文件用只读挂载 |
| 日志与转储 | 调试输出可能带出 | 规范禁止打印敏感值 |
构建期与运行期的密钥通道要分开治理:构建期不要用构建参数传密钥,因为它们会留在镜像层与构建历史里。
让应用打印全部环境变量的调试做法要保持警惕,很多凭据泄露正是从这一步开始的。