Kubernetes/Udemy - CKAD with Tests

RBAC

비번변경 2022. 1. 6. 15:53

Role Based Access Control을 사용하기 위해서는 권한 집합을 정의한 role과 user의 role을 정의하는 roleBinding을 생성해야 한다.

 

Role

Role을 정의하는 yaml 형식의 파일은 아래와 같으며, create 명령으로 생성할 수 있다.

하나의 Role은 여러 규칙을 가질 수 있으며, 하나의 규칙은 접근을 허용할 apiGroup과 resources, 그리고 자원에 허용할 작업을 나타내는 verbs으로 이루어져 있다.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer
rules:
- apiGroups: [""]
  resources: ["pods"] # 권한을 부여할 자원
  verbs: ["list", "get", "create", "update", "delete"] # 작업
- apiGroups: [""] # 다른 규칙
  resources: ["ConfigMap"]
  verbs: ["create"]

 

resoureNames

자원 중에서도 특정 자원에 대한 접근만을 허용하고자 할 때에는 rules.apiGroups.resourceNames 필드를 사용할 수 있다.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
	name: developer
rules:
- apiGroups: [""]
	resources: ["pods"] # 권한을 부여할 자원
	verbs: ["list", "get", "create", "update", "delete"] # 작업
	resourceNames : ["blue", "orange"]

 

Role 목록 및 상세 정보 조회

kubectl get roles

kubectl describe role <NAME>

 

RoleBinding

user의 Role을 설정하는 객체로, yaml 정의 파일은 아래와 같다. 다른 객체와 동일하게 create 명령으로 생성할 수 있다.

Role과 RoleBinding 객체는 namespace 내에 생성된다. 따라서 특정 네임스페이스 외의 자원에 대한 접근을 제한하고자 할 때에는 정의 파일의 metadata 필드에 namespace를 지정하도록 한다.

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: devuser-developer-binding
subjects: # 사용자 세부 정보 지정
- kind: User
  name: dev-user
  apiGroup: rbac.authorization.k8s.io
roleRef: # 생성한 역할 세부 정보 제공
  kind: Role
  name: developer
  apiGroup: rbac.authorization.k8s.io

 

RoleBinding 목록과 상세 정보 조회

kubectl get rolebindings

kubectl describe rolebindings <NAME>

 


kubectl auth can-i

클러스터에 접속한 사용자는 클러스터 내에서 허용된 작업을 확인할 필요가 있을 수 있다. 그런 경우에는 auth can-i 명령으로 확인할 수 있다.

kubectl auth can-i <VERBS> <RESOURCES>

# 예시
kubectl auth can-i create deployments
kubectl auth can-i delete nodes

 

관리자 또한 특정 사용자의 권한을 확인할 필요성이 있다. 이 경우에는 auth can-i 명령의 --as 옵션을 사용해 특정 사용자를 가장해 권한을 확인할 수 있다.

kubectl auth can-i <VERB> <RESOURCES> --as <USER>
kubectl auth can-i <VERB> <RESOURCES> --as <USER> --namespace <NAMESPACE_NAME>

# 예시
kubectl auth can-i create deployments --as dev-user
kubectl auth can-i delete nodes --as dev-user
kubectl auth can-i delete nodes --as dev-user --namespace test