
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 의 종류
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 한다 (=권한을 부여한다)
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
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
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에 속하는지 파악 (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을 분리하여 생성하는 편이 좋다.
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 필요하다.