주요 콘텐츠로 건너뛰기

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를 사용하려면 두 가지를 해야 합니다:

  1. 모델 매처에서 속성을 지정합니다.
  2. 요소에 대한 구조체 또는 클래스 인스턴스를 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