본문으로 건너뛰기

PBAC란 무엇인가? Casbin에서의 정책 기반 접근 제어(Policy-Based Access Control)

PBAC란 무엇인가?​

**정책 기반 접근 제어(PBAC)**는 인가 규칙을 애플리케이션 코드와 분리된 정책 데이터로 유지하며, 이를 런타임에 평가합니다. 누가 무엇을 할 수 있는지 변경하려면 새 릴리스를 배포하는 대신 정책을 수정하면 되므로, 보안 또는 컴플라이언스 팀이 규칙을 소유할 때 PBAC을 자주 선택합니다.

Casbin에서 PBAC은 규칙식을 정책 행(policy row)에 저장하고 eval()로 평가하는 것을 의미합니다. 모델 내의 고정된 역할 또는 속성 검사와는 달리, 각 정책 행에는 자체 조건을 포함할 수 있습니다.

정책에는 다음이 포함될 수 있습니다:

  • 동적 표현식: 요청마다 평가됨(예: r.sub.Age >= 18)
  • 복잡한 로직: 부울 및 비교 연산자, 속성 접근
  • 컨텍스트: 사용자, 리소스 및 환경 속성
  • 비즈니스 규칙: 정책에 포함된 도메인별 로직

PBAC vs ABAC vs RBAC​

RBAC와 ABAC는 결정의 근거가 무엇인지(역할 또는 속성)를 설명합니다. PBAC은 규칙이 어떻게 관리되는지(런타임에 평가되는 정책으로서)를 설명합니다. 두 개념은 겹칩니다. 이 페이지의 예시는 PBAC으로 관리되는 ABAC 조건이며, Casbin RBAC 정책 또한 런타임에 변경될 수 있는 데이터입니다. 실무에서는 "PBAC"이라는 용어가 할당뿐만 아니라 규칙 로직 자체가 정책에 존재하는 시스템을 지칭하는 데 사용됩니다. 접근 제어 모델 선택하기에서는 하나의 예제를 통해 모델들을 비교합니다.

모델​

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub_rule, obj_rule, act

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

[matchers]
m = eval(p.sub_rule) && eval(p.obj_rule) && r.act == p.act
  • p.sub_rule / p.obj_rule — 요청에 대한 표현식(예: r.sub.Age >= 18, r.obj.Level >= 1)
  • eval() — enforce 시점에 이러한 표현식을 평가함

예시​

기본 정책​

정책:

p, r.sub.Age >= 18, r.obj.Level >= 1, play

요청 예시:

{"Age":25}, {"Level":2}, play # ALLOWED (Age >= 18 and Level >= 1)
{"Age":16}, {"Level":2}, play # DENIED (Age < 18)
{"Age":20}, {"Level":0}, play # DENIED (Level < 1)
{"Age":25}, {"Level":2}, read # DENIED (action doesn't match policy)

복잡한 정책​

정책:

p, r.sub.Department == "IT" && r.sub.Level >= 3, r.obj.Confidential == false, read

요청 예시:

{"Department":"IT","Level":3}, {"Confidential":false}, read # ALLOWED
{"Department":"IT","Level":2}, {"Confidential":false}, read # DENIED (Level < 3)
{"Department":"HR","Level":3}, {"Confidential":false}, read # DENIED (Department != "IT")
{"Department":"IT","Level":3}, {"Confidential":true}, read # DENIED (Confidential == true)

코드 예시:

e, _ := NewEnforcer("examples/pbac_model.conf", "examples/pbac_policy.csv")

// Enable JSON request support
e.EnableAcceptJsonRequest(true)

// Define subject and object with attributes
subject := `{"Department": "IT", "Level": 3}`
object := `{"Confidential": false}`
action := "read"

// Check permission
ok, err := e.Enforce(subject, object, action)
if err != nil {
fmt.Printf("Enforcement error: %v\n", err)
return
}
if ok {
fmt.Println("Permission granted")
} else {
fmt.Println("Permission denied")
}

EnableAcceptJsonRequest(true)를 설정하면 JSON처럼 보이는 파라미터({ 또는 [)가 자동으로 파싱되며, 잘못된 JSON은 명확한 오류를 반환합니다.

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