Copilot пишет за 10 секунд то, что senior раньше писал за час. Cursor разворачивает фичу из одного абзаца. Claude Code открывает PR без участия человека. Это всё работает — кроме одного: review остался ручным. Скорость production-кода теперь регулярно превышает скорость human review, и это переписывает требования к governance.
Раньше Policy as Code был «nice to have»: код шёл через PR, два глаза смотрели на изменения, нарушение Action: "*" в IAM или отсутствие resources.limits ловилось senior'ом за день. Сейчас задержка между AI-сгенерированным кодом и его попыткой попасть в кластер измеряется минутами, а количество таких попыток — десятками в день на команду. PaC из бонуса превращается в функциональное требование. Это не «AI пишет политики» — это deterministic admission rules, написанные людьми или AI, но enforce'имые без human-in-the-loop, потому что человек физически не успевает.
Три точки, где можно поймать нарушение
Один admission-gate в кластере — это «всё или ничего». Один CI-check — это «можно обойти через --skip или hotfix-branch». Реально работающая модель — три слоя, и каждый ловит свой класс ошибок.
CI / pre-merge. conftest против Rego-политик, Trivy против CVE, Checkov против Terraform-конфигов. Дешевле всего: defect ловится до merge, до билда, до записи в registry. Здесь живут «не позволяй cidr_blocks = ["0.0.0.0/0"] на порту 22» и «не позволяй Action: "*" в IAM». Для Terraform — обязательный gate conftest test plan.json --policy ./policies/ против terraform plan -json, потому что один apply создаёт десятки ресурсов разом, и откатить дешевле в PR, чем потом.
Admission (cluster). OPA Gatekeeper, Kyverno или нативный CEL ValidatingAdmissionPolicy. Здесь ловится то, что CI пропустил: deploy старого тэга в обход pipeline, образ из неподписанного registry, pod без runAsNonRoot. Admission — last line of defense в смысле «до записи в etcd»: network egress-block срабатывает позже, runtime detection (Falco) — ещё позже.
Runtime. Falco/Tetragon — детектив, а не префектив. Ловит shell в prod-контейнере, доступ к Secret из default ServiceAccount. Не блокирует — алёртит, поэтому без первых двух слоёв бесполезен.
Важная деталь: CI gate без admission gate — это false sense of security. CI ловит то, что собрал ты; admission ловит то, что ты задеплоил. Эти два множества пересекаются, но не совпадают.
Чем enforce'ить
Три инструмента, и выбор между ними — не «лучший», а «под профиль команды».
OPA Gatekeeper — Rego, индустриальный стандарт, mature mutation в beta. Сильная сторона — выразительность Rego для сложных правил с cross-ресурсной логикой. Слабая — кривая обучения и языковой барьер: команда, которая никогда не писала Rego, тратит недели на «свою первую полезную constraint».
Kyverno — YAML вместо Rego, mutate/generate из коробки (например, автоматически добавить NetworkPolicy в новый namespace), встроенный verifyImages под Cosign/Sigstore без внешних data providers. CNCF Incubating. Default для команд, которым нужны mutation и image-policy, и которые не хотят ещё один DSL.
CEL ValidatingAdmissionPolicy — GA в Kubernetes 1.30, MutatingAdmissionPolicy + CEL GA в 1.36. Работает внутри API-сервера: нет TLS, нет Deployment, нет cert-manager, нет failure mode «webhook упал → всё отвергнуто или всё пропущено». Закрывает класс простых declarative-валидаций (required labels, naming conventions, transition rules), снимая «налог» с Kyverno/OPA. Не вытесняет их — для image verification, multi-resource generate и сложных правил всё равно нужен Kyverno.
Рабочий гайд: CEL для простого, Kyverno для среднего и image-policy, OPA Gatekeeper для команд с сложной кросс-ресурсной логикой и культурой Rego.
Что ломает PaC в проде
failurePolicy: Ignoreна ValidatingWebhookConfiguration. Default многих туториалов. Под нагрузкой / инцидентом policy-engine деградирует — admission defaults to allow, bypass активируется именно тогда, когда он опаснее всего. ВсегдаFail.enforcementAction: dryrunнавсегда. Gatekeeper killer-feature — dryrun-mode для observability blast radius перед flip вdeny. Но если он остался на полгода, это уже не политика, это логирование. Жёсткий timeline: dryrun неделя → deny.- Один gigantic ConstraintTemplate / ClusterPolicy. Невозможно отлаживать, невозможно ревьюить, exception для одного namespace ломает все остальные.
- PaC без unit-тестов. OPA Rego тестируется встроенным framework'ом, Kyverno — через
kyverno cli test. AI-сгенерированный policy без теста — это AI-сгенерированный security incident.
Где это сходится
PaC в эру AI-кода — это не способ замедлить разработчика обратно до доAI-скоростей. Это deterministic guardrails, которые позволяют отпустить human review на повторяющихся паттернах (required labels, image tags, resource limits, IAM wildcards) и сохранить его там, где он реально нужен (архитектура, бизнес-логика, edge cases). Speed-vs-control paradox разрешается не выбором «скорость или контроль», а перемещением контроля из ручной полосы в автоматическую.
Без этого моста AI-агент — это amplifier ошибок. С ним — это amplifier пропускной способности команды.