본문으로 건너뛰기

OrBAC

OrBAC란 무엇인가?​

**OrBAC(Organisation-Based Access Control)**은 추상화와 조직 차원으로 RBAC을 확장합니다. 정책은 역할, 활동 및 뷰를 참조하며, 구체적인 사용자, 작업 및 객체는 조직별로 여기에 매핑됩니다. 이를 통해 엔티티가 변경되어도 정책이 안정적으로 유지됩니다.

세 가지 매핑(모두 조직 범위로 제한됨):

  • Empower — 사용자 → 역할
  • Use — 작업 → 활동
  • Consider — 객체 → 뷰

요청의 (주체, 작업, 객체)가 해당 조직에서 권한이 있는 (역할, 활동, 뷰)에 매핑될 때 권한이 부여됩니다.

Model​

[request_definition]
r = sub, org, obj, act

[policy_definition]
p = role, activity, view, org

[role_definition]
g = _, _, _
g2 = _, _, _
g3 = _, _, _

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = g(r.sub, p.role, r.org) && g2(r.act, p.activity, r.org) && g3(r.obj, p.view, r.org) && r.org == p.org
  • g — 주체가 조직 내에서 역할을 가짐(Empower)
  • g2 — 작업이 조직 내 활동임(Use)
  • g3 — 객체가 조직 내 뷰에 속함(Consider)
  • r.org == p.org — 동일한 조직

정책 예시​

권한 규칙은 각 조직에서 어떤 역할이 어떤 뷰에서 어떤 활동을 수행할 수 있는지 지정합니다:

# Permission: role, activity, view, organization
p, manager, modify, document, org1
p, manager, consult, document, org1
p, employee, consult, document, org1
p, manager, modify, report, org2
p, manager, consult, report, org2
p, employee, consult, report, org2

Empower 규칙은 조직 내에서 주체에 역할을 할당합니다:

# Empower: subject, role, organization
g, alice, manager, org1
g, bob, employee, org1
g, charlie, manager, org2
g, david, employee, org2

Use 규칙은 구체적인 작업을 추상적인 활동에 매핑합니다:

# Use: action, activity, organization
g2, write, modify, org1
g2, read, consult, org1
g2, write, modify, org2
g2, read, consult, org2

Consider 규칙은 구체적인 객체를 추상적인 뷰에 매핑합니다:

# Consider: object, view, organization
g3, data1, document, org1
g3, data2, document, org1
g3, report1, report, org2
g3, report2, report, org2

코드 예시​

import "github.com/casbin/casbin/v3"

e, _ := casbin.NewEnforcer("examples/orbac_model.conf", "examples/orbac_policy.csv")

// alice is a manager in org1, can read and write documents
ok, _ := e.Enforce("alice", "org1", "data1", "read") // true
ok, _ = e.Enforce("alice", "org1", "data1", "write") // true

// bob is an employee in org1, can only read documents
ok, _ = e.Enforce("bob", "org1", "data1", "read") // true
ok, _ = e.Enforce("bob", "org1", "data1", "write") // false

// charlie is a manager in org2, can read and write reports
ok, _ = e.Enforce("charlie", "org2", "report1", "read") // true
ok, _ = e.Enforce("charlie", "org2", "report1", "write") // true

// Cross-organization access is denied
ok, _ = e.Enforce("alice", "org2", "report1", "read") // false
ok, _ = e.Enforce("charlie", "org1", "data1", "read") // false

장점​

  • 추상화(Abstraction) — 정책은 역할, 활동 및 뷰를 사용합니다. 구체적 매핑을 변경해도 정책을 다시 작성할 필요가 없습니다.
  • 조직별(Per-organization) — 각 조직은 자체적인 매핑과 권한을 가지며, 하나의 모델로 모두 처리할 수 있습니다.
  • 확장성(Scalability) — 다중 조직 환경에서 더 적고 명확한 규칙으로 관리됩니다.

Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.