ServiceAccount와 Pod 보안
Kubernetes Pod의 권한 관리와 보안 컨텍스트 설정
Kubernetes Pod의 권한 관리와 보안 컨텍스트 설정
목표: 최소 권한 원칙에 따라 Pod를 안전하게 실행할 수 있는 수준
👤 ServiceAccount
기본 개념
graph TB
subgraph "Pod 권한 흐름"
Pod["📦 Pod"] -->|"ServiceAccount"| SA["👤 ServiceAccount"]
SA -->|"Token"| API["🔷 API Server"]
API -->|"RBAC"| AUTH["✅ 인증/인가"]
end
ServiceAccount는 Pod가 Kubernetes API를 사용할 때의 신원입니다.
기본 ServiceAccount
# 기본 SA 확인
kubectl get serviceaccount default
# 모든 네임스페이스의 SA
kubectl get sa --all-namespaces
사용자 정의 ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app-sa
namespace: default
automountServiceAccountToken: false # 토큰 자동 마운트 비활성화
Pod에 연결
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
serviceAccountName: my-app-sa # SA 지정
automountServiceAccountToken: false # 토큰 마운트 비활성화
containers:
- name: app
image: my-app:latest
🔐 Token 관리
Kubernetes 1.24+ 변경사항
# 이전: Secret에 토큰 자동 생성
# 현재: TokenRequest API 사용
# 토큰 생성
kubectl create token my-app-sa
# 만료 시간 지정
kubectl create token my-app-sa --duration=24h
수동 토큰 생성 (레거시)
apiVersion: v1
kind: Secret
metadata:
name: my-app-sa-token
annotations:
kubernetes.io/service-account.name: my-app-sa
type: kubernetes.io/service-account-token
🛡️ 보안 컨텍스트
Pod 수준
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: my-app:latest
컨테이너 수준
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
containers:
- name: app
image: my-app:latest
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
seccompProfile:
type: RuntimeDefault
📋 보안 체크리스트
- ServiceAccount 생성
- 토큰 자동 마운트 제어
- RBAC 최소 권한
- runAsNonRoot 설정
- readOnlyRootFilesystem
- capabilities drop ALL
- seccompProfile 설정
- NetworkPolicy 적용
🔗 관련 노트
- 02-09-RBAC-설정 — 권한 관리
- 02-04-NetworkPolicy — TLS, mTLS
- 03-03-보안-하드닝 — 전체 보안
마지막 업데이트: 2026-06-01