정책 컨트롤러는 포드 보안 정책 번들과 함께 사용하여 Kubernetes 포드 보안 정책(PSP)과 동일한 여러 보호 기능을 사용할 수 있는 제약조건 템플릿의 기본 라이브러리와 함께 제공되며, 정책을 적용하기 전에 테스트하고 특정 리소스 범위를 제외하는 추가 기능이 포함되어 있습니다.
이 페이지에는 정책 번들을 수동으로 적용하는 방법에 관한 안내가 포함되어 있습니다. 또는 정책 번들을 직접 적용할 수 있습니다.
이 페이지는 감사 또는 시행 자동화를 제공하고 유지하여 클라우드 플랫폼 내에서 실행되는 모든 리소스가 조직의 규정 준수 요구사항을 충족하도록 보장하려는 IT 관리자와 운영자를 위해 작성되었습니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할 및 예시 태스크에 대해 자세히 알아보려면 일반 GKE 사용자 역할 및 태스크를 참조하세요.
번들에는 Kubernetes 포드 보안 정책(PSP) 필드 이름(컨트롤 ID)에 매핑되는 매개변수를 제공하는 다음과 같은 제약조건이 포함됩니다.
| 제약조건 이름 | 제약조건 설명 | Control ID | 
|---|---|---|
| psp-v2022-psp-allow-privilege-escalation | 루트 권한으로 에스컬레이션 제한 | allowPrivilegeEscalation | 
| psp-v2022-psp-apparmor | 컨테이너에 사용되는 AppArmor 프로필 | 주석 | 
| psp-v2022-psp-capabilities | Linux 기능 | allowedCapabilities, requiredDropCapabilities | 
| psp-v2022-flexvolume-drivers | 특정 FlexVolume 드라이버 허용 | allowedFlexVolumes | 
| psp-v2022-psp-forbidden-sysctls | 컨테이너에 사용되는 sysctl 프로필 | forbiddenSysctls | 
| psp-v2022-psp-fsgroup | 포드 볼륨을 소유한 FSGroup 할당 | fsGroup | 
| psp-v2022-psp-host-filesystem | 호스트 파일 시스템 사용 | allowedHostPaths | 
| psp-v2022-psp-host-namespace | 호스트 네임스페이스 사용 | hostPID, hostIPC | 
| psp-v2022-psp-host-network-ports | 호스트 네트워킹 및 포트 사용 | hostNetwork, hostPorts | 
| psp-v2022-psp-privileged-container | 권한이 있는 컨테이너 실행 | privileged | 
| psp-v2022-psp-proc-mount | 컨테이너의 Allowed Proc Mount 유형 | allowedProcMountTypes | 
| psp-v2022-psp-readonlyrootfilesystem | 읽기 전용 루트 파일 시스템을 사용 필수 | readOnlyRootFilesystem | 
| psp-v2022-psp-seccomp | 컨테이너에 사용되는 seccomp 프로필 | 주석 | 
| psp-v2022-psp-selinux-v2 | 컨테이너의 SELinux 컨텍스트 | seLinux | 
| psp-v2022-psp-pods-allowed-user-ranges | 컨테이너의 사용자 및 그룹 ID | runAsUser, runAsGroup, supplementalGroups, fsGroup | 
| psp-v2022-psp-volume-types | 볼륨 유형 사용 | volumes | 
시작하기 전에
- 이 안내에서 사용되는 gcloud및kubectl명령어를 제공하는 Google Cloud CLI를 설치하고 초기화합니다. Cloud Shell을 사용하는 경우 Google Cloud CLI가 사전 설치됩니다.
- 제약조건 템플릿의 기본 라이브러리를 사용하여 클러스터에 정책 컨트롤러를 설치합니다.
포드 보안 정책 정책 번들 감사
정책 컨트롤러를 사용하면 Kubernetes 클러스터에 정책을 적용할 수 있습니다. 앞의 테이블에서 설명된 Google 권장사항과 관련하여 워크로드 및 규정 준수를 테스트하는 데 도움이 되도록, '감사' 모드에서 이러한 제약조건을 배포하여 위반 사항을 표시할 수 있고 더 중요하게는 Kubernetes 클러스터에 적용하기 전에 문제를 해결할 기회를 가질 수 있습니다.
kubectl, kpt 또는 구성 동기화를 사용하여 dryrun으로 설정된 spec.enforcementAction으로 이러한 정책을 적용할 수 있습니다.
kubectl
- (선택사항) kubectl을 사용하여 정책 제약조건을 미리 봅니다. - kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 
- kubectl을 사용하여 정책 제약조건을 적용합니다. - kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 - 출력은 다음과 같습니다. - k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-v2022-psp-allow-privilege-escalation created k8spspallowedusers.constraints.gatekeeper.sh/psp-v2022-psp-pods-allowed-user-ranges created k8spspapparmor.constraints.gatekeeper.sh/psp-v2022-psp-apparmor created k8spspcapabilities.constraints.gatekeeper.sh/psp-v2022-psp-capabilities created k8spspfsgroup.constraints.gatekeeper.sh/psp-v2022-psp-fsgroup created k8spspflexvolumes.constraints.gatekeeper.sh/psp-v2022-psp-flexvolume-drivers created k8spspforbiddensysctls.constraints.gatekeeper.sh/psp-v2022-psp-forbidden-sysctls created k8spsphostfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-host-filesystem created k8spsphostnamespace.constraints.gatekeeper.sh/psp-v2022-psp-host-namespace created k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-v2022-psp-host-network-ports created k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-v2022-psp-privileged-container created k8spspprocmount.constraints.gatekeeper.sh/psp-v2022-psp-proc-mount created k8spspreadonlyrootfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-readonlyrootfilesystem created k8spspselinuxv2.constraints.gatekeeper.sh/psp-v2022-psp-selinux-v2 created k8spspseccomp.constraints.gatekeeper.sh/psp-v2022-psp-seccomp created k8spspvolumetypes.constraints.gatekeeper.sh/psp-v2022-psp-volume-types created 
- 정책 제약조건이 설치되었는지 확인하고 클러스터 전체에 위반 사항이 있는지 확인합니다. - kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 - 출력은 다음과 비슷합니다. - NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-v2022-psp-allow-privilege-escalation dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowedusers.constraints.gatekeeper.sh/psp-v2022-psp-pods-allowed-user-ranges dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspapparmor.constraints.gatekeeper.sh/psp-v2022-psp-apparmor 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspcapabilities.constraints.gatekeeper.sh/psp-v2022-psp-capabilities dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspfsgroup.constraints.gatekeeper.sh/psp-v2022-psp-fsgroup 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspflexvolumes.constraints.gatekeeper.sh/psp-v2022-psp-flexvolume-drivers 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspforbiddensysctls.constraints.gatekeeper.sh/psp-v2022-psp-forbidden-sysctls 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-host-filesystem 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnamespace.constraints.gatekeeper.sh/psp-v2022-psp-host-namespace dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-v2022-psp-host-network-ports dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-v2022-psp-privileged-container dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprocmount.constraints.gatekeeper.sh/psp-v2022-psp-proc-mount 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspreadonlyrootfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-readonlyrootfilesystem 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspselinuxv2.constraints.gatekeeper.sh/psp-v2022-psp-selinux-v2 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspseccomp.constraints.gatekeeper.sh/psp-v2022-psp-seccomp dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspvolumetypes.constraints.gatekeeper.sh/psp-v2022-psp-volume-types 0 
- (선택사항) 클러스터 환경에 따라 제약조건 파일에서 PSP 필드 이름 - parameters를 조정합니다. 자세한 내용은 위 표에서 특정 PSP 필드 이름의 링크를 확인하세요. 예를 들어- psp-host-network-ports에서 다음과 같습니다.- parameters: hostNetwork: true min: 80 max: 9000 
kpt
- kpt를 설치하고 설정합니다. 이 안내에서는 kpt를 사용하여 Kubernetes 리소스를 맞춤설정하고 배포합니다. 
- kpt를 사용하여 GitHub에서 포드 보안 정책(PSP) v2022 정책 번들을 다운로드하세요. - kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 
- set-enforcement-actionkpt 함수를 실행하여 정책의 시정 조치를- dryrun으로 설정합니다.- kpt fn eval psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun 
- 변경사항을 추적하는 리소스를 만드는 kpt로 작업 디렉터리를 초기화합니다. - cd psp-v2022 kpt live init 
- (선택사항) 클러스터 환경에 따라 제약조건 파일에서 PSP 필드 이름 - parameters를 조정합니다. 자세한 내용은 위 표에서 특정 PSP 필드 이름의 링크를 확인하세요. 예를 들어- psp-host-network-ports에서 다음과 같습니다.- parameters: hostNetwork: true min: 80 max: 9000 
- kpt로 정책 제약조건을 적용합니다. - kpt live apply 
- 정책 제약조건이 설치되었는지 확인하고 클러스터 전체에 위반 사항이 있는지 확인합니다. - kpt live status --output table --poll-until current - CURRENT상태는 제약조건이 성공적으로 설치되었음을 확인합니다.
구성 동기화
- kpt를 설치하고 설정합니다. 이 안내에서는 kpt를 사용하여 Kubernetes 리소스를 맞춤설정하고 배포합니다.
구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요.
- 구성 동기화의 동기화 디렉터리로 변경합니다. - cd SYNC_ROOT_DIR - resourcegroup.yaml로- .gitignore를 만들거나 추가하려면 다음 안내를 따르세요.- echo resourcegroup.yaml >> .gitignore 
- 전용 - policies디렉터리를 만듭니다.- mkdir -p policies 
- kpt를 사용하여 GitHub에서 포드 보안 정책(PSP) v2022 정책 번들을 다운로드하세요. - kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/psp-v2022 policies/psp-v2022 
- set-enforcement-actionkpt 함수를 실행하여 정책의 시정 조치를- dryrun으로 설정합니다.- kpt fn eval policies/psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun 
- (선택사항) 클러스터 환경에 따라 제약조건 파일에서 PSP 필드 이름 - parameters를 조정합니다. 자세한 내용은 위 표에서 특정 PSP 필드 이름의 링크를 확인하세요. 예를 들어- psp-host-network-ports에서 다음과 같습니다.- parameters: hostNetwork: true min: 80 max: 9000 
- (선택사항) 생성될 정책 제약조건을 미리 봅니다. - kpt live init policies/psp-v2022 kpt live apply --dry-run policies/psp-v2022 - 출력은 다음과 같습니다. - Dry-run strategy: client inventory update started inventory update finished apply phase started k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/psp-v2022-psp-allow-privilege-escalation apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspallowedusers.constraints.gatekeeper.sh/psp-v2022-psp-pods-allowed-user-ranges apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspapparmor.constraints.gatekeeper.sh/psp-v2022-psp-apparmor apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspcapabilities.constraints.gatekeeper.sh/psp-v2022-psp-capabilities apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspfsgroup.constraints.gatekeeper.sh/psp-v2022-psp-fsgroup apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspflexvolumes.constraints.gatekeeper.sh/psp-v2022-psp-flexvolume-drivers apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspforbiddensysctls.constraints.gatekeeper.sh/psp-v2022-psp-forbidden-sysctls apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spsphostfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-host-filesystem apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spsphostnamespace.constraints.gatekeeper.sh/psp-v2022-psp-host-namespace apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spsphostnetworkingports.constraints.gatekeeper.sh/psp-v2022-psp-host-network-ports apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspprivilegedcontainer.constraints.gatekeeper.sh/psp-v2022-psp-privileged-container apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspprocmount.constraints.gatekeeper.sh/psp-v2022-psp-proc-mount apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspreadonlyrootfilesystem.constraints.gatekeeper.sh/psp-v2022-psp-readonlyrootfilesystem apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspselinuxv2.constraints.gatekeeper.sh/psp-v2022-psp-selinux-v2 apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspseccomp.constraints.gatekeeper.sh/psp-v2022-psp-seccomp apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) k8spspvolumetypes.constraints.gatekeeper.sh/psp-v2022-psp-volume-types apply skipped: inventory policy prevented actuation (strategy: Apply, status: Empty, policy: MustMatch) apply phase finished inventory update started inventory update finished apply result: 16 attempted, 0 successful, 16 skipped, 0 failed 
- 구성 동기화의 동기화 디렉터리에 Kustomize가 사용되는 경우 루트 - kustomization.yaml에- policies/psp-v2022를 추가합니다. 그렇지 않으면- policies/psp-v2022/kustomization.yaml파일을 삭제합니다.- rm SYNC_ROOT_DIR/policies/psp-v2022/kustomization.yaml 
- 구성 동기화 저장소에 변경사항을 푸시합니다. - git add SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Adding Pod Security Policy audit enforcement' git push 
- 설치 상태를 확인합니다. - watch gcloud beta container fleet config-management status --project PROJECT_ID - SYNCED상태는 정책 설치를 확인합니다.
정책 위반 보기
정책 제약조건이 감사 모드로 설치되면 정책 컨트롤러 대시보드를 사용하여 UI에서 클러스터의 위반 사항을 볼 수 있습니다.
또한 kubectl을 사용하여 다음 명령어를 사용하여 클러스터에서 위반 사항을 볼 수 있습니다.
kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
위반이 있는 경우 제약조건당 위반 메시지 목록을 다음에서 볼 수 있습니다.
kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
포드 보안 정책 정책 번들 시정 조치 변경
클러스터에서 정책 위반을 검토한 후에는 허용 컨트롤러가 호환되지 않는 리소스가 클러스터에 적용되지 않도록 warn 또는 deny를 수행할 수 있도록 시행 모드 변경을 고려할 수 있습니다.
kubectl
- kubectl을 사용하여 정책의 시정 조치를 - warn로 설정합니다.- kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
- 정책 제약조건 시정 조치가 업데이트되었는지 확인합니다. - kubectl get constraint -l policycontroller.gke.io/bundleName=psp-v2022 
kpt
- set-enforcement-actionkpt 함수를 실행하여 정책의 시정 조치를- warn으로 설정합니다.- kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn 
- 정책 제약조건을 적용합니다. - kpt live apply 
구성 동기화
구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요.
- 구성 동기화의 동기화 디렉터리로 변경합니다. - cd SYNC_ROOT_DIR 
- set-enforcement-actionkpt 함수를 실행하여 정책의 시정 조치를- warn으로 설정합니다.- kpt fn eval policies/psp-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn 
- 구성 동기화 저장소에 변경사항을 푸시합니다. - git add SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Adding Pod Security Policy policy bundle warn enforcement' git push 
- 설치 상태를 확인합니다. - nomos status - 클러스터에 설치된 정책과 함께 - SYNCED상태가 표시됩니다.
테스트 정책 시행
다음 명령어를 사용하여 클러스터에 정책을 준수하지 않는 리소스를 만듭니다.
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: wp-non-compliant
  labels:
    app: wordpress
