Kubernetes 클러스터를 운영할 때, 보안 강화를 위해 특정 사용자 또는 서비스가 특정 리소스에 접근할 수 있도록 제한해야 합니다.
이를 위해 Kubernetes는 **RBAC(Role-Based Access Control)**을 제공합니다.
이번 글에서는 RBAC의 개념, 주요 리소스, 그리고 실전 활용법을 정리하겠습니다.
🔹 RBAC이란?
**RBAC(Role-Based Access Control)**은 역할 기반 접근 제어 시스템으로,
✔️ 사용자, 그룹, 서비스 계정 등의 리소스 접근을 제한 가능
✔️ Role, ClusterRole을 사용하여 권한을 정의
✔️ RoleBinding, ClusterRoleBinding을 사용하여 특정 사용자에게 권한을 부여
💡 RBAC을 설정하면, 불필요한 접근을 차단하고 Kubernetes 클러스터의 보안을 강화할 수 있습니다.
🔹 RBAC의 주요 리소스
리소스 설명
Role | 특정 네임스페이스에서 권한을 정의 |
ClusterRole | 클러스터 전체에서 권한을 정의 |
RoleBinding | 특정 네임스페이스에서 사용자/서비스 계정에 Role을 부여 |
ClusterRoleBinding | 클러스터 전체에서 사용자/서비스 계정에 ClusterRole을 부여 |
ServiceAccount | Pod가 Kubernetes API에 접근할 수 있도록 하는 계정 |
💡 Role은 네임스페이스 기반이고, ClusterRole은 클러스터 전체에서 사용됩니다.
🔹 Role & RoleBinding 예제 (네임스페이스 내 접근 제한)
아래 예제는 네임스페이스 dev에서 특정 사용자에게 Pod 조회(GET, LIST) 권한만 부여하는 설정입니다.
1️⃣ Role 생성
apiVersion: rbac.authorization.k8s.io/v1
kind: Role # 네임스페이스 내에서만 적용되는 역할
metadata:
name: pod-reader # Role 이름
namespace: dev # 적용할 네임스페이스
rules:
- apiGroups: [""]
resources: ["pods"] # Pod 리소스에 대한 권한 부여
verbs: ["get", "list"] # 조회(GET, LIST)만 가능
💡 pod-reader Role은 dev 네임스페이스에서 Pod를 조회할 수 있는 권한을 가집니다.
2️⃣ RoleBinding 생성
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding # 특정 네임스페이스 내에서 Role을 사용자에게 부여
metadata:
name: pod-reader-binding # RoleBinding 이름
namespace: dev # 적용할 네임스페이스
subjects:
- kind: User
name: alice # 'alice' 사용자에게 권한 부여
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader # 위에서 생성한 Role 이름
apiGroup: rbac.authorization.k8s.io
💡 이제 alice 사용자는 dev 네임스페이스에서 Pod를 조회할 수 있습니다.
🔹 ClusterRole & ClusterRoleBinding 예제 (클러스터 전체 권한 부여)
아래 예제는 클러스터 전체에서 모든 네임스페이스의 Pod를 조회할 수 있는 권한을 부여하는 설정입니다.
1️⃣ ClusterRole 생성
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole # 클러스터 전체에서 적용되는 역할
metadata:
name: cluster-pod-reader # ClusterRole 이름
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
💡 이 ClusterRole을 사용하면 모든 네임스페이스에서 Pod를 조회할 수 있습니다.
2️⃣ ClusterRoleBinding 생성
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding # 클러스터 전체에서 Role을 사용자에게 부여
metadata:
name: cluster-pod-reader-binding
subjects:
- kind: User
name: bob # 'bob' 사용자에게 권한 부여
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-pod-reader # 위에서 생성한 ClusterRole 이름
apiGroup: rbac.authorization.k8s.io
💡 이제 bob 사용자는 모든 네임스페이스에서 Pod를 조회할 수 있습니다.
🔹 ServiceAccount란?
ServiceAccount는 Pod가 Kubernetes API에 접근할 수 있도록 하는 계정입니다.
✔️ Pod가 특정 Kubernetes 리소스에 접근할 수 있도록 역할(Role) 부여 가능
✔️ 기본적으로 모든 Pod는 default ServiceAccount를 사용
✔️ RBAC과 함께 사용하여 특정 API 접근을 제한할 수 있음
💡 ServiceAccount는 Pod가 RBAC 기반으로 Kubernetes API에 접근할 때 필요합니다.
🔹 ServiceAccount & RoleBinding 예제
아래 예제는 특정 Pod가 Kubernetes API에서 Pod 목록을 조회할 수 있도록 설정하는 방법입니다.
1️⃣ ServiceAccount 생성
apiVersion: v1
kind: ServiceAccount # ServiceAccount 리소스 선언
metadata:
name: api-reader # ServiceAccount 이름
namespace: dev # 적용할 네임스페이스
2️⃣ RoleBinding을 사용하여 ServiceAccount에 권한 부여
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: api-reader-binding
namespace: dev
subjects:
- kind: ServiceAccount
name: api-reader # 위에서 생성한 ServiceAccount
namespace: dev
roleRef:
kind: Role
name: pod-reader # 위에서 생성한 Role 이름
apiGroup: rbac.authorization.k8s.io
💡 이제 api-reader ServiceAccount를 사용하는 Pod는 dev 네임스페이스에서 Pod 목록을 조회할 수 있습니다.
🔹 Pod에서 ServiceAccount 사용
apiVersion: v1
kind: Pod
metadata:
name: api-client
namespace: dev
spec:
serviceAccountName: api-reader # 위에서 생성한 ServiceAccount 사용
containers:
- name: api-client
image: bitnami/kubectl
command: ["sh", "-c", "kubectl get pods -n dev"]
💡 이 Pod는 api-reader ServiceAccount를 사용하여 Kubernetes API에서 dev 네임스페이스의 Pod 목록을 조회할 수 있습니다.
🔹 RBAC 설정 확인 및 삭제
현재 RBAC 설정 확인
kubectl get role,rolebinding,clusterrole,clusterrolebinding -A
RBAC 리소스 삭제
kubectl delete role pod-reader --namespace=dev
kubectl delete rolebinding pod-reader-binding --namespace=dev
kubectl delete clusterrole cluster-pod-reader
kubectl delete clusterrolebinding cluster-pod-reader-binding
💡 불필요한 RBAC 설정을 삭제하여 보안성을 유지할 수 있습니다.
🚀 마무리
✔️ RBAC은 Kubernetes 클러스터의 리소스 접근을 제어하는 보안 기능
✔️ Role & RoleBinding은 네임스페이스 단위로 권한을 부여
✔️ ClusterRole & ClusterRoleBinding은 클러스터 전체에서 권한을 부여
✔️ ServiceAccount를 사용하면 Pod가 Kubernetes API에 접근 가능