Kyverno
Модуль Kyverno - это механизм управления политиками безопасности кластера с помощью Custom Resources.
1. Основные возможности
-
Управление политиками. Определение и применение политик к ресурсам.
-
Admission‑контроль. Проверка (validate) и изменение (mutate) ресурсов при создании и обновлении.
-
Фоновое сканирование. Непрерывная проверка существующих ресурсов на соответствие политикам
-
Отчеты по политикам. Формирование отчетов о соблюдении политик.
-
Обработка исключений. Определение исключений из политик для отдельных случаев.
Более подробное описание Kyverno представлено в официальном репозитории.
2. Установка
2.1. Предварительные условия
-
У вас есть доступ к кластеру с учетной записью, имеющей роль cluster-admin в Kubernetes.
-
Вы установили утилиту kubectl для работы с Kubernetes.
2.2. Установка с помощью kubectl
-
Установите оператор kyverno-operator. Для этого сохраните представленный ниже манифест в файл, например
KyvernoOperator.yaml.Пример манифеста для установки kyverno-operator
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: kyverno-operator namespace: kyverno-operator spec: channel: stable installPlanApproval: Automatic name: kyverno-operator source: nova-catalog sourceNamespace: nova-operatorhub startingCSV: kyverno-operator.v1.13.1 -
Установите манифест в кластер Kubernetes, выполнив команду:
kubectl apply -f KyvernoOperator.yaml -
Проверьте состояние оператора после установки.
kubectl get pods -n nova-operatorsПример вывода:NAME READY STATUS RESTARTS AGE kyverno-operator-6f4fd9d5d4-69nvf 1/1 Running 1 (44h ago) 5dУбедитесь, что оператор находится в статусе
Running. В столбцеREADYдолжно быть1/1.
|
Ограничения при создании и обновлении:
|
2.2.1. Использование CEL-валидации (запрет сервисов типа NodePort)
ClusterPolicy с CEL-выражениями позволяет описывать валидацию декларативно на языке Common Expression Language. Данный пример запрещает создание и обновление в кластере сервисов типа NodePort.
Сохраните предоставленный манифест в файл, например, restrict-nodeport.yaml.
Пример манифеста
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: restrict-nodeport-cel
annotations:
policies.kyverno.io/title: Disallow NodePort in CEL expressions
policies.kyverno.io/category: Best Practices in CEL
spec:
validationFailureAction: Enforce (1)
background: true (2)
rules:
- name: validate-nodeport (3)
match: (4)
any: (5)
- resources:
kinds: (6)
- Service
operations: (7)
- CREATE
- UPDATE
validate: (8)
cel:
expressions: (9)
- expression: "has(object.spec.type) ? (object.spec.type != 'NodePort') : true" (10)
message: "Services of type NodePort are not allowed."
| 1 | spec.validationFailureAction (тип: string) - действие при нарушении правил валидации для всех правил политики. Допустимые значения: Audit — разрешить запрос, зафиксировать нарушение в отчете; Enforce — отклонить запрос. |
| 2 | spec.background (тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике. |
| 3 | spec.rules[].name (тип: string) - уникальное имя правила в рамках политики. |
| 4 | spec.rules[].match (тип: ResourceFilter) - условия применения правила (обязательное поле). |
| 5 | spec.rules[].match.any (тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию). |
| 6 | spec.rules[].match.any[].resources.kinds (тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service). |
| 7 | spec.rules[].match.any[].resources.operations (тип: []string) - операции, к которым применяется правило: CREATE, UPDATE, DELETE, CONNECT. |
| 8 | spec.rules[].validate (тип: Validation) - правило валидации ресурса. |
| 9 | spec.rules[].validate.cel.expressions (тип: []CELExpression) - CEL-выражения для валидации. Каждое содержит expression и message. |
| 10 | spec.rules[].validate.cel.expressions[].expression (тип: string) - CEL-выражение для проверки условия. |
Установите манифест в кластер Kubernetes, выполнив команду:
kubectl apply -f restrict-nodeport.yaml
2.2.2. Использование pattern в валидации (требование resource requests и limits)
ClusterPolicy с валидацией через pattern проверяет структуру ресурса с помощью overlay-паттерна. Символ ?* означает поле обязательно и не может быть пустым. Данный пример запрещает создание подов, контейнеры которых не задают requests и limits на CPU и память.
Сохраните предоставленный манифест в файл, например, require-resources.yaml.
Пример манифеста
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-resources
annotations:
policies.kyverno.io/title: Require CPU and memory requests/limits
policies.kyverno.io/category: Best Practices
spec:
validationFailureAction: Enforce (1)
background: true (2)
rules:
- name: require-resources-containers (3)
match: (4)
any: (5)
- resources:
kinds: (6)
- Pod
validate: (7)
message: "Each container must set cpu and memory requests and limits." (8)
pattern: (9)
spec:
containers:
- resources:
requests:
cpu: "?*" (10)
memory: "?*" (11)
limits:
cpu: "?*" (12)
memory: "?*" (13)
initContainers:
- resources:
limits:
cpu: '?*' (14)
memory: '?*' (15)
requests:
cpu: '?*' (16)
memory: '?*' (17)
| 1 | spec.validationFailureAction (тип: string) - действие при нарушении правил валидации для всех правил политики. Допустимые значения: Audit — разрешить запрос, зафиксировать нарушение в отчете; Enforce — отклонить запрос. |
| 2 | spec.background (тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике. |
| 3 | spec.rules[].name (тип: string) - уникальное имя правила в рамках политики. |
| 4 | spec.rules[].match (тип: ResourceFilter) - условия применения правила (обязательное поле). |
| 5 | spec.rules[].match.any (тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию). |
| 6 | spec.rules[].match.any[].resources.kinds (тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service). |
| 7 | spec.rules[].validate (тип: Validation) - правило валидации ресурса. |
| 8 | spec.rules[].validate.message (тип: string) - сообщение об ошибке, возвращаемое при нарушении. |
| 9 | spec.rules[].validate.pattern (тип: object) - overlay-паттерн для проверки структуры ресурса. Ресурс должен соответствовать указанной структуре. |
| 10 | spec.containers[].resources.requests.cpu (тип: string) - обязательное поле, не может быть пустым. Запрос CPU для контейнера. |
| 11 | spec.containers[].resources.requests.memory (тип: string) - обязательное поле, не может быть пустым. Запрос памяти для контейнера. |
| 12 | spec.containers[].resources.limits.cpu (тип: string) - обязательное поле, не может быть пустым. Лимит CPU для контейнера. |
| 13 | spec.containers[].resources.limits.memory (тип: string) - обязательное поле, не может быть пустым. Лимит памяти для контейнера. |
| 14 | spec.initContainers[].resources.limits.cpu (тип: string) - обязательное поле, не может быть пустым. Лимит CPU для init-контейнера. |
| 15 | spec.initContainers[].resources.limits.memory (тип: string) - обязательное поле, не может быть пустым. Лимит памяти для init-контейнера. |
| 16 | spec.initContainers[].resources.requests.cpu (тип: string) - обязательное поле, не может быть пустым. Запрос CPU для init-контейнера. |
| 17 | spec.initContainers[].resources.requests.memory (тип: string) - обязательное поле, не может быть пустым. Запрос памяти для init-контейнера. |
Установите манифест в кластер Kubernetes, выполнив команду:
kubectl apply -f require-resources.yaml
2.2.3. Использование foreach в валидации (ограничение реестров образов и запрет тега latest)
ClusterPolicy с foreach позволяет применять валидацию к каждому элементу списка внутри ресурса (например, к каждому контейнеру в поде). Первая политика запрещает использование образов не из реестра hub.nova-platform.io/registry. Вторая политика запрещает использование тега latest и образов без тега.
Сохраните предоставленный манифест в файл, например, restrict-image-registries.yaml.
Пример манифеста
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: restrict-image-registries
annotations:
policies.kyverno.io/title: Restrict image registries
policies.kyverno.io/category: Supply Chain Security
spec:
validationFailureAction: Enforce (1)
background: true (2)
rules:
- name: allowed-registries (3)
match: (4)
any: (5)
- resources:
kinds: (6)
- Pod
validate:
message: "Images must be pulled only from hub.nova-platform.io/registry." (7)
foreach: (8)
- list: "request.object.spec.containers" (9)
preconditions: (10)
all:
- key: "{{ element.image }}"
operator: NotEquals
value: ""
deny: (11)
conditions: (12)
any:
- key: "{{ element.image }}"
operator: NotEquals
value: "hub.nova-platform.io/registry/*"
---
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-latest-tag
annotations:
policies.kyverno.io/title: Disallow latest tag
policies.kyverno.io/category: Supply Chain Security
spec:
validationFailureAction: Enforce (1)
background: true (2)
rules:
- name: no-latest-tag (3)
match: (4)
any: (5)
- resources:
kinds: (6)
- Pod
validate:
message: "Using tag 'latest' or no tag is not allowed. Use a specific version." (7)
foreach: (8)
- list: "request.object.spec.containers" (9)
deny: (10)
conditions: (11)
any:
- key: "{{ element.image }}"
operator: Equals
value: "*:latest"
- key: "{{ element.image }}"
operator: NotEquals
value: "*:*"
| 1 | spec.validationFailureAction (тип: string) - действие при нарушении: Audit (разрешить запрос, зафиксировать нарушение) или Enforce (отклонить запрос). |
| 2 | spec.background (тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике. |
| 3 | spec.rules[].name (тип: string) - уникальное имя правила в рамках политики. |
| 4 | spec.rules[].match (тип: ResourceFilter) - условия применения правила (обязательное поле). |
| 5 | spec.rules[].match.any (тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию). |
| 6 | spec.rules[].match.any[].resources.kinds (тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service). |
| 7 | spec.rules[].validate.message (тип: string) - сообщение об ошибке, возвращаемое при нарушении. |
| 8 | spec.rules[].validate.foreach (тип: []ForEachValidation) - итерация по элементам списка внутри ресурса. |
| 9 | spec.rules[].validate.foreach[].list (тип: string) - JMESPath-выражение, возвращающее список элементов для итерации. |
| 10 | spec.rules[].validate.foreach[].preconditions (тип: Conditions) - условия применения правила к каждому элементу. |
| 11 | spec.rules[].validate.foreach[].deny (тип: object) - условия отклонения для каждого элемента. |
| 12 | spec.rules[].validate.foreach[].deny.conditions (тип: Conditions) - условия отклонения запроса (any/all с операторами сравнения). |
Установите манифест в кластер Kubernetes, выполнив команду:
kubectl apply -f restrict-image-registries.yaml
2.2.4. Использование anyPattern в валидации (запрет запуска контейнеров от root)
ClusterPolicy с anyPattern позволяет описать несколько допустимых конфигураций: ресурс считается валидным, если он соответствует хотя бы одному из паттернов. Данный пример запрещает запуск подов от имени root-пользователя. Под считается валидным, если либо spec.securityContext.runAsNonRoot: true задано на уровне пода, либо securityContext.runAsNonRoot: true задано на уровне каждого контейнера.
Сохраните предоставленный манифест в файл, например, require-run-as-non-root.yaml.
Пример манифеста
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-run-as-non-root
annotations:
policies.kyverno.io/title: Require runAsNonRoot
policies.kyverno.io/category: Pod Security Standards
spec:
validationFailureAction: Enforce (1)
background: true (2)
rules:
- name: check-runasnonroot (3)
match: (4)
any: (5)
- resources:
kinds: (6)
- Pod
validate:
message: >- (7)
Running as root is not allowed. Either the field spec.securityContext.runAsNonRoot
must be set to `true`, or all containers must set securityContext.runAsNonRoot to `true`.
anyPattern: (8)
- spec:
securityContext:
runAsNonRoot: true (9)
=(ephemeralContainers):
- =(securityContext):
=(runAsNonRoot): true (10)
=(initContainers):
- =(securityContext):
=(runAsNonRoot): true (11)
containers:
- =(securityContext):
=(runAsNonRoot): true (12)
- spec:
=(ephemeralContainers):
- securityContext:
runAsNonRoot: true (13)
=(initContainers):
- securityContext:
runAsNonRoot: true (14)
containers:
- securityContext:
runAsNonRoot: true (15)
| 1 | spec.validationFailureAction (тип: string) - действие при нарушении: Audit (разрешить запрос, зафиксировать нарушение) или Enforce (отклонить запрос). |
| 2 | spec.background (тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике. |
| 3 | spec.rules[].name (тип: string) - уникальное имя правила в рамках политики. |
| 4 | spec.rules[].match (тип: ResourceFilter) - условия применения правила (обязательное поле). |
| 5 | spec.rules[].match.any (тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию). |
| 6 | spec.rules[].match.any[].resources.kinds (тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service). |
| 7 | spec.rules[].validate.message (тип: string) - сообщение об ошибке, возвращаемое при нарушении. |
| 8 | spec.rules[].validate.anyPattern (тип: []object) - список паттернов: ресурс должен соответствовать хотя бы одному. |
| 9 | spec.securityContext.runAsNonRoot (тип: bool) - должно быть true на уровне пода (первый паттерн). |
| 10 | spec.ephemeralContainers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого ephemeral-контейнера. |
| 11 | spec.initContainers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого init-контейнера. |
| 12 | spec.containers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого контейнера. |
| 13 | spec.ephemeralContainers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого ephemeral-контейнера (второй паттерн). |
| 14 | spec.initContainers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого init-контейнера (второй паттерн). |
| 15 | spec.containers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого контейнера (второй паттерн). |
Установите манифест в кластер Kubernetes, выполнив команду:
kubectl apply -f require-run-as-non-root.yaml
2.3. Установка с помощью Nova Console
Установите модуль Kyverno через Nova Console OperatorHUB. Для этого выполните следующие шаги.
-
Установите оператор Kyverno Operator. В Nova Console в главном меню выберите Operators → OperatorHUB. Выберите Kyverno Operator. Нажмите кнопку Установить.
Заполните поля формы по примеру, представленному на скриншоте.
Подтвердите установку, нажав Установить.
-
Перейдите в раздел Operators → Установленные операторы. Выберите Kyverno Operator или сразу после установки нажмите Открыть оператор.
-
Перейдите ко вкладке ClusterPolicy и нажмите на кнопку Создать ClusterPolicy.
-
Заполнить настройки ClusterPolicy можно двумя способами:
-
С помощью формы
Заполните обязательные поля:
-
Имя - уникальное имя правила
-
Match - определяет, когда следует применять это правило политики. Критерии соответствия могут включать информацию о ресурсе (например, тип, имя, пространство имен, метки) и информацию о запросе на проверку доступа, такую как имя пользователя или роль. Требуется, по крайней мере, один тип.
-
Kinds - типы ресурсов Kubernetes (например, Pod, Deployment, Service). Укажите тип ресурса в поле Значение. Так же ресурсу можно задать имя в поле name.
-
subjects - субъекты (пользователи, группы, service accounts). Обязательным под данным заголовком является поле Имя - это метка для идентификации правила, она должна быть уникальной в рамках политики.
-
-
С помощью манифеста
Ниже предложены примеры манифестов для ClusterPolicy.
Использование CEL-валидации (запрет сервисов типа NodePort)
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: restrict-nodeport-cel annotations: policies.kyverno.io/title: Disallow NodePort in CEL expressions policies.kyverno.io/category: Best Practices in CEL spec: validationFailureAction: Enforce (1) background: true (2) rules: - name: validate-nodeport (3) match: (4) any: (5) - resources: kinds: (6) - Service operations: (7) - CREATE - UPDATE validate: (8) cel: expressions: (9) - expression: "has(object.spec.type) ? (object.spec.type != 'NodePort') : true" (10) message: "Services of type NodePort are not allowed."1 spec.validationFailureAction(тип: string) - действие при нарушении правил валидации для всех правил политики. Допустимые значения:Audit— разрешить запрос, зафиксировать нарушение в отчете;Enforce— отклонить запрос.2 spec.background(тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике.3 spec.rules[].name(тип: string) - уникальное имя правила в рамках политики.4 spec.rules[].match(тип: ResourceFilter) - условия применения правила (обязательное поле).5 spec.rules[].match.any(тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию).6 spec.rules[].match.any[].resources.kinds(тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service).7 spec.rules[].match.any[].resources.operations(тип: []string) - операции, к которым применяется правило: CREATE, UPDATE, DELETE, CONNECT.8 spec.rules[].validate(тип: Validation) - правило валидации ресурса.9 spec.rules[].validate.cel.expressions(тип: []CELExpression) - CEL-выражения для валидации. Каждое содержит expression и message.10 spec.rules[].validate.cel.expressions[].expression(тип: string) - CEL-выражение для проверки условия.Использование pattern в валидации (требование resource requests и limits)
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: require-resources annotations: policies.kyverno.io/title: Require CPU and memory requests/limits policies.kyverno.io/category: Best Practices spec: validationFailureAction: Enforce (1) background: true (2) rules: - name: require-resources-containers (3) match: (4) any: (5) - resources: kinds: (6) - Pod validate: (7) message: "Each container must set cpu and memory requests and limits." (8) pattern: (9) spec: containers: - resources: requests: cpu: "?*" (10) memory: "?*" (11) limits: cpu: "?*" (12) memory: "?*" (13) initContainers: - resources: limits: cpu: '?*' (14) memory: '?*' (15) requests: cpu: '?*' (16) memory: '?*' (17)1 spec.validationFailureAction(тип: string) - действие при нарушении правил валидации для всех правил политики. Допустимые значения:Audit— разрешить запрос, зафиксировать нарушение в отчете;Enforce— отклонить запрос.2 spec.background(тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике.3 spec.rules[].name(тип: string) - уникальное имя правила в рамках политики.4 spec.rules[].match(тип: ResourceFilter) - условия применения правила (обязательное поле).5 spec.rules[].match.any(тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию).6 spec.rules[].match.any[].resources.kinds(тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service).7 spec.rules[].validate(тип: Validation) - правило валидации ресурса.8 spec.rules[].validate.message(тип: string) - сообщение об ошибке, возвращаемое при нарушении.9 spec.rules[].validate.pattern(тип: object) - overlay-паттерн для проверки структуры ресурса. Ресурс должен соответствовать указанной структуре.10 spec.containers[].resources.requests.cpu(тип: string) - обязательное поле, не может быть пустым. Запрос CPU для контейнера.11 spec.containers[].resources.requests.memory(тип: string) - обязательное поле, не может быть пустым. Запрос памяти для контейнера.12 spec.containers[].resources.limits.cpu(тип: string) - обязательное поле, не может быть пустым. Лимит CPU для контейнера.13 spec.containers[].resources.limits.memory(тип: string) - обязательное поле, не может быть пустым. Лимит памяти для контейнера.14 spec.initContainers[].resources.limits.cpu(тип: string) - обязательное поле, не может быть пустым. Лимит CPU для init-контейнера.15 spec.initContainers[].resources.limits.memory(тип: string) - обязательное поле, не может быть пустым. Лимит памяти для init-контейнера.16 spec.initContainers[].resources.requests.cpu(тип: string) - обязательное поле, не может быть пустым. Запрос CPU для init-контейнера.17 spec.initContainers[].resources.requests.memory(тип: string) - обязательное поле, не может быть пустым. Запрос памяти для init-контейнера.Использование foreach в валидации (ограничение реестров образов и запрет тега latest)
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: restrict-image-registries annotations: policies.kyverno.io/title: Restrict image registries policies.kyverno.io/category: Supply Chain Security spec: validationFailureAction: Enforce (1) background: true (2) rules: - name: allowed-registries (3) match: (4) any: (5) - resources: kinds: (6) - Pod validate: message: "Images must be pulled only from hub.nova-platform.io/registry." (7) foreach: (8) - list: "request.object.spec.containers" (9) preconditions: (10) all: - key: "{{ element.image }}" operator: NotEquals value: "" deny: (11) conditions: (12) any: - key: "{{ element.image }}" operator: NotEquals value: "hub.nova-platform.io/registry/*" --- apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: disallow-latest-tag annotations: policies.kyverno.io/title: Disallow latest tag policies.kyverno.io/category: Supply Chain Security spec: validationFailureAction: Enforce (1) background: true (2) rules: - name: no-latest-tag (3) match: (4) any: (5) - resources: kinds: (6) - Pod validate: message: "Using tag 'latest' or no tag is not allowed. Use a specific version." (7) foreach: (8) - list: "request.object.spec.containers" (9) deny: (10) conditions: (11) any: - key: "{{ element.image }}" operator: Equals value: "*:latest" - key: "{{ element.image }}" operator: NotEquals value: "*:*"1 spec.validationFailureAction(тип: string) - действие при нарушении:Audit(разрешить запрос, зафиксировать нарушение) илиEnforce(отклонить запрос).2 spec.background(тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике.3 spec.rules[].name(тип: string) - уникальное имя правила в рамках политики.4 spec.rules[].match(тип: ResourceFilter) - условия применения правила (обязательное поле).5 spec.rules[].match.any(тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию).6 spec.rules[].match.any[].resources.kinds(тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service).7 spec.rules[].validate.message(тип: string) - сообщение об ошибке, возвращаемое при нарушении.8 spec.rules[].validate.foreach(тип: []ForEachValidation) - итерация по элементам списка внутри ресурса.9 spec.rules[].validate.foreach[].list(тип: string) - JMESPath-выражение, возвращающее список элементов для итерации.10 spec.rules[].validate.foreach[].preconditions(тип: Conditions) - условия применения правила к каждому элементу.11 spec.rules[].validate.foreach[].deny(тип: object) - условия отклонения для каждого элемента.12 spec.rules[].validate.foreach[].deny.conditions(тип: Conditions) - условия отклонения запроса (any/all с операторами сравнения).Использование anyPattern в валидации (запрет запуска контейнеров от root)
apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: require-run-as-non-root annotations: policies.kyverno.io/title: Require runAsNonRoot policies.kyverno.io/category: Pod Security Standards spec: validationFailureAction: Enforce (1) background: true (2) rules: - name: check-runasnonroot (3) match: (4) any: (5) - resources: kinds: (6) - Pod validate: message: >- (7) Running as root is not allowed. Either the field spec.securityContext.runAsNonRoot must be set to `true`, or all containers must set securityContext.runAsNonRoot to `true`. anyPattern: (8) - spec: securityContext: runAsNonRoot: true (9) =(ephemeralContainers): - =(securityContext): =(runAsNonRoot): true (10) =(initContainers): - =(securityContext): =(runAsNonRoot): true (11) containers: - =(securityContext): =(runAsNonRoot): true (12) - spec: =(ephemeralContainers): - securityContext: runAsNonRoot: true (13) =(initContainers): - securityContext: runAsNonRoot: true (14) containers: - securityContext: runAsNonRoot: true (15)1 spec.validationFailureAction(тип: string) - действие при нарушении:Audit(разрешить запрос, зафиксировать нарушение) илиEnforce(отклонить запрос).2 spec.background(тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике.3 spec.rules[].name(тип: string) - уникальное имя правила в рамках политики.4 spec.rules[].match(тип: ResourceFilter) - условия применения правила (обязательное поле).5 spec.rules[].match.any(тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию).6 spec.rules[].match.any[].resources.kinds(тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service).7 spec.rules[].validate.message(тип: string) - сообщение об ошибке, возвращаемое при нарушении.8 spec.rules[].validate.anyPattern(тип: []object) - список паттернов: ресурс должен соответствовать хотя бы одному.9 spec.securityContext.runAsNonRoot(тип: bool) - должно быть true на уровне пода (первый паттерн).10 spec.ephemeralContainers[].securityContext.runAsNonRoot(тип: bool) - должно быть true для каждого ephemeral-контейнера.11 spec.initContainers[].securityContext.runAsNonRoot(тип: bool) - должно быть true для каждого init-контейнера.12 spec.containers[].securityContext.runAsNonRoot(тип: bool) - должно быть true для каждого контейнера.13 spec.ephemeralContainers[].securityContext.runAsNonRoot(тип: bool) - должно быть true для каждого ephemeral-контейнера (второй паттерн).14 spec.initContainers[].securityContext.runAsNonRoot(тип: bool) - должно быть true для каждого init-контейнера (второй паттерн).15 spec.containers[].securityContext.runAsNonRoot(тип: bool) - должно быть true для каждого контейнера (второй паттерн).
-
-
Нажмите Создать. Отслеживайте статус на вкладке ClusterPolicy на странице оператора.