설명
PodSecurityPolicy의 runAsUser.rule: RunAsAny는 UID 0 실행을 제한하지 않습니다. privileged: true는 특권 컨테이너를, allowPrivilegeEscalation: true는 프로세스의 권한 상승을 허용하는 별도 설정입니다. 이런 권한이 불필요하게 허용되면 취약점 악용 시 영향 범위가 커질 수 있습니다.
운영 환경에서는 비 root 실행, privilege escalation 차단, 읽기 전용 루트 파일 시스템 같은 기본 방어를 함께 적용하는 편이 안전합니다.
참고: PodSecurityPolicy는 Kubernetes v1.21에서 사용 중단되었고 v1.25에서 제거되었습니다. 이 문서는 PSP를 사용하는 레거시 클러스터나 PSP 리소스가 남아 있는 환경을 다룹니다. 최신 클러스터에서는 Pod Security Admission 또는 Gatekeeper나 Kyverno 같은 정책 엔진으로 같은 제한을 적용하세요.
잠재적 영향
- 컨테이너 탈취 시 더 높은 권한으로 악용될 수 있습니다.
- 호스트나 민감 파일에 대한 영향 범위가 커질 수 있습니다.
- 워크로드 격리 수준이 낮아질 수 있습니다.
해결 방법
- PSP에서
privileged: false,allowPrivilegeEscalation: false를 설정하세요. runAsUser.rule은MustRunAsNonRoot로 제한하세요.readOnlyRootFilesystem: true와 root 그룹 금지 설정을 함께 적용하세요.
예시
기존 PSP의 관련 필드만 발췌했습니다. 다른 필수 필드와 정책 사용 권한은 생략되어 있습니다. 읽기 전용 루트 파일 시스템은 비 root 실행과 별도 통제입니다.
변경 전
yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: true
allowPrivilegeEscalation: true
runAsUser:
rule: "RunAsAny"
supplementalGroups:
rule: "RunAsAny"
fsGroup:
rule: "MustRunAs"
ranges:
- min: 0
max: 65535
변경 후
yaml
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
runAsUser:
rule: "MustRunAsNonRoot"
supplementalGroups:
rule: "MustRunAs"
ranges:
- min: 1
max: 65535
fsGroup:
rule: "MustRunAs"
ranges:
- min: 1
max: 65535
readOnlyRootFilesystem: true
설명:
- 변경 전: root 실행과 권한 상승을 허용해 컨테이너 탈취 시 피해 범위가 커질 수 있습니다.
- 변경 후: 비 root 실행과 권한 상승 차단을 적용해 격리 수준을 높입니다.