【问题标题】:Kubernetes: My PodSecurityPolicy is not working or misconfiguredKubernetes:我的 PodSecurityPolicy 不起作用或配置错误
【发布时间】:2020-01-23 13:40:50
【问题描述】:

我正在尝试限制除少数 pod 之外的所有 pod 以特权模式运行。

所以我创建了两个 Pod 安全策略: 一种允许运行特权容器,一种用于限制特权容器。

[root@master01 vagrant]# kubectl get psp
NAME         PRIV    CAPS   SELINUX    RUNASUSER   FSGROUP    SUPGROUP   READONLYROOTFS   VOLUMES
privileged   true           RunAsAny   RunAsAny    RunAsAny   RunAsAny   false            *
restricted   false          RunAsAny   RunAsAny    RunAsAny   RunAsAny   false            *

创建了可以使用 pod 安全策略“restricted”的集群角色,并将该角色绑定到集群中的所有服务帐户

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: psp-restricted
rules:
- apiGroups: ['policy']
  resources: ['podsecuritypolicies']
  verbs:     ['use']
  resourceNames:
  - restricted
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: psp-restricted
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: psp-restricted
subjects:
- kind: Group
  name: system:serviceaccounts
  apiGroup: rbac.authorization.k8s.io

现在我以“特权”模式部署一个 pod。但它正在部署。创建的 pod 注释表明在 pod 创建期间验证了 psp“特权”。这是为什么 ?受限制的 PSP 应该得到验证吗?

apiVersion: v1
kind: Pod
metadata:
  name: psp-test-pod
  namespace: default
spec:
  serviceAccountName: default
  containers:
    - name: pause
      image: k8s.gcr.io/pause
      securityContext:
        privileged: true
[root@master01 vagrant]# kubectl create -f pod.yaml
pod/psp-test-pod created
[root@master01 vagrant]# kubectl get pod psp-test-pod -o yaml |grep kubernetes.io/psp
    kubernetes.io/psp: privileged

Kubernetes 版本:v1.14.5

我在这里错过了什么吗?任何帮助表示赞赏。

【问题讨论】:

    标签: kubernetes kubernetes-pod


    【解决方案1】:

    发布我自己问题的答案。希望它会帮助某人

    我所有的 PodSecurityPolicy 配置都是正确的。问题是,我试图自己部署一个 pod,而不是通过任何控制器管理器,如 Deployment/Replicaset/Daemonset 等。 大多数 Kubernetes pod 不是由用户直接创建的。相反,它们通常是作为 Deployment、ReplicaSet 或其他模板化控制器的一部分通过控制器管理器间接创建的。

    对于自己部署的 Pod,Pod 是由 kubectl 创建的,而不是由控制器管理器创建的。

    在 Kubernetes 中有一个名为“cluster-admin”的超级用户角色。就我而言,kubectl 以超级用户角色“cluster-admin”运行。此“集群管理员”角色有权访问所有 pod 安全策略。因为,要将 pod 安全策略关联到角色,我们需要使用 'use' 动词并在 'apiGroups' 中将 'resources' 设置为 'podsecuritypolicy'

    在集群管理员角色中,“resources”*包括“podsecuritypolicies”和“verbs”*包括“use”。因此,所有策略也将强制执行 cluster-admin 角色。

    [root@master01 vagrant]# kubectl get clusterrole cluster-admin -o yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      annotations:
        rbac.authorization.kubernetes.io/autoupdate: "true"
      labels:
        kubernetes.io/bootstrapping: rbac-defaults
      name: cluster-admin
    rules:
    - apiGroups:
      - '*'
      resources:
      - '*'
      verbs:
      - '*'
    - nonResourceURLs:
      - '*'
      verbs:
      - '*'
    

    pod.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: psp-test-pod
      namespace: default
    spec:
      serviceAccountName: default
      containers:
        - name: pause
          image: k8s.gcr.io/pause
          securityContext:
            privileged: true
    

    我使用命令kubectl create -f pod.yaml部署了上面的pod.yaml 由于我创建了两个 pod 安全策略,一个用于限制,一个用于特权,因此 cluster-admin 角色可以访问这两个策略。因此,上面的 pod 可以使用 kubectl 正常启动,因为 cluster-admin 角色可以访问特权策略(privileged: false 也可以,因为 admin 角色也可以访问限制策略)。仅当由 kubectl 而不是由 kube 控制管理器直接创建的 pod 或 pod 可以通过 serviceaccount 访问“cluster-admin”角色时,才会发生这种情况

    如果是 Deployment/Replicaset 等创建的 Pod,首先 kubectl 将控制权交给控制器管理器,然后控制器会在验证权限(serviceaccount,podsecuritypolicies)后尝试部署 Pod

    在下面的部署文件中,pod 正在尝试以特权模式运行。就我而言,此部署将失败,因为我已经将“受限”策略设置为集群中所有服务帐户的默认策略。所以没有 pod 能够以特权模式运行。如果 pod 需要以特权模式运行,请允许该 pod 的 serviceaccount 使用“特权”策略

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: pause-deploy-privileged
      namespace: kube-system
      labels:
        app: pause
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: pause
      template:
        metadata:
          labels:
            app: pause
        spec:
          serviceAccountName: default
          containers:
          - name: pause
            image: k8s.gcr.io/pause
            securityContext:
              privileged: true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多