RBAC 는 쿠버네티스 클러스터 내부에서 오브젝트를 조작하기 위한 권한을 주기 위해서 사용한다.
RBAC 에 대해 본격적으로 배우기 전에 Cloud IAM 과 RBAC 가 어떤 관계가 있는지 이해하는게 중요하다.
GKE 에서 사용할 때 이 둘은 같이 사용하며, 서로가 하는 역할이 다르다:
- Cloud IAM:
- Google Cloud Platform (GCP) 의 리소스들 (e.g Cloud SQL, Cloud Storage, GKE 등) 에 접근하기 위한 권한을 담당한다.
- GKE 내부 클러스터의 오브젝트에 대한 접근 권한은 담당하지 않는다.
- RBAC:
- 쿠버네티스 클러스터 내부에서 오브젝트 (e.g Pod, Service, Deployment 등) 을 조작하기 위한 권한을 주기 위해서 사용한다.
Kubernetes RBAC 를 구성하는 세 가지 주요 요소는 다음과 같다:
- 주체(subjects):
- 누가 권한을 가지고 있는가? (Who)
- subject 는 User, Group, ServiceAccount 로 나눌 수 있다:
- User: 사용자나 시스템
- Group: 여러 사용자를 묶은 것
- ServiceAccount: Pod 또는 어플리케이션이 쿠버네티스와 상호작용하기 위해 사용하는 계정
- 자원(resources):
- 어떤 리소스에 대한 권한을 가지고 있는가? (Which)
- 동사(verbs):
- 리소스에 어떠한 작업 (e.g get, watch, create, describe) 을 할 수 있는가? (What)
Kubernetes RBAC 는 어떻게 사용자에게 권한을 주는가?
- Role 을 통해서 리소스에 대한 제어 권한을 만들고, 이 'Role' 을 사용자에게 Binding 하기 위해 'RoleBinding' 을 만들어서 권한을 줄 수 있다.
이를 Kubernetes RBAC 구성요소로 설명하자면 Role 은 Resource 와 Verb 를 가진 것이고, RoleBinding 은 Role 을 사용자에게 연결시켜주면서 subject 를 가지게 만드는 것이다.
Role 과 RoleBindings 는 Cluster Level 이나 Namespace Level 에서 사용할 수 있다.
- ClusterRole 은 클러스터 수준의 리소스 (e.g Node 나 PersistentVolume) 에 권한을 줄 때 유용하게 사용할 수 있다.
- 물론 namespace level 의 리소스도 권한을 줄 수 있으며, 이렇게주면 모든 네임스페이스에서 해당 리소스를 사용할 수 있다.
'Deny' 와 관련된 Role 은 없다. 그냥 해당 Role 이 없다면 기본적으로 제어를 할 수 없다라고 생각하면 된다.
`kubectl api-resources` 명령을 통해서 정확한 reousrce 이름과 apiGroup 을 볼 수 있는데 이를 이용하면 RBAC 정책을 설정하는데 도움을 줄 수 있다.
RBAC 예시:
예시: namespace level 의 Role
먼저 namespace level 의 Role 을 만드는 예시를 살펴보자:
- 이 Role 은
my-namespace
에서 생성되며, 이 namespace 에서만 Role 이 적용된다. - Pod 리소스에 대해 get, watch, list (즉, 읽기 작업)를 수행할 수 있는 권한을 부여했다.
- apiGroups 은 쿠버네티스 API 그룹을 지정하는데, 빈 값으로 주면 기본적인 기능을 사용할 수 있다.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: my-namespace
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
RoleBinding 을 다음과 같이 yaml 로 만들고 이를 각각 kubectl apply -f <파일명>.yaml
로 명령하면 Role 이 바인딩되서 사용자 Jane 은 해당 권한을 사용할 수 있다:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: my-namespace
subjects:
- kind: User
name: "jane"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
예시: Cluster Level 의 Role
ClusterRole은 클러스터 수준에서 권한을 부여하며, 네임스페이스를 지정할 필요가 없다.
kind: ClusterRole
을 통해서 클러스터 수준의 Role 을 만들 수 있다.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-reader-global
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
다음은 이 Role 과 Binding 하기 위한 RoleBinding 을 만드는 예시이다:
ClusterRoleBinding은 ClusterRole에만 참조할 수 있으며, 일반 Role에는 참조할 수 없다.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-pods-global
subjects:
- kind: User
name: "jane"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: pod-reader-global
apiGroup: rbac.authorization.k8s.io
이 글에서는 sub
'Kubernetes' 카테고리의 다른 글
Google Kubernetes Engine: Google Cloud's Operations Suite (0) | 2023.11.26 |
---|---|
Google Kubernetes Engine: Pod Security (0) | 2023.11.25 |
Google Kubernetes Engine: Cloud IAM (0) | 2023.11.19 |
Google Kubernetes Engine: Authentication and Authorization (0) | 2023.11.19 |
Google Kubernetes Engine: kubectl (0) | 2023.11.18 |