使用 PCI-DSS v4.0 政策限制条件

政策控制器附带默认的限制条件模板库,您可以将该库与 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 验证准入 Webhook。 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 要求 Config Management 在启用 Drift Prevention 且集群上至少有一个 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 限制 Pod 使用默认命名空间。 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 作为操作系统映像,确保节点上的时间一致且正确无误。 10.6.1、10.6.2、10.6.3
pci-dss-v4.0-restrict-pods-exec 禁止在 RolesClusterRoles 中使用 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 限制在 RolesClusterRoles 中使用通配符。 7.3.3、8.2.4
pci-dss-v4.0-restrict-storageclass StorageClass 限制为默认加密的 StorageClass 列表。 3.3.2、3.3.3

准备工作

  1. 安装并初始化 Google Cloud CLI,它提供了以下说明中使用的 gcloudkubectl 命令。如果您使用 Cloud Shell,则系统会预安装 Google Cloud CLI。
  2. 在使用默认限制条件模板库的集群上安装 Policy Controller v1.16.0 或更高版本。您还必须启用对参照限制条件的支持,因为此捆绑包包含参照限制条件。

为参照限制条件配置政策控制器

  1. 在文件中,将以下 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"
    
  2. 应用 policycontroller-config.yaml 清单:

    kubectl apply -f policycontroller-config.yaml
    

针对 PCI-DSS v4.0 配置集群的工作负载

  1. 所有应用(ReplicaSetDeploymentStatefulSetDaemonSet)都必须包含架构为 YYYY-MM-DDnetwork-controls/date 注解。
  2. 必须使用防病毒解决方案。 默认情况下,clamav Namespace 中存在名为 clamavdaemonset,不过您可以根据 pci-dss-v4.0-require-av-daemonset 限制条件中的实现自定义 daemonset 的名称和命名空间。
  3. 必须在 pci-dss-v4.0-require-binauthz 中启用和配置 Binary Authorization
  4. 必须为 CloudArmor 配置所有 BackendConfig
  5. 必须存在并启用 Config Sync
  6. 在集群中定义的每个 Namespace 都有 Egress 的默认拒绝 NetworkPolicy,允许的例外可以在 pci-dss-v4.0-require-namespace-network-policies 中指定。
  7. 默认情况下,必须为 configmanagement.gke.io 使用 Config Sync,不过,您可以在 pci-dss-v4.0-enforce-managed-by-configmanagement-label 限制条件中自定义允许的 app.kubernetes.io/managed-by 值。
  8. 在集群中定义的每个 Namespace 都必须具有 NetworkPolicy
  9. 如果使用 Anthos Service Mesh,则 ASM PeerAuthentication 必须使用严格的 mTLS spec.mtls.mode: STRICT
  10. 只能将允许的 IP 范围用于 Ingress 和 Express,可以在 pci-dss-v4.0-require-valid-network-ranges 中指定这些内容。
  11. 所有应用(ReplicaSetDeploymentStatefulSetDaemonSet)都必须包含架构为 pci-dss-[0-9]{4}q[1-4]pci-dss-firewall-audit label
  12. 不允许使用 cluster-admin ClusterRole
  13. 无法使用默认服务账号创建资源。
  14. 不能将默认 Namespace 用于 pod。
  15. 只能创建允许的 Ingress 对象(NodePortLoadBalancerIngressGatewayService 类型),可以在 pci-dss-v4.0-restrict-ingress 中指定这些对象。
  16. 所有节点都必须为其映像使用 Container-Optimized OS 或 Ubuntu,以保持一致的时间。
  17. 不允许在 RolesClusterRoles 中使用通配符或 pods/exec 权限。
  18. 在 RBAC 绑定中只能使用允许的主题,您的域名可以在 pci-dss-v4.0-restrict-rbac-subjects 中指定。
  19. pci-dss-v4.0-restrict-storageclass 中,要求默认使用加密 StorageClass

审核 PCI-DSS v4.0 政策包

政策控制器允许您为 Kubernetes 集群强制执行政策。为了帮助测试您的工作负载及其对上表中列出的 PCI-DSS v4.0 政策的合规性,您可以在“审核”模式下部署这些限制条件,以发现违规行为,更重要的是,您还有机会在对 Kubernetes 集群强制执行这些限制条件之前解决这些问题。

