[Kubernetes] RABC (Role Based Access Controls)

INYEONG KIM·2024년 8월 18일
post-thumbnail

RBAC

Role을 기반으로한 권한 부여 방식, Kubernetes 클러스터에서 RBAC을 활성화하기 위해서는 kube-apiserver의 --authorization-mode 에 RBAC을 추가가 필요하다.

$ kubectl get po -n kube-system kube-apiserver -o yaml

spec:
  containers:
  - command:
    - kube-apiserver
    ...
    - --authorization-mode=Node,RBAC 	# 현재 apiserver 에 설정되어 있는 권한 방식
    ...

Role 의 종류

  • Role: 특정 namespace 에 적용되는 role으로 Rolebinding 과 대응
  • ClusterRole: 전체 클러스터에 적용되는 role으로 ClusterRolebinding과 대응

kube-system 네임스페이스에서 configmaps 에 대한 get action이 가능한 role 예시

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: kube-proxy
  namespace: kube-system
rules:
- apiGroups:
  - ""
  resourceNames:
  - kube-proxy
  resources:
  - configmaps
  verbs:
  - get

Rolebinding (위 role 에 대한 binding)

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kube-proxy
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kube-proxy 							# 1. kube-proxy 라는 Role을
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:bootstrappers:kubeadm:default-node-token # 2. 해당 Group에 binding 한다 (=권한을 부여한다)

RBAC 실습 예시

kubeconfig 에 dev-user 가 이미 사전 정의 완료된 상태 가정, blue namespace의 pod 에 대한 list 권한 추가가 필요

controlplane ~ ➜  k get po -n blue --as dev-user
Error from server (Forbidden): pods is forbidden: User "dev-user" cannot list resource "pods" in API group "" in the namespace "blue"
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: blue
  name: developer
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-user-binding
  namespace: blue
subjects:
- kind: User
  name: dev-user
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developer
  apiGroup: rbac.authorization.k8s.io

Role, Rolebinding 의 정상 추가 이후 아래와 같이 dev-user 권한으로도 조회 가능

controlplane ~ ➜  k get po -n blue --as dev-user
NAME            READY   STATUS    RESTARTS   AGE
blue-app        1/1     Running   0          29m

특정 Role 에 apiGroup 추가

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer
  namespace: blue
rules:
- apiGroups:
  - apps
  resourceNames:
  - blue-app
  resources:
  - pods
  verbs:
  - get
  - watch
  - create
  - delete
- apiGroups:		# apiGroup은 여러개 추가 가능 (deployment 추가 권한 예시)
  - apps
  resources:
  - deployments
  verbs:
  - create

cluster-admin ClusterRole

Kubernetes 에 정의되어 있는 Role 중 가장 많은 권한을 가진 clusterrole으로 기본적으로는 system:masters Group에 권한이 부여되어 있다.

controlplane ~ ➜  k describe clusterrole cluster-admin 
Name:         cluster-admin
Labels:       kubernetes.io/bootstrapping=rbac-defaults
Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
PolicyRule:
  Resources  Non-Resource URLs  Resource Names  Verbs
  ---------  -----------------  --------------  -----
  *.*        []                 []              [*]
             [*]                []              [*]

controlplane ~ ➜  kubectl describe clusterrolebinding cluster-admin
Name:         cluster-admin
Labels:       kubernetes.io/bootstrapping=rbac-defaults
Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
Role:
  Kind:  ClusterRole
  Name:  cluster-admin
Subjects:
  Kind   Name            Namespace
  ----   ----            ---------
  Group  system:masters

특정 apiGroup 에 대한 권한 부여 예시

## 부여하고자하는 권한이 어떤 apiGroup에 속하는지 파악 (kubectl api-resources)
controlplane ~ ➜  kubectl api-resources | grep pv
persistentvolumeclaims              pvc          v1                                true         PersistentVolumeClaim
persistentvolumes                   pv           v1                                false        PersistentVolume

controlplane ~ ➜  kubectl api-resources | grep storageclass
storageclasses                      sc           storage.k8s.io/v1                 false        StorageClass

PV와 SC에 대한 권한을 부여할 때 서로 다른 apiGroup에 속하므로 ClusterRole 정의 시 아래와 같이 Rule을 분리하여 생성하는 편이 좋다.

  • apiGroups: [""] 로도 ClusterRole 생성은 가능
  • 그러나 권한제어가 정상적으로 진행되지 않을 우려가 존재
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: storage-admin
rules:
- apiGroups: [""]
  resources: ["persistentvolumes"]
  verbs: ["get", "watch", "list", "create", "delete"]
- apiGroups: ["storage.k8s.io"]
  resources: ["storageclasses"]
  verbs: ["get", "watch", "list", "create", "delete"

이후 생성한 storage-admin ClusterRole에 대해서는 별도 ClusterRolebinding 필요하다.

profile
미래의 저를 위해 작성하는 중입니다 🙆‍♂️

0개의 댓글