如何在 Kubernetes 的 Pod/容器中以非 root 用户身份登录

4

我正在尝试使用kubectl exec命令登录到一个Kubernetes pod。我成功了,但是它将我作为root用户登录。我还创建了一些其他用户作为系统构建的一部分。

使用的命令是"kubectl exec -it /bin/bash"。我想这意味着在pod上运行/bin/bash,导致进入容器的shell。

请问有人能指导我以下内容吗:

  1. 如何使用非root用户登录?
  2. 是否有一种方法禁用root用户登录?
  3. 如何将我们组织的LDAP绑定到容器中?

如果需要更多信息,请让我知道。

谢谢,

Anurag


通常情况下,您不会与Kubernetes pod或容器建立交互式连接。你的高级目标是什么? - David Maze
@DavidMaze - 感谢您的关注!在大多数情况下,如果出现任何问题,重建Pod是有意义的。然而,我们正在尝试将IBM MQ作为中间件/集成消息解决方案运行在可能被许多应用程序共享的域中。在排除此产品故障时,我们经常需要运行一些交互式命令来查找根本原因。另外,作为共享基础设施组件,它不会绑定到特定的应用程序。因此,我们需要至少一些团队能够登录并执行操作。我们不希望他们以root身份登录。因此正在寻找解决方案。 - Anurag
3个回答

3

您可以使用su - <用户名>作为非root用户登录。

运行cat /etc/passwd以获取所有可用用户的列表,然后识别一个具有有效shell编译器的用户,例如

/bin/bash/bin/sh

具有/bin/nologin/bin/false设置编译器的用户由系统进程使用,因此无法以它们身份登录。


1
这些步骤需要已经登录到Pod中。问题是如何首先登录到Pod中。 - castel

2

我认为这是由于容器用户是root,所以当您使用kubectl exec进入时,默认用户为root。如果您使用非root运行容器或pod,则kubectl exec将不会是root。


@BaiChua - 我们能在 Kubernetes 中以非 root 用户身份运行容器吗?我了解所有容器都是以 root 用户身份运行的。 - Anurag
当然可以。最佳实践是以非 root 用户身份运行。这不仅适用于 Kubernetes,事实上,即使是普通的 Docker 容器也必须以非 root 用户身份运行,除非有充分的理由需要以 root 用户身份运行。 - Bal Chua

1
在大多数情况下,Kubernetes Pod 中的 Docker 容器只运行一个进程。没有其他进程可以提供身份验证或授权功能。您可以尝试在一个容器中运行具有几个嵌套进程的包装器,但这会破坏容器化的思想,即以最小的开销运行不可变的应用程序代码。 kubectl exec 在相同的容器环境中运行另一个进程,并且没有选项可以为此进程设置用户 ID。
但是,您可以使用 docker exec 并使用附加选项来执行此操作:
--user , -u    Username or UID (format: <name|uid>[:<group|gid>])

无论如何,这两篇文章可能对您在Kubernetes集群中运行IBM MQ有所帮助。


感谢您花时间回答这个问题。是的,在容器内不运行多个进程似乎是合理的。 我还考虑使用入口点脚本安装LDAP和IBM MQ; 但是,如果我按照这种模式进行操作,我将开始使用各种监视代理和其他组件。 这将类似于构建完整的虚拟机,并且在发生故障时,pod重新启动时间会受到影响。 此外,我认为,正如您提到的那样,使用docker可以作为非root用户登录,但是使用Kubernetes则不行。 - Anurag
因此,看起来限制访问Pod的最佳方式是通过Kubernetes安全性。或者,如果使用运行托管Kubernetes的云提供商,则可以利用云的身份验证和访问管理功能。基本上,我们应该仅向外部组提供有限的列表访问权限,并向内部管理员用户提供管理员访问权限(以便他们可以执行Pod);所有这些都使用Kubernetes。我的理解正确吗?这通常是行业解决此问题的方式吗?还是一般情况下根本不被视为问题? - Anurag
在业界中,给予最少必要权限是一种常见的做法。请查看我最近关于集群安全性的回答:https://dev59.com/S63la4cB1Zd3GeqPQaoD#51879760 - VAS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接