アクセス制御の方式
許可という同じ結果でも、その根拠と管理する主体が異なることを具体的な属性から説明します。
説明
アクセス制御には、役割で権限をまとめるRBAC、主体・対象・状況の属性を使うABAC、所有者が付与できるDAC、分類ラベルを強制するMACなどがあります。同じ利用者と文書でも、判定に使う情報が違えば結果は変わります。
財務文書を読むaliceの固定例で、四つの独立した読取り規則を比較します。端末の信頼状態、所有者の付与、文書分類を順に変え、どの規則が反応するかを調べます。各方式の全機能ではなく、ここで明示する条件だけを評価します。
許可という同じ結果でも、その根拠と管理する主体が異なることを具体的な属性から説明します。
1主体・資源・状況を用意する
aliceはanalyst、finance部門、機密区分2・finance区画を読める主体です。文書7はbob所有で同じ部門・分類です。
from sc03 import models
user =主体の管理済み属性を用意する {"id":"alice","role":"analyst","department":"finance","clearance":2,"compartments":["finance"]}
resource =文書の所有・部門・分類を用意する {"id":7,"owner":"bob","department":"finance","level":2,"compartments":["finance"]}
context =要求時の端末と時刻を用意する {"trusted_device":True,"hour":10}
acl = set()所有者が付与する許可を空にする
print(user)比較する属性を読む
print(resource)
print(context)所有者はbobで、aliceへの個別許可はまだ空です。roleやclearanceなどは、利用者が自由に申告した値ではなく管理済み属性として扱います。
2四つの規則を評価する
RBACはanalyst、ABACは同部門・信頼端末・9時以上17時未満、DACは所有者か個別付与、MACは区分と区画の包含を検査します。
print(models(user, resource, context, acl)明示した四つの読取り規則を評価する)RBAC・ABAC・MACはTrue、DACはFalseです。方式ごとに別の規則を評価しており、四つを自動でOR合成した結果ではありません。
3端末の条件を変える
端末が信頼済みでなくなった状態へ変えます。
context["trusted_device"] = False要求状況の端末条件を変える
print(models(user, resource, context, acl)変化した規則を確認する)ABACだけがFalseへ変わります。このRBAC規則には端末条件を含めていないため、役割の許可はそのままです。
4所有者から読取りを付与する
bobがaliceへ文書7のreadを付与した状態を、ACLの組として登録します。
acl.add(("alice", 7, "read"))所有者による個別付与を反映する
print(models(user, resource, context, acl)付与後の各規則を確認する)DACがTrueになります。ABACは端末条件がFalseのままで、付与したことで他の方式の条件まで変わるわけではありません。
5文書の分類を上げる
文書のlevelを3へ変えます。aliceのclearanceは2のままです。
resource["level"] = 3文書の機密区分を上げる
print(models(user, resource, context, acl)分類に反応する規則を確認する)MACがFalseになります。所有者のDAC付与があっても、分類の強制条件を同時に適用する設計なら、それを上書きする許可にはなりません。
6区分だけでなく区画も確認する
clearanceを3にしても、文書にhr区画を追加すると区画の包含条件を満たせません。
user["clearance"] = 3主体の区分を文書に合わせる
resource["compartments"].append("hr")文書に別区画の条件を追加する
print(models(user, resource, context, acl)区画の不足を確認する)MACはFalseのままです。大小の数値だけでなく、必要な区画をすべて持つこともこの読取り規則の条件です。
7複数の条件を同時に要求する
端末と区画を満たす状態へ戻し、DACとMACを両方満たす場合だけ許可する方針を明示します。
context["trusted_device"] = True端末条件を満たす状態へ戻す
user["compartments"].append("hr")必要な区画を付与する
decisions = models方式別の判定を取得する(user, resource, context, acl)
print(decisions)各判定を読む
print(decisions["DAC"] and decisions["MAC"]二つの条件を両方要求する)四つともTrueで、DACとMACのANDもTrueです。複数方式を使う場合は、どの判定をどの演算で組み合わせるかまで定義します。
まとめ
方式によって参照する役割・属性・所有・分類が異なります。
所有者の許可と強制される分類条件は別の条件です。
複数方式を使うときは許可の合成方法も明示します。
操作履歴と解説を振り返れます。
Python 3.15 / SQLite / 明示した読取り認可モデル
from sc03 import models
user = {"id":"alice","role":"analyst","department":"finance","clearance":2,"compartments":["finance"]}
resource = {"id":7,"owner":"bob","department":"finance","level":2,"compartments":["finance"]}
context = {"trusted_device":True,"hour":10}
acl = set()
print(user)
print(resource)
print(context){'id': 'alice', 'role': 'analyst', 'department': 'finance', 'clearance': 2, 'compartments': ['finance']}
{'id': 7, 'owner': 'bob', 'department': 'finance', 'level': 2, 'compartments': ['finance']}
{'trusted_device': True, 'hour': 10}print(models(user, resource, context, acl)){'RBAC': True, 'ABAC': True, 'DAC': False, 'MAC': True}context["trusted_device"] = False
print(models(user, resource, context, acl)){'RBAC': True, 'ABAC': False, 'DAC': False, 'MAC': True}acl.add(("alice", 7, "read"))
print(models(user, resource, context, acl)){'RBAC': True, 'ABAC': False, 'DAC': True, 'MAC': True}resource["level"] = 3
print(models(user, resource, context, acl)){'RBAC': True, 'ABAC': False, 'DAC': True, 'MAC': False}user["clearance"] = 3
resource["compartments"].append("hr")
print(models(user, resource, context, acl)){'RBAC': True, 'ABAC': False, 'DAC': True, 'MAC': False}context["trusted_device"] = True
user["compartments"].append("hr")
decisions = models(user, resource, context, acl)
print(decisions)
print(decisions["DAC"] and decisions["MAC"]){'RBAC': True, 'ABAC': True, 'DAC': True, 'MAC': True}
True演習完了