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.