Менеджер политик безопасности

Страница “Менеджер политик безопасность” находится в разделе Кластер/Безопасность.

Страница представляет собой таблицу со списком политик безопасности, содержащую колонки:

  • Название (доступна фильтрация)
  • Дата создания (доступна сортировка)

Доступен просмотр и удаление политики.

На странице просмотра политики есть 3 вкладки: политика, лейблы и аннотации и события. Политику можно изменить с помощью YAML манифеста.

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

Рекомендуемые политики

Для добавления политики перейдите в интерфейс импорта манифеста и вставьте необходимые политики, затем нажмите “Проверить”. После успешного прохождения проверки нажмите “Загрузить”.

absence-of-cpu-requests

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  annotations:
    meta.helm.sh/release-name: shturval-policies
    meta.helm.sh/release-namespace: kyverno
    policies.kyverno.io/category: infosec
    policies.kyverno.io/description: Kubernetes обладает возможностью установки и ограничений
      на потребление ресурсов CPU запускаемыми контейнерами. В случае, если ограничения
      отсутствуют, может произойти Denial of Service (DoS), обусловленный тем, что
      pod (контейнер) будет использовать все ресурсы узла, которые ему доступны. Поэтому
      хорошей практикой считается установка параметров Request (запрос на ресурс)
      на CPU.
    policies.kyverno.io/severity: High
    policies.kyverno.io/title: CPU Requests checker
  labels:
    app.kubernetes.io/managed-by: Helm
  name: absence-of-cpu-requests
spec:
  admission: true
  background: true
  failurePolicy: Ignore
  rules:
  - match:
      any:
      - resources:
          kinds:
          - Pod
    name: check-for-cpu-requests
    skipBackgroundRequests: true
    validate:
      foreach:
      - list: request.object.spec.[initContainers, containers][]
        pattern:
          resources:
            requests:
              cpu: ?*
      message: Параметр Requests для CPU не установлен у Container/InitContainer
  schemaValidation: true
  validationFailureAction: Audit
  webhookTimeoutSeconds: 10

absence-of-ram-requests-limits

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  annotations:
    meta.helm.sh/release-name: shturval-policies
    meta.helm.sh/release-namespace: kyverno
    policies.kyverno.io/category: infosec
    policies.kyverno.io/description: Kubernetes обладает возможностью ограничения
      на потребление ресурсов RAM запускаемыми контейнерами. В случае, если такие
      параметры не установлены, возможна вероятность Denial of Service (DoS), обусловленной
      тем, что pod (контейнер) будет использовать все ресурсы узла, которые ему доступны.
      По этому хорошей практикой считается установка параметров Request (запрос на
      ресурс) и Limits (максимально допустимое количество ресурсов) на RAM.
    policies.kyverno.io/severity: High
    policies.kyverno.io/title: RAM Requests and Limits checker
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
  name: absence-of-ram-requests-limits
spec:
  admission: true
  background: true
  failurePolicy: Ignore
  rules:
  - match:
      any:
      - resources:
          kinds:
          - Pod
    name: check-for-ram-requests
    skipBackgroundRequests: true
    validate:
      foreach:
      - list: request.object.spec.[initContainers, containers][]
        pattern:
          resources:
            requests:
              memory: ?*
      message: Параметр Requests для RAM не установлен у Container/InitContainer
  - match:
      any:
      - resources:
          kinds:
          - Pod
    name: check-for-ram-limits
    skipBackgroundRequests: true
    validate:
      foreach:
      - list: request.object.spec.[initContainers, containers][]
        pattern:
          resources:
            limits:
              memory: ?*
      message: Параметр Limits для RAM не установлен у Container/InitContainer
  schemaValidation: true
  validationFailureAction: Audit
  webhookTimeoutSeconds: 10

automated-satoken-mount-used

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  annotations:
    meta.helm.sh/release-name: shturval-policies
    meta.helm.sh/release-namespace: kyverno
    policies.kyverno.io/category: infosec
    policies.kyverno.io/description: 'По умолчанию Kubernetes реализует подстановку
      ServiceAccount Token в pod. При помощи этого Token можно взаимодействовать с
      API-сервером, что НЕ требуется большинству pods. Рекомендуется отключать эту
      возможность и реализовывать ее только там, где это по-настоящему требуется.   '
    policies.kyverno.io/severity: High
    policies.kyverno.io/title: automountServiceAccountToken is set to true
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
  name: automated-satoken-mount-used
