关于 gke-security
gke-security 是面向 GKE 集群安全配置的参考指南,适用于集群管理员和平台团队。它说明安全基线、身份与密钥管理、RBAC、网络策略及工作负载防护,并列出可用的 MCP 工具。
主要功能
- 01说明 GKE 安全基线配置
- 02指导 Workload Identity 与 Secret Manager
- 03提供 RBAC 加固建议
- 04涵盖网络策略与 Binary Authorization
- 05介绍 Pod 安全标准和沙箱
适用场景
- 01规划新 GKE 集群的安全配置
- 02审查集群 RBAC 与 IAM 权限
- 03配置工作负载访问 Secret Manager
- 04为生产命名空间实施 Pod 安全标准
MCP 相关
列出 get_cluster、check_k8s_auth、get_k8s_resource、apply_k8s_manifest 和 update_cluster 等 MCP 工具,用于检查集群与 Kubernetes 资源,以及应用清单或更新集群。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ google/ skills --skill gke-security安装后在 Claude Code 中输入/gke-security确认已加载。
附带文件assets/default-deny-netpol.yamlassets/workload-identity-pod.yaml
详细介绍
GKE 安全
本参考介绍 GKE 集群的安全配置。黄金路径默认采用强化的安全态势。
MCP 工具:
get_cluster、check_k8s_auth、get_k8s_resource、apply_k8s_manifest、update_cluster
黄金路径安全默认设置
| 设置 | 黄金路径值 | Day-0/1 | 备注 |
|---|---|---|---|
workloadIdentityConfig.workloadPool | <PROJECT>.svc.id.goog | Day-0 | 为 Pod 启用 Workload Identity 联合 |
secretManagerConfig.enabled | true | Day-1 | 集成 Google Secret Manager |
secretManagerConfig.rotationConfig | enabled: true, rotationInterval: 120s | Day-1 | 自动轮换密钥 |
rbacBindingConfig.enableInsecureBindingSystemAuthenticated | false | Day-0 | 阻止旧版 system:authenticated 绑定 |
rbacBindingConfig.enableInsecureBindingSystemUnauthenticated | false | Day-0 | 阻止旧版 system:unauthenticated 绑定 |
nodeConfig.shieldedInstanceConfig.enableSecureBoot | true | Day-0 | 可验证的启动完整性 |
nodeConfig.shieldedInstanceConfig.enableIntegrityMonitoring | true | Day-0 | 运行时完整性检查 |
nodeConfig.workloadMetadataConfig.mode | GKE_METADATA | Day-0 | 阻止旧版元数据 API,强制使用 Workload Identity |
| 私有集群 + Dataplane V2 设置 | 参见 gke-networking 技能 | Day-0 | 私有节点、强制使用私有端点、ADVANCED_DATAPATH |
Workload Identity 联合
Workload Identity 是 Pod 访问 Google Cloud API 的推荐方式。 它无需使用静态服务账号密钥。
设置
# 1. Create a Google Service Account (GSA)
gcloud iam service-accounts create <GSA_NAME> \
--project <PROJECT_ID> \
--display-name "Workload Identity SA" \
--quiet
# 2. Grant IAM roles to the GSA
gcloud projects add-iam-policy-binding <PROJECT_ID> \
--member "serviceAccount:<GSA_NAME>@<PROJECT_ID>.iam.gserviceaccount.com" \
--role "<ROLE>" \
--quiet
# 3. Create Kubernetes Service Account (KSA)
kubectl create namespace <NAMESPACE>
kubectl create serviceaccount <KSA_NAME> --namespace <NAMESPACE>
# 4. Bind KSA to 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[<NAMESPACE>/<KSA_NAME>]" \
--quiet
# 5. Annotate KSA
kubectl annotate serviceaccount <KSA_NAME> \
--namespace <NAMESPACE> \
iam.gke.io/gcp-service-account=<GSA_NAME>@<PROJECT_ID>.iam.gserviceaccount.com
测试 Pod 请参见 assets/workload-identity-pod.yaml。
验证
kubectl run workload-identity-test \
--image=gcr.io/google.com/cloudsdktool/cloud-sdk:slim \
--serviceaccount=<KSA_NAME> --namespace=<NAMESPACE> \
--rm -it -- gcloud auth list --quiet
Secret Manager 集成
黄金路径启用 Secret Manager 并自动轮换密钥。密钥会同步到 Kubernetes Secret。
# Verify Secret Manager is enabled on cluster
gcloud container clusters describe <CLUSTER_NAME> --region <REGION> \
--format="value(secretManagerConfig.enabled)" \
--quiet
# Enable if not already (Day-1 change)
gcloud container clusters update <CLUSTER_NAME> --region <REGION> \
--enable-secret-manager \
--secret-manager-rotation-interval=120s \
--quiet
通过 CSI 卷挂载密钥(Deployment 示例)
启用 Secret Manager 插件后,工作负载可以使用 Secrets Store CSI 驱动程序将密钥作为卷挂载。此操作分为两个步骤:
- 定义
SecretProviderClass,指定要从 Secret Manager 获取的密钥。 - 在
Deployment中挂载卷,并引用该类。
重要
生产环境最佳实践:演示工作负载集成(例如 Secret Manager CSI)时,始终使用符合生产标准的
Deployment清单,而不是原始Pod清单。
第 1 步:创建 SecretProviderClass
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: app-secrets-provider
namespace: default
spec:
provider: gke # Identifies GKE managed provider
parameters:
secrets: |
- resourceName: "projects/<PROJECT_ID>/secrets/db-password/versions/latest"
fileName: "db-password.txt"
第 2 步:在 Deployment 中挂载密钥
apiVersion: apps/v1
kind: Deployment
metadata:
name: secure-app
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: secure-app
template:
metadata:
labels:
app: secure-app
spec:
serviceAccountName: secure-ksa # Must be bound to GSA with Secret Manager Secret Accessor role
containers:
- name: app
image: <IMAGE>
volumeMounts:
- name: secrets-volume
mountPath: "/var/secrets"
readOnly: true
volumes:
- name: secrets-volume
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "app-secrets-provider"
RBAC 强化
黄金路径会禁用不安全的旧版 RBAC 绑定,这些绑定会向 system:authenticated 和 system:unauthenticated 组授予广泛权限。
# Verify insecure bindings are disabled
gcloud container clusters describe <CLUSTER_NAME> --region <REGION> \
--format="yaml(rbacBindingConfig)" \
--quiet
RBAC 最佳实践:
- 优先使用命名空间范围的 Role,而不是集群范围的 ClusterRole
- 绑定到特定的 Group 或 ServiceAccount,绝不要绑定到
system:authenticated - 通过 MCP 审计权限:
check_k8s_auth(parent="...", verb="list", resourceType="pods", namespace="...")(或kubectl auth can-i --list --as=<user>) - 通过 MCP 查看绑定:
get_k8s_resource(parent="...", resourceType="clusterrolebinding")(或kubectl get clusterrolebindings,rolebindings --all-namespaces)
企业级 RBAC 规划请参见
gke-multitenancy技能,以及 https://docs.cloud.google.com/kubernetes-engine/docs/best-practices/rbac.md.txt
二进制授权
默认情况下,黄金路径未启用,但建议在生产环境中使用,以验证镜像溯源信息:
# Enable Binary Authorization
gcloud container clusters update <CLUSTER_NAME> --region <REGION> \
--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
--quiet
网络策略
数据平面 V2(黄金路径)提供内置的网络策略强制执行功能。为每个命名空间应用默认拒绝策略:
# MCP (preferred)
apply_k8s_manifest(parent="...", yamlManifest="<contents of default-deny-netpol.yaml>")
# kubectl fallback
kubectl apply -f ./assets/default-deny-netpol.yaml -n <NAMESPACE>
GKE Sandbox(gVisor)
用于在隔离沙箱中运行不可信工作负载:
# Enable on cluster (Standard clusters)
gcloud container clusters update <CLUSTER_NAME> --region <REGION> --enable-gke-sandbox --quiet
# Use in pod spec
# Add: runtimeClassName: gvisor
Pod 安全标准(黄金路径)
Pod 安全标准定义了三个配置文件,用于限制 Pod 的行为。生产命名空间的黄金路径默认使用 restricted 配置文件。
| 配置文件 | 级别 | 使用场景 |
|---|---|---|
privileged | 不受限制 | 系统命名空间(kube-system), |
| : : : 基础设施控制器 : | ||
baseline | 限制较少 | 共享/开发命名空间、正在迁移的旧版应用 |
restricted | 黄金路径 | 生产工作负载——阻止权限提升、主机访问和 root 用户 |
通过命名空间标签强制执行(Pod 安全准入):
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/warn: restricted
pod-security.kubernetes.io/audit: restricted
渐进式推出策略:
- 先在现有命名空间中启用
warn+audit,以识别违规情况 - 修复不合规的工作负载(移除
privileged、hostNetwork、root 用户等) - 所有工作负载通过检查后,启用
enforce
restricted 会阻止以 root 身份运行、权限提升、主机网络/PID/IPC、主机路径卷以及大多数 capabilities。黄金路径中的 workload-identity-pod.yaml 已符合要求。
网络策略日志记录(推荐)
使用数据平面 V2(黄金路径)时,可以为网络策略决策启用日志记录。这不是黄金路径的默认设置——建议启用,以便进行安全审计。
gcloud container clusters update <CLUSTER_NAME> --region <REGION> \
--enable-network-policy-logging \
--quiet
此功能会记录允许和拒绝的连接,有助于排查网络策略规则问题并审计流量。
常见 IAM 角色
GKE 最常用的五个预定义 IAM 角色:
| 角色 | 用途 | 使用场景 |
|---|---|---|
roles/container.admin | 全面控制集群和 | 管理集群生命周期的平台团队管理员 |
| : : Kubernetes 资源 : : | ||
roles/container.clusterAdmin | 管理集群,但不管理 | 创建/删除集群的集群运维人员 |
| : : 项目级 IAM : : | ||
roles/container.developer | 部署工作负载 | 将工作负载部署到现有集群的应用开发者 |
| : :(Pod、服务、部署) : : | ||
roles/container.viewer | 对集群和 Kubernetes | 监控、审计或只读仪表板 |
| : : 资源的只读访问权限 : : | ||
roles/container.clusterViewer | 仅列出和获取 | 需要集群元数据的 CI/CD 流水线 |
| : : 集群详情 : : |
最小权限原则:从
roles/container.viewer或roles/container.developer开始,仅在需要时提升权限。避免广泛授予roles/container.admin。
服务账号和 Agent
- GKE 服务 Agent
(
service-<PROJECT_NUMBER>@container-engine-robot.iam.gserviceaccount.com): 自动创建。代表您管理节点、网络和集群操作。请勿移除或修改其权限。 - 节点服务账号:默认情况下,节点使用 Compute Engine 默认服务账号。对于生产环境,请创建权限最小化的专用 SA,并通过节点池配置分配该账号。
- Workload Identity:Pod 访问 Google Cloud API 的推荐方式。将 Kubernetes ServiceAccount 映射到 Google IAM ServiceAccount——请参阅上文的 Workload Identity 设置。
跨服务身份验证模式
授予 GKE 工作负载访问其他 Google Cloud 服务权限的常见模式:
# Grant a GKE workload access to Cloud Storage
gcloud projects add-iam-policy-binding <PROJECT_ID> \
--member "serviceAccount:<GSA_NAME>@<PROJECT_ID>.iam.gserviceaccount.com" \
--role "roles/storage.objectViewer" \
--quiet
# Grant a GKE workload access to Cloud SQL
gcloud projects add-iam-policy-binding <PROJECT_ID> \
--member "serviceAccount:<GSA_NAME>@<PROJECT_ID>.iam.gserviceaccount.com" \
--role "roles/cloudsql.client" \
--quiet
# Grant a GKE workload access to Pub/Sub
gcloud projects add-iam-policy-binding <PROJECT_ID> \
--member "serviceAccount:<GSA_NAME>@<PROJECT_ID>.iam.gserviceaccount.com" \
--role "roles/pubsub.subscriber" \
--quiet
在所有情况下,GSA 都必须通过 Workload Identity 绑定到 KSA(请参阅上文的设置)。随后,Pod 使用 KSA 以 GSA 的身份进行身份验证。