728x90
정의
RBAC(Role-Based Access Control) 는 시스템에서 사용자의 역할을 기반으로 리소스에 대한 접근 권한을 관리하는 권한 관리 모델이다. 시스템 사용자에게 개별적으로 권한을 부여하는 대신, 공통 역할을 중심으로 권한을 할당함으로써 접근 제어를 간단하고 일관되게 관리할 수 있다.
주요 개념
- 사용자(User)
시스템 내에서 리소스에 접근하려는 개별 사용자 또는 서비스 계정을 의미한다. - 역할(Role)
특정 권한의 집합이다. 역할은 시스템에서 수행 가능한 작업과 작업 대상이 되는 리소스(예: 파일, 데이터베이스, 네트워크)의 유형을 정의한다.- 예: "관리자", "개발자", "읽기 전용 사용자"
- 권한(Permission)
특정 작업(예: 읽기, 쓰기, 삭제)과 특정 리소스(예: Pod, Service, ConfigMap) 간의 관계를 정의한다.- 예: "Pod 읽기 권한", "Deployment 생성 권한"
- 리소스(Resource)
사용자가 접근하려는 대상 객체이다.- 예: Kubernetes에서는 Pod, Service, Namespace 등이 리소스에 해당한다.
- 역할 할당(Role Assignment)
사용자에게 역할을 부여하는 과정이다.- 예: "Alice는 개발자 역할을 가진다."
RBAC의 구성 요소와 Kubernetes에서의 역할
- Role
- 특정 Namespace 내 리소스에 대한 권한을 정의한다.
- 예: 특정 Namespace의 Pod에 대해 읽기/쓰기를 허용하는 Role.
- ClusterRole
- 클러스터 전체 리소스 또는 비-Namespace 리소스(예: 노드, PersistentVolume)에 대한 권한을 정의한다.
- 예: 클러스터 전체의 모든 Pod를 읽을 수 있는 ClusterRole.
- RoleBinding
- Role을 사용자, 그룹 또는 ServiceAccount와 연결하여 권한을 부여한다.
- 특정 Namespace 내에서만 유효하다.
- ClusterRoleBinding
- ClusterRole을 사용자, 그룹 또는 ServiceAccount와 연결하여 클러스터 전체에서 권한을 부여한다.
RBAC 적용 예시
특정 pod에 대한 Role Binding 예시
1. Namespace 생성
K8S의 리소스를 논리적으로 구분하기 위해 사용된다.
apiVersion: v1
kind: Namespace
metadata:
name: example-namespace # Namespace 이름
2. Role 생성
아래는 Pod 리소스에 대해 권한을 정의하는 Role
이다.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: example-namespace
name: pod-reader
rules:
- apiGroups: [""] # Core API 그룹
resources: ["pods"] # 권한을 적용할 리소스
verbs: ["get", "list", "watch"] # 허용할 작업
3. ServiceAccount 생성
Pod가 K8S API 서버에 접근할 때 사용할 ServiceAccount
를 정의한다.
apiVersion: v1
kind: ServiceAccount
metadata:
name: example-serviceaccount
namespace: example-namespace # 동일 Namespace에 Role을 적용
4. RoleBinding 생성
2,3번에 생성한 Role
과 ServiceAccount
를 연결하여 사용할 수 있도록 한다.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: example-rolebinding
namespace: example-namespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: pod-reader # 연결할 Role 이름
subjects:
- kind: ServiceAccount
name: example-serviceaccount # 연결할 ServiceAccount 이름
namespace: example-namespace
5. Pod 에서 ServiceAccouint 연결
apiVersion: v1
kind: Pod
metadata:
name: pod-using-clusterrole
namespace: example-namespace
spec:
serviceAccountName: example-serviceaccount
containers:
- name: nginx
image: nginx
특정 노드에 대한 Clusterrole Binding
1. 특정 Node에 대한 권한 설정
특정 Node(예: node-1
)에 대한 읽기 권한(get
, list
, watch
)만 부여한다.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: specific-node-reader
rules:
- apiGroups: [""] # Core API 그룹
resources: ["nodes"] # Node 리소스
verbs: ["get", "list", "watch"] # 허용 작업
resourceNames:
- node-1 # 특정 Node 이름
2. Clusterrole Binding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: specific-node-reader-binding
subjects:
- kind: ServiceAccount
name: example-serviceaccount # 연결할 ServiceAccount 이름
namespace: example-namespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: specific-node-reader # 연결할 ClusterRole 이름
특정 PV에 대한 Clusterrole Binding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: specific-pv-manager-binding
subjects:
- kind: ServiceAccount
name: example-serviceaccount # 연결할 ServiceAccount 이름
namespace: example-namespace
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: specific-pv-manager # 연결할 ClusterRole 이름
728x90
'Engineering > K8S' 카테고리의 다른 글
NetworkPolicy (0) | 2024.12.23 |
---|---|
ResourceQuota 와 LimitRange (0) | 2024.12.23 |
Init Container 와 멀티 컨테이너 패턴 (1) | 2024.12.20 |
application Probe (0) | 2024.12.20 |
Control Plane 컴포넌트와 Node 컴포넌트 (+ taint, toleration, affinity, anti-affinity) (1) | 2024.12.19 |