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

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

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

При использовании Deckhouse версии >= 1.55, модуль по умолчанию работает в режиме Baseline. В связи с этим, init-контейнеры Istio не могут добавить необходимые правила для перехвата прикладного трафика и Поды не могут запуститься. Решение — либо поменять политику по умолчанию на Restricted, либо выставить эту политику для отдельного приложения с помощью лейбла security.deckhouse.io/pod-policy=privileged на прикладной Namespace.

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

  • 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:

kubectl 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:

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

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

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

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

---
apiVersion: deckhouse.io/v1alpha1
kind: OperationPolicy
metadata:
  name: common
spec:
  policies:
    allowedRepos:
      - myrepo.example.com
      - registry.deckhouse.io
    requiredResources:
      limits:
        - memory
      requests:
        - cpu
        - memory
    disallowedImageTags:
      - latest
    requiredProbes:
      - livenessProbe
      - readinessProbe
    maxRevisionHistoryLimit: 3
    imagePullPolicy: Always
    priorityClassNames:
    - production-high
    - production-low
    checkHostNetworkDNSPolicy: true
    checkContainerDuplicates: true
  match:
    namespaceSelector:
      labelSelector:
        matchLabels:
          operation-policy.deckhouse.io/enabled: "true"

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

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

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

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

---
apiVersion: deckhouse.io/v1alpha1
kind: SecurityPolicy
metadata:
  name: mypolicy
spec:
  enforcementAction: Deny
  policies:
    allowHostIPC: true
    allowHostNetwork: true
    allowHostPID: false
    allowPrivileged: false
    allowedFlexVolumes:
    - driver: vmware
    allowedHostPorts:
    - max: 4000
      min: 2000
    allowedProcMount: Unmasked
    allowedAppArmor:
    - unconfined
    allowedUnsafeSysctls:
    - kernel.*
    allowedVolumes:
    - hostPath
    - projected
    fsGroup:
      ranges:
      - max: 200
        min: 100
      rule: MustRunAs
    readOnlyRootFilesystem: true
    requiredDropCapabilities:
    - ALL
    runAsGroup:
      ranges:
      - max: 500
        min: 300
      rule: RunAsAny
    runAsUser:
      ranges:
      - max: 200
        min: 100
      rule: MustRunAs
    seccompProfiles:
      allowedLocalhostFiles:
      - my_profile.json
      allowedProfiles:
      - Localhost
    supplementalGroups:
      ranges:
      - max: 133
        min: 129
      rule: MustRunAs
  match:
    namespaceSelector:
      labelSelector:
        matchLabels:
          enforce: mypolicy

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

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

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

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

Пример:

apiVersion: mutations.gatekeeper.sh/v1
kind: AssignMetadata
metadata:
  name: demo-annotation-owner
spec:
  match:
    scope: Namespaced
    namespaces: ["default"]
    kinds:
    - apiGroups: [""]
      kinds: ["Pod"]
  location: "metadata.annotations.foo"
  parameters:
    assign:
      value:  "bar"

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