PodSecurityPolicy에서 PodSecurity 허용 컨트롤러로 마이그레이션


이 페이지에서는 PodSecurityPolicy에서 PodSecurity 허용 컨트롤러로 마이그레이션하여 Google Kubernetes Engine(GKE) 클러스터에서 여러 포드 수준 보안 제어를 계속 시행하는 방법을 보여줍니다.

개요

PodSecurityPolicy는 Kubernetes 포드 보안 표준과 같은 포드 수준 보안 제어를 시행하여 배포된 워크로드의 보안 구성을 세밀하게 제어할 수 있게 해주는 Kubernetes 허용 컨트롤러입니다. Kubernetes 프로젝트에서 PodSecurityPolicy를 지원 중단하고 Kubernetes v1.25에서 이 기능을 완전히 삭제했습니다.

현재 GKE 클러스터에서 PodSecurityPolicy를 사용하는 경우 GKE 버전 1.25 이상으로 업그레이드하기 전에 이 기능을 사용 중지하세요.

PodSecurityPolicy 지원 중단 및 삭제에 대한 자세한 내용은 PodSecurityPolicy 지원 중단을 참조하세요.

PodSecurity 및 PodSecurityPolicy

PodSecurity 허용 컨트롤러를 사용할 수 있고 기본적으로 다음 GKE 버전을 실행하는 클러스터에서 사용 설정됩니다.

  • 버전 1.25 이상: 정식
  • 버전 1.23 및 버전 1.24: 베타

PodSecurity를 사용하면 배포된 워크로드에서 포드 보안 표준에 정의된 정책을 적용할 수 있습니다. PodSecurity를 사용하면 PodSecurityPolicy에서 마이그레이션한 후 클러스터에 권장 포드 수준 보안 구성을 계속 구현할 수 있습니다. PodSecurityPolicy와 달리 PodSecurity에서는 커스텀 구성을 지원하지 않습니다.

요구사항 및 제한사항

  • PodSecurity는 GKE 버전 1.23 및 1.24에서 베타로 제공되고 GKE 버전 1.25 이상에서는 정식으로 제공됩니다.
  • PodSecurity는 이미 노드에서 실행 중인 포드가 적용된 정책을 위반해도 포드가 종료되지 않습니다.
  • PodSecurity는 필드를 변형하지 않습니다. PodSecurityPolicy의 변형 필드를 사용하는 경우 워크로드를 배포할 때 해당 필드가 있도록 포드 사양을 수정합니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.
  • 버전 1.23 이상을 실행하는 GKE Autopilot 또는 표준 클러스터가 있는지 유의하세요.
  • PodSecurityPolicy 리소스를 확인하여 필드 구성에 변형이 있는지 확인합니다. 노드에서 이미 실행 중인 모든 워크로드가 포드 보안 표준에 정의된 정책을 준수하도록 포드 매니페스트에 해당 필드를 추가합니다. 자세한 내용은 포드 보안 정책 단순화 및 표준화를 참조하세요.

클러스터에서 PodSecurity 허용 컨트롤러 구성

PodSecurity 허용 컨트롤러는 네임스페이스 수준에서 포드 보안 표준을 적용합니다. 컨트롤러가 각 네임스페이스에서 포드 보안 표준에 의해 정의된 정책 중 하나를 적용하도록 구성해야 합니다. 다음 정책을 사용할 수 있습니다.

  • 제한된: 가장 제한적인 정책입니다. 포드 강화 권장사항을 준수합니다.
  • 기준: 알려진 권한 에스컬레이션을 방지하는 최소한의 제한 정책입니다. 포드 사양의 필드에 모든 기본값을 허용합니다.
  • 권한: 알려진 권한 에스컬레이션을 포함하여 모든 항목을 허용하는 제한되지 않은 정책입니다. 이 정책을 적용할 때는 주의해야 합니다.

PodSecurityPolicy 구성을 PodSecurity 허용 컨트롤러로 마이그레이션하려면 클러스터의 모든 네임스페이스에서 다음을 수행합니다. 다음 섹션에서는 이러한 단계를 자세히 설명합니다.

  1. dry-run 모드의 제한된 정책을 네임스페이스에 적용하고 위반을 확인합니다.
  2. 포드가 제한된 정책을 위반하는 경우 dry-run 모드의 덜 제한적인 기준 정책을 네임스페이스에 적용하고 위반을 확인합니다.
  3. 포드가 기준 정책을 위반하는 경우 포드 사양을 수정하여 위반 사항을 수정합니다.
  4. 기준 정책이 더 이상 위반 사항을 반환하지 않으면 네임스페이스에 enforce 모드로 정책을 적용합니다.

