[Kubernetes] Pod Security Policy 완벽 가이드 (PSP, 보안 정책 관리)

☸️ Kubernetes Pod Security Policy (PSP) #

Kubernetes에서 컨테이너 보안을 강화하려면 Pod의 실행 방식 자체를 제한할 필요가 있습니다.

예를 들어 다음과 같은 정책이 필요할 수 있습니다.

  • 컨테이너는 root 권한 사용 금지
  • privileged 컨테이너 실행 금지
  • host network 사용 금지

이러한 Pod 보안 정책을 정의하는 기능이 바로 Pod Security Policy (PSP) 입니다.

Security Context가 Pod 내부 설정이라면
PSP는 클러스터 수준에서 강제하는 보안 정책이라고 이해하면 됩니다.


Kubernetes 보안 구조 #

graph TD

User --> APIserver

APIserver --> PSP

PSP --> PodSpec

PodSpec --> SecurityContext

SecurityContext --> Container

Pod 생성 과정

1️⃣ 사용자가 Pod 생성 요청 2️⃣ API Server가 PSP 정책 확인 3️⃣ Pod 설정이 정책을 만족하면 생성 4️⃣ 정책 위반 시 생성 실패


Security Context vs PSP #

항목Security ContextPod Security Policy
적용 범위Pod / ContainerCluster
역할Pod 보안 설정보안 정책 강제
설정 위치Pod YAMLCluster Resource
목적실행 권한 설정정책 통제

  • Security Context → Pod 설정
  • PSP → 정책 enforcement

Pod Security Policy 동작 방식 #

graph TD

User --> PodRequest

PodRequest --> APIserver

APIserver --> PSPCheck

PSPCheck -->|Allowed| PodCreated
PSPCheck -->|Denied| PodRejected

Pod 생성 시

✔ PSP 정책을 만족하면 생성 ❌ 정책 위반 시 생성 실패


PSP에서 제어 가능한 보안 항목 #

Pod Security Policy는 다양한 보안 항목을 제어할 수 있습니다.

대표적인 정책

정책설명
privilegedprivileged container 허용 여부
hostNetworkhost 네트워크 사용
hostPIDhost PID namespace 사용
hostIPChost IPC 사용
runAsUser컨테이너 사용자
fsGroup파일 시스템 그룹
volumes볼륨 타입
capabilitiesLinux capability

Pod Security Policy 예제 #

root 사용자 실행을 금지하는 PSP 예제입니다.

 1apiVersion: policy/v1beta1
 2kind: PodSecurityPolicy
 3
 4metadata:
 5  name: nonroot-psp
 6
 7spec:
 8
 9  runAsUser:
10    rule: MustRunAsNonRoot
11
12  seLinux:
13    rule: RunAsAny
14
15  supplementalGroups:
16    rule: RunAsAny
17
18  fsGroup:
19    rule: RunAsAny
20
21  volumes:
22  - '*'

이 정책의 핵심

runAsUser: MustRunAsNonRoot

컨테이너가 root로 실행되는 것을 금지합니다.


PSP 적용 구조 #

PSP는 RBAC을 통해 사용자에게 연결해야 합니다.

graph TD

PSP --> ClusterRole

ClusterRole --> ClusterRoleBinding

ClusterRoleBinding --> ServiceAccount

ServiceAccount --> Pod

즉 흐름은

PSP
 → ClusterRole
 → ClusterRoleBinding
 → ServiceAccount
 → Pod

ServiceAccount 생성 #

1apiVersion: v1
2kind: ServiceAccount
3
4metadata:
5  name: nonroot-sa

ClusterRole 생성 #

PSP를 사용할 수 있는 권한을 정의합니다.

 1apiVersion: rbac.authorization.k8s.io/v1
 2kind: ClusterRole
 3
 4metadata:
 5  name: nonroot-clusterrole
 6
 7rules:
 8- apiGroups:
 9  - policy
10  resources:
11  - podsecuritypolicies
12  resourceNames:
13  - nonroot-psp
14  verbs:
15  - use

ClusterRoleBinding 생성 #

서비스 계정과 ClusterRole을 연결합니다.

 1apiVersion: rbac.authorization.k8s.io/v1
 2kind: ClusterRoleBinding
 3
 4metadata:
 5  name: nonroot-clusterrole-binding
 6
 7subjects:
 8- kind: ServiceAccount
 9  name: nonroot-sa
10  namespace: default
11
12roleRef:
13  apiGroup: rbac.authorization.k8s.io
14  kind: ClusterRole
15  name: nonroot-clusterrole

Deployment 적용 예제 #

이제 PSP 정책을 사용하는 Deployment를 생성합니다.

 1apiVersion: apps/v1
 2kind: Deployment
 3
 4metadata:
 5  name: nonroot-deploy
 6
 7spec:
 8  replicas: 3
 9
10  selector:
11    matchLabels:
12      app: nonroot
13
14  template:
15    metadata:
16      labels:
17        app: nonroot
18
19    spec:
20      serviceAccountName: nonroot-sa
21
22      securityContext:
23        runAsUser: 1001
24        fsGroup: 2001
25
26      containers:
27      - name: app
28        image: example/app:v1
29        ports:
30        - containerPort: 8080

여기서 중요한 설정

runAsUser: 1001

PSP 정책에서 요구한 non-root 실행 조건을 만족합니다.


정책 위반 테스트 #

만약 다음과 같이 root 사용자로 실행되는 Pod를 생성하면

1containers:
2- name: root-app
3  image: example/app:v1

Pod 생성 시 다음과 같은 결과가 발생합니다.

Pod 생성 실패
PSP 정책 위반

보안 정책이 강제로 적용됩니다.


PSP 활성화 #

PSP는 기본적으로 비활성화되어 있으며 Admission Controller를 통해 활성화해야 합니다.

예: Minikube

1minikube start \
2--extra-config=apiserver.enable-admission-plugins=PodSecurityPolicy

운영 환경 Best Practice #

실무에서는 다음과 같은 정책을 많이 사용합니다.

1️⃣ Root 실행 금지 #

MustRunAsNonRoot

2️⃣ Privileged Container 금지 #

privileged: false

3️⃣ Host Network 차단 #

hostNetwork: false

4️⃣ Volume 타입 제한 #

hostPath 사용 제한

Kubernetes 보안 아키텍처 #

graph TD

Developer --> CI/CD

CI/CD --> KubernetesAPI

KubernetesAPI --> PSP

PSP --> Pod

Pod --> Container

PSP는 클러스터 레벨 보안 게이트 역할을 합니다.


정리 #

Kubernetes 보안 구조

Security Context #

  • Pod 실행 권한 설정

Pod Security Policy #

  • 클러스터 보안 정책
  • Pod 생성 정책 검사

RBAC #

  • PSP 사용 권한 제어

SecurityContext → 설정
PSP → 정책
RBAC → 접근 제어
Advertisement