Kubernetes: мой PodSecurityPolicy не работает или неправильно настроен - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь ограничить запуск всех модулей за исключением нескольких в привилегированном режиме.

Итак, я создал две политики безопасности 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            *

Создана роль кластера, которая может использовать политику безопасности модуля «ограничено» и привязана к этой роли для всех учетных записей служб в кластере

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, указывающая, что psp "привилегированный" был проверен во время создания pod.Почему это ?ограниченная 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

Я что-то здесь упускаю?Любая помощь приветствуется.

1 Ответ

0 голосов
/ 25 сентября 2019

Размещение ответа на свой вопрос.Надеюсь, это поможет кому-то

Все мои конфигурации PodSecurityPolicy верны.Проблема заключалась в том, что я пытался развернуть модуль самостоятельно, а не с помощью какого-либо диспетчера контроллеров, такого как Deployment / Replicaset / Daemonset и т. Д. Большинство модулей Kubernetes не создаются непосредственно пользователями.Вместо этого они обычно создаются косвенно как часть Deployment, ReplicaSet или другого шаблонного контроллера с помощью диспетчера контроллеров.

В случае модуля, развернутого своим собственным модулем, модуль создается kubectl, а не диспетчером контроллера.

В Kubernetes есть одна роль суперпользователя с именем «cluster-admin».В моем случае kubectl работает с ролью суперпользователя «cluster-admin».Эта роль «cluster-admin» имеет доступ ко всем политикам безопасности модуля.Потому что, чтобы связать политику безопасности pod с ролью, нам нужно использовать глаголы 'use' и установить для 'resources' значение 'podsecuritypolicy' в 'apiGroups'

В роли администратора кластера 'resources' * include«podsecuritypolicies» и «глаголы» * включают «use».Таким образом, все политики также будут применяться к роли администратора кластера.

[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

Я развернул вышеупомянутый pod.yaml с помощью команды kubectl create -f pod.yaml Поскольку я создал две политики безопасности pod для ограничения и одну для привилегий,Роль кластера-администратора имеет доступ к обеим политикам.Таким образом, вышеприведенный модуль будет нормально запускаться с kubectl, потому что роль кластера-администратора имеет доступ к привилегированной политике (привилегированный: ложь также работает, потому что роль администратора также имеет доступ к политике ограничения).Эта ситуация возникает, только если модуль, созданный непосредственно kubectl, а не менеджерами управления кубом, или модуль имеет доступ к роли «cluster-admin» через serviceaccount

В случае модуля, созданного с помощью Deployment / Replicaset и т. Д...first kubectl передает управление диспетчеру контроллеров, затем контроллер попытается развернуть модуль после проверки прав доступа (serviceaccount, podsecuritypolicies)

В приведенном ниже файле развертывания модуль пытается запустить модуль в привилегированном режиме.,В моем случае это развертывание не удастся, потому что я уже установил «ограниченную» политику в качестве политики по умолчанию для всех учетных записей служб в кластере.Таким образом, ни один модуль не сможет работать в привилегированном режиме.Если модуль должен работать в привилегированном режиме, разрешите служебной учетной записи этого модуля использовать «привилегированную» политику

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
...