PCI-DSS v3.2.1 정책 제약조건 사용
정책 컨트롤러는 PCI-DSS v3.2.1 번들과 함께 사용하여 결제 카드 산업 데이터 보안 표준(PCI-DSS) v3.2.1의 일부 측면에 대한 클러스터 리소스의 규정 준수를 평가할 수 있는 제약조건 템플릿의 기본 라이브러리와 함께 제공됩니다.
번들에는 정책 컨트롤러 v1.14.0 이상이 필요하며 다음 PCI-DSS v3.2.1 컨트롤에 매핑되는 이러한 제약조건이 포함됩니다.
제약조건 | 관리 | 제약조건 설명 | 참조 | 프로필 |
---|---|---|---|---|
pci-dss-v3.2.1-resources-have-required-labels | 1.1.4 | 모든 앱에 지정된 라벨을 포함하도록 요구하여 방화벽 요구 사항을 보장합니다. | 아니요 | 표준 |
pci-dss-v3.2.1-apps-must-have-certain-set-of-annotations | 1.1.5, 2.4 | 모든 앱이 지정된 주석을 포함하도록 요구하여 네트워크 제어에 대한 요구사항을 보장합니다. | 아니요 | 표준 |
pci-dss-v3.2.1-require-default-deny-network-policies | 1.2, 1.3, 2.2.2 | 클러스터에 정의된 모든 네임스페이스에 이그레스의 기본 거부 NetworkPolicy 가 있어야 합니다. |
예 | 확장 |
pci-dss-v3.2.1-block-all-ingress | 1.2, 1.3 | 인그레스 객체 생성을 제한합니다. | 아니요 | 확장 |
pci-dss-v3.2.1-require-valid-network-ranges | 1.2, 1.3.2 | 인그레스 및 이그레스와 함께 사용할 수 있는 CIDR 범위를 제한합니다. | 아니요 | 확장 |
pci-dss-v3.2.1-require-namespace-network-policies | 1.2 | 클러스터에 정의된 모든 네임스페이스에 NetworkPolicy가 있어야 합니다. | 예 | 표준 |
pci-dss-v3.2.1-enforce-managed-by-configmanagement-label | 1.2.2, 8.1.2 | RoleBinding 리소스에 유효한 app.kubernetes.io/managed-by= 라벨이 필요합니다. |
아니요 | 표준 |
pci-dss-v3.2.1-block-creation-with-default-serviceaccount | 2.1 | 기본 서비스 계정을 사용하여 리소스 만들기를 제한합니다. | 아니요 | 표준 |
pci-dss-v3.2.1-restrict-default-namespace | 2.1 | 포드가 기본 네임스페이스를 사용하지 못하도록 제한합니다. | 아니요 | 표준 |
pci-dss-v3.2.1-asm-peer-authn-strict-mtls | 4.1 | 모든 PeerAuthentications로 엄격한 mMTLS를 덮어쓸 수 없음을 적용합니다. | 아니요 | 표준 |
pci-dss-v3.2.1-require-av-daemonset | 5.1.1, 5.3 | 바이러스 백신 데몬셋이 있어야 합니다. | 예 | 표준 |
pci-dss-v3.2.1-enforce-config-management | 5.3, 6.1, 6.4 | 구성 관리의 존재 및 사용 설정을 적용합니다. | 아니요 | 표준 |
pci-dss-v3.2.1-enforce-cloudarmor-backendconfig | 6.5, 6.6 | BackendConfig 리소스에 Cloud Armor 구성을 적용합니다. |
아니요 | 표준 |
pci-dss-v3.2.1-restrict-rbac-subjects | 8.1, 8.1.5 | RBAC 주제에서 이름 사용을 허용된 값으로 제한합니다. | 아니요 | 확장 |
pci-dss-v3.2.1-block-secrets-of-type-basic-auth | 8.1.5, 8.2.3, 8.5 | 기본 인증 유형 보안 비밀의 사용을 제한합니다. | 아니요 | 표준 |
pci-dss-v3.2.1-nodes-have-consistent-time | 10.4.1, 10.4.3 | COS를 OS 이미지로 사용하여 노드에서 일관되고 정확한 시간을 보장합니다. | 아니요 | 표준 |
표준 및 확장 번들 제약조건 비교
PCI-DSS v3.2.1 번들은 PCI-DSS v3.2.1 컨트롤의 일부 측면을 달성하기 위한 독자적인 정책 요구사항 집합을 구현합니다. 표준 번들의 요구사항에 맞게 워크로드를 수정하는 것 외에도 환경에 맞게 맞춤설정해야 하는 선택적인 확장 제약조건 집합도 사용할 수 있습니다.
시작하기 전에
- 이 안내에서 사용되는
gcloud
및kubectl
명령어를 제공하는 Google Cloud CLI를 설치하고 초기화합니다. Cloud Shell을 사용하는 경우 Google Cloud CLI가 사전 설치됩니다. - 제약조건 템플릿의 기본 라이브러리를 사용하여 클러스터에 정책 컨트롤러를 설치하세요. 이 번들에는 개요 테이블에 나열된 참조 제약조건이 포함되어 있으므로 참조 제약조건에 대한 지원도 사용 설정해야 합니다.
참조 제약조건에 맞게 Policy Controller 구성
다음 YAML 매니페스트를
policycontroller-config.yaml
로 파일에 저장합니다. 매니페스트는 특정 종류의 객체를 감시하도록 정책 컨트롤러를 구성합니다.apiVersion: config.gatekeeper.sh/v1alpha1 kind: Config metadata: name: config namespace: "gatekeeper-system" spec: sync: syncOnly: - group: "apps" version: "v1" kind: "DaemonSet" - group: "networking.k8s.io" version: "v1" kind: "NetworkPolicy"
policycontroller-config.yaml
매니페스트를 적용합니다.kubectl apply -f policycontroller-config.yaml
PCI-DSS v3.2.1용 클러스터 워크로드 구성
표준 번들
- 모든 앱(
ReplicaSet
,Deployment
,StatefulSet
,DaemonSet
)에는pci-dss-[0-9]{4}q[1-4]
스키마의pci-dss-firewall-audit label
이 포함되어야 합니다. - 모든 앱(
ReplicaSet
,Deployment
,StatefulSet
,DaemonSet
)에는YYYY-MM-DD
스키마의network-controls/date
주석이 포함되어야 합니다. - 클러스터에 정의된 모든
namespace
에는NetworkPolicy
가 있어야 합니다. - Anthos Config Management를 사용해야 합니다. 기본적으로 Config Management에는
configmanagement.gke.io
가 필요하지만pci-dss-v3.2.1-enforce-managed-by-configmanagement-label
제약조건에서 맞춤설정할 수 있습니다. - 기본 서비스 계정을 사용하여 리소스를 만들 수 없습니다.
- 기본
namespace
는 포드에 사용할 수 없습니다. - Anthos Service Mesh를 사용하는 경우 ASM PeerAuthentication은 엄격한 mTLS
spec.mtls.mode: STRICT
를 사용해야 합니다. - 바이러스 백신 솔루션이 필요합니다. 기본값은
pci-dss-av
namespace
에 이름clamav
인daemonset
이 존재하는 것이지만,daemonset
의 이름과 네임스페이스는pci-dss-v3.2.1-require-av-daemonset
제약조건에서 맞춤설정할 수 있습니다.daemonset
에서clamav
를 실행하는 예시는 Kubernetes ClamAV 컨테이너를 참조하세요. - Anthos Config Management의 존재 및 사용 설정이 필요합니다.
- 모든
BackendConfig
는 CloudArmor 대해 구성되어야 합니다. basic-auth
유형 보안 비밀 사용은 허용되지 않습니다.- 모든 노드는 일관된 시간 동안 이미지에 대해 Google Container-Optimized OS를 사용해야 합니다.
확장 번들(맞춤설정이 필요한 경우 선택사항)
- 클러스터에 정의된 모든
namespace
에는 이그레스에 대한 기본 거부NetworkPolicy
가 있습니다. 허용되는 예외는pci-dss-v3.2.1-require-namespace-network-policies
에 지정할 수 있습니다. - 허용되는 인그레스 객체(
NodePort
및LoadBalancer
의Ingress
,Gateway
,Service
유형)만 만들 수 있으며pci-dss-v3.2.1-block-all-ingress
에 지정할 수 있습니다. - 인그레스 및 Express에는 허용된 IP 범위만 사용할 수 있으며,
pci-dss-v3.2.1-require-valid-network-ranges
에 지정할 수 있습니다. - RBAC 바인딩에서는 허용된 주체만 사용할 수 있으며, 도메인 이름은
pci-dss-v3.2.1-restrict-rbac-subjects
에 지정할 수 있습니다.
정책 컨트롤러로 PCI-DSS v3.2.1 정책 감사
정책 컨트롤러를 사용하면 Kubernetes 클러스터에 정책을 적용할 수 있습니다. 앞의 테이블에서 설명된 PCI-DSS v3.2.1 정책과 관련하여 워크로드 및 규정 준수를 테스트하는 데 도움이 되도록, '감사' 모드에서 이러한 제약조건을 배포하여 위반 사항을 표시할 수 있고 더 중요하게는 Kubernetes 클러스터에 적용하기 전에 문제를 해결할 기회를 가질 수 있습니다.
kubectl, kpt 또는 구성 동기화를 사용하여 dryrun
으로 설정된 spec.enforcementAction
으로 이러한 정책을 적용할 수 있습니다.
kubectl
(선택사항) kubectl을 사용하여 정책 제약조건을 미리 봅니다.
kubectl kustomize https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/anthos-bundles/pci-dss-v3.2.1
kubectl을 사용하여 정책 제약조건을 적용합니다.
kubectl apply -k https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/anthos-bundles/pci-dss-v3.2.1
출력은 다음과 같습니다.
asmpeerauthnstrictmtls.constraints.gatekeeper.sh/pci-dss-v3.2.1-asm-peer-authn-strict-mtls created k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/pci-dss-v3.2.1-block-creation-with-default-serviceaccount created k8sblockobjectsoftype.constraints.gatekeeper.sh/pci-dss-v3.2.1-block-secrets-of-type-basic-auth created k8senforcecloudarmorbackendconfig.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-cloudarmor-backendconfig created k8senforceconfigmanagement.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-config-management created k8srequirecosnodeimage.constraints.gatekeeper.sh/pci-dss-v3.2.1-nodes-have-consistent-time created k8srequiredaemonsets.constraints.gatekeeper.sh/pci-dss-v3.2.1-require-av-daemonset created k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/pci-dss-v3.2.1-require-namespace-network-policies created k8srequiredannotations.constraints.gatekeeper.sh/pci-dss-v3.2.1-apps-must-have-certain-set-of-annotations created k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-managed-by-configmanagement-label created k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v3.2.1-resources-have-required-labels created k8srestrictnamespaces.constraints.gatekeeper.sh/pci-dss-v3.2.1-restrict-default-namespace created
정책 제약조건이 설치되었는지 확인하고 클러스터 전체에 위반 사항이 있는지 확인합니다.
kubectl get -k https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/anthos-bundles/pci-dss-v3.2.1
출력은 다음과 비슷합니다.
NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS asmpeerauthnstrictmtls.constraints.gatekeeper.sh/pci-dss-v3.2.1-asm-peer-authn-strict-mtls dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sblockcreationwithdefaultserviceaccount.constraints.gatekeeper.sh/pci-dss-v3.2.1-block-creation-with-default-serviceaccount dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8sblockobjectsoftype.constraints.gatekeeper.sh/pci-dss-v3.2.1-block-secrets-of-type-basic-auth dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8senforcecloudarmorbackendconfig.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-cloudarmor-backendconfig dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8senforceconfigmanagement.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-config-management dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequirecosnodeimage.constraints.gatekeeper.sh/pci-dss-v3.2.1-nodes-have-consistent-time dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredaemonsets.constraints.gatekeeper.sh/pci-dss-v3.2.1-require-av-daemonset dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequirenamespacenetworkpolicies.constraints.gatekeeper.sh/pci-dss-v3.2.1-require-namespace-network-policies dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredannotations.constraints.gatekeeper.sh/pci-dss-v3.2.1-apps-must-have-certain-set-of-annotations dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v3.2.1-enforce-managed-by-configmanagement-label dryrun 0 k8srequiredlabels.constraints.gatekeeper.sh/pci-dss-v3.2.1-resources-have-required-labels dryrun 0 NAME ENFORCEMENT-ACTION TOTAL-VIOLATIONS k8srestrictnamespaces.constraints.gatekeeper.sh/pci-dss-v3.2.1-restrict-default-namespace dryrun 0
kpt
kpt를 설치하고 설정합니다. 이 안내에서는 kpt를 사용하여 Kubernetes 리소스를 맞춤설정하고 배포합니다.
kpt를 사용하여 GitHub에서 PCI-DSS v3.2.1 정책 번들을 다운로드합니다.
kpt pkg get https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/anthos-bundles/pci-dss-v3.2.1
set-enforcement-action
kpt 함수를 실행하여 정책의 시행 작업을dryrun
으로 설정합니다.kpt fn eval pci-dss-v3.2.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \ -- enforcementAction=dryrun
변경사항을 추적하는 리소스를 만드는 kpt로 작업 디렉터리를 초기화합니다.
cd pci-dss-v3.2.1 kpt live init
kpt로 정책 제약조건을 적용합니다.
kpt live apply
정책 제약조건이 설치되었는지 확인하고 클러스터 전체에 위반 사항이 있는지 확인합니다.
kpt live status --output table --poll-until current
CURRENT
상태는 제약조건이 성공적으로 설치되었음을 확인합니다.
구성 동기화
kpt를 설치하고 설정합니다. 이 안내에서는 kpt를 사용하여 Kubernetes 리소스를 맞춤설정하고 배포합니다.
Anthos Config Management를 처음 사용하는 경우 Anthos Config Management를 사용 설정합니다.
구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요.
구성 동기화의 동기화 디렉터리로 변경합니다.
cd SYNC_ROOT_DIR
resourcegroup.yaml
로.gitignore
를 만들거나 추가하려면 다음 안내를 따르세요.echo resourcegroup.yaml >> .gitignore
전용
policies
디렉터리를 만듭니다.mkdir -p policies
kpt를 사용하여 GitHub에서 PCI-DSS v3.2.1 정책 번들을 다운로드합니다.
kpt pkg get https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/anthos-bundles/pci-dss-v3.2.1 policies/pci-dss-v3.2.1
set-enforcement-action
kpt 함수를 실행하여 정책의 시행 작업을dryrun
으로 설정합니다.kpt fn eval policies/pci-dss-v3.2.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
(선택사항) 생성될 정책 제약조건을 미리 봅니다.
kpt live init policies/pci-dss-v3.2.1 kpt live apply --dry-run policies/pci-dss-v3.2.1
구성 동기화의 동기화 디렉터리가 Kustomize를 사용하는 경우 루트
kustomization.yaml
에policies/pci-dss-v3.2.1
를 추가합니다. 그렇지 않으면policies/pci-dss-v3.2.1/kustomization.yaml
파일을 삭제합니다.rm SYNC_ROOT_DIR/policies/pci-dss-v3.2.1/kustomization.yaml
구성 동기화 저장소에 변경사항을 푸시합니다.
git add SYNC_ROOT_DIR/policies/pci-dss-v3.2.1 git commit -m 'Adding PCI-DSS v3.2.1 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-v3.2.1 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'
위반이 있는 경우 제약조건당 위반 메시지 목록을 다음에서 볼 수 있습니다.
kubectl get constraint -l policycontroller.gke.io/bundleName=pci-dss-v3.2.1 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'
PCI-DSS v3.2.1 정책 적용
클러스터에서 정책 위반을 검토하면 다음 단계로 이러한 정책을 시행하여 허용 컨트롤러에서 정책을 준수하지 않는 리소스가 클러스터에 적용되지 않도록 합니다.
kubectl
kubectl을 사용하여 정책의 시정 조치를
deny
로 설정합니다.kubectl get constraint -l policycontroller.gke.io/bundleName=pci-dss-v3.2.1 -o json | jq '.items[].spec.enforcementAction="deny"' | kubectl apply -f -
정책 제약조건 시정 조치가 업데이트되었는지 확인합니다.
kubectl get -k https://github.com/GoogleCloudPlatform/acm-policy-controller-library.git/anthos-bundles/pci-dss-v3.2.1
kpt
set-enforcement-action
kpt 함수를 실행하여 정책의 시행 작업을deny
으로 설정합니다.kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=deny
정책 제약조건을 적용합니다.
kpt live apply
구성 동기화
구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요.
구성 동기화의 동기화 디렉터리로 변경합니다.
cd SYNC_ROOT_DIR
set-enforcement-action
kpt 함수를 실행하여 정책의 시행 작업을deny
으로 설정합니다.kpt fn eval policies/pci-dss-v3.2.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=deny
구성 동기화 저장소에 변경사항을 푸시합니다.
git add SYNC_ROOT_DIR/policies/pci-dss-v3.2.1 git commit -m 'Enforcing PCI-DSS v3.2.1 policies for GKE' 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
허용 컨트롤러는 이 리소스가 위반하는 정책 위반을 나열하는 오류를 생성해야 합니다. 예를 들면 다음과 같습니다.
Error from server (Forbidden): error when creating "STDIN": admission webhook "validation.gatekeeper.sh" denied the request: [pci-dss-v3.2.1-restrict-default-namespace] <default> namespace is restricted