정책 컨트롤러는 PCI-DSS v4.0 번들과 함께 사용하여 결제 카드 산업 데이터 보안 표준(PCI-DSS) v4.0의 일부 요소에 대해 클러스터 리소스 규정 준수를 평가할 수 있는 기본 제약조건 템플릿 라이브러리와 함께 제공됩니다.
PCI-DSS v4.0 정책 번들 제약조건
제약조건 이름 | 제약조건 설명 | 제어 ID |
---|---|---|
pci-dss-v4.0-require-apps-annotations | 클러스터의 모든 앱에 network-controls/date 주석이 있어야 합니다.
|
2.2.5 |
pci-dss-v4.0-require-av-daemonset | 바이러스 백신 DaemonSet 이 있어야 합니다.
|
5.2.1, 5.2.2, 5.2.3, 5.3.1, 5.3.2, 5.3.5 |
pci-dss-v4.0-require-binauthz | 허용 웹훅 검증을 위한 Binary Authorization이 필요합니다. | 2.2.1, 2.2.4, 6.2.3, 6.3.1, 6.3.2 |
pci-dss-v4.0-require-cloudarmor-backendconfig | BackendConfig 리소스에 Google Cloud Armor 구성을 적용합니다.
|
6.4.1, 6.4.2 |
pci-dss-v4.0-require-config-management | Drift Prevention이 사용 설정된 상태에서 Config Management가 실행되고 클러스터에 RootSync 객체가 최소 하나 이상 있어야 합니다.
|
1.2.8, 2.2.6, 5.3.5, 6.3.2, 6.5.1 |
pci-dss-v4.0-require-default-deny-network-policies | 클러스터에 정의된 모든 네임스페이스에 이그레스를 위한 기본 거부 NetworkPolicy 가 있어야 합니다.
|
1.3.2, 1.4.4 |
pci-dss-v4.0-require-managed-by-label | 모든 앱에 유효한 app.kubernetes.io/managed-by 라벨이 있어야 합니다.
|
1.2.8, 2.2.6, 5.3.5, 6.3.2, 6.5.1 |
pci-dss-v4.0-require-namespace-network-policies | 클러스터에 정의된 모든 Namespace 에 NetworkPolicy 가 있어야 합니다.
|
1.2.5, 1.2.6, 1.4.1, 1.4.4 |
pci-dss-v4.0-require-peer-authentication-strict-mtls | PeerAuthentications로 엄격한 mTLS를 덮어쓸 수 없습니다. | 2.2.7, 4.2.1, 8.3.2 |
pci-dss-v4.0-require-valid-network-ranges | 인그레스 및 이그레스에서 사용할 수 있는 CIDR 범위를 제한합니다. | 1.3.1, 1.3.2, 1.4.2, 1.4.4 |
pci-dss-v4.0-resources-have-required-labels | 방화벽 요구사항이 충족되도록 모든 앱에 지정된 라벨이 포함되어야 합니다. | 1.2.7 |
pci-dss-v4.0-restrict-cluster-admin-role | cluster-admin 역할 사용을 제한합니다.
|
7.2.1, 7.2.2, 7.2.5, 8.2.4 |
pci-dss-v4.0-restrict-creation-with-default-serviceaccount | 기본 서비스 계정을 사용하여 리소스 만들기를 제한합니다. 감사 중에는 영향을 주지 않습니다. | 2.2.2 |
pci-dss-v4.0-restrict-default-namespace | 기본 네임스페이스를 사용하는 포드를 제한합니다. | 2.2.3 |
pci-dss-v4.0-restrict-ingress | Ingress 객체 생성을 제한합니다.
|
1.3.1, 1.4.2, 1.4.4 |
pci-dss-v4.0-restrict-node-image | Container-Optimized OS 또는 Ubuntu만 OS 이미지로 허용하여 노드에서 일관되고 올바른 시간을 보장합니다. | 10.6.1, 10.6.2, 10.6.3 |
pci-dss-v4.0-restrict-pods-exec | Roles 및 ClusterRoles 에서 pods/exec 사용을 제한합니다.
|
8.6.1 |
pci-dss-v4.0-restrict-rbac-subjects | RBAC 주제에서 이름 사용을 허용된 값으로 제한합니다. | 7.3.2, 8.2.1, 8.2.2, 8.2.4 |
pci-dss-v4.0-restrict-role-wildcards | Roles 및 ClusterRoles 에서 와일드 카드 사용을 제한합니다.
|
7.3.3, 8.2.4 |
pci-dss-v4.0-restrict-storageclass | StorageClass 를 기본적으로 암호화하는 StorageClass 목록으로 제한합니다.
|
3.3.2, 3.3.3 |
시작하기 전에
- 이 안내에서 사용되는
gcloud
및kubectl
명령어를 제공하는 Google Cloud CLI를 설치하고 초기화합니다. Cloud Shell을 사용하는 경우 Google Cloud CLI가 사전 설치됩니다. - 기본 제약조건 템플릿 라이브러리를 사용하여 클러스터에 v1.16.0 이상의 정책 컨트롤러를 설치합니다. 이 번들에는 참조 제약조건이 포함되어 있으므로 참조 제약조건에 대한 지원을 사용 설정해야 합니다.
참조 제약조건에 맞게 정책 컨트롤러 구성
다음 YAML 매니페스트를 파일에
policycontroller-config.yaml
로 저장합니다. 이 매니페스트는 특정 종류의 객체를 감시하도록 정책 컨트롤러를 구성합니다.apiVersion: config.gatekeeper.sh/v1alpha1 kind: Config metadata: name: config namespace: "gatekeeper-system" spec: sync: syncOnly: - group: "networking.k8s.io" version: "v1" kind: "NetworkPolicy" - group: "admissionregistration.k8s.io" version: "v1" kind: "ValidatingWebhookConfiguration" - group: "storage.k8s.io" version: "v1" kind: "StorageClass"
policycontroller-config.yaml
매니페스트를 적용합니다.kubectl apply -f policycontroller-config.yaml
PCI-DSS v4.0용 클러스터 워크로드 구성
- 모든 앱(
ReplicaSet
,Deployment
,StatefulSet
,DaemonSet
)에는YYYY-MM-DD
스키마의network-controls/date
주석이 포함되어야 합니다. - 바이러스 백신 솔루션이 필요합니다. 기본값은
clamav
Namespace
에clamav
라는daemonset
이 있지만daemonset
의 이름과 네임스페이스를pci-dss-v4.0-require-av-daemonset
제약조건 구현에 따라 맞춤설정할 수 있습니다. pci-dss-v4.0-require-binauthz
에서 Binary Authorization을 사용 설정하고 구성해야 합니다.- 모든
BackendConfig
는 CloudArmor 대해 구성되어야 합니다. - 구성 동기화가 있고 사용 설정되어야 합니다.
- 클러스터에 정의된 모든
Namespace
에는 이그레스에 대한 기본 거부NetworkPolicy
가 있습니다. 허용되는 예외는pci-dss-v4.0-require-namespace-network-policies
에 지정할 수 있습니다. - 기본적으로
configmanagement.gke.io
에 구성 동기화를 사용해야 합니다. 하지만pci-dss-v4.0-enforce-managed-by-configmanagement-label
제약조건에서 허용되는app.kubernetes.io/managed-by
값을 맞춤설정할 수 있습니다. - 클러스터에 정의된 모든
Namespace
에는NetworkPolicy
가 있어야 합니다. - Cloud Service Mesh를 사용하는 경우 ASM PeerAuthentication은 엄격한 mTLS
spec.mtls.mode: STRICT
를 사용해야 합니다. - 인그레스 및 Express에는 허용된 IP 범위만 사용할 수 있으며,
pci-dss-v4.0-require-valid-network-ranges
에 지정할 수 있습니다. - 모든 앱(
ReplicaSet
,Deployment
,StatefulSet
,DaemonSet
)에는pci-dss-[0-9]{4}q[1-4]
스키마의pci-dss-firewall-audit label
이 포함되어야 합니다. - cluster-admin
ClusterRole
을 사용할 수 없습니다. - 기본 서비스 계정을 사용하여 리소스를 만들 수 없습니다.
- 기본
Namespace
를 포드에 사용할 수 없습니다. - 허용되는 인그레스 객체(
NodePort
및LoadBalancer
의Ingress
,Gateway
,Service
유형)만 만들 수 있으며pci-dss-v4.0-restrict-ingress
에 지정할 수 있습니다. - 모든 노드에서 일정한 시간 동안 이미지에 Container-Optimized OS 또는 Ubuntu를 사용해야 합니다.
Roles
및ClusterRoles
에서 와일드 카드 문자나pods/exec
권한을 사용할 수 없습니다.- 허용된 주체만 RBAC 바인딩에 사용할 수 있고 도메인 이름을
pci-dss-v4.0-restrict-rbac-subjects
에 지정할 수 있습니다. pci-dss-v4.0-restrict-storageclass
에서 기본적으로 암호화StorageClass
를 사용해야 합니다.
PCI-DSS v4.0 정책 번들 감사
정책 컨트롤러를 사용하면 Kubernetes 클러스터에 정책을 적용할 수 있습니다. 앞선 표에서 설명한 PCI-DSS v4.0 정책과 관련하여 워크로드와 규정 준수를 테스트하는 데 도움이 되도록 '감사' 모드에서 이러한 제약조건을 배포하여 위반 사항을 표시할 수 있고 더 중요하게는 Kubernetes 클러스터에 적용하기 전에 문제를 해결할 수 있습니다.
kubectl, kpt 또는 구성 동기화를 사용하여 dryrun
으로 설정된 spec.enforcementAction
으로 이러한 정책을 적용할 수 있습니다.
kubectl
(선택사항) kubectl을 사용하여 정책 제약조건을 미리 봅니다.
kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v4.0
kubectl을 사용하여 정책 제약조건을 적용합니다.
kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v4.0
출력은 다음과 같습니다.
asmpeerauthnstrictmtls.constraints.gatekeeper.sh/pci-dss-v4.0-require-peer-authentication-strict-mtls created k8sblockallingress.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-ingress created k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-creation-with-default-serviceaccount created k8senforcecloudarmorbackendconfig.constraints.gatekeeper.sh/pci-dss-v4.0-require-cloudarmor-backendconfig created k8senforceconfigmanagement.constraints.gatekeeper.sh/pci-dss-v4.0-require-config-management created k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-role-wildcards created k8srequirebinauthz.constraints.gatekeeper.sh/pci-dss-v4.0-require-binauthz created k8srequirecosnodeimage.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-node-image created k8srequiredaemonsets.constraints.gatekeeper.sh/pci-dss-v4.0-require-av-daemonset created k8srequiredefaultdenyegresspolicy.constraints.gatekeeper.sh/pci-dss-v4.0-require-default-deny-network-policies created k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/pci-dss-v4.0-require-namespace-network-policies created k8srequirevalidrangesfornetworks.constraints.gatekeeper.sh/pci-dss-v4.0-require-valid-network-ranges created k8srequiredannotations.constraints.gatekeeper.sh/pci-dss-v4.0-require-apps-annotations created k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v4.0-require-managed-by-label created k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v4.0-resources-have-required-labels created k8srestrictnamespaces.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-default-namespace created k8srestrictrbacsubjects.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-rbac-subjects created k8srestrictrolebindings.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-cluster-admin-role created k8srestrictrolerules.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-pods-exec created k8sstorageclass.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-storageclass created
정책 제약조건이 설치되었는지 확인하고 클러스터 전체에 위반 사항이 있는지 확인합니다.
kubectl get constraints -l policycontroller.gke.io/bundleName=pci-dss-v4.0
출력은 다음과 비슷합니다.
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnstrictmtls.constraints.gatekeeper.sh/pci-dss-v4.0-require-peer-authentication-strict-mtls dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sblockallingress.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-ingress dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-creation-with-default-serviceaccount dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8senforcecloudarmorbackendconfig.constraints.gatekeeper.sh/pci-dss-v4.0-require-cloudarmor-backendconfig dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8senforceconfigmanagement.constraints.gatekeeper.sh/pci-dss-v4.0-require-config-management dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-role-wildcards dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequirebinauthz.constraints.gatekeeper.sh/pci-dss-v4.0-require-binauthz dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequirecosnodeimage.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-node-image dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredaemonsets.constraints.gatekeeper.sh/pci-dss-v4.0-require-av-daemonset dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredannotations.constraints.gatekeeper.sh/pci-dss-v4.0-require-apps-annotations dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredefaultdenyegresspolicy.constraints.gatekeeper.sh/pci-dss-v4.0-require-default-deny-network-policies dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v4.0-require-managed-by-label dryrun 0 k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v4.0-resources-have-required-labels dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/pci-dss-v4.0-require-namespace-network-policies dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequirevalidrangesfornetworks.constraints.gatekeeper.sh/pci-dss-v4.0-require-valid-network-ranges dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictnamespaces.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-default-namespace dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictrbacsubjects.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-rbac-subjects dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictrolebindings.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-cluster-admin-role dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictrolerules.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-pods-exec dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sstorageclass.constraints.gatekeeper.sh/pci-dss-v4.0-restrict-storageclass dryrun 0
kpt
kpt를 설치하고 설정합니다. 이 안내에서는 kpt를 사용하여 Kubernetes 리소스를 맞춤설정하고 배포합니다.
kpt를 사용하여 GitHub에서 PCI-DSS v4.0 정책 번들을 다운로드합니다.
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v4.0
set-enforcement-action
kpt 함수를 실행하여 정책의 시행 작업을dryrun
으로 설정합니다.kpt fn eval pci-dss-v4.0 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun
변경사항을 추적하는 리소스를 만드는 kpt로 작업 디렉터리를 초기화합니다.
cd pci-dss-v4.0 kpt live init
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에서 PCI-DSS v4.0 정책 번들을 다운로드합니다.
kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v4.0 policies/pci-dss-v4.0
set-enforcement-action
kpt 함수를 실행하여 정책의 시행 작업을dryrun
으로 설정합니다.kpt fn eval policies/pci-dss-v4.0 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
(선택사항) 생성될 정책 제약조건을 미리 봅니다.
kpt live init policies/pci-dss-v4.0 kpt live apply --dry-run policies/pci-dss-v4.0
구성 동기화의 동기화 디렉터리에 Kustomize가 사용되는 경우 루트
kustomization.yaml
에policies/pci-dss-v4.0
를 추가합니다. 그렇지 않으면policies/pci-dss-v4.0/kustomization.yaml
파일을 삭제합니다.rm SYNC_ROOT_DIR/policies/pci-dss-v4.0/kustomization.yaml
구성 동기화 저장소에 변경사항을 푸시합니다.
git add SYNC_ROOT_DIR/policies/pci-dss-v4.0 git commit -m 'Adding PCI-DSS v4.0 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=pci-dss-v4.0 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
위반이 있는 경우 제약조건당 위반 메시지 목록을 다음에서 볼 수 있습니다.
kubectl get constraint -l policycontroller.gke.io/bundleName=pci-dss-v4.0 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
PCI-DSS v4.0 정책 번들 시정 조치 변경
클러스터에서 정책 위반을 검토한 후에는 허용 컨트롤러가 호환되지 않는 리소스가 클러스터에 적용되지 않도록 warn
또는 deny
를 수행할 수 있도록 시행 모드 변경을 고려할 수 있습니다.
kubectl
kubectl을 사용하여 정책의 시정 조치를
warn
로 설정합니다.kubectl get constraint -l policycontroller.gke.io/bundleName=pci-dss-v4.0 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
정책 제약조건 시정 조치가 업데이트되었는지 확인합니다.
kubectl get constraint -l policycontroller.gke.io/bundleName=pci-dss-v4.0
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/pci-dss-v4.0 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
구성 동기화 저장소에 변경사항을 푸시합니다.
git add SYNC_ROOT_DIR/policies/pci-dss-v4.0 git commit -m 'Adding PCI-DSS v4.0 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: [pci-dss-v4.0-restrict-default-namespace] <default> namespace is restricted pod/wp-non-compliant created
PCI-DSS v4.0 정책 번들 삭제
필요한 경우 클러스터에서 PCI-DSS v4.0 정책 번들을 삭제할 수 있습니다.
kubectl
kubectl을 사용하여 정책을 삭제합니다.
kubectl delete constraint -l policycontroller.gke.io/bundleName=pci-dss-v4.0
kpt
정책을 삭제합니다.
kpt live destroy
구성 동기화
구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요.
구성 동기화 저장소에 변경사항을 푸시합니다.
git rm -r SYNC_ROOT_DIR/policies/pci-dss-v4.0 git commit -m 'Removing PCI-DSS v4.0 policies' git push
상태를 확인합니다.
gcloud alpha anthos config sync repo list --project PROJECT_ID
SYNCED
열에 표시된 저장소는 정책 삭제를 확인합니다.