spec:
  admission: true
  background: true
  failurePolicy: Ignore
  rules:
  - match:
      any:
      - resources:
          kinds:
          - Pod
    name: check-for-automount-serviceaccount-token
    skipBackgroundRequests: true
    validate:
      message: Добавлена автоматическая подстановка ServiceAccount Token в Pod
      pattern:
        spec:
          automountServiceAccountToken: "false"
  schemaValidation: true
  validationFailureAction: Audit
  webhookTimeoutSeconds: 10

container-is-privileged

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  annotations:
    meta.helm.sh/release-name: shturval-policies
    meta.helm.sh/release-namespace: kyverno
    policies.kyverno.io/category: infosec
    policies.kyverno.io/description: 'Указанный флаг запускает контейнер в привилегированном
      режиме, что может быть использовано злоумышленником. Например, для повышения
      привилегий и развития атаки на кластер. Большинство контейнеров не требует использование
      указанного флага, поэтому рекомендуется НЕ использовать его.   '
    policies.kyverno.io/severity: High
    policies.kyverno.io/title: privileged flag in spec.containers is set to true
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
  name: container-is-privileged
spec:
  admission: true
  background: true
  failurePolicy: Ignore
  rules:
  - match:
      any:
      - resources:
          kinds:
          - Pod
    name: check-for-privileged
    skipBackgroundRequests: true
    validate:
      message: Обнаружен контейнер с флагом privileged
      pattern:
        spec:
          containers:
          - =(securityContext):
              =(privileged): "false"
  schemaValidation: true
  validationFailureAction: Audit
  webhookTimeoutSeconds: 10

default-ns-is-used

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  annotations:
    meta.helm.sh/release-name: shturval-policies
    meta.helm.sh/release-namespace: kyverno
    pod-policies.kyverno.io/autogen-controllers: none
    policies.kyverno.io/category: infosec
    policies.kyverno.io/description: 'Использование namespace с именем "default" не
      рекомендуется. Хорошей практикой считается использование специально-созданных
      namespace под нужды специалистов и/или приложений.   '
    policies.kyverno.io/severity: High
    policies.kyverno.io/title: deployment to default namespace
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
  name: default-ns-is-used
spec:
  admission: true
  background: true
  failurePolicy: Ignore
  rules:
  - match:
      resources:
        kinds:
        - Pod
    name: check-for-default-ns
    skipBackgroundRequests: true
    validate:
      message: Обнаружен ресурс в неймспейсе default
      pattern:
        metadata:
          namespace: '!default'
  - match:
      resources:
        kinds:
        - DaemonSet
        - Deployment
        - Job
        - CronJob
        - StatefulSet
    name: check-for-default-ns-pod-controller
    skipBackgroundRequests: true
    validate:
      message: Обнаружен ресурс в неймспейсе default
      pattern:
        metadata:
          namespace: '!default'
  schemaValidation: true
  validationFailureAction: Audit
  webhookTimeoutSeconds: 10

hostnetwork-is-used

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  annotations:
    meta.helm.sh/release-name: shturval-policies
    meta.helm.sh/release-namespace: kyverno
    policies.kyverno.io/category: infosec
    policies.kyverno.io/description: 'Использование параметра hostNetwork позволяет
      обойти требования сетевых политик, т.к. с точки зрения сетевого плагина рассматриваемый
      pod находится в другой сети (сеть узла).      '
    policies.kyverno.io/severity: medium
    policies.kyverno.io/title: hostNetwork is set to `true`
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
  managedFields:
  - apiVersion: kyverno.io/v1
  name: hostnetwork-is-used
spec:
  admission: true
  background: true
  failurePolicy: Ignore
  rules:
  - match:
      any:
      - resources:
          kinds:
          - Pod
    name: check-for-hostnetwork
    skipBackgroundRequests: true
    validate:
      message: 'Использована сеть узлов для Pod. Рекомендуется удалить или отключить
        параметр hostNetwork          '
      pattern:
        spec:
          =(hostNetwork): "false"
  schemaValidation: true
  validationFailureAction: Audit
  webhookTimeoutSeconds: 10

master-tolerations-are-set

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  annotations:
    meta.helm.sh/release-name: shturval-policies
    meta.helm.sh/release-namespace: kyverno
    policies.kyverno.io/category: infosec
    policies.kyverno.io/description: 'Использование tolerations позволяет запускать
      Pods на узлах, которые обладают соответствующими taints. Хорошей практикой считается
      НЕ запускать Pods на ControlPlane узлах, которые по умолчанию обладают taints:
      node-role.kubernetes.io/master:NoSchedule  '
    policies.kyverno.io/severity: Medium
    policies.kyverno.io/title: Tolerations for scheduling on ControlPlane Nodes
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
  name: master-tolerations-are-set
