- Role — 네임스페이스 안의 권한
- ClusterRole — 클러스터 전체 권한 (노드·PV 같은 비네임스페이스 자원 포함)
- RoleBinding — Role 또는 ClusterRole 을 특정 네임스페이스에 묶는다
- ClusterRoleBinding 클러스터 전체에 묶는다
kind: Role
metadata: { namespace: prod, name: pod-reader }
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
성질
- 허용만 있다. 거부 규칙이 없다 (기본이 거부이므로)
- 여러 바인딩이 있으면 합집합이 허용된다
- ClusterRole 을 RoleBinding 으로 묶으면 그 네임스페이스에만 적용된다
- 공통 Role 을 한 번 정의해 여러 네임스페이스에 재사용하는 관용구다
# 권한 확인 — 가장 빠른 방법
kubectl auth can-i delete pods --as=system:serviceaccount:prod:monitoring
kubectl auth can-i --list --as=system:serviceaccount:prod:monitoring -n prod
서비스 어카운트
파드는 서비스 어카운트로 API 서버에 인증한다 지정하지 않으면 그 네임스페이스의 default 를 쓴다
주의 — default 에 권한을 주면 그 네임스페이스의 '모든' 파드가 갖게 된다
- 워크로드마다 전용 SA 를 만드는 것이 원칙이다
API 를 안 쓰는 파드는 토큰 마운트를 꺼 둔다
- automountServiceAccountToken: false
- 침투 시 API 서버로 향하는 경로 하나가 사라진다
위험한 권한
- secrets 읽기 — 그 네임스페이스의 모든 비밀을 본다
- pods/exec — 실행 중인 컨테이너에 들어간다
- pods 생성 — 특권 파드를 만들어 노드를 장악할 수 있다
- escalate · bind — 자기 권한을 스스로 올릴 수 있다
- clusterrolebindings 아무 권한이나 자기에게 줄 수 있다
cluster-admin 을 서비스 어카운트에 주는 것은 사실상 클러스터 전체를 넘기는 것이다
Pod Security Admission
네임스페이스 라벨로 정책 수준을 정한다
privileged 제한 없음
baseline 알려진 권한 상승을 막는다 (최소 방어)
restricted 강하게 제한 (비루트 · capability 제거 · seccomp)
-
kubectl label ns prod \
- pod-security.kubernetes.io/warn=restricted
-
enforce(차단) · audit(감사) · warn(경고) 세 모드
-
warn 부터 켜서 무엇이 걸리는지 본 뒤 enforce 로 올린다
restricted 를 켜면 runAsNonRoot 가 요구된다
- 이미지가 USER 를 '숫자 UID' 로 지정해야 판정할 수 있다
- 이름만 있으면 기동이 거부된다
1.36 에서 User Namespaces 가 GA 됐다
- hostUsers: false 로 컨테이너 root 를 호스트 비특권 UID 로 매핑한다
감사 로그와 함께 본다
누가 무엇을 했는지는 API 서버 감사 로그에 남는다
- --audit-policy-file 로 정책을 정한다
RBAC 이 '무엇을 할 수 있는가' 라면 감사 로그는 '실제로 무엇을 했는가' 다
권한을 좁힐 때
- ① 감사 로그로 실제 사용 API 를 파악한다
- ② 그만큼만 허용하는 Role 을 만든다
- ③ can-i --list 로 검증한다
처음부터 최소 권한을 추측해 만들면 대개 부족하거나 과하다
사람 계정과 서비스 계정
쿠버네티스에는 '사용자' 리소스가 없다
- 인증은 외부에 위임한다 (OIDC · 클라우드 IAM · 인증서)
- RBAC 은 그 결과로 받은 이름·그룹에 권한을 매핑할 뿐이다
서비스 어카운트는 클러스터 안의 리소스다 (파드용)
kubectl auth can-i --list # 지금 나의 권한
kubectl auth can-i --list --as=alice@corp.com # 특정 사용자로 가정
면접 함정
- ❌ "RBAC에 거부 규칙을 넣는다" → 없다. 기본이 거부이므로 허용만 쓴다.
- ❌ "네임스페이스를 나눴으니 격리된다" → RBAC과 NetworkPolicy를 따로 걸어야 한다.