Policy Controller 附带默认的限制条件模板库,您可以将该库与 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 | 要求正在运行配置管理,并且启用了偏移防范功能,集群上至少有一个 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 | 要求在集群中定义的每个命名空间都具有 Egress 的默认拒绝 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 | 确保 PeerAuthentication 无法覆盖严格 mTLS。 | 2.2.7、4.2.1、8.3.2 |
pci-dss-v4.0-require-valid-network-ranges | 限制允许与 Ingress 和 Egress 搭配使用的 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
,但daemonset
的名称和命名空间可以自定义以符合pci-dss-v4.0-require-av-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
。 - 如果使用 Cloud 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
列中显示您的代码库即表示政策移除成功。