ABAC
ABAC 모델이란 무엇인가요?
ABAC는 속성 기반 접근 제어를 의미합니다. 이것은 문자열 값 자체를 사용하는 대신 주체, 객체, 또는 행동의 속성(특성)을 사용하여 접근을 제어할 수 있게 해줍니다. 복잡한 ABAC 접근 제어 언어인 XACML에 대해 들어 보셨을 수도 있습니다. 그러나 Casbin의 ABAC은 훨씬 더 간단합니다. Casbin의 ABAC에서는 모델 요소에 대해 문자열 대신 구조체 또는 클래스 인스턴스를 사용할 수 있습니다.
공식 ABAC 예제를 살펴봅시다:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == r.obj.Owner
매처에서는 r.obj
대신 r.obj.Owner
를 사용합니다. Enforce()
함수에 전달된 r.obj
는 문자열이 아닌 구조체 또는 클래스 인스턴스가 될 것입니다. Casbin은 해당 구조체 또는 클래스에서 obj
멤버 변수를 반영하여 가져옵니다.
r.obj
구조체 또는 클래스의 정의는 다음과 같습니다:
type testResource struct {
Name string
Owner string
}
JSON을 통해 enforcer에게 매개변수를 전달하려면 e.EnableAcceptJsonRequest(true)
를 사용하여 함수를 활성화해야 합니다.
예를 들어:
e, _ := NewEnforcer("examples/abac_model.conf")
e.EnableAcceptJsonRequest(true)
data1Json := `{ "Name": "data1", "Owner": "bob"}`
ok, _ := e.Enforce("alice", data1Json, "read")
JSON 매개변수를 수락하는 함수를 활성화하면 성능이 1.1에서 1.5배 떨어질 수 있습니다.
ABAC를 어떻게 사용하나요?
ABAC를 사용하려면 두 가지를 해야 합니다:
- 모델 매처에서 속성을 지정합니다.
- 요소에 대한 구조체 또는 클래스 인스턴스를 Casbin의
Enforce()
함수에 인수로 전달합니다.
현재로서는 r.sub
, r.obj
, r.act
등과 같은 요청 요소만 ABAC를 지원합니다. Casbin의 정책에서 구조체 또는 클래스를 정의할 방법이 없기 때문에 p.sub
와 같은 정책 요소에서는 사용할 수 없습니다.
매처에서 여러 ABAC 속성을 사용할 수 있습니다. 예를 들어: m = r.sub.Domain == r.obj.Domain
.
CSV의 구분자와 충돌하는 정책에 쉼표를 사용해야 하는 경우, 문장을 따옴표로 둘러싸서 이스케이프할 수 있습니다. 예를 들어, "keyMatch("bob", r.sub.Role)"
는 분리되지 않습니다.
복잡하고 많은 수의 ABAC 규칙에 대한 모델 확장
위의 ABAC 모델 구현은 그 핵심에서 간단합니다. 그러나 많은 경우, 인증 시스템은 복잡하고 많은 수의 ABAC 규칙을 필요로 합니다. 이 요구사항을 수용하기 위해, 모델 대신 정책에 규칙을 추가하는 것이 권장됩니다. 이는 eval()
함수 구조를 도입함으로써 이루어질 수 있습니다. 다음은 예시입니다:
이것은 ABAC 모델을 정의하는 데 사용되는 CONF
파일의 정의입니다.
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub_rule, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = eval(p.sub_rule) && r.obj == p.obj && r.act == p.act
이 예에서, p.sub_rule
은 정책에서 사용될 필요한 속성을 포함하는 구조체 또는 클래스(사용자 정의 타입)입니다.
This is the policy that is used against the model for Enforcement
. 이제 eval()
에 전달된 객체 인스턴스를 매개변수로 사용하여 특정 ABAC 제약 조건을 정의할 수 있습니다.
p, r.sub.Age > 18, /data1, read
p, r.sub.Age < 60, /data2, write