为什么我的Pod安全策略没有停止在Pod中使用root用户?

时间:2020-02-03 17:01:17

标签: kubernetes

我正在尝试部署受限制的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准入控制器。

有人对此有解决方案吗?

1 个答案:

答案 0 :(得分:0)

首先:

$ kubectl run --name=nginx hello-world

您未指定窗格的图像名称。正确的语法应为:

$ kubectl run --image=nginx NAME_OF_DEPLOYMENT

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


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

  • 无法使用/打开准入控制器

在具有Pod安全策略开启的新创建的Kubernetes集群上,无论您具有什么特权,都应该不能生成任何Pod。

Pod安全策略控制作为可选的(但建议使用)admission controller实现。 enabling the admission controller强制执行PodSecurityPolicies,但是在未授权任何策略的情况下执行会阻止在集群中创建任何Pod

- Kubernetes.io: enabling pod security policies

准入控制器以及Pod安全策略和RBAC与正在使用的解决方案紧密相关。您应参考针对您案例的文档。

例如:

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

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

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

  • 新创建的带有kubespray的Kubernetes集群(在Provisioning上运行并在Ubuntu上运行时,pod安全策略变量设置为true)将创建一个限制性PSP,并且它将具有一个MustRunAsNonRoot参数在PSP中。

NGINX窗格还有另一个问题。 NGINX图片将尝试以root用户的身份在广告连播中运行。 PSP的访问控制器配置为:

runAsUser:
  rule: MustRunAsNonRoot

会根据Error: container has runAsNonRoot and image will run as root拒绝消息PSP

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

  • 使用以下方法创建PSP(将以root用户身份在pod中运行):
  runAsUser:
    rule: RunAsAny
  • 创建自己的NGINX映像,其配置方式允许以非root用户身份运行NGINX

以下此类广告连播的示例:

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;
        }