level 11
随意使用 root 和特权可能会带来不必要的风险。下面说说特权与 root 运行方式的不同之处以及特权的实际意义。
2021年06月28日 05点06分
1
level 11
熟悉 Unix 系统的人(例如 macOS、Linux)都习惯于通过使用 sudo 随意提升我们的特权给 root 用户。在调试开发工具或尝试编辑受保护目录中的文件时,经常会发生这种情况,许多人在第一次尝试之后,执行命令不成功,都会默认使用 sudo。
2021年06月28日 05点06分
2
level 11
Docker 允许其在主机操作系统上隔离进程、功能和文件系统,并且实际上,大多数容器默认以 root 身份运行。为了示例,本文将使用 DockerHub 上的三个最受欢迎镜像。
Postgres:
$ docker run -it postgres
#whoami
root
#id -u
0
Couchbase:
$ docker run -it couchbase sh
#whoami
root
#id -u
0
Alpine:
$ docker run -it alpine sh
#whoami
root
#id -u
0
我们可以看到,默认情况下,大多数镜像都以 root 用户身份运行。通常这可以简化调试过程,尤其是在我们要 exec 到容器时。尽管 root 用户的 Linux 功能非常有限,但最好还是避免以 root 用户身份运行。
2021年06月28日 05点06分
3
level 11
尽管在容器内部以 root 身份运行是非常正常的事,但是如果我们想要强化容器,仍然需要避免这种情况。首先,违反了最小特权原则,其次,更严格地说,容器将成为运行 Docker 命令的同一用户命名空间的一部分,并且如果容器能够转义,它将可以访问 volume、socket 等资源。
有两种避免以 root 用户身份运行的方法。
通过调整 Dockerfile 以使用特定用户:
// Dockerfile
FROM microsoft/windowsservercore
# Create Windows user in the container
RUN net user /add patrick
# Set it for subsequent commands
USER patrick
在运行时重写 User ID:
$ docker run -it --user 4000 postgres sh
# whoami
whoami: cannot find name for user ID 4000
# id -u
4000
2021年06月28日 05点06分
4
level 11
到此为止,我们了解了一些有关 root 和 --privileged flag 的信息,以及它们与“主机”操作系统的关系。无论我们是否想限制容器的安全性或调试问题,都需要确保应用程序安全。防御安全性需要深度防御(像洋葱一层一层的保护)并减少攻击面,通过不以 root 身份运行,不以特权身份运行以及添加 SecurityContext 和 PodSecurityPolicies 是实现更高容器安全性的四个主要方面。
2021年06月28日 05点06分
6