Compare commits
2 Commits
ffa61ab646
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
f980b651d9
|
|||
|
e995770695
|
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user