PodSecurity가 새 포드를 거부하는 경우 잠재적인 다운타임을 방지하려면 스테이징 환경에서 다음 단계를 수행합니다. 또는 식별된 정책을 enforce 모드 대신 audit 모드로 적용하고 감사 로그를 검토하여 거부된 포드를 찾을 수 있습니다.

audit 모드에서는 정책을 적용하지 않습니다. GKE는 포드를 배포하고 GKE 감사 로그에 항목을 추가합니다.

클러스터의 모든 네임스페이스 나열

클러스터의 모든 네임스페이스 목록을 가져옵니다. 목록의 모든 네임스페이스에 다음 섹션의 단계를 반복합니다.

kubectl get ns

다음 GKE 버전에서 GKE는 kube-system 네임스페이스에 적용되는 정책을 무시합니다.

  • 1.23.6-gke.1900 이상
  • 1.24.0-gke.1200 이상

이전 GKE 버전에서는 kube-system에 정책을 적용하지 않습니다.

테스트 실행 모드에서 포드 보안 표준의 각 정책 적용

다음 단계에서는 가장 제한적인 제한된 정책부터 시작하여 dry-run 모드로 각 정책을 적용합니다. 출력에 경고가 표시되면 위반하는 포드 사양을 정책을 준수하도록 수정하거나, 덜 제한적인 기준 정책을 사용합니다. 출력에 경고가 표시되지 않으면 dry-run 모드 없이 기준 정책을 적용할 수 있습니다.

  1. dry-run 모드에서 제한된 정책을 적용합니다.

    kubectl label --dry-run=server --overwrite ns NAMESPACE \
        pod-security.kubernetes.io/enforce=restricted
    

    네임스페이스의 포드가 제한된 정책을 위반하는 경우 출력이 다음과 비슷합니다.

    Warning: existing pods in namespace "NAMESPACE" violate the new PodSecurity enforce level "restricted:latest"
    namespace/NAMESPACE labeled
    

    제한됨 정책에 경고가 표시되면 포드를 수정하여 위반을 수정하고 명령어를 다시 시도합니다. 또는 다음 단계에서 덜 제한적인 기준 정책을 적용해 봅니다.

  2. dry-run 모드에서 기준 정책을 적용합니다.

    kubectl label --dry-run=server --overwrite ns NAMESPACE \
        pod-security.kubernetes.io/enforce=baseline
    

    네임스페이스의 포드가 기준 정책을 위반하면 출력은 다음과 비슷합니다.

    Warning: existing pods in namespace "NAMESPACE" violate the new PodSecurity enforce level "baseline:latest"
    namespace/NAMESPACE labeled
    

포드가 기준 정책을 위반하는 경우 포드를 수정하여 위반을 수정하고 GKE가 더 이상 경고를 표시하지 않을 때까지 이 단계를 반복합니다.

네임스페이스에 정책 적용

네임스페이스에 맞는 정책을 확인하면 정책을 enforce 모드의 네임스페이스에 적용합니다.

kubectl label --overwrite ns NAMESPACE \
    pod-security.kubernetes.io/enforce=POLICY

POLICY를 정책 이름(restricted, baseline 또는 privileged 중 하나)으로 바꿉니다.

클러스터의 모든 네임스페이스에 위 단계를 반복해야 합니다.

클러스터에서 PodSecurityPolicy 기능 중지

클러스터의 모든 네임스페이스PodSecurity 허용 컨트롤러를 구성한 후에는 PodSecurityPolicy 기능을 중지합니다.

gcloud beta container clusters update CLUSTER_NAME \
    --no-enable-pod-security-policy

CLUSTER_NAME을 GKE 클러스터 이름으로 바꿉니다.

클러스터를 GKE 버전 1.25로 업그레이드하면 GKE는 GKE, 정책 컨트롤러, 미리 정의한 PodSecurityPolicy 객체를 포함하여 나머지 모든 PodSecurityPolicy 객체를 자동으로 삭제합니다.

권장사항

  • 가능하면 제한된 정책을 준수해야 합니다. 애플리케이션을 감사하여 구성을 더 강화할 수 있는지 확인합니다.
  • 이전 단계의 kubectl label 명령어에 pod-security.kubernetes.io/MODE-version: VERSION 라벨을 추가하여 포드 보안 모드를 특정 Kubernetes 부 버전으로 잠글 수 있습니다. VERSION을 Kubernetes 버전 번호(예: v1.24)로 바꿉니다.
  • PodSecurityPolicy 기능을 사용 중지한 후 실행 중인 애플리케이션을 검토하여 보안 구성의 중단 또는 격차를 확인합니다.
  • PodSecurity를 구성한 후 모든 새 네임스페이스에 PodSecurity 라벨을 자동으로 적용하도록 네임스페이스 생성 프로세스를 업데이트합니다. 자세한 내용은 네임스페이스 생성 프로세스 검토를 참조하세요.

다음 단계