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 |