DevOps/Kubernetes

Kubernetes Authorization / 쿠버네티스가 인가를 처리하는 방법

우드의개발개발 2024. 10. 28. 12:08

1. 쿠버네티스의 인가

이번 글은 쿠버네티스 클러스터가 api-server로 요청이 왔을 때 인가를 처리하는 방법에 대한  글입니다. 인증 과정 뒤에 해당 요청의 주체가 권한이 있는지 확인하는 작업으로 인증을 통과한 주체를 대상으로 권한을 확인하는 프로세스입니다. 인증과정이 궁금하시다면 아래 링크를 클릭해주세요.

 

쿠버네티스에서 인증을 처리하는 과정이 궁금하다면?

 

쿠버네티스가 인가를 처리하는 방법에는 크게 4가지 유형이 있습니다. 우선 Node Authorizer 부터 살펴보겠습니다.

 

1.1 Node Authorizer

 

kubelet이 kube-apiserver를 대상으로 읽기와 쓰기 작업을 요청한다고 했을 때 kubelet에게 부여한 인증서를 기반으로 인가를 처리하는 예시를 살펴보겠습니다. 위 그림의 인증서 안에 system:nodessystem:node:node01이 적혀 있는 것을 확인하실 수 있습니다.  위와 같은 인증서를 만들기 위해선 인증서를 만들 때 아래와 같은 명령어로 인증서를 만듭니다. CN 필드에는 인증서 이름을, 필드에는 인증서가 속한 조직을 지정합니다(권장되는 방식이지 필수 규칙은 아닙니다). 

 

openssl req -new -key kubelet.key 
  -subj "/CN=system:node:node01/O=system:nodes" \
  -out kubelet.csr -config openssl.cnf -extensions v3_ext

 

이렇게 인증서를 통해 인증을 요청한 방식은 Node 모드에 해당하며 노드가 클러스터에 접속해 인증을 받는 상황에 주로 사용됩니다.

 

1.2 ABAC(Attribute Based Access Control)

 

위 방법은 유저 또는 유저그룹에 권한을 지정하는 방법입니다. 유저  또는 그룹을 단위로 파일을 관리해야 하기 때문에 많이 사용하지 않는 방법입니다.

 

1.3 RBAC(Role Based Access Control)

역할이라는 개념이 있습니다. 무슨무슨 행동을 할 수 있는 권한 묶음입니다. 역할을 생성하면 해당 역할을 특정 유저에 매칭시킵니다. 이를 롤바인딩이라고 합니다. 

 

1.3.1 Role과 Rolebinding

 

역할을 만들어 권한을 부여하는 방식입니다. 위 그림에선 두개의 역할(Developer, Security)을 만들어 클러스터 내 유저를 특정 역할에 바인딩 시키는 방식으로 유저의 권한을 관리하는 것을 볼 수 있습니다.

 

역할을 만들 때 resourceNames로 권한을 세부적으로 조정할 수 있는 옵션이 있습니다. 위 역할은 파드를 조회하고 생성하고 업데이트할 수 있는 역할입니다. 그런데 현재 5개의 파드 중에 blue와 orange 파드에 대해서만 권한을 부여하고 싶습니다. 그렇다고 했을 때 resourceNames 필드를 통해 파드에 부여한 이름을 명시함으로써 역할을 세부적으로 조정할 수 있습니다.

 

 

Role을 만들어 특정 유저에 Rolebinding 시켰다면 위 명령어를 통해 특정 유저가 특정 권한이 있는지 확인할 수 있습니다.

마지막 예제를 살펴보겠습니다. dev-user가 test 네임스페이스에서 파드를 만들 수 있는 권한이 있는지 확인하는 명령어 입니다. 유저를 명시하지 않으면 현재 컨텍스터에서 설정된 사용자가 유저의 기본값으로 들어갑니다.

 

1.3.2 ClusterRole과 ClusterRolebinding

 

앞선 글에서 Role과 Rolebinding에 대해 살펴보았습니다. 이번에는 ClusterRole과 ClusterRolebinding에 대해 알아보겠습니다. ClusterRole은 네임스페이스에 구애받지 않는 역할을 생성하고 싶을 때 사용합니다. 그리고 해당 역할을 특정 유저가 사용하고 싶을 때 ClusterRolebinding을 통해 ClusterRole과 User를 매칭시킵니다. 

1.4 Webhook

 

쿠버네티스 자체 기능을 사용하는 것이 아니라 외부 어플리케이션을 통해 권한을 관리하는 방식입니다. 대표적으로 OPA(Open Policy Agent)가 있습니다.

 

2. 쿠버네티스의 인가 설정

 

위와 같이 권한에 대한 작업이 마무리되면 해당 권한을 활성화시키는 작업을 추가로 수행해주어야 합니다. 아무런 작업을 하지 않을 경우 기본값은 AlwaysAllow로 모든 요청을 허용합니다. 권한을 설정해 준 경우 kube-apiserver의 설정 파일 내 --authorization-mode에 권한을 부여한 유형과 관련된 값을 할당해줍니다.

 

위와 같이 여러 권한을 할당한 경우 Node-> RBAC -> Webhook 순으로 타당한 권한이 있는지 확인한 후 유저의 요청에 권한이 있는지 확인하는 작업을 수행합니다. 그 중 하나라도 매칭되는 것이 있다면 더이상 권한을 확인하는 작업을 수행하지 않고 권한에 대한 요청을 승인합니다.