在docker中隐藏/混淆环境参数

Ser*_*nov 6 mysql docker

我使用mysql图像作为示例,但问题是通用的.

用于在docker中启动mysqld的密码在docker ps中不可见,但它在docker inspect中可见:

sudo docker run --name mysql-5.7.7 -e MYSQL_ROOT_PASSWORD=12345 -d mysql:5.7.7

CONTAINER ID        IMAGE               COMMAND                   CREATED             STATUS              PORTS               NAMES
b98afde2fab7        mysql:5.7.7         "/entrypoint.sh mysq   6 seconds ago       Up 5 seconds        3306/tcp            mysql-5.7.7

sudo docker inspect b98afde2fab75ca433c46ba504759c4826fa7ffcbe09c44307c0538007499e2a

"Env": [
        "MYSQL_ROOT_PASSWORD=12345",
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        "MYSQL_MAJOR=5.7",
        "MYSQL_VERSION=5.7.7-rc"
    ]
Run Code Online (Sandbox Code Playgroud)

有没有办法隐藏/混淆启动容器时传递的环境参数.或者,是否可以通过引用文件传递敏感参数?

Adr*_*uat 8

奇怪的是,我只是写了一篇关于此的文章.

我建议不要使用环境变量存储机密,主要是因为迪奥戈莫妮卡在这里概述的原因; 它们在太多地方可见(链接容器,docker检查,子进程),并且可能最终出现在调试信息和问题报告中.我不认为使用环境变量文件将有助于缓解任何这些问题,尽管它会阻止值保存到shell历史记录中.

相反,你可以在一个卷中传递你的秘密,例如:

$ docker run -v $(pwd)/my-secret-file:/secret-file ....
Run Code Online (Sandbox Code Playgroud)

如果您真的想要使用环境变量,可以将其作为要获取的脚本传递,这至少会将其从检查和链接容器中隐藏(例如CMD source /secret-file && /run-my-app).

使用卷的主要缺点是您可能会意外地将文件检入版本控制.

更好但更复杂的解决方案是从密钥值存储(例如etcd(带crypt),keywhizVault)获取它.

  • 文件卷的一个变体是中央配置管理存储,例如 Etcd 或 Consul。另请参阅旨在安全保存机密的保险库项目。来自构建 consul 的同一个人,并且可以与其一起部署。这是一个很难正确解决的问题:https://vaultproject.io/ (2认同)

use*_*097 1

您说“或者,是否可以通过引用文件来传递敏感参数?”,摘自文档http://docs.docker.com/reference/commandline/run/ --env-file=[] Read in a file of environment variables

  • 很确定这在 docker 检查和任何链接的容器中仍然可见。 (7认同)