メインコンテンツまでスキップ

手形スキーマ

手形 (Tegata) スキーマ、バージョン 0.1 の完全なリファレンスです。手形は <policy-id>.tegata.json という名前の JSON ドキュメントで、1 つの認可ポリシーを宣言します。本ページでは、すべてのフィールド・ 演算子・固定された評価セマンティクスを記載します。

導入は クイックスタートポリシーを追加する を参照してください。

正規フィールドとメタデータ

すべてのフィールドは 正規 (canonical)メタデータ のいずれかです。

  • 正規 フィールドはポリシーの意味を定義します。Rego にコンパイルされ、tegata_hash(あなたが 承認するフィンガープリント)に含まれます。
  • メタデータ フィールド(description、relationship の labelaudit オブジェクト全体)は人間と 監査証跡のためのものです。ハッシュから除外され、コンパイルされません。

実務上の帰結: ルールの並べ替えや description の書き換えは tegata_hash を変えませんが、role・ action・condition・effect の変更は変えます。


トップレベル構造

additionalProperties: false。必須: tegatapolicyrules

フィールド正規備考
tegatastringはいスキーマバージョン。const "0.1"
policyobjectはいid 必須。下記参照。
attributesobject mapはい属性の型宣言。下記参照。
auditobjectいいえ人間・監査用メタデータ。コンパイルされない。下記参照。
rulesarrayはいminItems: 1ルールオブジェクト 参照。

policy

フィールド正規備考
policy.idstringはいkebab-case ^[a-z][a-z0-9]*(-[a-z0-9]+)*$maxLength: 64
policy.descriptionstringいいえ自由記述。

attributes

object map(正規)です。キーは ^(subject|resource|environment|custom).<name...> に一致し、値は "string" | "integer" | "boolean" です。ここで属性を宣言する必要があるのは、その型がルールの リテラルから導出できない場合だけです(例: relationship でのみ使う属性)。

audit

メタデータ(コンパイルされない)です。フィールド:

フィールド備考
source_textstring元の自然言語の要件。
normalized_textstring正規化した言い換え。
ambiguitiesarray解釈メモ。各要素: codemessage、任意の related_rules[]

ambiguities[].code は次のいずれかです: assumed_interpretationmissing_inputcontradictionunexpressible_delegatedexception_scope


ルールオブジェクト

additionalProperties: false。必須: ideffectsubjectactionsresource

フィールド必須備考
idstringはいkebab-case、maxLength: 64、ファイル内で一意。
effectstringはい"allow" または "deny"
descriptionstringいいえメタデータ。
subjectobjectはい任意の roles。下記参照。
actionsarrayはい下記参照。
resourceobjectはいtype 必須。下記参照。
relationshipsarrayいいえエンティティ間比較。Relationships 参照。
conditionsarrayいいえ属性制約。Conditions 参照。

subject

subject.roles は任意の、空でない、一意な snake_case 識別子の配列です。role は any-of(列挙した いずれかの role を持てば一致)で照合されます。任意の subject に一致させるには roles を省略します。

actions

必須です。空でない一意な snake_case 識別子の配列(any-of で照合)か、正確なワイルドカード ["*"] のいずれかです。

resource

type は必須で、snake_case 識別子またはワイルドカード "*" です。


Relationships

relationships は任意の配列です。エンティティ間比較(subject 対 resource)が許されるのは ここだけ です。

フィールド正規備考
labelいいえ人間可読な名前。
subject_attributeはい識別子。
opはいeqneqgtgteltlte のいずれか。
resource_attributeはい識別子。

例 — 「請求書の提出者がリクエストしたユーザーである」:

{ "label": "own_submission", "subject_attribute": "user_id", "op": "eq", "resource_attribute": "submitted_by" }

Conditions

conditions は任意の配列です。各 condition は op による判別共用体です。keyスコープ付きキーsubject.*resource.*environment.*custom.*)です。

