Mysql容器密码安全



我有几个关于mysql容器密码安全的问题。我使用mysql/mysql-server:8.0 image.

第一个问题是

使用MYSQL_PASSWORD env var在mysql容器基于上面的图像安全吗?我将在下面详细说明。

我通过k8s的env var注入为mysql容器设置mysql密码,即使用k8s的秘密通过k8s manifest文件中的env var在mysql容器中设置MYSQL_PASSWORD env var。这安全吗?这是我的第一个问题。下面的表说明使用MYSQL_PWD(注意这不是MYSQL_PASSWORD) env var是非常不安全的,因为ps cmd可以显示运行进程的环境,任何其他用户都可以利用它。这是否也适用于使用MYSQL_PASSWORD而不是MYSQL_PWD的容器情况?

第二个问题

在同一个mysql容器中运行mysql -h 127.0.0.1 -p${MYSQL_PASSWORD}是安全的吗?

我需要在k8s就绪探针中运行类似的cmd。本页的警告部分说运行mysql -phard-coded-password是不安全的。我不确定密码是否仍然不安全,即使像上面那样使用env var,我也不确定这个警告是否适用于容器情况。

提前感谢!

如果您的安全考虑包括保护您的数据库免受具有合法登录访问主机的攻击者的攻击,那么最安全的选择是在文件中传递数据库凭据。命令行选项和环境变量,原则上都是通过ps可见的。

对于数据库容器,标准Docker Hub映像没有路径以这种方式提供凭据。如果您在其他地方创建初始数据库,然后将结果数据目录挂载到您的生产系统上(将此视为恢复备份),那么您不需要设置任何初始数据变量。

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

更广泛地说,这里还有两件事我要考虑:

  1. 任何可以运行任何docker命令的人都可以很容易地root整个主机。因此,如果你广泛地授予Docker套接字访问任何具有登录权限的人,他们可以很容易地找到凭据(如果没有别的,他们可以在容器中docker execcat命令来转储凭据文件)。

  2. Dockerfile中的任何ENV指令都可以在docker historydocker inspect输出中看到,任何人都可以获得图像的副本。永远不要在你的Dockerfile中放任何凭证!

实际上,我建议,如果你这么关心你的数据库凭据,你可能正在处理某种生产系统;如果您处理的是生产系统,那么可以登录该系统的人员是有限且可信的。在这种情况下,环境变量设置不会将凭证暴露给任何无法读取它的人。

(在Kubernetes Pod的更具体的情况下,通过Secret注入环境变量,在大多数情况下,几乎没有人可以登录访问单个节点,并且Secret可以由Kubernetes RBAC保护。如果设置正确,这是非常安全的,不会被窥探。

最新更新