Mysql 容器密码安全
Mysql container password security
我有几个关于 mysql 容器中密码安全的问题。我用 mysql/mysql-server:8.0 image.
第一个问题是
根据上图在 mysql 容器中使用 MYSQL_PASSWORD env var 是否安全?
我在下面对此进行了详细说明。
我通过k8s env var注入为mysql容器设置了mysql密码,即通过env使用k8s secrets在mysql容器中设置MYSQL_PASSWORD env var k8s 清单文件中的 var。这安全吗?这是我的第一个问题。 Notes following table in this page 说使用 MYSQL_PWD(注意这不是 MYSQL_PASSWORD)env var 是非常不安全的,因为 ps cmd 可以显示 运行ning 进程和任何其他进程的环境用户可以利用它。这是否也适用于使用 MYSQL_PASSWORD 而不是 MYSQL_PWD 的容器情况?
第二题是
在同一个 mysql 容器中 运行ning mysql -h 127.0.0.1 -p${MYSQL_PASSWORD}
安全吗?
我需要 运行 在 k8s 就绪探测中使用类似的 cmd。 The warning section of this page 说 运行ning mysql -phard-coded-password
不安全。我不确定即使像上面那样使用环境变量,密码是否仍然不安全,我也不确定这个警告是否适用于容器案例。
提前致谢!
如果您的安全考虑包括保护您的数据库免受对主机具有合法登录访问权限的攻击者的攻击,那么最安全的选择是在文件中传递数据库凭据。 command-line 选项和环境变量原则上都可以通过 ps
.
看到
对于数据库容器,标准 Docker 集线器映像没有以这种方式提供凭据的路径。如果您在其他地方创建初始数据库,然后将生成的数据目录挂载到您的生产系统上(将这视为恢复备份),那么您将不需要设置任何初始数据变量。
here$ docker run -it -v "$PWD/mysql:/var/lib/mysql" -e MYSQL_PASSWORD=... mysql
^C
here$ scp -r ./mysql there:
here$ ssh there
# without any -e MYSQL_*=... options
there$ docker run -v "$PWD/mysql:/var/lib/mysql" -p 3306:3306 mysql
更广泛地说,我还要考虑另外两件事:
任何可以 运行 任何 docker
命令的人都可以非常轻松地对整个主机进行 root。因此,如果您向任何具有登录权限的人广泛授予 Docker 套接字访问权限,他们可以轻松找到凭据(如果没有别的,他们可以 docker exec
容器中的 cat
命令进行转储凭据文件)。
Docker 文件中的任何 ENV
指令将在 docker history
和 docker inspect
输出中显示给任何获得图像副本的人.切勿在您的 Docker 文件中放置任何类型的凭据!
实际上,我建议,如果您如此担心您的数据库凭据,您可能正在处理某种生产系统;如果你正在处理一个生产系统,那么可以登录它的一组人是有限且可信的。在这种情况下,环境变量设置不会向任何无法阅读的人公开凭据。
(在更具体的情况下,Kubernetes Pod 具有由 Secret 注入的环境变量,在大多数情况下,几乎没有人可以登录访问单个节点,并且 Secret 可以由 Kubernetes RBAC 保护。这是非常安全的如果设置正确,不会被窥探。)
我有几个关于 mysql 容器中密码安全的问题。我用 mysql/mysql-server:8.0 image.
第一个问题是
根据上图在 mysql 容器中使用 MYSQL_PASSWORD env var 是否安全? 我在下面对此进行了详细说明。
我通过k8s env var注入为mysql容器设置了mysql密码,即通过env使用k8s secrets在mysql容器中设置MYSQL_PASSWORD env var k8s 清单文件中的 var。这安全吗?这是我的第一个问题。 Notes following table in this page 说使用 MYSQL_PWD(注意这不是 MYSQL_PASSWORD)env var 是非常不安全的,因为 ps cmd 可以显示 运行ning 进程和任何其他进程的环境用户可以利用它。这是否也适用于使用 MYSQL_PASSWORD 而不是 MYSQL_PWD 的容器情况?
第二题是
在同一个 mysql 容器中 运行ning mysql -h 127.0.0.1 -p${MYSQL_PASSWORD}
安全吗?
我需要 运行 在 k8s 就绪探测中使用类似的 cmd。 The warning section of this page 说 运行ning mysql -phard-coded-password
不安全。我不确定即使像上面那样使用环境变量,密码是否仍然不安全,我也不确定这个警告是否适用于容器案例。
提前致谢!
如果您的安全考虑包括保护您的数据库免受对主机具有合法登录访问权限的攻击者的攻击,那么最安全的选择是在文件中传递数据库凭据。 command-line 选项和环境变量原则上都可以通过 ps
.
对于数据库容器,标准 Docker 集线器映像没有以这种方式提供凭据的路径。如果您在其他地方创建初始数据库,然后将生成的数据目录挂载到您的生产系统上(将这视为恢复备份),那么您将不需要设置任何初始数据变量。
here$ docker run -it -v "$PWD/mysql:/var/lib/mysql" -e MYSQL_PASSWORD=... mysql
^C
here$ scp -r ./mysql there:
here$ ssh there
# without any -e MYSQL_*=... options
there$ docker run -v "$PWD/mysql:/var/lib/mysql" -p 3306:3306 mysql
更广泛地说,我还要考虑另外两件事:
任何可以 运行 任何
docker
命令的人都可以非常轻松地对整个主机进行 root。因此,如果您向任何具有登录权限的人广泛授予 Docker 套接字访问权限,他们可以轻松找到凭据(如果没有别的,他们可以docker exec
容器中的cat
命令进行转储凭据文件)。Docker 文件中的任何
ENV
指令将在docker history
和docker inspect
输出中显示给任何获得图像副本的人.切勿在您的 Docker 文件中放置任何类型的凭据!
实际上,我建议,如果您如此担心您的数据库凭据,您可能正在处理某种生产系统;如果你正在处理一个生产系统,那么可以登录它的一组人是有限且可信的。在这种情况下,环境变量设置不会向任何无法阅读的人公开凭据。
(在更具体的情况下,Kubernetes Pod 具有由 Secret 注入的环境变量,在大多数情况下,几乎没有人可以登录访问单个节点,并且 Secret 可以由 Kubernetes RBAC 保护。这是非常安全的如果设置正确,不会被窥探。)