spec:
  admission: true
  background: true
  failurePolicy: Ignore
  rules:
  - match:
      resources:
        kinds:
        - Pod
    name: check-for-tolerations
    skipBackgroundRequests: true
    validate:
      message: Обнаружены tolerations, запустившие Pod на ControlPlane-узле с taints
        `node-role.kubernetes.io/control-plane:NoSchedule`
      pattern:
        spec:
          =(tolerations):
          - key: '!node-role.kubernetes.io/control-plane'
  schemaValidation: true
  validationFailureAction: Audit
  webhookTimeoutSeconds: 10

secrets-in-env-var

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  annotations:
    meta.helm.sh/release-name: shturval-policies
    meta.helm.sh/release-namespace: kyverno
    policies.kyverno.io/category: infosec
    policies.kyverno.io/description: 'Секреты, указываемые в качестве переменных окружения
      могут быть скомпрометированы. Рекомендуется использование сторонних систем (Secret
      Management) для управления секретами.   '
    policies.kyverno.io/severity: High
    policies.kyverno.io/title: secrets are stored in env vars
  generation: 1
  name: secrets-in-env-var
spec:
  admission: true
  background: true
  failurePolicy: Ignore
  rules:
  - match:
      any:
      - resources:
          kinds:
          - Pod
    name: check-for-secrets-in-env
    skipBackgroundRequests: true
    validate:
      foreach:
      - list: request.object.spec.[initContainers, containers][]
        pattern:
          =(env):
          - =(valueFrom):
              X(secretKeyRef): "null"
      message: Обнаружены секреты в переменных окружения
  schemaValidation: true
  validationFailureAction: Audit
  webhookTimeoutSeconds: 10

service-nodeport-used

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  annotations:
    meta.helm.sh/release-name: shturval-policies
    meta.helm.sh/release-namespace: kyverno
    policies.kyverno.io/category: infosec
    policies.kyverno.io/description: 'NodePort может быть использован для предоставления
      доступа извне кластера к приложениям. Однако, такой подход не является примером
      хороших практик и не может контролироваться при помощи NetworkPolicy. Рекомендуется
      использование альтернатив - например, Ingress, для предоставления внешнего доступа
      к приложениям кластера.   '
    policies.kyverno.io/severity: High
    policies.kyverno.io/title: service type is set to NodePort
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
  name: service-nodeport-used
spec:
  admission: true
  background: true
  failurePolicy: Ignore
  rules:
  - match:
      any:
      - resources:
          kinds:
          - Service
    name: check-for-nodeport
    skipBackgroundRequests: true
    validate:
      message: Обнаружен Service Type NodePort. Рекомендуется использовать Ingress
      pattern:
        spec:
          type: '!NodePort'
  schemaValidation: true
  validationFailureAction: Audit
  webhookTimeoutSeconds: 10

sysadmin-capabilities-used

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  annotations:
    meta.helm.sh/release-name: shturval-policies
    meta.helm.sh/release-namespace: kyverno
    policies.kyverno.io/category: infosec
    policies.kyverno.io/description: 'Указанная Linux Capability обладает крайне большими
      полномочиями (согласно документации на Linux Capabilities: CAP_SYS_ADMIN - this
      capability is overloaded, Don''t choose CAP_SYS_ADMIN if you can possibly avoid
      it!). Большинство приложений не требуют наличия этой возможности. Поэтому надо
      следить за тем, чтобы указанная capability появлялась как можно реже. Использование
      ее возможностей может привести к ИБ-проблемам, в том числе "побегу" (escape)
      из pod (container).     '
    policies.kyverno.io/severity: High
    policies.kyverno.io/title: SYS_ADMIN capability added to container
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
  name: sysadmin-capabilities-used
spec:
  admission: true
  background: true
  failurePolicy: Ignore
  rules:
  - match:
      any:
      - resources:
          kinds:
          - Pod
    name: check-for-sysadmin-capabilities-enabled
    skipBackgroundRequests: true
    validate:
      foreach:
      - deny:
          conditions:
            any:
            - key: SYS_ADMIN
              operator: AnyIn
              value: '{{ element.securityContext.capabilities.add || '''' }}'
        list: request.object.spec.[initContainers, containers][]
      message: Установлен параметр SYS_ADMIN в описании Capabilities у Container/InitContainer
  schemaValidation: true
  validationFailureAction: Audit
  webhookTimeoutSeconds: 10