Позволяет использовать в кластере политики безопасности согласно 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.