認可コンパイラ (Authorization Compiler)
認可コンパイラは、人間がレビューできる認可仕様を、実行可能なポリシー成果物へ変換します。Ninka では、その認可仕様が 手形 (Tegata) です。
要件
↓
手形 人間がレビューする認可仕様
↓
関所 (Sekisho) 機械的に判定できる検査
↓
Ninka コンパイラ 決定論的な変換
↓
Rego + メタデータ
↓
固定された OPA で build 再現可能な実行成果物の生成
↓
Execution Bundle
↓
Consumer Projection
↓
Ninka ランタイム
↓
判定
重要なのは「AI を使うかどうか」ではなく、責任をどこで分けるかです。AI は認可仕様の作成を支援できます。人間は、その仕様が意図した認可要件を表しているかをレビューします。その後の実行成果物への変換は toolchain が機械的に担います。
手形から Rego までは決定論的に変換する
Ninka コンパイラは、canonical な手形を Rego へ決定論的に変換します。同じ canonical な手形を同じ Ninka リリースでコンパイルすれば、Rego はバイト単位で同一になります。
この保証は Rego までです。WASM は、その後の OPA build で生成します。Ninka は既定の OPA toolchain を固定し、同じ build 条件で実行成果物を再現できるようにしています。
同じ canonical な手形 + 同じ Ninka リリース
→ バイト単位で同一の Rego
同じ Rego + 同じ固定 OPA toolchain / build 契約
→ 再現可能な WASM
したがって、Ninka コンパイラ単体が WASM まで決定論的に生成するわけではありません。
承認の完全性は、3 つの別々の主張でできている
「人がこれを承認した」から「このバイト列が動いている」までの連鎖は、1 つの主張ではありません。 3 つあり、混ぜてはいけません。
- 同じ
tegata_hashは、同じ正規の認可仕様を表す - 同じ Ninka のリリースは、その仕様からバイト単位で同一の Rego を導く
- 動いている成果物は、
rego_sha256・wasm_sha256・両者をつなぐ build の系譜によって、 その仕様へ束縛されている
3 つを 1 つに畳むと、Ninka について最も多い誤読が生まれます。tegata_hash が実行される
バイト列を識別している、という読み方です。tegata_hash が識別するのは、人がレビューした
仕様のほうです。そこから先へ identity を運ぶのは、成果物のハッシュです。
仕様の identity と成果物の identity は別
それぞれの識別子は、別の対象を識別します。
tegata_hash:どの canonical な認可仕様かrego_sha256:どの Rego バイト列かwasm_sha256:どの実行用 WASM バイト列かgenerated_by/opa_version:どの Ninka / OPA リリースで生成したか
最初の三つは、それぞれ異なる対象の identity です。generated_by と opa_version は生成元を示す provenance であり、認可仕様そのものの identity ではありません。
後段の処理が上流の判断を独自に再計算しなくてよいように、これらの情報を成果物として受け渡します。
コンパイラが導出し、成果物が宣言し、ランタイムが検証して実行する。
たとえば、ポリシーの entrypoint を導出するのはコンパイラです。生成されたメタデータが policy・Rego・entrypoint・実行 bundle の対応を宣言し、ランタイムが宣言どうしと実際の module を照合します。ランタイム側で別の entrypoint 命名規則を持つことはありません。
必要な identity や結び付きが検証できなければ、問題の無い部分だけを使うのではなく、その bundle 全体を拒否します。
成果物の正確なフィールドと形式は 生成ファイル を参照してください。
verify は再現性を検査し、確認できない項目は明示する
ninka-authz verify は、現在の手形と toolchain の契約からソース由来の状態を再生成し、既存の生成物と比較します。固定された OPA toolchain を利用できる場合は、実行 bundle も再 build し、WASM に対する validation も必要な範囲で再実行します。
WASM まですべて検査済みの green な結果であれば、検査した生成状態について再現性の証拠になります。ただし、人間が手形を承認したことや、以前の認可実装と同じ挙動であることを示すものではありません。
一方、固定された OPA toolchain を取得できない環境では、WASM 関連の検査が not checked と明示されたまま exit 0 になる場合があります。これは「一致を確認した」という意味ではありません。成功・失敗・スキップの正確な扱いは CLI リファレンス を参照してください。
また、verify は Git を参照しません。生成ファイルを Git で追跡する方針と、ディスク上の成果物を検証することは別の問題です。
Validation は、コンパイラ自身の出力だけを基準にしない
Ninka は手形から validation 用の入力を導出しますが、期待される判定は、生成された Rego とは独立した reference evaluator が手形の意味論から決めます。そのうえで、生成された WASM が同じ判定を返すことを確認します。
これにより、検査対象の変換ロジックと同じロジックで期待値まで作り、同じ誤りを「正しい」と判定してしまう構造を避けています。
ただし validation にも範囲があります。Ninka が導出できる変換上の義務を検査するものであり、元の業務要件が正しかったかどうかは判断しません。そこは人間のレビューに残ります。
OPA は build 時に使い、リクエスト処理には入らない
OPA が担当するのは、Rego から実行用の WASM を build する工程です。実行時の認可判定で OPA サーバへ通信することはありません。アプリケーション内の Ninka ランタイムが、検証済みの bundle をプロセス内で評価します。
Ninka は別のホスト型認可サーバを増やすためのものではありません。認可の意図とアプリケーションでの適用の間に、レビュー可能な認可仕様と、検証可能なコンパイル・build の経路を置くものです。
Consumer Projection がアプリケーションとの境界になる
Consumer Projection は、生成されたアプリケーション向けのモジュールです。policy reference、型付きの入力契約、実行 bundle、そしてランタイムが bundle を検証するために必要なメタデータを運びます。
アプリケーション
│
▼
Consumer Projection
│
▼
Ninka ランタイム → ALLOW / DENY
いつ認可判定を呼ぶか、どの具体的なリソースを対象にするか、入力をどう組み立てるか、返された判定をどう適用するかはアプリケーション側の責任です。
Authorization Reference は表示用のビューであり、別の権威ではない
Authorization Reference は、手形と生成済みの状態を、人間が読んだり具体例を試したりできる形で表示します。プロジェクトを編集・コンパイルせず、独自の認可意味論も定義しません。
最後のコンパイル後に仕様だけが変わった場合、LIVE モードはコンパイル済みの状態を STALE として扱い、古い成果物を現在のポリシーとして評価しません。