【问题标题】:Why is my Pod Security Policy not stopping the use of root user in a pod?为什么我的 Pod 安全策略没有停止在 pod 中使用 root 用户?
【发布时间】:2020-05-19 11:35:24
【问题描述】:

我正在尝试部署一个受限 psp,它应该禁止在 pod 中使用 root 用户:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: unprivilegedpolicy
spec:
  privileged: false
  allowPrivilegeEscalation: false
  requiredDropCapabilities:
    - ALL
  volumes:
    - 'configMap'
    - 'emptyDir'
    - 'projected'
    - 'secret'
    - 'downwardAPI'
    - 'persistentVolumeClaim'
  hostNetwork: false
  hostIPC: false
  hostPID: false
  runAsUser:
    rule: 'MustRunAsNonRoot'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  fsGroup:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  readOnlyRootFilesystem: false

我已将此 psp 添加到 ClusterRole 并将其绑定到命名空间 hello-world

Name:         UnPrivilegedClusterRole
Labels:       <none>
Annotations:  <none>
PolicyRule:
  Resources                   Non-Resource URLs  Resource Names        Verbs
  ---------                   -----------------  --------------        -----
  podsecuritypolicies.policy  []                 [unprivilegedpolicy]  [use]

[root@master01 ~]# kubectl describe clusterrolebindings.rbac.authorization.k8s.io HelloWorldRoleBinding
Name:         HelloWorldRoleBinding
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  ClusterRole
  Name:  UnPrivilegedClusterRole
Subjects:
  Kind   Name                    Namespace
  ----   ----                    ---------
  Group  system:serviceaccounts  hello-world

但是,如果我尝试使用 kubectl run --name=nginx hello-world 运行 ngnix 容器,该容器会以 root 用户身份成功运行。部署通过 ServiceAccount 进行部署。

PodSecurityPolicy 准入控制器已启用。

有人对此有解决方案吗?

【问题讨论】:

  • 您是否在 PSP 中尝试过 runAsUser: XXX 指令? pod 是否在正确的命名空间中创建?
  • 是的,Pod 位于正确的命名空间中,不,我没有尝试过。我认为它应该像这样工作(这个例子来自 k8 文档)
  • 请以K8S docs 为例。我设法以 nginx pod 无法生成 Error: container has runAsNonRoot and image will run as root 告终。你是如何在准入控制器中启用podsecuritypolicy 的?即使没有任何配置 pod 也不应该生成。

标签: kubernetes


【解决方案1】:

首先:

$ kubectl run --name=nginx hello-world

您没有指定 pod 的图像名称。正确的语法应该是:

$ kubectl run --image=nginx NAME_OF_DEPLOYMENT

如上所述,命令将尝试创建部署


您遇到的问题很可能与有关:

  • 不工作/打开准入控制器

在 pod 安全策略开启的新创建的 Kubernetes 集群上,无论您的权限如何,您都应该能够生成任何 pod。

Pod 安全策略控制作为可选(但推荐)admission controller 实现。 PodSecurityPolicies 由 enabling the admission controller 强制执行,但在未授权任何策略的情况下执行此操作将阻止在集群中创建任何 pod

-- Kubernetes.io: enabling pod security policies

准入控制器以及 pod 安全策略和 RBAC 与您正在使用的解决方案密切相关。您应该参考特定于您的案例的文档。

例如:

  • 新创建的 GKE 集群启用了 pod 安全且未配置任何 PSP 将不会创建 pod。它将显示一条消息:Unable to validate against any pod security policy: []

警告:如果您在未先定义和授权任何实际策略的情况下启用 PodSecurityPolicy 控制器,则任何用户、控制器或服务帐户都无法创建或更新 Pod。如果您正在使用现有集群,您应该在启用控制器之前使用defineauthorize 策略。

-- GKE: Pod security policies and how to enable/disable it

  • 使用kubespray(在 Ubuntu 上配置和运行时将 pod 安全策略变量设置为 true)新创建的 Kubernetes 集群将创建一个限制性的 PSP,并在 PSP 内有一个 MustRunAsNonRoot 参数。

NGINX pod 存在另一个问题。 NGINX 图像将尝试在 pod 内以 root 用户身份运行。使用PSP 配置的准入控制器:

runAsUser:
  rule: MustRunAsNonRoot

将通过消息:Error: container has runAsNonRoot and image will run as rootPSP 否认这一点。

要使用此策略运行 NGINX pod,您需要:

  • 使用以下命令创建一个PSP(允许在 pod 内以 root 用户身份运行):
  runAsUser:
    rule: RunAsAny
  • 创建自己的NGINX 映像,以允许以非root 用户身份运行NGINX 的方式进行配置。

以下此类 pod 示例:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: non-root-nginx
  name: non-root-nginx
spec:
  securityContext:
    runAsUser: 101
    fsGroup: 101
  containers:
  - image: nginx
    name: non-root-nginx
    volumeMounts:
    - mountPath: /var/cache/nginx
      name: edir
    - mountPath: /var/run
      name: varun
    - mountPath: /etc/nginx/conf.d/default.conf
      name: default-conf
      subPath: default.conf
  dnsPolicy: ClusterFirst
  restartPolicy: Never
  volumes:
  - name: edir
    emptyDir: {}
  - name: varun
    emptyDir: {}
  - name: default-conf
    configMap:
      name: nginx8080
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx8080
  namespace: default
data:
  default.conf: |+
    server {
        listen       8080;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

【讨论】:

    猜你喜欢
    • 2019-11-26
    • 2021-09-17
    • 1970-01-01
    • 2021-08-07
    • 2019-07-30
    • 2019-11-15
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多