我应该在 Google Kubernetes Engine 上使用哪个非 root 用户?

我应该在 Google Kubernetes Engine 上使用哪个非 root 用户?

在 Kubernetes 上将容器进程配置为以非 root 用户身份运行时,该用户是否需要存在于主机上?如果是,当主机节点由 Google Kubernetes Engine 管理时,使用哪个用户 ID 比较合适?

Google Cloud 推荐的容器操作最佳实践如下:

(...) 最佳做法是不在容器内以 root 身份运行进程。您可以使用 PodSecurityPolicy 在 Kubernetes 中强制执行此行为。在 Kubernetes 中创建 pod 时,使用 runAsUser 选项指定运行该进程的 Linux 用户。

我愿意遵循这一做法。

答案1

正如最佳实践中提到的文档,您可以使用随机用户在本地(或在 GKE 集群节点上)运行容器映像:

docker run --user $((RANDOM+1)) [你的容器]

这意味着用户可以是随机用户;因此,它不属于主机上存在的用户。你只需确保它不是 root 用户即可。

此外,您还可以查看文档并运行命令获取正在运行的容器的 shell。运行“ps aux”后,您将看到一些进程在可用用户下运行。它们可以是任何随机用户。

答案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。

相关内容