Рецепт: политики deny-closed (Cedar / OPA)
Цель: добавить ограничения на основе атрибутов поверх RBAC с
deny-by-default — например, «никто не трогает ресурсы с меткой secret, что бы
ни говорила его роль».
Один инвариант, который нужно держать в голове: PDP только ограничивает. Решение составляется как RBAC ∩ нативный ABAC ∩ внешний PDP — политика никогда не может выдать то, что отклоняет ролевая модель (модель).
Cedar (встроенный, основной)
Заголовок раздела «Cedar (встроенный, основной)»Выберите движок и укажите ему путь к файлу политики, затем перезапустите:
OLIVARES_PDP_ENGINE=cedarOLIVARES_PDP_CEDAR_FILE=/etc/olivares/policy.cedarПолитика Cedar — это forbid-наложение: базовый permit означает «RBAC уже
принял решение», а ваши правила forbid вычитают:
permit(principal, action, resource);
forbid(principal, action, resource) when { resource.kind == "credential" && resource.sensitivity == "secret" };Два факта об авторинге, проверенные по адаптеру: resource.kind и
resource.sensitivity всегда присутствуют во входных данных решения (можно
ссылаться без условий); любой другой атрибут необходимо защищать через has(),
иначе правило не сможет сработать. Написанный вами permit никогда не сможет
расширить решение.
OPA (по HTTP)
Заголовок раздела «OPA (по HTTP)»OLIVARES_PDP_ENGINE=opaOLIVARES_PDP_OPA_URL=http://opa.internal:8181OLIVARES_PDP_OPA_PATH=/v1/data/olivares/decisionOLIVARES_PDP_OPA_TOKEN=<bearer-reference> # optionalПишите Rego в режиме permit-by-default:
package olivares
default allow := true
allow := false if { input.resource.sensitivity == "secret" input.action == "read"}true = нет ограничения. false, отсутствующий результат или любая ошибка
транспорта либо ответ не-2xx срабатывают на закрытие (fail closed) — запрос
отклоняется, а не остаётся молча неуправляемым.
Проверка, dry-run, публикация
Заголовок раздела «Проверка, dry-run, публикация»Модуль governance предоставляет жизненный цикл политики, чтобы плохая политика никогда не попадала вслепую:
# Compile-check the source:curl -ks -X POST "$BASE/v1/m/governance/pdp/validate" \ -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT" \ -d @policy.json
# Pre-flight a decision WITHOUT audit side effects:curl -ks -X POST "$BASE/v1/m/governance/pdp/dry-run" \ -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT" \ -d '{"principal":"…","action":"…","resource":{"kind":"credential","sensitivity":"secret"}}'
# Then publish (policy-admin permission):curl -ks -X POST "$BASE/v1/m/governance/pdp/publish" …GET /v1/m/governance/pdp/versions перечисляет то, что развёрнуто;
POST /v1/m/governance/pdp/explain объясняет решение.
Проверьте свойства безопасности
Заголовок раздела «Проверьте свойства безопасности»- Перезапуститесь с некорректным файлом политики: движок отключает только внешний PDP и журналирует это — RBAC и нативный ABAC продолжают управлять; control plane не падает.
- Каждое ограничение, которое применяет PDP, аудируется — проверьте ledger после отклонённого запроса.
Заметки
Заголовок раздела «Заметки»- Политики версионируются и публикуются, а не редактируются «на лету» в продакшене — относитесь к публикации как к изменению, прошедшему ревью.
- Для действий, требующих одобрения (а не отклонения), смотрите одобрения HITL.