init
This commit is contained in:
127
05-variables/02-context/README.md
Normal file
127
05-variables/02-context/README.md
Normal 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.
|
||||
```
|
||||
13
05-variables/02-context/deployment-freeze-config.yaml
Normal file
13
05-variables/02-context/deployment-freeze-config.yaml
Normal 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."
|
||||
52
05-variables/02-context/restrict-deploys-during-freeze.yaml
Normal file
52
05-variables/02-context/restrict-deploys-during-freeze.yaml
Normal 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
|
||||
45
05-variables/02-context/restrict-privileged-non-admins.yaml
Normal file
45
05-variables/02-context/restrict-privileged-non-admins.yaml
Normal 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
|
||||
Reference in New Issue
Block a user