상세 컨텐츠

본문 제목

[Kubernetes]권한관리 (role, rbac 등)

Ops/Kubernetes

by 크리두 2022. 11. 21. 16:33

본문

반응형

What??

kubernetes 클러스터를 관리하다 보면 수많은 사용자와 애플리케이션이 동시에 사용하는것이 일반적이다. 사내 개발 조직에 속해 있는 개발자들이 사용하는 경우도 있고 클러스터를 관리하는 인프라 관리자, 애플리케이션들이 있다. 이렇게 동시에 많은 사용자가 있을 경우 보안을 고려해야하는데 그중에서 사용하는 것이 RBAC(Role Based Access Control)를 기반으로 하는 Service Account라는 기능이 있다. 이뿐만 아니라 role기반으로 rolebinding이라는 기능으로 그룹을 나누어 관리도 가능하다. 또한, 특정 namespace나 특정 자원에 대한 전용 권한만 추가할 수 있도록 관리하는 기능도 제공한다.

크게 ABAC(Attribute-based access control)와 RBAC(Role-based access control) 2가지 방법을 제공하고 있다.
 

ABAC (Attribute-based Access Control)

단어 의미 그대로 속성(Attribute)기반의 권한 관리 기능이다.
사용가능한 속성으로는 일반적으로 사용자(user), 그룹(group), 요청 경로(request path), 요청 동사(request verb) 등 외에 namespace, resource 속성 기반으로 설정할 수도 있다. 권한 관리를 파일을 이용하기 때문에 권한 변경을 위해서 직접 master 서버에 들어가 파일을 변경하고 apiserver를 재시작해주어야 하다는 단점이 있다. 

 

RBAC (Role-Based Access Control)

역할(Role)을 기반으로 권한 관리 기능이다. 대부분의 권한관리 시스템에서 많이 사용하는 방법으로 사용하고 있다.
사용자와 role을 별개로 선언한 다음에 그 2가지를 엮는 role binding을 이용해서 사용자에게 권한을 부여해준다. ABAC와 달리 서버에 접근할 필요없이 kubectl이나 api 를 이용해서 관리하는 것이 가능하다.
  • Access Control(접근 제어) : '누가 어디서 무엇을 어떻게' 하는가?
  • RBAC(Role-based Access Control) : 어떤 역할(Role)이 '어디서 무엇을 어떻게' 하는가?

 

권한 인증 과정

kubernetes는 여러 가지의 컴포넌트들로 이루어져 있는데, kube-apiserver, kube-controller, kube-scheduler, etcd 등이 있다.

이러한 컴포넌트 중에서 가장 많이 사용하는 컴포넌트가 k8s API 서버에 해당하는 kube-apiserver라는 컴포넌트이다. 대부분 api를 통하여서 쿠버네티스 기능들을 사용하게 되는 구조이다.

 

The components of a Kubernetes cluster

 

예를 들어 kubectl 명령어를 이용해서 쿠버네티스 기능을 실행하면 쿠버네티스 내부에서는 다음과 같이 처리 됩니다.

 

k8s 명령어를 사용할 때 처리 절차

사용자가 kubectl 명령어를 날리게 되면 k8s API 서버의 HTTP 핸들러에 요청을 전송한다. API 서버는 사용자가 k8s 사용자를 확인(Authentication) 및 해당 명령어(기능)를 실행할 권한(Authorizaition)이 있는지 확인한다. Authentication(인증)과 Authorization(인가)에 인증서, third party 인증(Oauth 등) 등과 같은 다른 방법을 사용될 수 있다. 그 다음, Admission Controller라는 별도의 단계를 거쳐서 요청 받은 기능을 수행한다.

 

대부분 따로 권한 설정을 부여하지 않지만 명령어가 실행되는 것을 알수 있다. 이 부분은 k8s를 설치할 때 설치 도구가 자동으로 kubeconfig라는 파일을 통해 kubectl이 관리자 권한을 갖도록 설정해 두기 때문이다. 파일의 위치는 ~/.kube/config 에서 확인할 수 있다.

 

apiVersion: v1

clusters:
- cluster:
    certficate-authority-data: ***
    server: https://10.100.0.20:6443
name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
preferences: {}

users:
- name: admin
  user:
    client-certificate-data: ***
    client-key-data: ***

위는 ~/.kube/config 파일 내용이며 저장된 설정을 읽어 들여 k8s 클러스터를 제어한다. 이 파일에 저장된 내용중에 users라는 항목에 인증을 위한 데이터가 설정되어 있다. client-certificate-data와 client-key-data에 base64로 인코딩된 인증서이며, 이 키 쌍은 k8s에서 최고 권한 cluster-admin을 갖는다. 그래서 모든 명령어를 사용할 수 있다.

 

ServiceAccount와 Role, Cluster Role 

Service Account

서비스 어카운트는 권한 관리하기 위한 k8s 오브젝트 중 하나이다. 한명의 사용자 또는 application에 해당한다고 보면 쉽다.

일단 namespace 속하는 오브젝트이며 serviceaccount 또는 sa라는 이름(명령어)로 사용할 수 있다.

 

  • Role : 특정 네임스페이스에 한정된 정책
    (특정 네임스페이스 + '어디서 무엇을 어떻게')
  • ClusterRole : 클러스터 전체에 한정된 정책
    (클러스터 전체 + '어디서 무엇을 어떻게')
  • RoleBinding : 역할이 특정 네임스페이스에 한정된 정책을 따르도록 적용
    (어떤 역할이 특정 네임스페이스에서 하는가?)
  • ClusterRoleBinding : 역할이 클러스터 전체에 한정된 정책을 따르도록 적용
    (어떤 역할이 클러스터 전체에서 하는가?)
반응형

'Ops > Kubernetes' 카테고리의 다른 글

Logging Tool 기능 비교 분석  (0) 2024.02.22
Elastic Cloud on Kubernetes 설치  (0) 2022.10.23
RBAC Authorization  (0) 2021.10.20
K8S ingress에 대하여  (0) 2021.06.24
Private 도커 Registry 설치 및 설정  (0) 2020.11.10

관련글 더보기

댓글 영역