쿠버네티스에서는 보안 강화를 위해 사용자 및 서비스 계정의 권한을 제한하는 것이 필수적입니다.
이를 위해 RBAC(Role-Based Access Control)를 활용하여 특정 사용자 및 그룹에 대한 액세스를 제어하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1. RBAC를 활용한 특정 네임스페이스에 대한 읽기 전용 권한 부여
2. 서비스 계정(ServiceAccount) 및 RoleBinding을 활용한 애플리케이션 권한 관리
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ RBAC를 활용한 특정 네임스페이스에 대한 읽기 전용 권한 부여
❓ 문제 상황
운영팀에서 개발자가 특정 네임스페이스의 리소스를 조회할 수 있도록 권한을 부여해야 합니다.
단, Pod을 생성하거나 수정하는 것은 불가능하고, 조회(ReadOnly)만 가능하도록 설정해야 합니다.
• 대상 사용자: developer
• 적용 네임스페이스: dev-namespace
• 권한: get, list, watch (조회 전용)
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Role을 생성하여 해당 네임스페이스에서 읽기 전용 권한을 부여합니다.
2. RoleBinding을 사용하여 특정 사용자에게 Role을 연결합니다.
✅ 정답 Manifest (RBAC 읽기 전용 권한 부여)
🔹 Role 생성 (네임스페이스 내 ReadOnly 권한)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: dev-namespace
name: readonly-role
rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps"]
verbs: ["get", "list", "watch"] # 읽기 전용 권한 부여
🔹 RoleBinding 생성 (사용자에게 Role 부여)
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: dev-namespace
name: readonly-binding
subjects:
- kind: User
name: developer # 개발자 사용자
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: readonly-role
apiGroup: rbac.authorization.k8s.io
📌 적용 후 예상 결과 값
1. 개발자가 네임스페이스의 리소스를 조회할 수 있는지 확인
kubectl auth can-i get pods --namespace=dev-namespace --as=developer
💡 예상 출력 값
yes
2. 개발자가 Pod을 생성할 수 없는지 확인
kubectl auth can-i create pod --namespace=dev-namespace --as=developer
💡 예상 출력 값
no
✅ 개발자가 dev-namespace 내 리소스를 조회할 수 있지만, 수정은 불가능함
2️⃣ 서비스 계정(ServiceAccount) 및 RoleBinding을 활용한 애플리케이션 권한 관리
❓ 문제 상황
운영팀에서 특정 애플리케이션이 실행되는 서비스 계정에 필요한 최소 권한만 부여해야 합니다.
애플리케이션이 자신이 속한 네임스페이스에서만 Pod 정보를 조회할 수 있도록 설정해야 합니다.
• 서비스 계정: app-service-account
• 적용 네임스페이스: app-namespace
• 권한: Pod 조회(get, list, watch)
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. ServiceAccount를 생성하여 애플리케이션에 특정 계정을 부여합니다.
2. Role 및 RoleBinding을 사용하여 최소한의 권한만 할당합니다.
✅ 정답 Manifest (서비스 계정 및 RoleBinding 설정)
🔹 ServiceAccount 생성
apiVersion: v1
kind: ServiceAccount
metadata:
name: app-service-account
namespace: app-namespace
🔹 Role 생성 (Pod 조회 권한만 부여)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: app-namespace
name: app-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"] # Pod 조회 권한만 부여
🔹 RoleBinding 생성 (ServiceAccount에 Role 부여)
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
namespace: app-namespace
name: app-role-binding
subjects:
- kind: ServiceAccount
name: app-service-account # 지정한 서비스 계정
namespace: app-namespace
roleRef:
kind: Role
name: app-role
apiGroup: rbac.authorization.k8s.io
📌 적용 후 예상 결과 값
1. ServiceAccount가 Pod을 조회할 수 있는지 확인
kubectl auth can-i get pods --namespace=app-namespace --as=system:serviceaccount:app-namespace:app-service-account
💡 예상 출력 값
yes
2. ServiceAccount가 다른 리소스를 조회할 수 없는지 확인
kubectl auth can-i get secrets --namespace=app-namespace --as=system:serviceaccount:app-namespace:app-service-account
💡 예상 출력 값
no
✅ 서비스 계정이 Pod 조회 권한만 가지고 있으며, 다른 리소스에는 접근할 수 없음