在GKE上用使用Workload Identity真香

什么是 Workload Identity?

在 GKE 上运行的应用可能需要访问 Google Cloud API,例如 Compute Engine API、BigQuery Storage API 或 Pub Sub API。

Workload Identity 允许 GKE 集群中的 Kubernetes 服务帐号充当 IAM 服务帐号。访问 Google Cloud API 时,使用已配置 Kubernetes 服务帐号的 Pod 会自动作为 IAM 服务帐号进行身份验证。通过工作负载身份,您可以为集群中的每个应用分配不同的精细身份和授权。

Workload identity 有什么好处呢?

对开发人员,我们不用再每三个月去rotate service account key
WHY?因为使用了Workload Identity, 只用创建google service account,不用生成key file,大大减少了安全风险。

在没有Workload Identity 之前,我们一般会使用以下两种方案从GKE访问Google Cloud API.

  • 导出服务帐号密钥并将其存储为 Kubernetes Secret。Google 服务帐号密钥不会过期,并且需要手动轮替。如果有未被发现的安全漏洞,则导出服务帐号密钥可能会导致安全漏洞范围扩大。如果导出的密钥被盗,攻击者可以使用该密钥以服务帐号的身份进行身份验证,直到您发现并手动撤消密钥。
  • 使用节点的 Compute Engine 默认服务帐号。您可以使用项目中的任何 IAM 服务帐号身份运行节点池。如果您在创建节点池期间未指定服务帐号,则 GKE 会使用项目的 Compute Engine 默认服务帐号。Compute Engine 服务帐号由该节点上部署的所有工作负载共享。这会导致权限过度预配,从而违反最小权限原则,不适合多租户集群。

上面两种方案都有安全入侵的风险,所以Google官方也建议我们使用Workload Identity。

如何使用 Workload Identity 呢?

首先,我们需要为GKE Cluster 启用Workload Identity,然后应该将应用配置为使用Workload Identity 向 Google Cloud 进行身份验证。

为GKE Cluster 启用 Workload Identity

  1. 创建新集群
    创建新集群,创建的时候直接开启 Workload Identity.
gcloud container clusters create CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --workload-pool=PROJECT_ID.svc.id.goog

替换以下内容:

  • CLUSTER_NAME:新集群的名称。
  • COMPUTE_REGION:集群的 Compute Engine 区域。对于区域级集群,请使用 --zone=COMPUTE_ZONE
  • PROJECT_ID:您的 Google Cloud 项目 ID。
  1. 更新现有的标准集群(PS: Autopilot 集群默认已经开启了Workload Identity)
gcloud container clusters update CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --workload-pool=PROJECT_ID.svc.id.goog

替换以下内容:

  • CLUSTER_NAME:新集群的名称。
  • COMPUTE_REGION:集群的 Compute Engine 区域。对于区域级集群,请使用 --zone=COMPUTE_ZONE
  • PROJECT_ID:您的 Google Cloud 项目 ID。

在现有集群上启用 Workload Identity 后,您可能需要迁移正在运行的工作负载以使用 Workload Identity。选择最适合您的环境的迁移策略。您可以创建新的节点池并启用 Workload Identity,也可以更新现有的节点池以启用 Workload Identity

将应用配置为使用 Workload Identity

Workload Identity 将 kubernetes service account 和 google service account 进行了绑定,参照如下步骤即可成功实现。

  1. 创建应用要部署的k8s namespace
    kubectl create namespace NAMESPACE
  2. 为应用创建 Kubernetes service account
    kubectl create serviceaccount KSA_NAME --namespace NAMESPACE
  3. 创建 Google IAM service account 或 使用现有的 IAM service account。
    gcloud iam service-accounts create GSA_NAME --project=GSA_PROJECT
  4. 确保 IAM 服务帐号具有应用所需要的权限。可以使用以下命令授予其角色:
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member "serviceAccount:GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com" \
    --role "ROLE_NAME"
  1. 通过在两个服务帐号之间添加 IAM 政策绑定,允许 Kubernetes 服务帐号模拟 IAM 服务帐号。以下绑定是允许 Kubernertes 服务帐号充当 IAM 服务帐号。
gcloud iam service-accounts add-iam-policy-binding GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com \
    --role roles/iam.workloadIdentityUser \
    --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
  1. 使用 IAM 服务帐号的电子邮件地址为 Kubernetes 服务帐号添加注解.
kubectl annotate serviceaccount KSA_NAME \
    --namespace NAMESPACE \
    iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com
  1. 更新应用的Kubernetes Deployment文件,以在使用Workload Identity的节点上安排工作负载并使用已添加注解的Kubernetes service account. 然后重新部署应用就可以了。
spec:
  serviceAccountName: KSA_NAME

替换以下内容:

  • KSA_NAME:新 Kubernetes 服务帐号的名称。
  • NAMESPACE:服务帐号的 Kubernetes 命名空间的名称。
  • GSA_NAME:新 IAM 服务帐号的名称。
  • GSA_PROJECT:IAM 服务帐号的 Google Cloud 项目的项目 ID。
  • PROJECT_ID:您的 Google Cloud 项目 ID。
  • ROLE_NAME:要分配给服务帐号的 IAM 角色,如 roles/spanner.viewer。

如何验证 Workload Identity 生效?

通过使用运行特定于操作系统的容器映像的 Kubernetes 服务帐号创建 Pod,然后通过交互式会话连接到该服务帐号,验证服务帐号是否配置正确。

apiVersion: v1
kind: Pod
metadata:
  name: workload-identity-test
  namespace: NAMESPACE
spec:
  containers:
  - image: google/cloud-sdk:slim
    name: workload-identity-test
    command: ["sleep","infinity"]
  serviceAccountName: KSA_NAME
  nodeSelector:
    iam.gke.io/gke-metadata-server-enabled: "true"

部署上述pod,然后在pod中打开bash,查询GKE元数据。

kubectl exec -it workload-identity-test \
  --namespace NAMESPACE \
  -- /bin/bash
curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/

结束语

以上就是在GKE上使用Workload Identity,更多的信息大家可以参考google 官方文档,里面有更多详细的信息。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容