정책 컨트롤러는 Policy Essentials v2022 번들과 함께 사용하여 클러스터 리소스에 Google 권장사항을 적용할 수 있는 제약조건 템플릿의 기본 라이브러리와 함께 제공됩니다.
이 제약조건 번들은 다음 도메인에서 정책을 적용하고 시행합니다.
- RBAC 및 서비스 계정
- Pod 보안 정책
- 컨테이너 네트워크 인터페이스(CNI)
- 보안 비밀 관리
- 일반 정책
Policy Essentials 정책 번들 제약조건
제약조건 이름 | 제약조건 설명 |
---|---|
policy-essentials-v2022-no-secrets-as-env-vars | 보안 비밀을 환경 변수로 사용하는 대신 보안 비밀을 파일로 사용하는 것을 선호합니다. |
policy-essentials-v2022-pods-require-security-context | 포드 및 컨테이너에 보안 컨텍스트를 적용합니다. |
policy-essentials-v2022-prohibit-role-wildcard-access | Roles 및 ClusterRoles에서 와일드 카드 사용을 최소화합니다. |
policy-essentials-v2022-psp-allow-privilege-escalation-container | allowPrivilegeEscalation으로 컨테이너 허용을 최소화합니다. |
policy-essentials-v2022-psp-capabilities | 컨테이너가 `NET_RAW` 기능을 삭제해야 하며 어떠한 기능도 다시 추가하도록 허용되지 않습니다. |
policy-essentials-v2022-psp-host-namespace | `hostPID` 또는 `hostIPC`를 `true`로 설정하여 컨테이너 허용을 최소화합니다. |
policy-essentials-v2022-psp-host-network-ports | 호스트 네트워크 네임스페이스를 공유하려는 컨테이너 허용을 최소화합니다. |
policy-essentials-v2022-psp-privileged-container | 권한이 있는 컨테이너 허용을 최소화합니다. |
policy-essentials-v2022-psp-pods-must-run-as-nonroot | 루트 컨테이너 허용을 최소화합니다. |
policy-essentials-v2022-psp-seccomp-default | 포드 정의에서 seccomp 프로필이 runtime/default 또는 docker/default로 설정되었는지 확인합니다. |
policy-essentials-v2022-restrict-clusteradmin-rolebindings | cluster-admin 역할 사용을 최소화합니다. |
시작하기 전에
- 이 안내에서 사용되는
gcloud
및kubectl
명령어를 제공하는 Google Cloud CLI를 설치하고 초기화합니다. Cloud Shell을 사용하는 경우 Google Cloud CLI가 사전 설치됩니다. - 기본 제약조건 템플릿 라이브러리를 사용하여 클러스터에 v1.14.3 이상의 정책 컨트롤러를 설치합니다.
Policy Essentials 정책 번들 감사
정책 컨트롤러를 사용하면 Kubernetes 클러스터에 정책을 적용할 수 있습니다. 앞의 테이블에서 설명된 Google 권장사항과 관련하여 워크로드 및 규정 준수를 테스트하는 데 도움이 되도록, '감사' 모드에서 이러한 제약조건을 배포하여 위반 사항을 표시할 수 있고 더 중요하게는 Kubernetes 클러스터에 적용하기 전에 문제를 해결할 기회를 가질 수 있습니다.
kubectl, kpt 또는 구성 동기화를 사용하여 dryrun
으로 설정된 spec.enforcementAction
으로 이러한 정책을 적용할 수 있습니다.
kubectl
(선택사항) kubectl을 사용하여 정책 제약조건을 미리 봅니다.
kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022
kubectl을 사용하여 정책 제약조건을 적용합니다.
kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022
출력은 다음과 같습니다.
k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars created k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation created k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot created k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities created k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace created k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports created k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container created k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-default created k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context created k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access created k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings created
정책 제약조건이 설치되었는지 확인하고 클러스터 전체에 위반 사항이 있는지 확인합니다.
kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022
출력은 다음과 비슷합니다.
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-default dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings dryrun 0
kpt
kpt를 설치하고 설정합니다. 이 안내에서는 kpt를 사용하여 Kubernetes 리소스를 맞춤설정하고 배포합니다.
kpt를 사용하여 GitHub에서 Policy Essentials v2022 정책 번들을 다운로드합니다.
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022
set-enforcement-action
kpt 함수를 실행하여 정책의 시행 작업을dryrun
으로 설정합니다.kpt fn eval policy-essentials-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun
변경사항을 추적하는 리소스를 만드는 kpt로 작업 디렉터리를 초기화합니다.
cd policy-essentials-v2022 kpt live init
kpt로 정책 제약조건을 적용합니다.
kpt live apply
출력은 다음과 같습니다.
k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-docker-default created k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context created k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access created k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars created k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation-container created k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot created k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports created k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings created k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities created k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace created k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container created 11 resource(s) applied. 11 created, 0 unchanged, 0 configured, 0 failed
정책 제약조건이 설치되었는지 확인하고 클러스터 전체에 위반 사항이 있는지 확인합니다.
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에서 Policy Essentials v2022 정책 번들을 다운로드합니다.
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022 policies/policy-essentials-v2022
set-enforcement-action
kpt 함수를 실행하여 정책의 시행 작업을dryrun
으로 설정합니다.kpt fn eval policies/policy-essentials-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
(선택사항) 생성될 정책 제약조건을 미리 봅니다.
kpt live init policies/policy-essentials-v2022 kpt live apply --dry-run policies/policy-essentials-v2022
출력은 다음과 같습니다.
Dry-run strategy: client inventory update started inventory update finished apply phase started k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars apply successful k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation apply successful k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot apply successful k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities apply successful k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace apply successful k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports apply successful k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container apply successful k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-default apply successful k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context apply successful k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access apply successful k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings apply successful apply phase finished inventory update started inventory update finished apply result: 11 attempted, 11 successful, 0 skipped, 0 failed
구성 동기화의 동기화 디렉터리에 Kustomize가 사용되는 경우 루트
kustomization.yaml
에policies/policy-essentials-v2022
를 추가합니다. 그렇지 않으면policies/policy-essentials-v2022/kustomization.yaml
파일을 삭제합니다.rm SYNC_ROOT_DIR/policies/policy-essentials-v2022/kustomization.yaml
구성 동기화 저장소에 변경사항을 푸시합니다.
git add SYNC_ROOT_DIR/policy-essentials-v2022 git commit -m 'Adding Policy Essentials v2022 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=policy-essentials-v2022 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
위반이 있는 경우 제약조건당 위반 메시지 목록을 다음에서 볼 수 있습니다.
kubectl get constraint -l policycontroller.gke.io/bundleName=policy-essentials-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
Policy Essentials 정책 번들 시정 조치 변경
클러스터에서 정책 위반을 검토한 후에는 허용 컨트롤러가 호환되지 않는 리소스가 클러스터에 적용되지 않도록 warn
또는 deny
를 수행할 수 있도록 시행 모드 변경을 고려할 수 있습니다.
kubectl
kubectl을 사용하여 정책의 시정 조치를
warn
로 설정합니다.kubectl get constraint -l policycontroller.gke.io/bundleName=policy-essentials-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=policy-essentials-v2022
kpt
set-enforcement-action
kpt 함수를 실행하여 정책의 시정 조치를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-action
kpt 함수를 실행하여 정책의 시정 조치를warn
으로 설정합니다.kpt fn eval policies/policy-essentials-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
구성 동기화 저장소에 변경사항을 푸시합니다.
git add SYNC_ROOT_DIR/policies/policy-essentials-v2022 git commit -m 'Adding Policy Essentials policy bundle warn enforcement' git push
설치 상태를 확인합니다.
gcloud alpha anthos config sync repo list --project PROJECT_ID
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: [policy-essentials-v2022-psp-capabilities] container <wordpress> is not dropping all required capabilities. Container must drop all of ["NET_RAW"] or "ALL" pod/wp-non-compliant created
Policy Essentials 정책 번들 삭제
필요한 경우 클러스터에서 Policy Essentials 정책 번들을 삭제할 수 있습니다.
kubectl
kubectl을 사용하여 정책을 삭제합니다.
kubectl delete constraint -l policycontroller.gke.io/bundleName=policy-essentials-v2022
kpt
정책을 삭제합니다.
kpt live destroy
구성 동기화
구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요.
구성 동기화 저장소에 변경사항을 푸시합니다.
git rm -r SYNC_ROOT_DIR/policies/policy-essentials-v2022 git commit -m 'Removing Policy Essentials v2022 policies' git push
상태를 확인합니다.
gcloud alpha anthos config sync repo list --project PROJECT_ID
SYNCED
열에 표시된 저장소는 정책 삭제를 확인합니다.