レシピ: deny-closed ポリシー (Cedar / OPA)
エディション: permit と forbid を含むカスタム Cedar ポリシーの作成・編集には Business が必要です。Community は保存済みポリシー、カスタムロール、スコープ付き権限の適用を維持し、閲覧と取り消しを許可します。DELETE /v1/m/governance/pdp/active?engine=cedar は作成済み Cedar ポリシーだけを無効化し、履歴、管理対象の権限、採用済みポリシーを保持します。組み込みロール、ネイティブ拒否ルール、緊急停止は Community に残ります。このレシピの外部 PDP はアクセスを制限するだけですが、作成した Cedar permit はスコープ内のアクセスを付与できます。 この外部エンジン(OLIVARES_PDP_ENGINE、Cedar ファイルまたは OPA)の選択には Business が必要です。Community はエンジンが選択されていると起動を拒否します。
目的: deny-by-default の RBAC の上に属性ベースの制限を追加する —
たとえば「ロールが何と言おうと、secret とタグ付けされたリソースには誰も触れない」。
頭に入れておくべき不変条件はただ一つ: PDP は 制限のみを行う。 決定は RBAC ∩ ネイティブ ABAC ∩ 外部 PDP として合成される — ポリシーはロールモデルが拒否したものを決して付与できない (モデル)。
Cedar (組み込み、プライマリ)
Section titled “Cedar (組み込み、プライマリ)”エンジンを選択し、ポリシーファイルを指定してから再起動する:
OLIVARES_PDP_ENGINE=cedarOLIVARES_PDP_CEDAR_FILE=/etc/olivares/policy.cedarCedar ポリシーは 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 経由)
Section titled “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> # optionalRego は permit-by-default で記述する:
package olivares
default allow := true
allow := false if { input.resource.sensitivity == "secret" endswith(input.permission, ":read")}true = 制限なし。false、結果の欠落、または あらゆるトランスポート上または
非 2xx のエラーは fail closed する — リクエストは拒否され、決して
気づかぬうちにガバナンスを外れることはない。
検証、ドライラン、公開
Section titled “検証、ドライラン、公開”ガバナンスモジュールはポリシーのライフサイクルを公開しており、不正なポリシーが 盲目的に投入されることはない:
# policy.cedar is the Cedar policy above; jq 1.6 or newer builds the JSON bodies.# Compile-check the source:curl -ks -X POST "$BASE/v1/m/governance/pdp/validate" \ -H "Authorization: Bearer $TOKEN" -H "X-Olivares-Tenant: $TENANT" \ -d "$(jq -n --rawfile source policy.cedar '{engine:"cedar",$source}')"
# 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 "$(jq -n --rawfile source policy.cedar --argjson request '{"principal":{"kind":"user","id":"u1"},"permission":"models:keys:read","resource":{"kind":"credential","sensitivity":"secret"}}' \ '{engine:"cedar",$source,$request}')"
# 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 は決定を説明する。
安全性プロパティを検証する
Section titled “安全性プロパティを検証する”- 不正な ポリシーファイルで再起動する: エンジンは外部 PDP のみを 無効化してログに記録する — RBAC とネイティブ ABAC はガバナンスを継続し、 control plane はダウンしない。
- PDP が適用するすべての制限は 監査される — 拒否されたリクエストの後に ledger を確認すること。
- ポリシーはバージョン管理されて公開されるものであり、本番でホット編集される ファイルではない — 公開はレビュー済みの変更として扱うこと。
- 拒否ではなく承認ゲート付きのアクションについては、 HITL 承認 を参照。