Root 컨테이너 허용

PodSecurityPolicy가 root 실행과 privilege escalation을 허용하면 컨테이너 침해 시 영향 범위가 커질 수 있습니다.

설명

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 실행과 권한 상승 차단을 적용해 격리 수준을 높입니다.

참조