【问题标题】:kubernetes securitycontext runAsNonRoot Not workingkubernetes securitycontext runAsNonRoot 不工作
【发布时间】:2020-08-14 08:56:15
【问题描述】:

我正在使用 securityContext 进行测试,但是当我将 runAsNonRoot 设置为 true 时,我无法启动 pod。 我使用 vagrant 以用户 abdelghani 的身份将一个 master 和两个 minions 和 ssh 部署到主机:

id $USER
uid=1001(abdelghani) gid=1001(abdelghani) groups=1001(abdelghani),27(sudo)

集群信息:

Kubernetes 版本:4.4.0-185-generic 正在使用的云:(如果不在公共云上,则放置裸机) 安装方式:手动 主机操作系统:ubuntu16.04.6 CNI 和版本: 显色指数和版本:

apiVersion: v1
kind: Pod
metadata:
  name: buggypod
spec:
  containers:
  - name: container
    image: nginx
    securityContext:        
      runAsNonRoot: true

我愿意: kubectl apply -f pod.yml 它说创建了 pod mybugypod 但是当我检查时: kubectl 获取 pod pod 的状态是 CreateContainerConfigError

我做错了什么?

【问题讨论】:

  • 您能否运行“kubectl describe pod ”并与我们分享该输出?目前还不清楚为什么它现在失败了。不要忘记以某种格式包装输出,以便我们可以阅读它。
  • 正如@Rohit 指出的那样,这是因为 nginx 映像需要以 root 身份启动。我尝试使用busybox,它在用户存在于图像中的条件下工作(例如用户65534)

标签: security kubernetes


【解决方案1】:

我尝试根据您的要求运行 pod。它失败的原因是 Nginx 需要修改 root 拥有的 /etc/ 中的某些配置,当您运行 AsNonRoot 时它会失败,因为它无法编辑 Nginx 默认配置。

这是您在运行时实际遇到的错误。

10-listen-on-ipv6-by-default.sh: error: can not modify /etc/nginx/conf.d/default.conf (read-only file system?)
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2020/08/13 17:28:55 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
2020/08/13 17:28:55 [emerg] 1#1: mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)
nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)

我运行的规范。

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: buggypod
  name: buggypod
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
  containers:
  - image: nginx
    name: buggypod
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

我的建议是您使用 Dockerfile 创建一个自定义 Nginx 映像,该映像还创建用户并为新创建的文件夹 /var/cache/nginx、/etc/nginx/conf.d、/var/log/nginx 提供权限创建的用户。这样您就可以实现以非根用户身份运行容器。

【讨论】:

    【解决方案2】:

    默认情况下,Nginx 服务将期望对其配置路径 (/etc/nginx) 具有读写权限,非 root 用户将拥有对其失败原因的路径的访问权限。 您刚刚设置了 runAsNonRoot,但您不能期望或保证容器将以用户 1001 身份启动服务。请尝试将 runAsUser 显式设置为 1001,如下所示,这应该可以解决您的问题。

    apiVersion: v1
    kind: Pod
    metadata:
      name: buggypod
    spec:
      containers:
        - name: container
          image: nginx
          securityContext:        
            runAsUser: 1001 
    

    【讨论】:

    • 谢谢@Kiruba。实际上,用户应该存在于图像中而不是主机中。在 nginx 的情况下,该用户需要 root 权限
    猜你喜欢
    • 2019-05-25
    • 2019-01-03
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2017-11-27
    相关资源
    最近更新 更多