fix pols for 1.18

This commit is contained in:
2026-05-14 18:55:39 +07:00
parent 5578400e7f
commit ffa61ab646
19 changed files with 266 additions and 180 deletions
@@ -26,22 +26,14 @@ spec:
- kube-system
- kyverno
validate:
message: >-
Контейнер '{{ element.name }}' в поде '{{ request.object.metadata.name }}'
(namespace: {{ request.object.metadata.namespace }}) не имеет resource limits.
Добавьте в манифест:
resources:
limits:
memory: "256Mi"
cpu: "500m"
Документация: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
foreach:
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @) |
merge(request.object.spec.ephemeralContainers[] || `[]`, @)
message: >-
Контейнер '{{ element.name }}' в поде '{{ request.object.metadata.name }}'
не имеет resource limits. Добавьте resources.limits.memory и resources.limits.cpu.
pattern:
resources:
limits:
@@ -25,20 +25,20 @@ spec:
namespaces:
- kube-system
validate:
message: >-
Образ '{{ element.image }}' использует тег :latest или не имеет тега.
Используйте конкретный тег (например, nginx:1.25.3) или digest
(nginx@sha256:abc123...) для воспроизводимых деплойментов.
foreach:
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @)
merge(request.object.spec.initContainers[] || `[]`, @) |
merge(request.object.spec.ephemeralContainers[] || `[]`, @)
message: >-
Образ '{{ element.image }}' использует тег :latest или не имеет тега.
Используйте конкретный тег (nginx:1.25.3) или digest (nginx@sha256:...).
deny:
conditions:
any:
- key: "{{ element.image }}"
operator: Contains
value: ":latest"
- key: "{{ element.image }}"
operator: NotContains
value: ":"
- key: "{{ regex_match(':latest', element.image) }}"
operator: Equals
value: true
- key: "{{ regex_match('^(([^/]+/)*[^/:]+)$', element.image) }}"
operator: Equals
value: true
@@ -27,25 +27,23 @@ spec:
- kube-system
- kyverno
validate:
message: >-
Образ '{{ element.image }}' из недоверенного реестра.
Разрешены только:
- registry.company.com/
- gcr.io/company-project/
Загрузите образ в внутренний реестр и обновите манифест.
foreach:
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @)
merge(request.object.spec.initContainers[] || `[]`, @) |
merge(request.object.spec.ephemeralContainers[] || `[]`, @)
message: >-
Образ '{{ element.image }}' из недоверенного реестра.
Разрешены: registry.company.com/, gcr.io/company-project/.
Загрузите образ в внутренний реестр и обновите манифест.
deny:
conditions:
all:
# Образ НЕ из первого доверенного реестра
- key: "{{ element.image }}"
operator: NotStartsWith
value: "registry.company.com/"
# И НЕ из второго доверенного реестра
- key: "{{ element.image }}"
operator: NotStartsWith
value: "gcr.io/company-project/"
# regex_match: false = образ НЕ начинается с доверенного реестра
- key: "{{ regex_match('^registry\\.company\\.com/', element.image) }}"
operator: Equals
value: false
- key: "{{ regex_match('^gcr\\.io/company-project/', element.image) }}"
operator: Equals
value: false
# Добавьте дополнительные условия по аналогии
@@ -26,15 +26,14 @@ spec:
namespaces:
- kube-system
validate:
message: >-
Контейнер '{{ element.name }}' добавляет запрещённые capabilities:
{{ element.securityContext.capabilities.add }}.
Разрешена только NET_BIND_SERVICE.
Пересмотрите необходимость этих привилегий.
foreach:
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @)
merge(request.object.spec.initContainers[] || `[]`, @) |
merge(request.object.spec.ephemeralContainers[] || `[]`, @)
message: >-
Контейнер '{{ element.name }}' добавляет запрещённые capabilities.
Разрешена только NET_BIND_SERVICE. Пересмотрите необходимость привилегий.
deny:
conditions:
any:
@@ -52,6 +52,6 @@ spec:
deny:
conditions:
any:
- key: "{{ request.object.spec.volumes[].hostPath | length(@) }}"
- key: "{{ request.object.spec.volumes[?hostPath] | length(@) }}"
operator: GreaterThan
value: "0"
@@ -26,15 +26,14 @@ spec:
namespaces:
- kube-system
validate:
message: >-
Контейнер '{{ element.name }}' имеет securityContext.privileged: true.
Привилегированные контейнеры запрещены — они получают полный доступ к хосту.
Удалите поле securityContext.privileged или установите значение false.
foreach:
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @) |
merge(request.object.spec.ephemeralContainers[] || `[]`, @)
message: >-
Контейнер '{{ element.name }}' имеет securityContext.privileged: true.
Привилегированные контейнеры запрещены. Удалите поле или установите false.
deny:
conditions:
any:
@@ -25,14 +25,14 @@ spec:
namespaces:
- kube-system
validate:
message: >-
Контейнер '{{ element.name }}' не сбрасывает все capabilities.
Добавьте в securityContext:
capabilities:
drop:
- ALL
foreach:
- list: "request.object.spec.containers"
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @) |
merge(request.object.spec.ephemeralContainers[] || `[]`, @)
message: >-
Контейнер '{{ element.name }}' не сбрасывает все capabilities.
Добавьте securityContext.capabilities.drop: [ALL].
deny:
conditions:
all:
@@ -45,11 +45,11 @@ spec:
namespaces:
- kube-system
validate:
message: >-
Контейнер '{{ element.name }}' использует runAsUser: 0 (root).
Установите runAsUser >= 1000.
foreach:
- list: "request.object.spec.containers"
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @)
message: "Контейнер '{{ element.name }}' использует runAsUser: 0 (root). Установите runAsUser >= 1000."
deny:
conditions:
any:
@@ -30,11 +30,15 @@ spec:
Добавьте в spec.securityContext:
seccompProfile:
type: RuntimeDefault
pattern:
spec:
anyPattern:
- spec:
securityContext:
seccompProfile:
type: "RuntimeDefault | Localhost"
type: RuntimeDefault
- spec:
securityContext:
seccompProfile:
type: Localhost
- name: disallow-unconfined-seccomp
match: