如何以非 root 用户运行 Docker 容器
需要用 root 用户运行 Docker?
组织中,经常以 Root 用户运行 Docker 中的容器。但是你的工作负载真的需要 root 权限吗?显然很少。尽管如此,默认情况下,你的容器仍将以 root 用户身份运行。但这可能会带来严重的安全问题。实际上,如果以 root 用户运行容器内部的进程,就是以 root 用户身份运行主机的进程。这就为那些恶意访问主机的攻击者,提供了机会。
只需在常用的任何镜像上使用以下命令,你就可以自己查看它使用的用户身份,
显然,作为最佳实践,我们应该避免以超级用户身份运行容器。因此,让我们看看如何以非 root 用户身份运行容器。
将非 root 用户添加到 Dockerfile
你可以在 Dockerfile 中使用 RUN 命令创建用户,这个用户仅具有容器内工作负载所需的权限。
上面的命令行创建了一个用户newuser
, 并指定了用户登录后使用的主目录和 shell 。如下所示,将用户添加到你的 Dockerfile 中:
从第 5 行开始,每个命令都是以newuser
身份而不是 root 身份运行。是不是很简单?
但是,我们并不总是仅使用自定义镜像。我们还使用了许多第三方镜像,因此我们无法像上面那样将 root 权限的用户注入其中。
这些第三方 Docker 镜像默认情况下将以 root 用户身份运行,除非我们对其进行处理。如果你使用不知名来源中的镜像,那么该镜像很可能嵌入了恶意命令,这就可能会影响集群的安全性。
Kubernetes 中 Pod 安全上下文和 Pod 安全策略,可以帮助我们以非 root 身份运行三方镜像。
使用 Pod 安全上下文
你可以使用 Pod 安全上下文,将 Pod 的执行限制为特定的非 root 用户。通过在 Pod 规范中添加一个字段securityContext
,就可以为 Pod 指定这些安全设置 。
在以上规范中,我们创建了一个为非 root 的用户,runAsUser
指定 Pod 内的任何容器 仅以 userID 为5000
的运行。runAsGroup
指定的容器内所有进程的组 ID。否则,则组 ID 将是 0。
现在,你可以创建此 pod 并检查容器中运行的进程:
如上所示,PID 1 正在以 userID 为 5000 的用户而不是 root 用户身份运行。
使用 Kubernetes Pod 安全策略
Kubernetes Pod 安全策略定义了 Pod 必须运行的条件。换句话说,如果不满足这些条件,Kubernetes 将阻止 Pod 运行。
PodSecurityPolicy 示例:
该安全策略实现以下目的:
限制容器在特权模式下运行。
限制需要根目录的容器。
仅允许容器 NFS 存储卷。
仅允许容器访问主机端口 8000。
应用:
查看:
现在已经创建了策略,你可以通过尝试以 root 特权运行容器来对其进行测试。
pod 安全策略将禁止其运行,并给出错误消息:
结论
在这篇文章中,我强调了默认设置下,使用 root 用户运行 Docker 容器有着固有风险。我还提出了多种方法来克服这种风险。
如果你正在运行自定义镜像,请创建一个新的非 root 用户并在 Dockerfile 中指定它。
如果使用的是第三方镜像,则可以在容器或容器级别设置安全上下文。
还有一种方法是创建一个 Pod 安全策略,该策略将不允许任何容器以 root 特权运行。
译文链接: https://dzone.com/articles/docker-without-root-privileges
版权声明: 本文为 InfoQ 作者【琦彦】的原创文章。
原文链接:【http://xie.infoq.cn/article/c1d5ee4ceadc5311f76b5e925】。文章转载请联系作者。
评论