spec:
  containers:
    - image: wordpress
      name: wordpress
      ports:
      - containerPort: 80
        name: wordpress
EOF
다음 예시와 같이 허용 컨트롤러는 이 리소스가 위반하는 정책 위반을 나열하는 경고를 생성해야 합니다.
Warning: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/fsGroup. Allowed fsGroup: {"ranges": [{"max": 200, "min": 100}], "rule": "MustRunAs"}
Warning: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/runAsGroup. Allowed runAsGroup: {"ranges": [{"max": 200, "min": 100}], "rule": "MustRunAs"}
Warning: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/runAsUser
Warning: [psp-v2022-psp-pods-allowed-user-ranges] Container wordpress is attempting to run without a required securityContext/supplementalGroups. Allowed supplementalGroups: {"ranges": [{"max": 200, "min": 100}], "rule": "MustRunAs"}
Warning: [psp-v2022-psp-allow-privilege-escalation] Privilege escalation container is not allowed: wordpress
Warning: [psp-v2022-psp-seccomp] Seccomp profile 'not configured' is not allowed for container 'wordpress'. Found at: no explicit profile found. Allowed profiles: {"RuntimeDefault", "docker/default", "runtime/default"}
Warning: [psp-v2022-psp-capabilities] container <wordpress> is not dropping all required capabilities. Container must drop all of ["must_drop"] or "ALL"
Warning: [psp-v2022-psp-readonlyrootfilesystem] only read-only root filesystem container is allowed: wordpress
pod/wp-non-compliant created
포드 보안 정책 정책 번들 삭제
필요한 경우 클러스터에서 포드 보안 정책 정책 번들을 삭제할 수 있습니다.
kubectl
- kubectl을 사용하여 정책을 삭제합니다. - kubectl delete constraint -l policycontroller.gke.io/bundleName=psp-v2022 
kpt
- 정책을 삭제합니다. - kpt live destroy 
구성 동기화
구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요.
- 구성 동기화 저장소에 변경사항을 푸시합니다. - git rm -r SYNC_ROOT_DIR/policies/psp-v2022 git commit -m 'Removing PSP policies' git push 
- 상태를 확인합니다. - nomos status - 클러스터에 리소스가 삭제된 상태로 - SYNCED상태가 표시됩니다.