fix pols for 1.18
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user