This commit is contained in:
2026-04-08 20:22:14 +07:00
commit 34fbdd1412
96 changed files with 5321 additions and 0 deletions

View File

@@ -0,0 +1,127 @@
# Урок 5.2 — Контекстные данные и информация о кластере
## Файлы
| Файл | Описание |
|------|----------|
| `deployment-freeze-config.yaml` | ConfigMap для управления freeze |
| `restrict-deploys-during-freeze.yaml` | Блокировка деплоев во время freeze |
| `restrict-privileged-non-admins.yaml` | Привилегии только для admin-групп |
## Применение
```bash
kubectl apply -f deployment-freeze-config.yaml
kubectl apply -f restrict-deploys-during-freeze.yaml
kubectl apply -f restrict-privileged-non-admins.yaml
```
## Тест deployment freeze
```bash
# Убедиться что freeze выключен
kubectl get configmap deployment-freeze-config -n kyverno \
-o jsonpath='{.data.freeze_active}'
# Должно быть: false
# Создать тестовый deployment — должен пройти
kubectl create deployment test-deploy \
--image=nginx:1.25.3 --replicas=1
# Активировать freeze
kubectl patch configmap deployment-freeze-config -n kyverno \
--type merge \
-p '{"data":{"freeze_active":"true"}}'
# Подождать обновления кэша (~60 сек), затем попробовать деплой
kubectl create deployment blocked-deploy \
--image=nginx:1.25.3 --replicas=1
# Ожидаем ошибку: Деплойменты заморожены...
# Деактивировать freeze
kubectl patch configmap deployment-freeze-config -n kyverno \
--type merge \
-p '{"data":{"freeze_active":"false"}}'
# Уборка
kubectl delete deployment test-deploy 2>/dev/null || true
```
## Доступные контекстные данные запроса
```yaml
# Информация о ресурсе
request.object.metadata.name
request.object.metadata.namespace
request.object.metadata.labels
request.object.metadata.annotations
# Информация об операции
request.operation # CREATE | UPDATE | DELETE | CONNECT
request.dryRun # true при --dry-run=server
# Старый объект (только при UPDATE)
request.oldObject.spec.replicas
# Информация о пользователе
request.userInfo.username
request.userInfo.uid
request.userInfo.groups # список групп
request.userInfo.extra # дополнительные атрибуты
# Пример: разные правила для CREATE vs UPDATE
preconditions:
any:
- key: "{{ request.operation }}"
operator: Equals
value: CREATE
```
## Тест userInfo — проверка групп
```bash
# Посмотреть свои группы в кластере
kubectl auth whoami
# Попробовать создать привилегированный под (должен быть отклонён)
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: test-privileged
namespace: default
spec:
containers:
- name: app
image: nginx:1.25.3
securityContext:
privileged: true
resources:
limits:
memory: "128Mi"
cpu: "100m"
EOF
# Ожидаем: error... не имеет права создавать привилегированные контейнеры
```
## Cross-resource проверка через apiCall
```yaml
# Читаем лейблы namespace во время обработки Pod запроса
context:
- name: nsLabels
apiCall:
urlPath: "/api/v1/namespaces/{{ request.object.metadata.namespace }}"
jmesPath: "metadata.labels"
# Читаем список всех Deployments в namespace
context:
- name: existingDeployments
apiCall:
urlPath: "/apis/apps/v1/namespaces/{{ request.object.metadata.namespace }}/deployments"
jmesPath: "items[].metadata.name"
# ВАЖНО: каждый apiCall = HTTP запрос к API Server.
# Используйте с умом — это влияет на латентность admission.
# Для часто используемых данных предпочитайте ConfigMap.
```

View File

@@ -0,0 +1,13 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: deployment-freeze-config
namespace: kyverno
labels:
app: kyverno-config
data:
# Установите freeze_active: "true" для блокировки деплойментов
freeze_active: "false"
freeze_start: "2024-12-24T00:00:00Z"
freeze_end: "2025-01-02T09:00:00Z"
freeze_reason: "Новогодний feature freeze. Экстренные деплои — через oncall."

View File

@@ -0,0 +1,52 @@
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: restrict-deploys-during-freeze
annotations:
policies.kyverno.io/title: "Блокировка деплойментов во время freeze"
policies.kyverno.io/category: Governance
policies.kyverno.io/severity: high
policies.kyverno.io/subject: Deployment
policies.kyverno.io/description: >-
Блокирует создание новых Deployments когда в ConfigMap
deployment-freeze-config поле freeze_active=true.
Пользователи группы emergency-deployers и system:masters
могут деплоить даже во время freeze.
Активируйте freeze: kubectl patch configmap deployment-freeze-config
-n kyverno --type merge -p '{"data":{"freeze_active":"true"}}'
spec:
rules:
- name: check-freeze
match:
resources:
kinds:
- Deployment
preconditions:
any:
- key: "{{ request.operation }}"
operator: Equals
value: CREATE
context:
- name: freezeConfig
configMap:
name: deployment-freeze-config
namespace: kyverno
validate:
message: >-
Деплойменты заморожены с {{ freezeConfig.data.freeze_start }}
до {{ freezeConfig.data.freeze_end }}.
Причина: {{ freezeConfig.data.freeze_reason }}
Для экстренного деплоя обратитесь к oncall инженеру.
deny:
conditions:
all:
# Freeze активен
- key: "{{ freezeConfig.data.freeze_active }}"
operator: Equals
value: "true"
# Пользователь НЕ в группе экстренного деплоя
- key: "{{ request.userInfo.groups }}"
operator: AllNotIn
value:
- emergency-deployers
- system:masters

View File

@@ -0,0 +1,45 @@
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: restrict-privileged-for-non-admins
annotations:
policies.kyverno.io/title: "Привилегированные контейнеры — только для администраторов"
policies.kyverno.io/category: Security
policies.kyverno.io/severity: high
policies.kyverno.io/subject: Pod
policies.kyverno.io/description: >-
Запрещает создание привилегированных контейнеров для обычных пользователей.
Администраторы (system:masters, cluster-admins) могут создавать
привилегированные поды для системных нужд.
Использует request.userInfo для проверки прав запрашивающего.
spec:
rules:
- name: restrict-privileged-non-admin
match:
resources:
kinds:
- Pod
# Precondition: применять только если пользователь НЕ администратор
preconditions:
all:
- key: "system:masters"
operator: NotIn
value: "{{ request.userInfo.groups }}"
- key: "cluster-admins"
operator: NotIn
value: "{{ request.userInfo.groups }}"
validate:
message: >-
Пользователь '{{ request.userInfo.username }}' не имеет права
создавать привилегированные контейнеры.
Обратитесь к cluster-admin для выполнения системных задач.
foreach:
- list: >-
request.object.spec.containers[] |
merge(request.object.spec.initContainers[] || `[]`, @)
deny:
conditions:
any:
- key: "{{ element.securityContext.privileged }}"
operator: Equals
value: true