使用服务账号进行身份验证

服务账号是工作负载或服务用于以编程方式使用资源和安全访问微服务的账号。它们是一种特殊的身份,由应用或工作负载(而非真人)使用。与用户账号类似,服务账号可以被授予权限和角色,但无法像真人用户一样登录。

服务账号非常适合用于管理 Google Distributed Cloud (GDC) 气隙基础架构,例如:

  • 内部 Distributed Cloud 服务和工作负载,用于安全访问 Distributed Cloud 控制平面应用编程接口 (API)。例如,数据库服务与 Kubernetes API 交互以创建和删除数据库。
  • Distributed Cloud 中的客户工作负载,用于访问 Distributed Cloud 服务并进行授权的应用编程接口 (API) 调用。例如,服务账号可以使用 Vertex AI Workbench 笔记本电脑通过 Speech-to-Text API 管理客户来转写音频文件。
  • 要与分布式云联合的外部工作负载。例如,服务账号可以管理 Distributed Cloud 外部的一款应用,该应用可将文档数字化,但希望使用光学字符识别 (OCR) API 来替换其当前的 OCR 引擎。
  • Distributed Cloud 服务或系统控制器安全地访问客户资源或用户集群。例如,服务账号可以管理身份验证和授权工作流,其中在管理员集群中运行的服务控制器需要在客户管理的用户集群中运行工作负载。

您可以使用 GDC 控制台或 gdcloud CLI 管理账号。借助 gdcloud CLI,服务身份功能基于全局 ProjectServiceAccount API 构建。由于服务账号是全局配置的,因此它们可以在 gdcloud 宇宙中的所有可用区中运行。

准备工作

您只能在项目内创建服务账号。如需详细了解如何创建项目,请参阅创建项目

创建服务身份

如需获得创建服务账号所需的权限,请让您的项目 IAM 管理员为您授予 Project IAM Admin (project-iam-admin) 角色。

有权访问服务账号的用户可以访问项目中的所有服务账号。

如需在项目中创建服务账号,请使用 GDC 控制台或 gdcloud CLI。

控制台

  1. 登录 GDC 控制台。
  2. 在导航菜单中,选择身份和访问权限 > 服务身份
  3. 点击创建服务身份。 系统会打开服务身份详情页面。
  4. 服务身份名称字段中,输入服务身份的名称。例如:testserviceidentity
  5. 点击创建

gdcloud

创建服务身份:

gdcloud iam service-accounts create NAME \
    --project=PROJECT

替换以下值:

  • NAMEProjectServiceAccount 的名称。该名称在项目命名空间中必须是唯一的。
  • PROJECT:要在其中创建服务身份的项目。如果已设置 gdcloud init,请省略 --project 标志。

此命令会在管理 API 服务器上的项目命名空间中创建 ProjectServiceAccount

API

  1. 创建 ProjectServiceAccount 自定义资源 YAML 文件,例如 my-project-sa.yaml

    apiVersion: resourcemanager.global.gdc.goog/v1
    kind: ProjectServiceAccount
    metadata:
      name: NAME
      namespace: PROJECT
    spec:
      keys:
      - algorithm: ALGORITHM
      id: KEY_ID
      key: KEY
      validAfter: "START_TIME"
      validBefore: "EXPIRATION_TIME"
    

    执行以下变量替换操作:

    • NAMEProjectServiceAccount 资源的名称。该名称在项目命名空间中必须是唯一的。
    • PROJECT:要在其中创建服务身份的项目。
    • ALGORITHM:密钥的算法。仅支持 ES256 密钥。
    • KEY_ID:密钥的唯一标识符。该 ID 用于确定要使用哪个密钥进行验证。
    • KEY:用于验证的 base64 编码公钥。
    • START_TIME:密钥生效的开始时间,例如 2025-02-07T00:59:34Z
    • EXPIRATION_TIME:密钥的过期时间,例如 2026-02-07T00:59:34Z
  2. ProjectServiceAccount 自定义资源应用于全局 API 服务器:

    kubectl --kubeconfig GLOBAL_API_SERVER_KUBECONFIG apply -f my-project-sa.yaml
    

    GLOBAL_API_SERVER_KUBECONFIG 变量替换为全局 API 服务器的 kubeconfig 文件的路径。

查看服务身份

如需查看项目中的服务账号列表,请使用 GDC 控制台或 gdcloud CLI。

控制台

  1. 登录 GDC 控制台。
  2. 选择一个项目。
  3. 在导航菜单中,依次点击身份和访问权限 > 服务身份,查看项目的服务账号列表。

gdcloud

列出项目中的服务账号:

gdcloud iam service-accounts list \
    --project=PROJECT

为服务身份分配角色绑定

如需分配角色绑定,您必须拥有适当的权限。如需获得分配角色所需的权限,请让您的项目 IAM 管理员为您授予项目 IAM 管理员 (project-iam-admin) 角色。

使用 GDC 控制台或 gdcloud CLI 分配角色绑定。

