Kubernetes - Authorization - RBAC, Role, RoleBinding

현시기얌·2022년 1월 18일
0

Kubernetes

목록 보기
18/23

RBAC

역할 기반으로 권한을 부여하는 방식이다.

쿠버네티스에는 Node나 PV 그리고 Namespace 같이 Cluster 단위로 관리되는 자원과
Pod와 Service같이 Namespace 단위로 관리되는 자원으로 나눌 수 있다.

그리고 Namespace를 만들면 자동적으로 ServiceAccount가 만들어지기도 하고 추가적으로 더 만들 수 도 있는데 ServiceAccount에 Role과 RoleBinding을 어떻게 설정하느냐에 따라 ServiceAccount는 Namespace 내에 있는 자원만 접근할 수도 있고 Cluster에 있는 자원에도 접근할 수 있게 된다.

Role은 여러개를 만들 수 있고 각 Role에는 Namespace에 있는 자원에 대해서 자원을 조회만 하거나 생성만 할 수 있도록 권한을 줄 수 있다.

RoleBinding은 Role과 ServiceAccount를 연결시켜주는 역할을 하는데 Role은 하나만 지정할 수 있고 ServiceAccount는 여러 개 지정할 수 있다.

위의 사진을 예시로 보면 ServiceAccount과 ServiceAccount1은 Role1을 지정되어 있는 권한으로 API 서버에 접근할 수 있게 된다.

이렇듯 한 Namespace 내에서 권한을 부여할 때는 Role과 RoleBinding을 여러개 만들어서 관리하면 된다.

Cluster 자원에 접근하는 경우

Cluster 자원에 접근하기 위해서는 ClusterRole과 ClusterRoleBinding이 만들어져 있어야 한다.

ClusterRole은 Cluster 단위의 Object를 지정할 수 있다. (기능은 Role과 똑같다.)

위의 예시 처럼 ClusterRoleBinding에 NamespaceA에 있는 ServiceAccount를 추가하게 되면 NamespaceA에 있는 ServiceAccount에서도 Cluster 자원에 접근할 수 있는 권한을 얻게 된다.

만약 NamespaceB처럼 Namespace안에 ServiceAccount와 RoleBinding이 연결되어 있고 Role을 지정할 때 ClusterRole을 지정하면 ServiceAccount는 Cluster 자원에는 접근할 수 없고 Namespace 안에 있는 자원에만 접근할 수 있다.

그럼 결국 Role을 만들어서 사용하는 것과 같은데 ClusterRole을 사용하는 이유는 모든 Namespace마다 똑같은 Role을 만들고 관리해야하는 상황에서 각각의 Namespace마다 똑같은 Role을 만들게 되면 이 Role에 대한 변경이 필요할 때 모든 Role이 수정되야 하는 불편함이 있다.
따라서 ClusterRole을 하나만 만들어 유지 관리를 쉽게 하기 위해서다.

Role, RoleBinding

위의 사진을 보면 한 Namespace안에 Pod와 Service가 있다. 그리고 Namespace를 만들면 자동으로 생성되는 ServiceAccount와 Token값이 들어있는 Secret이 있고 Role을 만들건데 내용으로는 apiGroups와 resources 속성에 Pod일 경우 [""], [pods] 이렇게 각각 들어가는데 Pod는 코어 API 이기 때문에 apiGroups에 특별히 넣지 않아도 되고 resources가 Job일 때만 위의 사진처럼 apiGroups에 ["batch"], resources에 [jobs]을 넣어줘야햔다.
verbs라는 속성으로 조회만 가능하게 한다.

RoleBinding을 만들고 roleRef 속성에 Role을 연결하고 subjects 속성에 ServiceAccount를 연결하면 된다.

이렇게 연결이 완료되었다면 사용자는 Token 값을 가지고 API 서버에 접근할 수가 있고 Token에 대한 권한에 따라 Namespace 내에 있는 Pod만 조회할 수 있게 된다.

다른 Namespace가 있고 이 Namespace안에 있는 ServiceAccount를 Admin처럼 모든 Cluster 자원에 접근할 수 있도록 하려면

먼저 ClusterRole을 *를 이용하여 모든 것이 이용 가능하도록 설정해주고 ClusterRoleBinding을 만들어서 ServiceAccount에 연결을 하면 된다.

그럼 이 Token으로 API 서버에 접근하면 다른 Namespace에 있는 자원은 물론이고 Cluster 단위에서의 자원 또한 조회나 생성이 가능하다.

profile
현시깁니다

0개의 댓글