ファミリop の値値フィールド備考
スカラーeq, neqvalue(リテラル)等価 / 非等価。
順序gt, gte, lt, ltevalue(整数または文字列)boolean は不可。
集合in, not_invalues(空でない一意なリテラル配列)集合への所属。
配列メンバーシップcontains, not_containsvalue(リテラル)配列属性への所属。
存在exists, not_exists値なし。

例:

{ "key": "resource.amount", "op": "lte", "value": 500000 }

識別子とリテラル

  • 識別子(role・action・resource type・属性名)は snake_case です。
  • リテラルstringintegerboolean です。
  • 整数のみ — v0.1 に浮動小数点数はありません。 金額やしきい値は整数です(例: JPY を整数として)。

評価セマンティクス

これらは固定で、設定変更できません。

ルール挙動
ルール内すべての condition(と relationship)は AND されます。
同一 effect のルール間OR されます — その effect の一致するルールがあれば一致。
allow 対 denydeny が allow を上書き(Deny-First)。
一致する allow がないdeny — Zero-Trust、デフォルト false
roles / actionsany-of で照合。
ワイルドカード"*" はすべてに一致。

完全な例

正規の authz/invoice-access.tegata.json:

{
"tegata": "0.1",
"policy": {
"id": "invoice-access",
"description": "請求書の閲覧・削除・承認"
},
"attributes": {
"subject.user_id": "string",
"resource.submitted_by": "string"
},
"audit": {
"source_text": "従業員は自分が提出した請求書を閲覧できる。マネージャー・経理・管理者は全ての請求書を閲覧できる。マネージャーは50万円以内の請求書を承認できる。経理は金額によらず承認できる。管理者は請求書を削除できる。",
"ambiguities": [
{
"code": "assumed_interpretation",
"message": "「自分が提出した」を relationship(subject.user_id = resource.submitted_by)で表現した。代理提出・共同提出の概念はないものと仮定。",
"related_rules": ["allow-employee-view-own-invoice"]
},
{
"code": "assumed_interpretation",
"message": "「50万円以内」を resource.amount lte 500000(整数・JPY)と解釈した。境界値50万円ちょうどは承認可に含む。含まない意図なら lt に変更が必要。",
"related_rules": ["allow-manager-approve-invoice-within-limit"]
},
{
"code": "missing_input",
"message": "resource.amount / resource.submitted_by は請求書レコード(DB)から、subject.user_id はセッションから供給される前提。通貨はJPY単一通貨を仮定。",
"related_rules": ["allow-employee-view-own-invoice", "allow-manager-approve-invoice-within-limit"]
}
]
},
"rules": [
{
"id": "allow-employee-view-own-invoice",
"effect": "allow",
"description": "従業員は自分が提出した請求書を閲覧できる",
"subject": { "roles": ["employee"] },
"actions": ["view"],
"resource": { "type": "invoice" },
"relationships": [
{ "label": "own_submission", "subject_attribute": "user_id", "op": "eq", "resource_attribute": "submitted_by" }
]
},
{
"id": "allow-staff-view-invoice",
"effect": "allow",
"description": "マネージャー・経理・管理者は全ての請求書を閲覧できる",
"subject": { "roles": ["manager", "finance", "admin"] },
"actions": ["view"],
"resource": { "type": "invoice" }
},
{
"id": "allow-manager-approve-invoice-within-limit",
"effect": "allow",
"description": "マネージャーは50万円以内の請求書を承認できる",
"subject": { "roles": ["manager"] },
"actions": ["approve"],
"resource": { "type": "invoice" },
"conditions": [ { "key": "resource.amount", "op": "lte", "value": 500000 } ]
},
{
"id": "allow-finance-approve-invoice",
"effect": "allow",
"description": "経理は金額によらず請求書を承認できる",
"subject": { "roles": ["finance"] },
"actions": ["approve"],
"resource": { "type": "invoice" }
},
{
"id": "allow-admin-delete-invoice",
"effect": "allow",
"description": "管理者は請求書を削除できる",
"subject": { "roles": ["admin"] },
"actions": ["delete"],
"resource": { "type": "invoice" }
}
]
}

関連ページ