mcpField
G
gke-security

gke-security

github.com/google安全21.6k1.4k 次安装今天更新
代码仓库

关于 gke-security

gke-security 是面向 GKE 集群安全配置的参考指南,适用于集群管理员和平台团队。它说明安全基线、身份与密钥管理、RBAC、网络策略及工作负载防护,并列出可用的 MCP 工具。

主要功能

  1. 01说明 GKE 安全基线配置
  2. 02指导 Workload Identity 与 Secret Manager
  3. 03提供 RBAC 加固建议
  4. 04涵盖网络策略与 Binary Authorization
  5. 05介绍 Pod 安全标准和沙箱

适用场景

  1. 01规划新 GKE 集群的安全配置
  2. 02审查集群 RBAC 与 IAM 权限
  3. 03配置工作负载访问 Secret Manager
  4. 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.googDay-0为 Pod 启用 Workload Identity 联合
secretManagerConfig.enabledtrueDay-1集成 Google Secret Manager
secretManagerConfig.rotationConfigenabled: true, rotationInterval: 120sDay-1自动轮换密钥
rbacBindingConfig.enableInsecureBindingSystemAuthenticatedfalseDay-0阻止旧版 system:authenticated 绑定
rbacBindingConfig.enableInsecureBindingSystemUnauthenticatedfalseDay-0阻止旧版 system:unauthenticated 绑定
nodeConfig.shieldedInstanceConfig.enableSecureBoottrueDay-0可验证的启动完整性
nodeConfig.shieldedInstanceConfig.enableIntegrityMonitoringtrueDay-0运行时完整性检查
nodeConfig.workloadMetadataConfig.modeGKE_METADATADay-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 驱动程序将密钥作为卷挂载。此操作分为两个步骤:

  1. 定义 SecretProviderClass,指定要从 Secret Manager 获取的密钥。
  2. 在 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

渐进式推出策略:

  1. 先在现有命名空间中启用 warn + audit,以识别违规情况
  2. 修复不合规的工作负载(移除 privileged、hostNetwork、root 用户等)
  3. 所有工作负载通过检查后,启用 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 的身份进行身份验证。

评论

支持 Markdown