您可以在 spec.enforcementAction 设置为 dryrun 的情况下,使用 kubectl、kptConfig Sync 应用这些政策。

kubectl

  1. (可选)使用 kubectl 预览政策限制条件:

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v4.0
    
  2. 使用 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
    
  3. 验证政策限制条件是否已安装,并检查集群中是否存在违规行为:

    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

  1. 安装并设置 kpt。在这些说明中,kpt 用于自定义和部署 Kubernetes 资源。

  2. 使用 kpt 从 GitHub 下载 PCI-DSS v4.0 政策包:

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/anthos-bundles/pci-dss-v4.0
    
  3. 运行 set-enforcement-action kpt 函数将政策的强制执行操作设置为 dryrun

    kpt fn eval pci-dss-v4.0 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
      -- enforcementAction=dryrun
    
  4. 使用 kpt 初始化工作目录,此操作会创建一个资源来跟踪更改:

    cd pci-dss-v4.0
    kpt live init
    
  5. 使用 kpt 应用政策限制条件:

    kpt live apply
    
  6. 验证政策限制条件是否已安装,并检查集群中是否存在违规行为:

    kpt live status --output table --poll-until current
    

    状态为 CURRENT,即确认限制条件成功安装。

Config Sync

  1. 安装并设置 kpt。在这些说明中,kpt 用于自定义和部署 Kubernetes 资源。

使用 Config Sync 将政策部署到其集群的运维人员可以按照以下说明操作:

  1. 更改为 Config Sync 的同步目录:

    cd SYNC_ROOT_DIR
    

    创建 resourcegroup.yaml 或将其附加到 .gitignore

    echo resourcegroup.yaml >> .gitignore
    

  2. 创建一个专用的 policies 目录:

    mkdir -p policies
    
  3. 使用 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
    
  4. 运行 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
    
  5. (可选)预览待创建的政策限制条件:

    kpt live init policies/pci-dss-v4.0
    kpt live apply --dry-run policies/pci-dss-v4.0
    
  6. 如果 Config Sync 的同步目录使用 Kustomize,请将 policies/pci-dss-v4.0 添加到根 kustomization.yaml。 否则,请移除 policies/pci-dss-v4.0/kustomization.yaml 文件:

    rm SYNC_ROOT_DIR/policies/pci-dss-v4.0/kustomization.yaml
    
  7. 将更改推送到 Config Sync 代码库:

    git add SYNC_ROOT_DIR/policies/pci-dss-v4.0
    git commit -m 'Adding PCI-DSS v4.0 policy audit enforcement'
    git push
    
  8. 验证安装状态:

    watch gcloud beta container fleet config-management status --project PROJECT_ID
    

    状态 SYNCED 用于确认政策的安装情况。

查看违规问题

在审核模式下安装政策限制条件后,您可以使用政策控制器信息中心在界面中查看集群的违规问题。

您还可以使用 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

  1. 使用 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"}]'
    
  2. 验证政策限制条件强制执行措施是否已更新:

    kubectl get constraint -l policycontroller.gke.io/bundleName=pci-dss-v4.0
    

kpt

  1. 运行 set-enforcement-action kpt 函数将政策的强制执行操作设置为 warn

    kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  2. 应用政策限制条件:

    kpt live apply
    

Config Sync

使用 Config Sync 将政策部署到其集群的运维人员可以按照以下说明操作:

  1. 更改为 Config Sync 的同步目录:

    cd SYNC_ROOT_DIR
    
  2. 运行 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
    
  3. 将更改推送到 Config Sync 代码库:

    git add SYNC_ROOT_DIR/policies/pci-dss-v4.0
    git commit -m 'Adding PCI-DSS v4.0 policy bundle warn enforcement'
    git push
    
  4. 验证安装状态:

    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
    

Config Sync

使用 Config Sync 将政策部署到其集群的运维人员可以按照以下说明操作:

  1. 将更改推送到 Config Sync 代码库:

    git rm -r SYNC_ROOT_DIR/policies/pci-dss-v4.0
    git commit -m 'Removing PCI-DSS v4.0 policies'
    git push
    
  2. 验证状态:

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    SYNCED 列中显示您的代码库即表示政策移除成功。