关于 gke-workload-security
面向 GKE 运维人员的工作负载安全指南,涵盖安全审计、Workload Identity、网络策略、节点防护和密钥管理,并附有配置步骤与示例。
主要功能
- 01审计集群安全配置
- 02配置 Workload Identity
- 03实施网络策略与默认拒绝
- 04启用 Shielded Nodes 和 GKE Sandbox
- 05执行 Pod Security Standards
- 06通过 CSI Driver 挂载 Secret Manager 密钥
适用场景
- 01检查集群身份与节点安全设置
- 02限制 Pod 间网络流量
- 03隔离不可信工作负载
- 04将 Secret Manager 密钥挂载到 Pod
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ googlecloudplatform/ gke-mcp --skill gke-workload-security安装后在 Claude Code 中输入/gke-workload-security确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/default-deny-netpol.yamlworkload-identity-pod.yamlscripts/audit_cluster.sh详细介绍
GKE 工作负载安全
此技能提供用于保护 GKE 工作负载的工作流和最佳实践。 涵盖安全审计、身份和访问管理(Workload Identity)、网络安全(Network Policies)和节点安全。
工作流
1. 安全审计
使用提供的审计脚本评估集群当前的安全状况。
功能:
- 检查是否启用了 Workload Identity。
- 验证是否启用了 Network Policy。
- 检查是否启用了 Shielded Nodes。
- 检查是否启用了 Binary Authorization。
- 检查是否配置了 Private Cluster。
命令:
./scripts/audit_cluster.sh <cluster-name> <region> <project-id>
2. 配置 Workload Identity
Workload Identity 允许 Kubernetes 服务账号(KSA)模拟 Google 服务账号(GSA)。这是工作负载访问 Google Cloud API 的推荐方式。
步骤:
-
创建命名空间和 KSA:
kubectl create namespace workload-identity-test-ns kubectl create serviceaccount <ksa-name> \ --namespace workload-identity-test-ns -
将 KSA 绑定到 GSA:
gcloud iam service-accounts add-iam-policy-binding <gsa-name>@<project-id>.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:<project-id>.svc.id.goog[workload-identity-test-ns/<ksa-name>]" -
为 KSA 添加注解:
kubectl annotate serviceaccount <ksa-name> \ --namespace workload-identity-test-ns \ iam.gke.io/gcp-service-account=<gsa-name>@<project-id>.iam.gserviceaccount.com -
验证示例 Pod: 使用现有资源
assets/workload-identity-pod.yaml测试配置。先更新文件中的<ksa-name>。kubectl apply -f ./assets/workload-identity-pod.yaml -n workload-identity-test-ns
3. 实施 Network Policies
使用 Network Policies 控制 Pod 之间的流量。默认情况下,所有流量都允许通过。
启用 Network Policy 强制执行:
gcloud container clusters update <cluster-name> \
--update-addons=NetworkPolicy=ENABLED \
--region <region>
说明
如果集群使用 Dataplane V2(
--enable-dataplane-v2),则内置了 Network Policy 强制执行功能,无需执行此步骤(并且此步骤可能会失败)。
应用默认拒绝策略: 通过默认拒绝所有入站和出站流量来隔离命名空间。
将 替换为要隔离的命名空间。
kubectl apply -f ./assets/default-deny-netpol.yaml -n <target-namespace>
4. 启用 Shielded Nodes
确保节点运行时的完整性可验证。
命令:
gcloud container clusters update <cluster-name> \
--enable-shielded-nodes \
--region <region>
5. GKE Sandbox(gVisor)
在沙箱中运行不受信任的工作负载,以增强隔离。
启用 GKE Sandbox:
gcloud container clusters update <cluster-name> \
--enable-gke-sandbox \
--region <region>
运行沙箱 Pod:
在 Pod 规范中添加 runtimeClassName: gvisor。
6. Pod 安全标准
使用标签在命名空间上强制实施安全策略。
强制执行 Restricted 配置文件:
kubectl label --overwrite ns <namespace> \
pod-security.kubernetes.io/enforce=restricted \
pod-security.kubernetes.io/enforce-version=latest
说明
使用
latest可确保采用与集群当前版本相对应的策略。你可以将其固定为特定版本(例如v1.30),使命名空间始终使用某个特定版本的策略。
7. Secret Manager 集成(CSI Driver)
将 Google Cloud Secret Manager 中的密钥直接挂载为 Pod 中的卷。
前提条件:必须在集群上启用 Secret Manager CSI driver。
SecretProviderClass 示例:
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: my-secret-provider
spec:
provider: gcp
parameters:
secrets: |
- resourceName: "projects/<project-id>/secrets/my-secret/versions/latest"
fileName: "my-secret-file"
Pod 规范摘录示例:
spec:
containers:
- name: my-app
volumeMounts:
- name: secrets-store-inline
mountPath: "/mnt/secrets"
readOnly: true
volumes:
- name: secrets-store-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "my-secret-provider"
8. 启用 Network Policy 日志记录
如果使用 GKE Dataplane V2,可以记录允许和拒绝的连接。
步骤:
- 配置
NetworkLogging自定义资源。
NetworkLogging 清单示例:
apiVersion: networking.gke.io/v1alpha1
kind: NetworkLogging
metadata:
name: default
spec:
cluster:
allow:
log: true
delegate: true
deny:
log: true
delegate: true
这会将连接详情记录到 Cloud Logging。
最佳实践
- 最小权限: 始终使用 Workload Identity,并仅分配最低限度的 IAM 角色。避免使用节点默认服务账号。
- 网络隔离: 使用 Network Policies 限制 Pod 之间的通信。启用 Network Policy 日志记录,以便查看流量情况。
- 镜像安全: 使用 Binary Authorization,确保只部署受信任的镜像。
- 密钥管理:对于敏感数据,使用 Secret Manager CSI driver,而不是默认的 Kubernetes 密钥。
- Pod 安全: 在所有非系统命名空间上强制执行
baseline或restrictedPod 安全标准。 - 策略强制执行: 考虑使用 Policy Controller(Gatekeeper)在集群范围内强制执行自定义安全和合规策略。