CIP-12: Policy
0. Abstract
Section titled “0. Abstract”本仕様は、Concrnt のリソースに対するアクセス制御ポリシーを定義する手段を提供する。
1. Status of This Memo
Section titled “1. Status of This Memo”このドキュメントはポリシー言語と評価方法の仕様を定義する。 Concrnt プロジェクトにより公開されるバージョン付き仕様であり、実装者およびプロトコル設計者を対象とする。
本 CIP はオプショナルな拡張であり、CIP-0, CIP-1 を前提とする。CIP-3〜CIP-11 の各拡張は、 認可判定の手段として本 CIP を参照する。
本仕様はドラフトであり、後方互換性のない変更が行われる可能性がある。
2. 表記規則
Section titled “2. 表記規則”このドキュメントにおける以下の語は、必ず大文字で記述される場合、 BCP 14 [RFC2119] [RFC8174] にしたがって解釈される。
MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, NOT RECOMMENDED, MAY, OPTIONAL
3. Introduction
Section titled “3. Introduction”Concrnt において、タイムラインなどのフィードリソースは特定のサーバーに閉じたものではなく、 複数のサーバーのエンティティから書き込み・参照される。そのため「誰がこのリソースに投稿できるか」 「誰がこのリソースを読めるか」といったアクセス制御は、サーバーローカルな設定ではなく、 リソース自身に関連付けられた宣言的なポリシーとして表現され、リソースをホストするどのサーバーでも 同一の結論が得られる必要がある。
CIP-12 は、このためのポリシー言語を定義する。ポリシーは次の 3 つの要素から構成される。
- Policy Document — ポリシー本体。名前付き・バージョン付きの JSON ドキュメントであり、 HTTP で解決可能な URL でホストされる。
- リソースへの関連付け — CIP-1 で定義される Concrnt Document の
policyフィールドに、 Policy Document への URL 参照 (および評価パラメータ) を記述することで、 その Document が表すリソースにポリシーを適用する。 - 評価 — サーバーは、リソースへの操作 (アクション) が要求されたとき、 対象リソースとその祖先、および配布先 (distributes) のポリシーを重ね合わせた ポリシースタックを構築し、これを評価して操作の可否を決定する。
4. Policy Document
Section titled “4. Policy Document”Policy Document は次の JSON 構造を持つ。
{ "name": "string", "description": "string (optional)", "versions": { "2025-12-23": { "statements": [ (see 4.1 Statement) ], "defaults": { "<action-name>": "<conclusion>" } } }}nameポリシー名。descriptionポリシーの説明 (OPTIONAL)。versionsポリシー言語のバージョンをキーとし、ポリシー本体を値とするマップ。 現在の最新バージョンは"2025-12-23"であり、このドキュメントではこのバージョンを定義する。 評価者は自身が対応するバージョンのエントリのみを使用する。 対応するバージョンが存在しない場合、その Policy Document は解決不能として扱う (§5.3.4)。
バージョンエントリの中身は次の 2 要素から構成される。
statementsStatement (§4.1) のフラットな配列。defaultsアクション名をキーとし、Conclusion 値 (§6.1) を値とするマップ (OPTIONAL)。 そのアクションについてどの Statement も結論を出さなかった場合のフォールバック値となる (§6.2)。
4.1 Statement
Section titled “4.1 Statement”Statement は、特定のアクションに対する 1 つの判定規則である。
{ "action": "record:create", "key": "*", "condition": { (see 4.2 Rule) }, "emit": "allow", "reason": "string (optional)"}actionこの Statement が適用されるアクション名 (§4.3)。要求されたアクションと完全一致した場合のみ 評価される。keyこの Statement が適用されるリソースキー (CCURI) のパターン (OPTIONAL)。*を任意の文字列にマッチするワイルドカードとして使用できる。 パターンは対象キー全体にマッチしなければならない (前方一致ではない)。 リソースに関連付けられたポリシーが解決される際、keyは特別な相対表記を持つ (§5.2)。condition条件式 (§4.2)。評価結果が真である場合のみ、この Statement はemitの値を出力する。emit条件成立時に出力する Conclusion 値 (§6.1)。ok/ng/allow/denyのいずれか。reason条件成立時に評価結果へ付加される説明文字列 (OPTIONAL)。 アクセス拒否時のエラーメッセージ等に利用される。
条件式の評価がエラーとなった場合 (未知の演算子、型不一致、ConcrntCall の失敗等)、
その Statement は何も出力してはならない (MUST NOT。エラーを伝播させない)。
結果として、どの Statement も出力しなかったアクションは defaults へフォールバックする。
これにより、ポリシー作成者は defaults の設定を通じて、評価不能時に
fail-open (許可側に倒す) とするか fail-closed (拒否側に倒す) とするかを選択できる。
4.2 Rule
Section titled “4.2 Rule”条件式は、演算子のツリーとして表現される。各ノードは次の構造を持つ。
{ "op": "<operator-name>", "args": [ <Rule>, ... ], "const": <any> (optional)}op演算子名。args引数となる子ノードの配列。各子ノードを評価した結果が演算子への引数となる。const定数値 (OPTIONAL)。§4.2.1 参照。
引数の子ノードは、宣言順にすべて評価したうえで演算子に渡される (短絡評価を行わない)。 いずれかの子ノードの評価がエラーとなった場合、式全体の評価はエラーとなる (MUST)。 評価者間で「どの引数まで評価されたか」による結論の差を生まないためである。 未知の演算子を含む式の評価はエラーとなる (その Statement は何も出力しない)。
4.2.1 Const と糖衣構文
Section titled “4.2.1 Const と糖衣構文”op が "Const" であるノードは、const フィールドの値をそのまま返す。
{ "op": "Const", "const": "admin" }また糖衣構文として、Const 以外の演算子ノードに const フィールドが指定された場合、
その値は Const ノードとして引数リストの先頭に挿入される。
次の 2 つの式は等価である。
{ "op": "Load", "const": "params.role" }
{ "op": "Load", "args": [ { "op": "Const", "const": "params.role" } ] }4.2.2 論理演算子
Section titled “4.2.2 論理演算子”And可変長引数。すべての引数は bool でなければならない (MUST)。すべて真なら真、 さもなくば偽を返す。引数が 0 個の場合は真を返す (MUST)。Or可変長引数。すべての引数は bool でなければならない (MUST)。いずれかが真なら真、 さもなくば偽を返す。引数が 0 個の場合は偽を返す (MUST)。Not引数 1 個。bool でなければならない (MUST)。論理否定を返す。
bool でない引数が現れた場合はエラーとなる。
4.2.3 比較演算子
Section titled “4.2.3 比較演算子”Eq引数 2 個。両者が等しければ真を返す。比較は JSON データモデル上で行う (MUST): 引数は string / number / boolean / null のいずれかであり、型が異なる場合は偽を返す。 number は数値として (IEEE 754 double の等価性で) 比較する。 配列またはオブジェクトが引数に現れた場合はエラーとなる (MUST)。Contains引数 2 個。第 1 引数は配列でなければならない (MUST)。 第 2 引数が配列の要素として含まれていれば真を返す。要素の比較はEqと同一の規則による (MUST)。IsNotEmpty引数 1 個。引数がnullの場合は偽。配列・文字列・オブジェクトの場合、 空でなければ真を返す。それ以外の型 (数値等) はエラーとなる。
4.2.4 データアクセス演算子
Section titled “4.2.4 データアクセス演算子”-
Load引数 1 個 (string)。評価コンテキスト (§4.2.6) をドット記法で解決し、その値を返す。 キーが存在しない場合はエラーとなる。{ "op": "Load", "const": "requester.ccid" } -
CCUriOwner引数 1 個 (string)。引数を CCURI (CIP-0) としてパースし、その owner (CCID) を返す。 パースに失敗した場合はエラーとなる。
4.2.5 ConcrntCall
Section titled “4.2.5 ConcrntCall”ConcrntCall は、ポリシー評価の過程で Concrnt の API を呼び出し、その結果を条件判定に利用する
ための演算子である。「特定のエンティティを Ack している者のみ閲覧可」のような、
外部の状態に依存する条件を表現できる。
引数は次の形式の可変長リストであり、すべて string でなければならない (MUST)。
[ <resolver>, <api>, <key1>, <value1>, <key2>, <value2>, ... ]resolver(args[0]) API を解決する起点となる CCID 等の識別子。この識別子の所属サーバーに対して API が呼び出される。api(args[1]) 呼び出すエンドポイント名 (例:"net.concrnt.core.acknowledges")。- 以降の引数は、クエリパラメータのキーと値のペア。ペア数は偶数でなければならない (MUST)。
返り値は API のレスポンスである。レスポンスが CIP-5 §3.2 のページング形式
({"items": [...], ...}) の場合、評価器は items 配列を返り値としなければならない (MUST)。
IsNotEmpty と組み合わせて真偽値化するのが典型的な用法である。
{ "op": "IsNotEmpty", "args": [ { "op": "ConcrntCall", "args": [ { "op": "Const", "const": "con1alice" }, { "op": "Const", "const": "net.concrnt.core.acknowledges" }, { "op": "Const", "const": "from" }, { "op": "Const", "const": "con1alice" }, { "op": "Const", "const": "to" }, { "op": "Load", "const": "requester.ccid" } ] } ]}評価規則:
- 呼び出し可能な API は評価者 (サーバー) が定める allowlist に制限されなければならない (MUST)。
allowlist にない API の呼び出しは、名前解決やネットワーク I/O を行う前に拒否される。
参考実装の allowlist は現在
net.concrnt.core.acknowledgesのみである。 - HTTP 2xx 応答は、
itemsが空配列であっても成功した (空の) 結果として扱う (MUST)。 2xx 以外の応答は評価エラーとする (MUST)。 - 呼び出しが失敗した場合 (ネットワークエラー、非 2xx 応答、非許可 API、呼び出し機構が利用できない
評価コンテキスト等)、式の評価はエラーとなり、その Statement は何も出力しない。
§4.1 のとおり
defaultsへフォールバックするため、制限系ポリシーはdefaultsに拒否側の値 (ng等) を設定することで fail-closed にできる。
allowlist の内容は実装定義である。allowlist に依存するポリシーは、評価者によって結果が異なりうる
ため、ポリシー作成者は defaults によるフォールバック (fail-open / closed) を
宣言するべきである (SHOULD)。
4.2.6 評価コンテキスト
Section titled “4.2.6 評価コンテキスト”Load が解決対象とする評価コンテキストは、次のルートを持つ。
| ルート | 内容 |
|---|---|
requester |
操作を要求しているエンティティ |
self |
操作対象の Document (CIP-1 の構造。kind / key / value / author / schema / createdAt 等) |
params |
ポリシー参照時に指定されたパラメータ (§5.1) |
globals |
サーバーのグローバルパラメータ。fqdn (サーバーの FQDN) を含む |
requester のフィールドは次の通り導出される。
ccid— CIP-2 で認証されたリクエスタの CCID。ゲスト (未認証) の場合は空文字列""。domain— リクエスタの Entity Document から解決された所属サーバーの FQDN。ゲストの場合は空文字列。alias— リクエスタの Entity Document の alias。設定されている場合にのみ存在する。 値は自己申告であり、CIP-0 §8.3 の検証を経ているかは受理サーバーの実装に依存するため、 認可の条件として使用すべきではない (SHOULD NOT)。tag— サーバーがリクエスタに付与したタグ文字列 (後述)。設定されている場合にのみ存在する。
存在しないキーへの Load はエラーとなり (§4.2.4)、その Statement は defaults へ
フォールバックする。ゲストの判定には requester.ccid と空文字列の Eq 比較を用いる。
self は評価対象の操作により定まる。作成・更新時の扱いは §5.3.1 を参照。
削除 (record:delete / association:delete) の評価において、self は削除対象として保存済みの
Document でなければならない (MUST)。提出された kind: "delete" の Document を self として
用いてはならない (MUST NOT) — 削除コマンドの author は常にリクエスタ自身であるため、
これを許すと「author 本人のみ削除可」のポリシーが任意の第三者に成立してしまう。
タグ文法: requester.tag は、サーバーがエンティティに付与したタグの
カンマ区切り文字列である (例: "_admin,role:moderator")。
- 各要素は
keyまたはkey:value形式である。keyおよびvalueには カンマ (,) およびコロン (:) を含めてはならない (MUST NOT)。 _で始まるkeyはサーバー実装のために予約される (例:_admin,_blocked,_invite)。requester.tagの評価結果は文字列であるため、Contains(配列用) では判定できない。 現状、個別タグの有無を判定する標準演算子は定義されていない (将来の拡張とする)。 文字列全体のEq比較は可能である。
4.3 Actions
Section titled “4.3 Actions”本仕様は次のアクションを定義する。サーバーは、該当する操作の評価時にこれらのアクション名を 使用しなければならない (MUST)。
| アクション名 | 評価タイミング |
|---|---|
record:create |
kind: record の Document が新規キーへ commit されるとき |
record:update |
既存キーを持つ Document が上書き commit されるとき |
record:read |
Document が読み取られるとき |
record:delete |
kind: delete により Document が削除されるとき |
association:create |
kind: association の Document が commit されるとき |
association:read |
Association Document が読み取られるとき |
association:delete |
Association Document が削除されるとき |
対象が kind: association である場合は association 系のアクション名が、
それ以外は record 系のアクション名が使用される。
アクション名の名前空間は拡張可能であり、上位プロトコルや拡張が独自のアクション名を
定義してもよい (MAY)。評価時に、どの Statement の action にもマッチしないアクションは
defaults のみで判定される。
5. リソースへのポリシーの適用
Section titled “5. リソースへのポリシーの適用”5.1 policy フィールド
Section titled “5.1 policy フィールド”CIP-1 で定義される Concrnt Document を拡張し、policy フィールドを定義する。
{ "kind": "record", "key": "cckv://con1alice/my-timeline", "schema": "https://...", "value": { ... }, "author": "con1alice...",
"policy": { "entries": [ { "url": "https://policy.concrnt.world/p/whitelist-timeline.json", "params": { "allowlist": ["con1alice...", "con1bob..."] }, "defaults": { "record:create": "ng" } } ] },
"createdAt": "2025-11-23T12:34:56Z"}entriesポリシー参照の配列。複数のポリシーを 1 つのリソースに適用できる。entries[].urlPolicy Document (§4) を解決可能な URL。entries[].params評価時に評価コンテキストのparamsとして注入される値 (OPTIONAL)。 同一の Policy Document をパラメータ違いで再利用するために使用する。entries[].defaultsアクション名 → Conclusion のマップ (OPTIONAL)。 解決された Policy Document 自身のdefaultsを上書きする。 参照先ポリシーが解決できなかった場合のフォールバック値としても使用される (§5.3.4)。
5.2 key の相対解決
Section titled “5.2 key の相対解決”Policy Document は特定のリソースから独立して記述されるため、Statement の key には
適用先からの相対表記を使用できる。サーバーはポリシーを解決する際、
基準 URI (以下 <source>。通常はポリシーが関連付けられたリソースの URI。
仮想親レイヤーでは §5.3 の規則による) を用いて key を次のように
書き換えなければならない (MUST)。
| 記述 | 書き換え後 | 意味 |
|---|---|---|
"." |
<source> |
基準リソース自身のみ |
"" または "*" |
<source>* |
基準リソース自身とその配下すべて |
"./*" |
<source>/* |
基準リソースの配下のみ (自身を含まない) |
上記以外の値はそのまま使用される。
5.3 ポリシースタックの構築
Section titled “5.3 ポリシースタックの構築”サーバーは、あるリソースへの操作を評価する際、以下のレイヤーを順に積んだポリシースタックを 構築する。各レイヤーは 0 個以上の評価単位 (解決済みポリシー + params) の順序付きリストである。
- サーバーグローバルポリシー — サーバー運営者が設定するポリシー。常に先頭レイヤーとなる。
- 祖先のポリシー — 対象リソースのキー階層 (cckv URI のパス構造) のルート側から 対象リソースへ向かって、各階層の Document に関連付けられたポリシーを 1 階層 1 レイヤーとして順に積む (ルートが先、直近の親が最後)。
- 仮想親 (配布先) のポリシー — ある階層の Document が
distributes(CIP-7) によって タイムライン等へ配布されている場合、その配布先リソースに関連付けられたポリシー。 配布先を宣言しているリソースのレイヤーの直前に、独立した 1 レイヤーとして挿入される。 これにより、タイムラインのポリシーがそこに配布される投稿を統制できる。 仮想親レイヤーのkey相対解決 (§5.2) では、<source>として配布先リソースの URI ではなくdistributesを宣言しているリソースの URI の親パスを用いる (MUST)。 これにより、配布先ポリシーの相対keyパターン ("./*"等) が評価対象リソースのキーに マッチする。 - 対象リソース自身のポリシー — 対象 Document の
policyフィールドから解決されたもの。 常に最後のレイヤーとなる。
すなわち評価順は グローバル → ルート → … → 直近の親 → (仮想親 →) 対象リソース自身 である。
§6.3 の評価規則と組み合わせると、強い判定 (allow / deny) はグローバル側 (外側) のレイヤーが
優先され、弱い判定 (ok / ng) は対象リソース自身に近い (深い) レイヤーが優先される。
association の評価では、association 自身ではなく associate が指すリソースを起点として
スタックが構築される。Association Document 自身の policy はスタックに積まれない
(評価コンテキストの self としてのみ参照される)。
5.3.1 作成・更新時の自己ポリシーの扱い
Section titled “5.3.1 作成・更新時の自己ポリシーの扱い”提出者が制御する Document が自身の操作を承認することを防ぐため、以下を適用する。
- 作成 (
record:create) の評価では、コミットされようとしている Document 自身のpolicyフィールドを評価レイヤーに含めてはならない (MUST NOT)。 新規 Document のポリシーは、保存された後の将来の操作に対してのみ効力を持つ。 - 更新 (
record:update) の評価では、保存済みの既存 Document のポリシーを 「対象リソース自身のポリシー」レイヤーとして使用しなければならない (MUST)。 置き換え候補として提出された Document のポリシーを認可判定に使用してはならない (MUST NOT)。
いずれの場合も、提出された Document は評価コンテキストの self (§4.2.6) としては参照される。
5.3.2 解決
Section titled “5.3.2 解決”各エントリの url から Policy Document を取得し、評価者が対応するバージョンのエントリ (§4) を
評価単位とする。サーバーは解決結果をキャッシュしてよい (MAY)。
5.3.3 defaults の上書き
Section titled “5.3.3 defaults の上書き”エントリに defaults が指定されている場合、解決されたポリシーの defaults を
アクション単位で上書きする。これにより、ポリシーを参照する側のドキュメントが
フォールバック時の結論を決定できる。
5.3.4 解決失敗時の扱い
Section titled “5.3.4 解決失敗時の扱い”参照先ポリシーが解決できなかった場合 (取得失敗、対応バージョン無し等)、
そのエントリはエラー状態の評価単位としてスタックに残されなければならない (MUST)。
エラー状態の評価単位は、評価時にエントリの defaults に宣言された結論
(宣言が無いアクションについては unset) として折りたたまれる。
解決失敗を「ポリシー無し」として黙って無視してはならない (MUST NOT)。
6. 評価方法
Section titled “6. 評価方法”6.1 Conclusion
Section titled “6.1 Conclusion”評価結果は次の 5 値をとる。
| 値 | 強度 | 意味 |
|---|---|---|
unset |
— | 判定なし |
ok |
弱 | 弱い許可 |
ng |
弱 | 弱い拒否 |
allow |
強 | 強い許可 |
deny |
強 | 強い拒否 |
2 つの Conclusion の合成は次の規則に従う。
- 一方が
unsetなら他方を返す。 denyとallowが衝突した場合、unset(相殺) となる。- それ以外で
denyを含めばdeny、allowを含めばallow(強い判定は弱い判定に優先する)。 okとngが衝突した場合、unset(相殺) となる。- それ以外で
okを含めばok、ngを含めばng。
deny × allow は「拒否優先」ではなく相殺である点に注意。
同一レイヤー内で強い許可と強い拒否が対立した場合、そのレイヤーは判定を放棄し、
判断は後続のレイヤー (またはデフォルト) へ委ねられる。
この合成は可換でも結合的でもないため、複数の値の折りたたみは、
宣言順 (statements の配列順、policy.entries の配列順) の左畳み込みで
行わなければならない (MUST)。
6.2 単一ポリシーの評価
Section titled “6.2 単一ポリシーの評価”あるアクション action・対象キー key について、1 つのポリシーは次のように評価される。
statementsから、actionが一致し、かつ書き換え済みkeyパターン (§5.2) が 対象キー全体にマッチする Statement を抽出する。- 各 Statement の
conditionを評価する。評価がエラーとなった Statement はスキップする。 - 結果が真となった Statement の
emitを、配列順の左畳み込み (§6.1) で合成する。 このときreasonが指定されていれば評価理由として蓄積する。 - 折りたたみ結果が
unsetの場合、defaults[action]が定義されていればその値とする。
6.3 スタックの評価
Section titled “6.3 スタックの評価”ポリシースタックは先頭レイヤーから順に評価される。
- レイヤー内の各評価単位を §6.2 で評価する
(エラー状態の評価単位は
defaultsの宣言値、無ければunset)。 評価単位にparamsが付与されている場合、評価コンテキストのparamsを その値で差し替えて評価する。 - レイヤー内の結果を、評価単位の宣言順の左畳み込み (§6.1) で合成し、レイヤーの結論とする。
- レイヤーの結論に応じて:
deny→ 直ちにdenyで評価終了 (以降のレイヤーは評価しない)。allow→ 直ちにallowで評価終了。unset→ 次のレイヤーへ (暫定結論は変更しない)。ok/ng→ 暫定結論を更新し、次のレイヤーへ。
- 全レイヤー評価後、暫定結論 (初期値
unset) を最終結論とする。
強い判定 (allow / deny) は先に評価されたレイヤーが優先され、
弱い判定 (ok / ng) は後に評価されたレイヤーが優先される。
スタックはグローバル → ルート → … → 対象リソース自身の順に構築される (§5.3) ため、 強い判定については外側 (サーバー・祖先) がリソース自身に優先し、 弱い判定についてはリソース自身の宣言が祖先のデフォルト的な宣言を上書きする。
6.4 最終判定
Section titled “6.4 最終判定”最終結論が allow または ok の場合のみ、操作は許可される。
deny、ng、および unset (どのポリシーも判定しなかった場合) は拒否である。
すなわち、評価系全体としてはデフォルト拒否であり、
通常運用ではサーバーグローバルポリシーが基本操作に ok を与えることが想定される。
拒否時のエラーには、評価過程で蓄積された reason (§4.1) を含めるべきである (SHOULD)。
7.1 特定ユーザーのみ書き込み可能なタイムライン
Section titled “7.1 特定ユーザーのみ書き込み可能なタイムライン”Policy Document (https://policy.example.com/whitelist.json でホスト):
{ "name": "whitelist-writers", "description": "params.allowlist に含まれるCCIDのみ書き込みを許可する", "versions": { "2025-12-23": { "statements": [ { "action": "record:create", "key": "./*", "emit": "allow", "condition": { "op": "Contains", "args": [ { "op": "Load", "const": "params.allowlist" }, { "op": "Load", "const": "requester.ccid" } ] } }, { "action": "record:create", "key": "./*", "emit": "deny", "reason": "this timeline is restricted to allowlisted members", "condition": { "op": "Not", "args": [ { "op": "Contains", "args": [ { "op": "Load", "const": "params.allowlist" }, { "op": "Load", "const": "requester.ccid" } ] } ] } } ] } }}タイムライン側の Document:
{ "kind": "record", "key": "cckv://con1alice/members-timeline", "schema": "https://schema.concrnt.net/timeline.json", "value": { "name": "Members Only" }, "author": "con1alice...", "policy": { "entries": [ { "url": "https://policy.example.com/whitelist.json", "params": { "allowlist": ["con1alice...", "con1bob..."] } } ] }, "createdAt": "2025-11-23T12:34:56Z"}7.2 Ack している相手のみ閲覧可能なリソース (ConcrntCall)
Section titled “7.2 Ack している相手のみ閲覧可能なリソース (ConcrntCall)”リソースの owner が要求者を Ack (CIP-10) している場合のみ読み取りを許可する。
呼び出しに失敗した場合は defaults により ng (拒否) へ倒れる (fail-closed)。
{ "name": "followers-only-read", "versions": { "2025-12-23": { "statements": [ { "action": "record:read", "key": "*", "emit": "ok", "condition": { "op": "IsNotEmpty", "args": [ { "op": "ConcrntCall", "args": [ { "op": "Const", "const": "con1alice" }, { "op": "Const", "const": "net.concrnt.core.acknowledges" }, { "op": "Const", "const": "from" }, { "op": "Const", "const": "con1alice" }, { "op": "Const", "const": "to" }, { "op": "Load", "const": "requester.ccid" } ] } ] } } ], "defaults": { "record:read": "ng" } } }}8. Security Considerations
Section titled “8. Security Considerations”- ポリシーは HTTP 経由で解決されるため、Policy Document のホスティングは TLS で保護 されるべきである (SHOULD)。またサーバーは解決結果をキャッシュするため、 ポリシー変更の反映にはキャッシュ TTL 分の遅延が生じうる。
- Policy Document の URL 解決および
ConcrntCallは、提出者が間接的に指定した宛先への サーバー側ネットワーク I/O (SSRF の温床) となる。評価者は、プライベートアドレス・ ループバックアドレス・リンクローカルアドレスへ解決される宛先へのリクエストを 拒否するべきである (SHOULD)。また、解決にはタイムアウトを課し、結果をキャッシュ するべきである (SHOULD)。DNS 再バインディングを考慮し、接続時の宛先 IP に対して 検査を行うことが望ましい。 ConcrntCallは評価時にネットワーク I/O を発生させる。評価者は allowlist による API 制限 (MUST) に加え、タイムアウトや呼び出し回数の制限を課すべきである (SHOULD)。ConcrntCallの結果は、resolverの所属サーバーの応答をそのまま信頼する。resolverにリクエスタ由来の値 (requester.ccid等) を用いると、認可の判断材料を リクエスタの支配下にあるサーバーが提供することになるため、用いるべきではない (SHOULD NOT)。 評価者は、応答に含まれる Signed Document の署名を検証し、無効な要素を除外してもよい (MAY)。- ポリシー解決失敗時の挙動 (§5.3.4) は、参照エントリの
defaultsに依存する。 機密性が要求されるリソースでは、拒否側の defaults を必ず宣言し fail-closed とすべきである (SHOULD)。
9. References
Section titled “9. References”- RFC 2119 – Key words for use in RFCs to Indicate Requirement Levels
- RFC 8174 – Clarifications to RFC 2119
- CIP-0 – Concrnt Core (CCID, CCURI)
- CIP-1 – Concrnt Document System
- CIP-10 – Ack
この文書は concrnt/CIPs-translated の ja/12-policy.md から生成されています。原文(英語)は concrnt/CIPs を参照してください。