Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Cedar入門
Search
赤神青空
August 08, 2026
Programming
15
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cedar入門
赤神青空
August 08, 2026
More Decks by 赤神青空
See All by 赤神青空
MySQLとPostgreSQLって何が違うの?
akagami
0
30
第何正規形かを判定する
akagami
0
19
なぜ正規化するのか
akagami
0
22
1NFから3NF
akagami
0
20
3NFの先にあるもの
akagami
0
13
Cloudflare「Kitesurf」を読む
akagami
0
15
AWS Amplifyの、何が良いのか?
akagami
0
14
続・AWS Amplifyの、何が良いのか?
akagami
0
14
Stacked PRの、何が新しいのか
akagami
0
24
Other Decks in Programming
See All in Programming
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.8k
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
260
「人を評価する AI」の設計と実装
ryoyanara
0
200
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
1
130
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
160
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
240
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
500
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.7k
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
380
運用ダッシュボードの設計を誰も教えてくれないのだけどみなさんどうしてるんですか? - チームに監視するという文化を根付かせるための第一歩を踏みたい -
satoshi256kbyte
1
120
What's New in Android 2026
veronikapj
0
260
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
18k
Featured
See All Featured
The Curse of the Amulet
leimatthew05
2
14k
エンジニアに許された特別な時間の終わり
watany
108
250k
New Earth Scene 8
popppiees
3
2.5k
Accessibility Awareness
sabderemane
1
180
Paper Plane (Part 1)
katiecoart
PRO
1
10k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
GraphQLとの向き合い方2022年版
quramy
50
15k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
370
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
330
Site-Speed That Sticks
csswizardry
13
1.4k
Transcript
2026年08月08日(土) Cedar入門 認可を「言語」にする 赤神 青空
▪認可はどこに書かれているか ある日の実装 「このドキュメント、この人は編集していいんだっけ?」 の答えが、APIハンドラのif文の中にしかない。 所有者チェック doc.owner == user.id がハンドラごとに手書き 共有リストの参照
編集者リストの照合が、別の場所にもう1つ 共有機能が育つたび、同じ判定がコードのあちこちに散らばっていく。 今ココ はじめに 2/29
▪散らばせるか、集約するか 認可ロジックの置き場所 ✕ コードに埋め込む 判定がハンドラごとに重複する 「今どんなルールか」を一覧できない 変更のたびに全箇所を探して直す ◯ ポリシーとして外に出す ルールが1箇所に宣言的に集まる
コードと独立に監査・変更できる さらに「正しさ」を機械検証できる この右側を実現する言語が、今日の主役のCedarです。 今ココ はじめに 3/29
▪Cedarが引き受けるのは後者だけ 前提:認証と認可は別物 この2つの区別が、今日の話ぜんぶの土台になる。 01 02 03 あなたは誰か。 Cognito・OAuthの仕事 あなたに何が許されるか。 ここがCedarの守備範囲
「誰か」は変わらないが 「何が許されるか」は頻繁に変わる 認証(AuthN) 今ココ はじめに 認可(AuthZ) 分ける理由 4/29
01 Cedarとは 生まれと現在地 今ココ Cedarとは 5/29
▪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
▪共有ダイアログの正体 あなたは毎日「ポリシー」を書いている 共有:「企画書.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
▪認可の問いを4要素に分解する PARCモデル Cedarのポリシーは、すべてこの4つの語彙で書かれる。 P A R C 誰が。 User::"hikaru" など
何をする。 Action::"editDoc" など 何に対して。 Doc::"企画書" など どんな状況で。 リンク共有経由・時刻など Principal 今ココ Cedarとは Action Resource Context 8/29
▪アプリは「尋ねる」だけ 判定のしくみ 認可リクエスト P:誰が ポリシー集合 permit / forbid たち Allow
User::"hikaru" A:何をする Action::"editDoc" 認可エンジン R:何に対して Doc::"企画書" C:どんな状況で Cedar 許可(permitに合致) { via: "リンク共有" } Deny 拒否(既定値‧forbid) PARCの4つ組を渡すと、ポリシー集合に照らして Allow / Deny が返る 今ココ Cedarとは 9/29
▪permitの3点セット 最小のポリシー 「ひかるは、企画書を、閲覧してよい」をそのまま書く。 rust permit ( principal == User::"hikaru", action
resource == Action::"viewDoc", == Document::"企画書" ); 今ココ Cedarとは 10/29
02 書いてみる RBAC・ABAC・評価規則 今ココ 書いてみる 11/29
▪認可の書き方の二大流派 RBAC と ABAC RBAC(役割ベース) 「役割」で許可を決める 例:編集者グループなら編集できる 分かりやすいが、例外が増えると 役割が無限に増殖する ABAC(属性ベース)
「属性」の条件式で決める 例:文書の所有者本人なら削除できる 役割を増やさず例外を表現できるが 条件が読み解きにくくなる Cedarはどちらも同じ文法で書けて、混ぜられる。これが強み。 今ココ 書いてみる 12/29
▪in がメンバーシップを表す RBAC:グループで許可する 「デザインチームの全員が、企画書を閲覧・コメントできる」。 rust permit ( principal in Group::"design-team",
action in [Action::"viewDoc", Action::"commentDoc"], resource == Document::"企画書" ); 今ココ 書いてみる 13/29
▪when句が条件を受け持つ ABAC:属性で絞る 「所有者本人だけが、削除できる」。 役割を新設せず、属性の比較だけで例外を表す。 rust permit ( principal, action ==
Action::"deleteDoc", resource ) when { resource.owner == principal }; 今ココ 書いてみる 14/29
▪この潔さがCedarの安全性の核 評価規則は2行で言える デフォルトは拒否。 そして forbid は permit に必ず勝つ。 書き忘れ=拒否 permitを書かない限り、何も許可されない
例外は上書き不能 「アーカイブ済みは編集禁止」をforbid1本で保証できる 「うっかり許可」が構造的に起きにくいように言語が設計されている。 今ココ 書いてみる 15/29
▪横断的な禁止事項を1本で forbidの使いどころ どれだけ共有されていても、この1本がアーカイブ済み文書の編集を止める。 rust forbid ( principal, action == Action::"editDoc",
resource ) when { resource.archived == true }; 今ココ 書いてみる 16/29
▪切り出した代償を、宣言で払い戻す スキーマ:型チェックを取り戻す 外に出したポリシーは、放っておくとただの文字列。 owner を ownerId と書き間違えても、誰も怒ってくれない。 rust entity User
in [Group]; entity Document in [Folder] { owner: User, archived: Bool // ← 階層はここで宣言 // ← 属性の型もここで }; action editDoc appliesTo { principal: User, resource: Document }; この宣言があるから、次の階層ポリシーが書けて、後半の形式検証も動く 今ココ 書いてみる 17/29
▪グループ階層で「まとめて」許可する × フォルダ 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
▪テンプレート=動的な許可付与のしくみ 許可は、実行中に増えたり減ったりする ここまではあらかじめ書いておくルールの話だった。 でも共有ボタンは、ユーザーが押した瞬間に許可を1本増やしている。 穴あきポリシー(?principal / ?resource)を用意しておく 共有ボタン=穴に値を差して、ポリシーを1本生成 共有解除=生成したその1本を消す なぜ「テンプレート」という仕組みが要るのか
生成されるのは値だけ。ルールの形は開発者が握ったまま テンプレートを直せば、生成済みの全部に一括反映 認可ルールを、アプリの機能としてユーザーに開放できる 今ココ 書いてみる 19/29
▪組み込みか、マネージドか どうやって使うか ライブラリとして組み込む Rust crate(各言語バインディングあり) アプリ内で完結、追加コストなし ポリシーの保管・配布は自前 AVPに任せる ポリシーストアをAWSが管理 完全従量課金(2025年に大幅値下げ)
Cognitoトークン連携が組み込み どちらでもポリシーの書き方は同じ。移行も現実的。 今ココ 書いてみる 20/29
03 正しさを証明する Cedarが「形式」と呼ばれる理由 今ココ 形式検証 21/29
▪なぜ数学の出番なのか 認可のバグは、テストで見つけにくい テストは「試したケース」しか守れない。 認可で怖いのは試していない組み合わせのほう。 見つけにくい ポリシーが増えるほど、意図しない許可の隙間は組み合わ せの闇に沈む 形式検証なら すべての入力について成り立つ・成り立たないを数学的に 判定できる
Cedarはこの検証が可能なように、言語自体が設計されている。 今ココ 形式検証 22/29
▪誰が、何を検証するのか 検証は「2階建て」になっている ここから先、検証の対象が2つ出てくる。混ざりやすいので先に分けておく。 1F 2F 共通 認可エンジンにバグがないか。 AWSがすでにやってくれた 書いたルールが意図通りか。 あなたが自分でやる
Lean(定理証明支援系)と SMTソルバ Cedar自身の正しさ 今ココ 形式検証 あなたのポリシーの正しさ 支えている道具は同じ 23/29
▪検証駆動開発(VGD) 1F:Cedar自身はこう作られた 形式化 評価器・認可器の モデルをLeanで書く なぜ信用できるか 性質を証明 → 定理証明 forbid優先などを
数学的に保証 この体制で計25件のバグを発見・修正(証明で4件、テストで21 件)。レビューもテストもすり抜けたものたち。 今ココ 形式検証 実装と照合 → ランダム入力で 差分テスト Rust実装と突き合わせ つまり 「forbidが勝つ」は仕様書の約束ではなく、証明済みの定理。 24/29
▪2Fへ では、自分の書いたポリシーは? エンジンが正しくても、 書いたルールが意図通りかは別の問題。 例えば 「整理したつもりが、実は誰も削除できなくなっていた」 ここでも 同じ武器が使える。Cedarは解析できるように設計されて いる そのための道具が、次に出てくるSymCC。
今ココ 形式検証 25/29
▪cedar-policy-symcc 2F:SymCCに「問い」を投げる ポリシー集合をSMT論理式に翻訳し、総当たりせずに全入力を調べる。聞けるのは6種類。 1本のポリシーについて聞く 「エラーで落ちることはない?」(never errors) 「誰も通れない/誰でも通れる?」(always denies / allows)
2つの集合を見比べて聞く 「同じ挙動?」(equivalent)・「含まれる?」(implies) 「絶対に重ならない?」(disjoint) 答えがNoなら、SMTソルバが「破れる具体例」をリクエストの形で返す 今ココ 形式検証 26/29
▪リファクタリングの安全網 いちばん効くのは equivalent ポリシーを整理・書き換えたあと、 check_equivalent で「挙動が変わっていない」ことを証明できる。 これまで 書き換え後の挙動は、テストケースのぶんだけ祈る SymCC後 全入力で等価と証明、違えば反例が具体的に出る
認可の書き換えが、怖い作業から普通の作業になる。 今ココ 形式検証 27/29
▪principalいま、認可の前提が変わりつつある が人間とは限らなくなった これまで principal は人間だった。 いまそこにAIエージェントが入ってくる。 何が困るか エージェントはユーザーの代理で動く。本人の全権限をそ のまま渡すわけにはいかない どう解くか
ツール呼び出しそのものを action として認可の対象にする その認可基盤に Cedarが選ばれている(AgentCore、cedar-for-agents)。 今ココ おわりに 28/29
▪今日はこれだけ まとめ 01 認可はコードから切り出せる if文の散らばりは、PARCの語彙でポリシーに集約できる。 02 デフォルト拒否・forbid優先 2行の評価規則が「うっかり許可」を構造的に防ぐ。 03 正しさは証明できる
SymCCで等価性まで機械判定。しかも検証器自体がLeanで証明済み。 今ココ おわりに 29/29