Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cedar入門

 Cedar入門

Avatar for 赤神青空

赤神青空

August 08, 2026

More Decks by 赤神青空

Other Decks in Programming

Transcript

  1. ▪AWS生まれ、いまはCNCFのOSS Cedar=認可ポリシー言語 認可の判定だけのために設計されたドメイン特化言語。 AWSが開発しOSS化(Apache 2.0)、Rust製で判定はミリ秒オーダー 採用サービスの「中の言語」でもある Amazon Verified Permissions(AVP) Amazon

    Bedrock AgentCore のPolicy CNCF(Kubernetesなどを預かる中立財団)に加入 =AWSが手を引いても残る言語になった 設計目標は「表現力・速度・安全性・解析可能性」の4点 今ココ Cedarとは 6/29
  2. ▪共有ダイアログの正体 あなたは毎日「ポリシー」を書いている 共有:「企画書.docx」 あ あおい(⾃分) オーナー デ デザインチーム 閲覧者 ひ

    ひかる 編集者 ⾒慣れたあの画⾯。実はこれが… permit (principal == User::"aoi", action, // ぜんぶ resource == Doc::"企画書"); permit (principal in Group::"design", action == Action::"viewDoc", resource == Doc::"企画書"); permit (principal == User::"hikaru", action in [viewDoc, editDoc], resource == Doc::"企画書"); …認可ポリシーの集合そのもの 共有設定の1行1行が、そのまま認可ポリシー1本1本に対応する 今ココ Cedarとは 7/29
  3. ▪認可の問いを4要素に分解する PARCモデル Cedarのポリシーは、すべてこの4つの語彙で書かれる。 P A R C 誰が。 User::"hikaru" など

    何をする。 Action::"editDoc" など 何に対して。 Doc::"企画書" など どんな状況で。 リンク共有経由・時刻など Principal 今ココ Cedarとは Action Resource Context 8/29
  4. ▪アプリは「尋ねる」だけ 判定のしくみ 認可リクエスト P:誰が ポリシー集合 permit / forbid たち Allow

    User::"hikaru" A:何をする Action::"editDoc" 認可エンジン R:何に対して Doc::"企画書" C:どんな状況で Cedar 許可(permitに合致) { via: "リンク共有" } Deny 拒否(既定値‧forbid) PARCの4つ組を渡すと、ポリシー集合に照らして Allow / Deny が返る 今ココ Cedarとは 9/29
  5. ▪認可の書き方の二大流派 RBAC と ABAC RBAC(役割ベース) 「役割」で許可を決める 例:編集者グループなら編集できる 分かりやすいが、例外が増えると 役割が無限に増殖する ABAC(属性ベース)

    「属性」の条件式で決める 例:文書の所有者本人なら削除できる 役割を増やさず例外を表現できるが 条件が読み解きにくくなる Cedarはどちらも同じ文法で書けて、混ぜられる。これが強み。 今ココ 書いてみる 12/29
  6. ▪この潔さがCedarの安全性の核 評価規則は2行で言える デフォルトは拒否。 そして forbid は permit に必ず勝つ。 書き忘れ=拒否 permitを書かない限り、何も許可されない

    例外は上書き不能 「アーカイブ済みは編集禁止」をforbid1本で保証できる 「うっかり許可」が構造的に起きにくいように言語が設計されている。 今ココ 書いてみる 15/29
  7. ▪切り出した代償を、宣言で払い戻す スキーマ:型チェックを取り戻す 外に出したポリシーは、放っておくとただの文字列。 owner を ownerId と書き間違えても、誰も怒ってくれない。 rust entity User

    in [Group]; entity Document in [Folder] { owner: User, archived: Bool // ← 階層はここで宣言 // ← 属性の型もここで }; action editDoc appliesTo { principal: User, resource: Document }; この宣言があるから、次の階層ポリシーが書けて、後半の形式検証も動く 今ココ 書いてみる 17/29
  8. ▪グループ階層で「まとめて」許可する × フォルダ Group::"design-team" Folder::"proposals" User::"aoi" Doc::"企画書" User::"hikaru" User::"sora" ほか計6⼈

    principal in で全員を指す × 6⼈ × 3件 Doc::"⾒積書" Doc::"議事録" resource in で配下すべてを指す 18通りの許可が、この1本に畳み込まれる permit (principal in Group::"design-team", action == Action::"viewDoc", resource in Folder::"proposals"); 「フォルダごとチームに共有」も、in を2箇所使うだけで表せる 今ココ 書いてみる 18/29
  9. ▪検証駆動開発(VGD) 1F:Cedar自身はこう作られた 形式化 評価器・認可器の モデルをLeanで書く なぜ信用できるか 性質を証明 → 定理証明 forbid優先などを

    数学的に保証 この体制で計25件のバグを発見・修正(証明で4件、テストで21 件)。レビューもテストもすり抜けたものたち。 今ココ 形式検証 実装と照合 → ランダム入力で 差分テスト Rust実装と突き合わせ つまり 「forbidが勝つ」は仕様書の約束ではなく、証明済みの定理。 24/29
  10. ▪cedar-policy-symcc 2F:SymCCに「問い」を投げる ポリシー集合をSMT論理式に翻訳し、総当たりせずに全入力を調べる。聞けるのは6種類。 1本のポリシーについて聞く 「エラーで落ちることはない?」(never errors) 「誰も通れない/誰でも通れる?」(always denies / allows)

    2つの集合を見比べて聞く 「同じ挙動?」(equivalent)・「含まれる?」(implies) 「絶対に重ならない?」(disjoint) 答えがNoなら、SMTソルバが「破れる具体例」をリクエストの形で返す 今ココ 形式検証 26/29