Позволяет использовать в кластере политики безопасности согласно Pod Security Standards Kubernetes. Модуль для работы использует Gatekeeper.

Pod Security Standards определяют три политики, охватывающие весь спектр безопасности. Эти политики являются кумулятивными, то есть состоящими из набора политик, и варьируются по уровню ограничений от «неограничивающего» до «ограничивающего значительно».

Модуль не применяет политики к системным пространствам имен.

Список политик, доступных для использования:

  • Privileged — неограничивающая политика с максимально широким уровнем разрешений;
  • Baseline — минимально ограничивающая политика, которая предотвращает наиболее известные и популярные способы повышения привилегий. Позволяет использовать стандартную (минимально заданную) конфигурацию пода;
  • Restricted — политика со значительными ограничениями. Предъявляет самые жесткие требования к подам.

Подробнее про каждый набор политик и их ограничения можно прочитать в документации Kubernetes.

Политика кластера используемая по умолчанию определяется следующим образом:

  • При установке Deckhouse версии ниже v1.55, для всех несистемных пространств имен используется политика по умолчанию Privileged;
  • При установке Deckhouse версии v1.55 и выше, для всех несистемных пространств имен используется политика по умолчанию Baseline;

Обратите внимание, что обновление Deckhouse в кластере на версию v1.55 не вызывает автоматической смены политики по умолчанию.

Политику по умолчанию можно переопределить как глобально (в настройках модуля), так и для каждого пространства имен отдельно (лейбл security.deckhouse.io/pod-policy=<POLICY_NAME> на соответствующем пространстве имен).

Пример установки политики Restricted для всех подов в пространстве имен my-namespace:

1kubectl label ns my-namespace security.deckhouse.io/pod-policy=restricted

По умолчанию, политики Pod Security Standards применяются в режиме “Deny” и поды приложений, не удовлетворяющие данным политикам, не смогут быть запущены. Режим работы политик может быть задан как глобально для кластера так и для каждого namespace отдельно. Что бы задать режим работы политик глобально используйте configuration. В случае если необходимо переопределить глобальный режим политик для определенного namespace, допускается использовать лейбл security.deckhouse.io/pod-policy-action =<POLICY_ACTION> на соответствующем namespace. Список допустимых режимом политик состоит из: “dryrun”, “warn”, “deny”.

Пример установки “warn” режима политик PSS для всех подов в пространстве имен my-namespace:

1kubectl label ns my-namespace security.deckhouse.io/pod-policy-action=warn

Предлагаемые модулем политики могут быть расширены. Примеры расширения политик можно найти в FAQ.

Операционные политики

Модуль предоставляет набор операционных политик и лучших практик для безопасной работы ваших приложений. Мы рекомендуем устанавливать следующий минимальный набор операционных политик:

1---
2apiVersion: deckhouse.io/v1alpha1
3kind: OperationPolicy
4metadata:
5  name: common
6spec:
7  policies:
8    allowedRepos:
9      - myrepo.example.com
10      - registry.deckhouse.io
11    requiredResources:
12      limits:
13        - memory
14      requests:
15        - cpu
16        - memory
17    disallowedImageTags:
18      - latest
19    requiredProbes:
20      - livenessProbe
21      - readinessProbe
22    maxRevisionHistoryLimit: 3
23    imagePullPolicy: Always
24    priorityClassNames:
25    - production-high
26    - production-low
27    checkHostNetworkDNSPolicy: true
28    checkContainerDuplicates: true
29  match:
30    namespaceSelector:
31      labelSelector:
32        matchLabels:
33          operation-policy.deckhouse.io/enabled: "true"

Для применения приведенной политики достаточно навесить лейбл operation-policy.deckhouse.io/enabled: "true" на желаемый namespace. Политика, приведенная в примере, рекомендована для использования командой Deckhouse. Аналогичным образом вы можете создать собственную политику с необходимыми настройками.

Политики безопасности

Модуль предоставляет возможность определять политики безопасности применимо к приложениям (контейнерам), запущенным в кластере.

Пример политики безопасности:

1---
2apiVersion: deckhouse.io/v1alpha1
3kind: SecurityPolicy
4metadata:
5  name: mypolicy
6spec:
7  enforcementAction: Deny
8  policies:
9    allowHostIPC: true
10    allowHostNetwork: true
11    allowHostPID: false
12    allowPrivileged: false
13    allowedFlexVolumes:
14    - driver: vmware
15    allowedHostPorts:
16    - max: 4000
17      min: 2000
18    allowedProcMount: Unmasked
19    allowedAppArmor:
20    - unconfined
21    allowedUnsafeSysctls:
22    - kernel.*
23    allowedVolumes:
24    - hostPath
25    - projected
26    fsGroup:
27      ranges:
28      - max: 200
29        min: 100
30      rule: MustRunAs
31    readOnlyRootFilesystem: true
32    requiredDropCapabilities:
33    - ALL
34    runAsGroup:
35      ranges:
36      - max: 500
37        min: 300
38      rule: RunAsAny
39    runAsUser:
40      ranges:
41      - max: 200
42        min: 100
43      rule: MustRunAs
44    seccompProfiles:
45      allowedLocalhostFiles:
46      - my_profile.json
47      allowedProfiles:
48      - Localhost
49    supplementalGroups:
50      ranges:
51      - max: 133
52        min: 129
53      rule: MustRunAs
54  match:
55    namespaceSelector:
56      labelSelector:
57        matchLabels:
58          enforce: mypolicy

Для применения приведенной политики достаточно навесить лейбл enforce: "mypolicy" на желаемый namespace.

Изменение ресурсов Kubernetes

Модуль также позволяет использовать custom resource’ы Gatekeeper для легкой модификации объектов в кластере, такие как:

  • AssignMetadata — для изменения секции metadata в ресурсе;
  • Assign — для изменения других полей, кроме metadata;
  • ModifySet — для добавления или удаления значений из списка, например аргументов для запуска контейнера.

Пример:

1apiVersion: mutations.gatekeeper.sh/v1
2kind: AssignMetadata
3metadata:
4  name: demo-annotation-owner
5spec:
6  match:
7    scope: Namespaced
8    namespaces: ["default"]
9    kinds:
10    - apiGroups: [""]
11      kinds: ["Pod"]
12  location: "metadata.annotations.foo"
13  parameters:
14    assign:
15      value:  "bar"

Подробнее про доступные варианты можно прочитать в документации Gatekeeper.