Open3
casbin で遊ぶ

Casbin とは?
- オープンソースのアクセス制御ライブラリ
- アクセス制御モデルはPERMメタモデル(Policy、Effect、Request、Matchers)に基づいて設定ファイルに抽象化される
- ポリシーはメモリ、ファイル、データベース(MySQL、MongoDB、Redisなど)など様々な場所に保存できる
- Go 以外にも Java、Python などに対応
アクセス制御とは?
- 特定のリソースに対して、誰がどのような操作を行えるかを制御すること
-
- RBAC - Role Based Access Control
- ロールとは部署、場所、組織内の階級、職務など
- Pros: シンプル
- Cons: ロールが爆発する
- ABAC - Attribute Based Access Control
- 属性とはユーザーのロール、ログイン場所、リソースのオーナーなど
- Pros: 多くの変数を定義でき、高度な制御を確保できる
- Cons: コストがかかる
- このほか PBAC というのもあるらしい
https://www.okta.com/jp/identity-101/role-based-access-control-vs-attribute-based-access-control/

PERMメタモデル
- Policy, Effect, Request, Matchers
Request
- 定義は
r={sub,obj,act}
で、誰が、何を、どうする、の形になっている
Policy
- アクセス戦略のモデルを定義する。権限のリスト
-
p={sub, obj, act}
orp={sub, obj, act, eft}
-
eft
(=policy result)が定義されていない場合、一致するポリシー結果はデフォルトで許可される(allowになる)
-
Matcher
- RequestとPolicyのマッチングルールを定義する
- 例えば
m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
というマッチングルールは、リクエストパラメータ(エンティティ、リソース、およびメソッド)がポリシーで見つかったものと等しい場合、ポリシー結果(p.ft)が返されることを意味する。
Effect
- 複数Matchersのマッチング結果を論理的に評価する
- 例:`e = some(where(p.eft == allow)) マッチング戦略の結果、p.ftが(いくつかの)allowの結果を持つ場合、真になる。
- 例:
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
allowの結果を持つ戦略が1つ以上あり、denyの結果を持つ戦略が1つもない場合、真になる。

- Casbinで最もシンプルなモデルはACL(Access Control List)。
# Request definition
[request_definition]
r = sub, obj, act
# Policy definition
[policy_definition]
p = sub, obj, act
# Policy effect
[policy_effect]
e = some(where (p.eft == allow))
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
ポリシーの例
p, alice, data1, read
p, bob, data2, write
これは「アリスはdata1を読める」「ボブはdata2を書き込みできる」という意味。