Compare commits

...

2 Commits

Author SHA1 Message Date
vasyansk f980b651d9 fix foreach 2026-05-19 17:16:39 +07:00
vasyansk e995770695 add test pols 2026-05-19 16:37:43 +07:00
13 changed files with 133 additions and 27 deletions
+10 -1
View File
@@ -7,7 +7,16 @@
"Bash(sudo mv /tmp/kyverno /usr/local/bin/kyverno)",
"Bash(mv /tmp/kyverno ~/bin/kyverno)",
"Bash(mv /tmp/kyverno ~/.local/bin/kyverno)",
"Bash(export PATH=\"$HOME/bin:$HOME/.local/bin:$PATH\")"
"Bash(export PATH=\"$HOME/bin:$HOME/.local/bin:$PATH\")",
"Bash(~/.local/bin/kyverno apply *)",
"Bash(rtk ls *)",
"Bash(/bin/ls *)",
"Bash(export PATH=\"$HOME/.local/bin:$PATH\")",
"Bash(kyverno apply *)",
"Read(//private/tmp/**)",
"Bash(mkdir -p polsdir1 polsdir2)",
"Bash(cp t1.yaml polsdir1/)",
"Bash(cp t2.yaml polsdir2/)"
]
}
}
@@ -26,14 +26,14 @@ spec:
- kube-system
- kyverno
validate:
message: >-
Все контейнеры в поде '{{ request.object.metadata.name }}'
обязаны иметь resources.limits.memory и resources.limits.cpu.
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,14 +25,14 @@ spec:
namespaces:
- kube-system
validate:
message: >-
Один из образов в поде '{{ request.object.metadata.name }}' использует
тег :latest или не имеет тега. Используйте конкретный тег или digest.
foreach:
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @) |
merge(request.object.spec.ephemeralContainers[] || `[]`, @)
message: >-
Образ '{{ element.image }}' использует тег :latest или не имеет тега.
Используйте конкретный тег (nginx:1.25.3) или digest (nginx@sha256:...).
deny:
conditions:
any:
@@ -27,15 +27,14 @@ spec:
- kube-system
- kyverno
validate:
message: >-
Один из образов в поде '{{ request.object.metadata.name }}' из недоверенного реестра.
Разрешены: registry.company.com/, gcr.io/company-project/.
foreach:
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @) |
merge(request.object.spec.ephemeralContainers[] || `[]`, @)
message: >-
Образ '{{ element.image }}' из недоверенного реестра.
Разрешены: registry.company.com/, gcr.io/company-project/.
Загрузите образ в внутренний реестр и обновите манифест.
deny:
conditions:
all:
@@ -26,14 +26,14 @@ spec:
namespaces:
- kube-system
validate:
message: >-
Один из контейнеров в поде '{{ request.object.metadata.name }}' добавляет
запрещённые capabilities. Разрешена только NET_BIND_SERVICE.
foreach:
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @) |
merge(request.object.spec.ephemeralContainers[] || `[]`, @)
message: >-
Контейнер '{{ element.name }}' добавляет запрещённые capabilities.
Разрешена только NET_BIND_SERVICE. Пересмотрите необходимость привилегий.
deny:
conditions:
any:
@@ -26,14 +26,14 @@ spec:
namespaces:
- kube-system
validate:
message: >-
Один из контейнеров в поде '{{ request.object.metadata.name }}'
имеет securityContext.privileged: true. Запрещено.
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: >-
Каждый контейнер в поде '{{ request.object.metadata.name }}' должен
сбрасывать все capabilities: securityContext.capabilities.drop: [ALL].
foreach:
- 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,13 @@ spec:
namespaces:
- kube-system
validate:
message: >-
Один из контейнеров в поде '{{ request.object.metadata.name }}'
использует runAsUser: 0 (root). Установите runAsUser >= 1000.
foreach:
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @)
message: "Контейнер '{{ element.name }}' использует runAsUser: 0 (root). Установите runAsUser >= 1000."
deny:
conditions:
any:
+2 -2
View File
@@ -26,8 +26,8 @@ kubectl get clusterpolicy my-policy -o yaml | grep -A 10 "status:"
```bash
# Kyverno CLI — самый быстрый способ проверить
kyverno apply my-policy.yaml \
--resource my-resource.yaml \
kyverno apply test-pols/ \
--resource test-deployment.yaml \
--detailed-results
# Вывод:
@@ -0,0 +1,42 @@
# Тестовые поды для демонстрации kyverno apply --detailed-results.
# Под good-pod — проходит обе политики.
# Под bad-pod — нарушает обе политики (нет limits, нет label 'owner').
---
apiVersion: v1
kind: Pod
metadata:
name: good-pod
namespace: default
labels:
app: demo
owner: team-platform
spec:
containers:
- name: app
image: nginx:1.25.3
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
cpu: 200m
memory: 256Mi
---
apiVersion: v1
kind: Pod
metadata:
name: bad-pod
namespace: default
labels:
app: demo
spec:
containers:
- name: app
image: nginx:1.25.3
- name: sidecar
image: busybox:1.36
command: ["sh", "-c", "sleep 3600"]
resources:
requests:
cpu: 10m
memory: 16Mi
@@ -0,0 +1,26 @@
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels-demo
annotations:
policies.kyverno.io/title: "DEMO: Требовать обязательные labels"
policies.kyverno.io/description: >-
Демонстрационная политика для урока 6.2.
Проверяет наличие labels 'app' и 'owner' у Pod.
spec:
validationFailureAction: Audit
background: true
rules:
- name: check-required-labels
match:
any:
- resources:
kinds:
- Pod
validate:
message: "Pod must have labels 'app' and 'owner'."
pattern:
metadata:
labels:
app: "?*"
owner: "?*"
@@ -0,0 +1,28 @@
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-resource-limits-demo
annotations:
policies.kyverno.io/title: "DEMO: Требовать resources.limits"
policies.kyverno.io/description: >-
Демонстрационная политика для урока 6.2.
Проверяет, что у всех контейнеров заданы CPU и memory limits.
spec:
validationFailureAction: Audit
background: true
rules:
- name: check-container-limits
match:
any:
- resources:
kinds:
- Pod
validate:
message: "All containers must have resources.limits.cpu and resources.limits.memory."
foreach:
- list: "request.object.spec.containers"
pattern:
resources:
limits:
cpu: "?*"
memory: "?*"
@@ -36,14 +36,14 @@ spec:
value: >-
{{ join('', ['^(', join('|', split(allowedRegistries.data.\"allowed-registries\", '\n')[?@ != '']), ')']) }}
validate:
message: >-
Образ в поде '{{ request.object.metadata.name }}' из недоверенного реестра.
Список разрешённых (обновлён {{ allowedRegistries.data.\"last-updated\" }}):
{{ allowedRegistries.data.\"allowed-registries\" }}
foreach:
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @)
message: >-
Образ '{{ element.image }}' из недоверенного реестра.
Список разрешённых реестров (обновлён {{ allowedRegistries.data.\"last-updated\" }}):
{{ allowedRegistries.data.\"allowed-registries\" }}
deny:
conditions:
all: