[Kubernetes] 권한 관리(RBAC)

1. API Groups

권한관리를 이해하기 전에 API Groups에 대해 알아야 한다.

kube-apiserver는 [API]-[Resources]-[Verbs] 구조로 API를 제공한다. 예를 들어 가장 자주 사용하는 kubectl get deployment 커맨드를 보면 /apps/v1/deployments/get를 호출하는 것을 알 수 있다. 이 동작과 관련된 API를 이해해야 권한을 관리 할 수 있다.

2. Authorization

앞선 인증 절차를 거쳐 접근을 허용한 사용자가 어떤 동작까지 수행할 수 있는지에 대해 관리하는 것이 권한 관리이다.

권한 모드에는 6가지가 있고 kube-apiserver의 yaml 파일에서 설정할 수 있다.

  • NODE : 클러스터의 다른 노드(kubelet)에 대한 권한을 관리
  • ABAC : 동작 기반의 권한 관리. 신규 유저, 동작이 추가될 때마다 매번 설정을 업데이트 해야 하므로 작업량이 많다.
  • RBAC : ABAC의 단점을 보완하여 Role 기반으로 정의하여 해당 Role에 사용자를 매핑하는 방식이다.
  • WEBHOOK : 서드파티 권한관리 솔루션을 사용하는 경우 사용자 요청이 있을 때마다 해당 솔루션으로 정보를 전달하여 관리
  • AlwaysAllow : 모든 권한 허용 (default)
  • AlwaysDeny : 모든 권한 차단

3. RBAC

role은 네임스페이스 단위로 설정되며 지정하지 않으면 디폴트 네임스페이스의 role을 설정하게 된다.

3-1. Role 생성

# dev-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata: 
  name: developer
rules: 
- apiGroups: [""]
  resources: ["Pods"]
  verbs: ["list", "get", "create"]
  resourceNames: ["blue", "orange"]
- apiGroups: [""]
  resources: ["ConfigMap"]
  verbs: ["create"]

3-2. Role binding 생성

# devuser-dev-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBingding
metadata: 
  name: devuser-dev-binding
subjects: 
- kind: User
  name: devuser
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: dev
  apiGroup: rbac.authorization.k8s.io

3-3. role 관련 kubectl 커맨드

# role 정보 조회
kubectl get roles
# roleBinding 정보 조회
kubectl get rolebindings
# role 정보 상세 조회
kubectl describe role dev

# 권한 보유 여부 확인
kubectl auth can-i create pods
# admin일 경우 다른 유저의 권한 가장하여 확인
kubectl auth can-i create pods --as devuser
# namespace 옵션 추가
kubectl auth can-i create pods --as devuser --namespace test

4. Cluster Role

앞서 다룬 Role과 Rolebinding의 경우 '네임스페이스 범위 리소스'이다. pods, replicaset 등과 같이 한 네임스페이스 안에서만 존재하는 것이다. 이와는 달리 Cluster 범위의 리소스들이 존재하는데 nodes, PV, CSR, namespace 그리고 clusterroles와 clusterrolebindings이다. 이 리소스들은 아래 명령으로 조회 가능하다. Cluster Role은 클러스터 범위 리소스들에 대한 권한을 관리하는 것이다.

# 네임스페이스 범위 리소스 조회
kubectl api-resources --namespaced-true

# 클러스터 범위 리소스 조회
kubectl api-resources --namespaced=false

4-1. Clusterrole.yml

# cluster-admin-role.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata: 
  name: cluster-administrator
rules: 
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["list", "get", "create"]

4-2. Clusterrolebinding.yml

# cluster-admin-role-binding.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata: 
  name: cluster-admin-role-binding
subjects: 
- kind: User
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
roleRef:
- kind: ClusterRole
  name: cluster-administrator
  apiGroup: rbac.authorization.k8s.io

'Kubernetes' 카테고리의 다른 글

[Kubernetes] Volume 관리  (0) 2021.01.25
[Kubernetes] Network Policy  (0) 2021.01.19
[Kubernetes] 백업, 복구  (0) 2020.12.23
[Kubernetes] 클러스터 업그레이드  (0) 2020.12.17
[Kubernetes] 어플리케이션 배포 관리  (0) 2020.12.11