![我应该在 Google Kubernetes Engine 上使用哪个非 root 用户?](https://linux22.com/image/727673/%E6%88%91%E5%BA%94%E8%AF%A5%E5%9C%A8%20Google%20Kubernetes%20Engine%20%E4%B8%8A%E4%BD%BF%E7%94%A8%E5%93%AA%E4%B8%AA%E9%9D%9E%20root%20%E7%94%A8%E6%88%B7%EF%BC%9F.png)
在 Kubernetes 上将容器进程配置为以非 root 用户身份运行时,该用户是否需要存在于主机上?如果是,当主机节点由 Google Kubernetes Engine 管理时,使用哪个用户 ID 比较合适?
Google Cloud 推荐的容器操作最佳实践如下:
(...) 最佳做法是不在容器内以 root 身份运行进程。您可以使用 PodSecurityPolicy 在 Kubernetes 中强制执行此行为。在 Kubernetes 中创建 pod 时,使用 runAsUser 选项指定运行该进程的 Linux 用户。
我愿意遵循这一做法。
答案1
答案2
目前接受的答案暗示您可以设置任何随机的非 root UID 并且一切顺利。我想为未来的读者澄清一点。
首先,为了确保每个人都在同一页面上,Kubernetes 目前不支持用户命名空间这个问题。尽管它现在是 Linux 内核的一个特性,而且DockersecurityContext
。因此,在 Kubernetes 中,当您使用UID指定 pod 或容器时runAsUser
,该 UID 将是主机节点和容器内使用的 UID。这引出了您的问题(也是我在研究之前的问题):您应该使用什么 UID?
首先,是的,每个人都同意它不应该是 root(UID 0)。但它不能是完全随机 UID。如果 UID 与现有用户(例如无密码 sudo 权限)冲突,则该用户实际上为 root。然而,这不是唯一糟糕的情况,例如,您也不希望 UID 与 MySQL 数据库用户冲突。因此,您希望分配一个 UID,该 UID 要么 a) 尚未分配任何用户,要么 b) 分配给您为此目的在主机上专门创建的用户。
使用 Google Kubernetes Engine,如果您使用容器优化操作系统映像运行,则 UID 值似乎有一个约定:
从 [2000, 4999] 范围中选择一个 ID,以避免与其他用户帐户冲突。
[1]https://cloud.google.com/container-optimized-os/docs/how-to/create-configure-instance
检查我们的一个 GKE 节点,这似乎是正确的,因为我看到 SSH 用户被分配了从 5000 开始的 UID。因此在我们的 GKE 集群上,我们刚刚为我们的容器分配了 UID/GID 2000。