Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #12: RBAC (Role-Based Access Control) (정책 및 접근 제어 리소스)

ygtoken 2025. 3. 5. 00:30
728x90

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란?

ServiceAccountPod가 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에 접근 가능

 

728x90