使用 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 | 禁止在 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 |
准备工作
- 安装并初始化 Google Cloud CLI,它提供了以下说明中使用的
gcloud
和kubectl
命令。如果您使用 Cloud Shell,则系统会预安装 Google Cloud CLI。 - 在使用默认限制条件模板库的集群上安装 Policy Controller 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
,不过您可以根据pci-dss-v4.0-require-av-daemonset
限制条件中的实现自定义daemonset
的名称和命名空间。 - 必须在
pci-dss-v4.0-require-binauthz
中启用和配置 Binary Authorization。 - 必须为 CloudArmor 配置所有
BackendConfig
。 - 必须存在并启用 Config Sync。
- 在集群中定义的每个
Namespace
都有 Egress 的默认拒绝NetworkPolicy
,允许的例外可以在pci-dss-v4.0-require-namespace-network-policies
中指定。 - 默认情况下,必须为
configmanagement.gke.io
使用 Config Sync,不过,您可以在pci-dss-v4.0-enforce-managed-by-configmanagement-label
限制条件中自定义允许的app.kubernetes.io/managed-by
值。 - 在集群中定义的每个
Namespace
都必须具有NetworkPolicy
。 - 如果使用 Anthos Service Mesh,则 ASM PeerAuthentication 必须使用严格的 mTLS
spec.mtls.mode: STRICT
。 - 只能将允许的 IP 范围用于 Ingress 和 Express,可以在
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
用于 pod。 - 只能创建允许的 Ingress 对象(
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 集群强制执行这些限制条件之前解决这些问题。
您可以在 spec.enforcementAction
设置为 dryrun
的情况下,使用 kubectl、kpt 或 Config Sync 应用这些政策。
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
,即确认限制条件成功安装。
Config Sync
- 安装并设置 kpt。在这些说明中,kpt 用于自定义和部署 Kubernetes 资源。
使用 Config Sync 将政策部署到其集群的运维人员可以按照以下说明操作:
更改为 Config Sync 的同步目录:
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
如果 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
将更改推送到 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
验证安装状态:
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
使用 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
Config Sync
使用 Config Sync 将政策部署到其集群的运维人员可以按照以下说明操作:
更改为 Config Sync 的同步目录:
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
将更改推送到 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
验证安装状态:
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 将政策部署到其集群的运维人员可以按照以下说明操作:
将更改推送到 Config Sync 代码库:
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
列中显示您的代码库即表示政策移除成功。