Как расширить политики Pod Security Standards?

Pod Security Standards реагируют на label security.deckhouse.io/pod-policy: restricted или security.deckhouse.io/pod-policy: baseline.

Чтобы расширить политику Pod Security Standards, добавив к существующим проверкам политики свои собственные, необходимо:

  • создать шаблон проверки (ресурс ConstraintTemplate);
  • привязать его к политике restricted или baseline.

Пример шаблона для проверки адреса репозитория образа контейнера:

1apiVersion: templates.gatekeeper.sh/v1
2kind: ConstraintTemplate
3metadata:
4  name: k8sallowedrepos
5spec:
6  crd:
7    spec:
8      names:
9        kind: K8sAllowedRepos
10      validation:
11        openAPIV3Schema:
12          type: object
13          properties:
14            repos:
15              type: array
16              items:
17                type: string
18  targets:
19    - target: admission.k8s.gatekeeper.sh
20      rego: |
21        package d8.pod_security_standards.extended
22        violation[{"msg": msg}] {
23          container := input.review.object.spec.containers[_]
24          satisfied := [good | repo = input.parameters.repos[_] ; good = startswith(container.image, repo)]
25          not any(satisfied)
26          msg := sprintf("container <%v> has an invalid image repo <%v>, allowed repos are %v", [container.name, container.image, input.parameters.repos])
27        }
28        violation[{"msg": msg}] {
29          container := input.review.object.spec.initContainers[_]
30          satisfied := [good | repo = input.parameters.repos[_] ; good = startswith(container.image, repo)]
31          not any(satisfied)
32          msg := sprintf("container <%v> has an invalid image repo <%v>, allowed repos are %v", [container.name, container.image, input.parameters.repos])
33        }

Пример привязки проверки к политике restricted:

1apiVersion: constraints.gatekeeper.sh/v1beta1
2kind: K8sAllowedRepos
3metadata:
4  name: prod-repo
5spec:
6  match:
7    kinds:
8      - apiGroups: [""]
9        kinds: ["Pod"]
10    namespaceSelector:
11      matchLabels:
12        security.deckhouse.io/pod-policy: restricted
13  parameters:
14    repos:
15      - "mycompany.registry.com"

Пример демонстрирует настройку проверки адреса репозитория в поле image у всех подов, создающихся в пространстве имен, имеющих label security.deckhouse.io/pod-policy: restricted. Если адрес в поле image создаваемого пода начинается не с mycompany.registry.com, под создан не будет.

Подробнее о шаблонах и языке политик можно узнать в документации Gatekeeper.

Больше примеров описания проверок для расширения политики можно найти в библиотеке Gatekeeper.

Что, если несколько политик (операционных или безопасности) применяются на один объект?

В таком случае необходимо, чтобы конфигурация объекта соответствовала всем политикам, которые на него распространяются.

Например, рассмотрим две следующие политики безопасности:

1apiVersion: deckhouse.io/v1alpha1
2kind: SecurityPolicy
3metadata:
4  name: foo
5spec:
6  enforcementAction: Deny
7  match:
8    namespaceSelector:
9      labelSelector:
10        matchLabels:
11          name: test
12  policies:
13    readOnlyRootFilesystem: true
14    requiredDropCapabilities:
15    - MKNOD
16---
17apiVersion: deckhouse.io/v1alpha1
18kind: SecurityPolicy
19metadata:
20  name: bar
21spec:
22  enforcementAction: Deny
23  match:
24    namespaceSelector:
25      labelSelector:
26        matchLabels:
27          name: test
28  policies:
29    requiredDropCapabilities:
30    - NET_BIND_SERVICE

Тогда для выполнения требований приведенных политик безопасности в спецификации контейнера нужно указать:

1    securityContext:
2      capabilities:
3        drop:
4          - MKNOD
5          - NET_BIND_SERVICE
6      readOnlyRootFilesystem: true