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