Docker 容器环境变量安全
- 2025-06-25 18:53:00
- 丁国栋
- 原创 17
有时我们会注意到有这样的情形,在容器中一个应用可以读取的环境变量与shell环境读取的环境变量不同,例如应用可以读取某个环境变量,而登录shell则无法读取,这在一定程度上增加了环境变量的安全性。那么这种安全的设计是如何实现的呢?
常见的一种方式是 进程环境隔离 的方式,在启动业务进程之前,先启动一个启动器程序(作为容器的entrypoint),在启动器程序中设置环境变量,将这个环境变量再传递给业务进程(在 Linux/容器中,环境变量默认从父进程继承,但子进程可以独立修改自己的环境,且不会反向影响父进程或兄弟进程)。这样的优势是可以把业务进程使用的较为敏感的环境变量以二进制的方式储存再启动器程序里,而启动器程序可以使用编译语言如Go编写,这样用户即使登录到shell也无法查看这些注入给业务进程的环境变量,但有一个严重的问题在于一旦使用这种方式,那么在登录shell中环境变量可以通过查看业务进程的环境变量文件读取到(例如读取 /proc/<pid>/environ文件),为了解决这个问题,登录shell的用户需要限制为与业务进程不同的用户,但这种方式也不是保险的,因为可以在启动容器的登录shell时指定根用户启动(docker exec -it --user root my_container /bin/sh)。
最佳实践建议
- 永远不要在代码、脚本中硬编码敏感信息
- 使用最小权限原则
- 定期轮换凭据
- 考虑使用临时令牌而非长期有效的凭据
- 在代码库中考虑使用.gitignore排除包含敏感信息的文件
- 增加审计手段,确保每个敏感操作是可审计的以及是被审计的
发表评论