Role Base Access Control
Role을 이용해서 구현된 Access control을 말합니다.
일반적인 RBAC 구현
구성 요소
- Subject
- User
- Group
- Service Account
- Resource
- Role
- Assign
주의점
- Role과 Group 을 자주 오용 하는 경우가 많다.
- Role 은 권한 정책만 집중하고, Group 은 인원 관리에만 집중한다.
- 즉 Role 과 Group 는 관심사의 분리 관점에서 보아야 한다.
- Role을 복잡하게 만드는 경우가 많다.
- 일반적인 RBAC System에서는 Subject 하나에 여러 Role 을 부여 할수 있다.
- 그러므로 Role은 되도록 단순하게 유지하고, Subject에 여러 Role 을 부여하는 방식이 더 좋다.
- eg)
전체를 읽을수 있고 일부 리소스를 쓸수 있는 Role보다는전체 viewer Role,일부 editor Role두 Role 을 두고 한 Subject에 둘다 부여 하는 것이 더 단순하다.
- eg)
example
yaml 로 전체 RBAC system의 예시 데이터를 표현해 본다면 아래와 같다.
users:
- name: bluemir
- name: aaaa
- name: bbbb
groups:
- name: admin
members: [ bluemir, aaaa ]
- name: devops
member: [ aaaa, bbbb ]
resources:
- kind: issue
name: i1
- kind: issue
name: i2
- kind: article
name: a1
- kind: article
name: a2
- kind: project
name: p1
- kind: project
name: p2
roles:
- name: reader
rules:
- verbs: [get, list]
resources: [] # all
알려진 문제점 과 보완책
Role Explosion
Strict RBAC의 경우 권한이 분리되어야 하는 Resource 별로 Role 이 하나씩 필요하다. 만일 서로 권한이 달라야 하는 Resource가 동적 생성이 되는 경우, 그에 따라 Role 이 폭발적으로 증가할수 있다. 이는 객체별로 소유권이 다르지만 모두 하나의 collection 을 쓰는 multi-tenancy 환경에서 잘 관찰할수 있다.
예를 들어 하나의 게시판에서 각 게시물을 작성자만 다시 수정할 수 있도록 권한 처리 요구사항이 있다고 생각해보자 이 경우 작성자 마다 권한이 조금씩 다르다는 것을 의미하고, 적어도 작성자 마다 Role 이 부여되어야한다는 사실을 알수 있다. 그리고 글 하나가 추가 될떄 마다 Role의 Policy 로 각 게시글을 직접 지정하거나, 게시물 자체에 작성자라는 속성을 부여하고 이 속성을 Policy에서 지정해야 한다.
여러개의 Role은 일괄 Update 등이 어렵고, 유지보수도 어렵다. 이 한계점을 극복하기 위해서는 RBAC 에서 동적인 부분을 도입할수 있다.
가장 흔한 방법은 Rule에 Condition 과 같은 추가적인 filter 를 제공하는 것이다.
`
roles:
- name: post-owner
rules:
- verbs: [update]
selector:
- kind: post
condition:
- user.name == resource.owner-name
그러나 이 방법은 사실상 ABAC이나 Rule Chaining 방식이라고 봐도 무방할것이다. 하지만 대부분의 요구사항은 RBAC 으로 사용해서 유지 보수가 쉽도록 하고, 특별한 Case 에 대해서 추가적인 option 을 제공 함으로써 가능한 기능의 범위를 넓히려는 경우에 유용하다.