控制台

  1. 登录 GDC 控制台。
  2. 选择一个项目。
  3. 在导航菜单中,依次选择身份和访问权限 > 访问权限
  4. 成员列表中,点击 添加成员。 系统会显示用户和角色页面。
  5. 成员类型列表中选择服务身份
  6. 服务身份列表中,选择要为其分配角色绑定的服务身份。
  7. 角色列表中,选择要分配给服务身份的角色,例如 Backup Creator
  8. 可选:如需添加其他角色,请点击 添加其他角色。 选择其他角色。
  9. 点击添加

gdcloud

此命令会创建并命名项目角色绑定,以将指定角色与管理 API 服务器上的 ProjectServiceAccount 绑定:

gdcloud iam service-accounts add-iam-policy-binding \
    --project=PROJECT \
    --role=ROLE \
    --role-namespace=ROLE_NAMESPACE \
    --iam-account=NAME

替换以下值:

  • PROJECT:要在其中创建角色绑定的项目。 如果已设置 gdcloud init,则可以省略 --project 标志。
  • ROLE:要分配给 ProjectServiceAccount 的预定义角色。以 Role/name 格式指定角色,其中角色是 Kubernetes 类型 IAMRole名称是预定义角色的名称。例如,如需分配 Project Viewer 角色,请将角色设置为 IAMRole/project-viewer
  • ROLE_NAMESPACE:要与服务账号绑定的角色的命名空间。仅当您的宇宙包含多个可用区时,此操作才适用。
  • NAME:要使用的服务身份的名称。

删除服务身份

如需删除项目中的服务账号,请使用 GDC 控制台或 gdcloud CLI。

控制台

  1. 登录 GDC 控制台。
  2. 在导航菜单中,依次选择身份和访问权限 > 服务身份
  3. 选中要删除的服务身份对应的复选框。
  4. 点击删除
  5. 系统会显示确认对话框。在请在下面输入以下内容进行确认字段中,输入 remove
  6. 点击删除

gdcloud

运行以下命令可删除服务身份:

gdcloud iam service-accounts delete NAME \
    --project=PROJECT

创建和添加密钥对

如需在项目中创建和添加密钥对,请使用 GDC 控制台或 gdcloud CLI。

控制台

  1. 登录 GDC 控制台。
  2. 在导航菜单中,依次选择身份和访问权限 > 服务身份
  3. 点击要在密钥中添加的服务身份的名称。
  4. 点击创建新密钥
  5. 新密钥会显示在密钥列表中,并且系统会显示一个对话框,确认您已成功创建密钥。

gdcloud

此命令会创建应用默认凭据 JSON 文件以及公钥和私钥对:

gdcloud iam service-accounts keys create APPLICATION_DEFAULT_CREDENTIALS_FILENAME \
    --project=PROJECT \
    --iam-account=NAME \
    --ca-cert-path=CA_CERTIFICATE_PATH

替换以下值:

  • APPLICATION_DEFAULT_CREDENTIALS_FILENAME:JSON 文件的名称。
  • PROJECT:选择要为其创建密钥的项目。 如果已设置 gdcloud init,则可以省略 --project 标志。
  • NAME:要为其添加密钥的服务身份的名称。
  • CA_CERTIFICATE_PATH:可选:用于验证身份验证端点的证书授权机构 (CA) 证书路径。 如果您未指定此路径,系统将使用系统 CA 证书。 您必须在系统 CA 证书中安装 CA。

Distributed Cloud 会将公钥添加到您用于验证私钥签名的 JSON Web 令牌 (JWT) 的密钥中。ProjectServiceAccount私钥会写入应用默认凭据 JSON 文件。

以下示例展示了应用默认凭据 JSON 文件:

{
"type": "gdch_service_account",
"format_version": "1",
"project": "project_name",
"private_key_id": "abcdef1234567890",
"private_key": "-----BEGIN RSA PRIVATE KEY-----\nETC\n-----END RSA PRIVATE KEY-----\n",
"name": "service_identity_name",
"ca_cert_path": "service_identity_name",
"token_uri": "https://service-identity.<Domain>/authenticate"
}

此示例使用以下值:

  • project:组织中的项目命名空间。
  • private_key_id:分配给密钥的 ID。
  • private_key:CLI 生成的私钥。
  • name:服务身份的名称。
  • token_uri:身份验证端点的地址。

列出服务账号的凭据

列出项目中的特定 ProjectServiceAccount 的公钥:

gdcloud iam service-accounts keys list \
    --project=PROJECT \
    --iam-account=NAME

删除凭据

如需删除公钥,请使用 GDC 控制台或 gdcloud CLI。

控制台

  1. 登录 GDC 控制台。
  2. 在导航菜单中,依次选择身份和访问权限 > 服务身份
  3. 点击包含要删除的密钥的服务身份的名称。
  4. 点击删除
  5. 在确认对话框中点击删除

gdcloud

从项目中的特定 ProjectServiceAccount 中移除具有相应密钥 ID 的公钥:

gdcloud iam service-accounts keys delete KEY_ID \
    --project=PROJECT \
    --iam-account=NAME