服务账号是工作负载或服务用于以编程方式安全使用资源和访问微服务的账号。 它们是由应用或工作负载(而非真人)使用的特殊身份。与用户账号类似,服务账号可以被授予权限和角色,但它们无法像真人用户一样登录。
服务账号对于管理 Google Distributed Cloud (GDC) 气隙设备基础架构非常有用,例如:
- 内部 GDC 气隙设备服务和工作负载,用于安全访问 GDC 气隙设备控制平面应用编程接口 (API)。
- GDC 气隙设备中的客户工作负载,用于访问 GDC 气隙设备服务并进行经过授权的应用编程接口 (API) 调用。
- 外部工作负载,用于与 GDC 气隙设备联合。
- GDC 气隙设备服务或系统控制器,用于安全访问客户资源。例如,服务账号可以管理身份验证和授权工作流,其中在裸金属 Kubernetes 集群中运行的服务控制器必须运行由客户管理的工作负载。
您可以使用 GDC 控制台、gdcloud CLI 或 API 管理账号。借助 gdcloud CLI,服务身份功能基于 ProjectServiceAccount API 构建。
准备工作
您只能在项目内创建服务账号。如需了解详情,请参阅 创建项目。
创建服务身份
如需获得创建服务账号所需的权限,请让您的 Project IAM 管理员为您授予 Project IAM 管理员 (project-iam-admin) 角色。
有权访问服务账号的用户可以访问项目中的所有服务账号。
如需在项目中创建服务身份,请使用 GDC 控制台、gdcloud CLI 或 API。
控制台
- 登录 GDC 控制台。
- 在导航菜单中,选择 Identity & Access > Service identities 。
- 点击 Create Service Identity。 系统会打开 Service Identity details 页面。
- 在 Service identity name 字段中,输入服务身份的名称。例如:
Test service identity。 - 点击 Create 。
gdcloud
创建服务身份:
gdcloud iam service-accounts create NAME \
--project=PROJECT
替换以下值:
- NAME:
ProjectServiceAccount的名称。该名称在项目命名空间中必须是唯一的。 - PROJECT:要在其中创建服务
身份的项目。如果已设置
gdcloud init,请省略--project标志。
此命令会在项目命名空间中创建一个 ProjectServiceAccount。
API
创建一个
ProjectServiceAccount自定义资源 YAML 文件,例如my-project-sa.yaml:apiVersion: resourcemanager.gdc.goog/v1 kind: ProjectServiceAccount metadata: name: NAME namespace: PROJECT spec: keys: - algorithm: ALGORITHM id: KEY_ID key: BASE64_ENCODED_KEY validAfter: "START_TIME" validBefore: "EXPIRATION_TIME"执行以下变量替换操作:
NAME:ProjectServiceAccount资源的名称。该名称在项目命名空间中必须是唯一的。PROJECT:要在其中创建服务身份的项目。ALGORITHM:密钥的算法。仅支持 ES256 密钥。KEY_ID:密钥的唯一标识符。该 ID 用于确定要验证的密钥。BASE64_ENCODED_KEY:要验证的 PEM 格式的 base64 编码公钥。用于生成此公钥的私钥应采用 ECDSA P256 PEM 格式。START_TIME:密钥生效的开始时间,例如2025-02-07T00:59:34Z。EXPIRATION_TIME:密钥的到期时间,例如2026-02-07T00:59:34Z。
将
ProjectServiceAccount自定义资源应用于管理 API 服务器:kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG apply -f my-project-sa.yaml将
MANAGEMENT_API_SERVER_KUBECONFIG变量替换为管理 API 服务器的 kubeconfig 文件的路径。
查看服务身份
如需查看项目中的服务账号列表,请使用 GDC 控制台或 gdcloud CLI。
控制台
- 登录 GDC 控制台。
- 选择一个项目。
- 在导航菜单中,点击 Identity & Access > Service Identities 以查看项目的服务账号列表。
gdcloud
列出项目中的服务账号:
gdcloud iam service-accounts list \
--project=PROJECT
为服务身份分配角色绑定
如需分配角色绑定,您必须拥有适当的权限。如需获得分配角色所需的权限,请让您的 Project IAM 管理员为您授予 Project IAM 管理员 (project-iam-admin) 角色。
使用 GDC 控制台或 gdcloud CLI 分配角色绑定。
控制台
- 登录 GDC 控制台。
- 选择一个项目。
- 在导航菜单中,选择 Identity & Access > Access 。
- 在 Member 列表中,点击 Add member。 您会看到 Users and roles 页面。
- 在 Member type 列表中,选择 Service identity 。
- 在 Service identity 列表中,选择要为其分配角色绑定的服务身份。
- 在 Role 列表中,选择要分配给服务身份的角色,例如 Backup Creator 。
- 可选:如需添加其他角色,请点击 添加其他角色。 选择其他角色。
- 点击 Add 。
gdcloud
此命令会创建并命名项目角色绑定,以将指定角色与 ProjectServiceAccount 绑定:
gdcloud iam service-accounts add-iam-policy-binding \
--project=PROJECT \
--role=ROLE \
--iam-account=NAME
替换以下值:
- PROJECT:要在其中创建角色绑定
的项目。
如果已设置
gdcloud init,则可以省略--project标志。 - ROLE:要分配给
ProjectServiceAccount的预定义角色。请以Role/name格式指定角色,其中 Role 是 Kubernetes 类型(例如Role或ProjectRole),而 name 是预定义角色的名称。例如,如需分配 Project Viewer 角色,请将角色设置为Role/project-viewer。 - NAME:要使用的服务身份的名称。
删除服务身份
如需删除项目中的服务账号,请使用 GDC 控制台或 gdcloud CLI。
删除服务身份后,应用无法再通过该服务身份访问项目资源。
控制台
- 登录 GDC 控制台。
- 在导航菜单中,选择 Identity & Access > Service Identities 。
- 选中要删除的服务身份对应的复选框。
- 点击 Delete 。
- 系统会显示确认对话框。在 Confirm by typing the following below 字段中,输入
remove。 - 点击 Delete 。
gdcloud
运行以下命令以删除服务身份:
gdcloud iam service-accounts delete NAME \
--project=PROJECT
创建和添加密钥对
如需在项目中创建和添加密钥对,请使用 GDC 控制台、gdcloud CLI 或 API。
控制台
- 登录 GDC 控制台。
- 在导航菜单中,选择 Identity & Access > Service Identities 。
- 点击要添加密钥的服务身份的名称。
- 点击 Create New Key。
- 新密钥会显示在 Keys 列表中,并且系统会显示一个对话框,确认您已成功创建密钥。
gdcloud
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。
GDC 气隙设备会将公钥添加到您用于验证私钥签名的 JSON Web 令牌 (JWT) 的 ProjectServiceAccount 密钥。私钥会写入应用默认凭据 JSON 文件。
以下示例展示了应用默认凭据 JSON 文件:
{
"type": "gdch_service_account",
"format_version": "1",
"project": "project_name",
"private_key_id": "abcdef1234567890",
"private_key": "-----BEGIN PRIVATE KEY-----\nETC\n-----END 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 生成的 PEM 格式的 ECDSA P256 私钥。name:服务身份的名称。token_uri:身份验证端点的地址。
API
生成公钥和私钥对。以下命令以
openssl为例,这是一个常用的工具。openssl ecparam -name prime256v1 -genkey -noout -out "key.pem" openssl ec -in "key.pem" -pubout > "pub.pem"对公钥进行 Base64 编码并检索其密钥 ID:
KEY_ID=$(openssl pkey -in key.pem -pubout -outform der | openssl dgst -sha256 | sed 's/^.* //') BASE64_ENCODED_KEY=$(cat pub.pem | base64)创建或更新
ProjectServiceAccount自定义资源 YAML 文件,包括上一步中生成的密钥信息:apiVersion: resourcemanager.gdc.goog/v1 kind: ProjectServiceAccount metadata: name: NAME namespace: PROJECT spec: keys: - algorithm: ALGORITHM id: KEY_ID key: BASE64_ENCODED_KEY validAfter: "START_TIME" validBefore: "EXPIRATION_TIME"执行以下变量替换操作:
NAME:ProjectServiceAccount资源的名称。该名称在项目命名空间中必须是唯一的。PROJECT:要在其中创建密钥的项目。ALGORITHM:密钥的算法。仅支持 ES256 密钥。KEY_ID:密钥的唯一标识符。该 ID 用于确定要验证的密钥。BASE64_ENCODED_KEY:要验证的 PEM 格式的 base64 编码公钥。用于生成此公钥的私钥应采用 ECDSA P256 PEM 格式。START_TIME:密钥生效的开始时间,例如2025-02-07T00:59:34Z。EXPIRATION_TIME:密钥的到期时间,例如2026-02-07T00:59:34Z。
将
ProjectServiceAccount自定义资源应用于管理 API 服务器:kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG apply -f my-project-sa.yaml将
MANAGEMENT_API_SERVER_KUBECONFIG变量替换为管理 API 服务器的 kubeconfig 文件的路径。创建包含私钥的应用默认凭据 JSON 文件。确保 JSON 文件中的
KEY_ID变量设置为与您在ProjectServiceAccount规范中使用的KEY_ID变量相同的值。cat <<EOF > "key_file.json" { "format_version": "1", "name": "NAME", "private_key": "$(tr '\n' '\t' < "key.pem" | sed 's/\t/\\n/g')", "private_key_id": "KEY_ID", "project": "PROJECT", "token_uri": "AUTH_URL", "type": "gdch_service_account" } EOF执行以下变量替换操作:
NAME:服务身份的名称。KEY_ID:密钥的唯一标识符。该 ID 用于确定要验证的密钥,并且必须与ProjectServiceAccount规范中使用的KEY_ID值一致。PROJECT:组织中的项目命名空间。AUTH_URL:身份验证端点的地址。
通过激活服务帐号,将密钥对添加到您的项目:
gdcloud auth activate-service-account –-key-file=key_file.json
列出服务账号的凭据
列出项目中特定 ProjectServiceAccount 中的公钥:
gdcloud iam service-accounts keys list \
--project=PROJECT \
--iam-account=NAME
删除凭据
如需删除公钥,请使用 GDC 控制台或 gdcloud CLI。
控制台
- 登录 GDC 控制台。
- 在导航菜单中,选择 Identity & Access > Service Identities 。
- 点击包含要删除的密钥的服务身份的名称。
- 点击 Delete。
- 在确认对话框中,点击 Delete 。
gdcloud
从项目中特定的 ProjectServiceAccount 中移除具有密钥 ID 的公钥:
gdcloud iam service-accounts keys delete KEY_ID \
--project=PROJECT \
--iam-account=NAME
使用服务账号密钥授权服务账号
您可以使用 gdcloud 命令,通过服务账号密钥激活服务帐号:
创建服务帐号密钥文件, 如果您还没有。
运行以下命令以激活服务帐号:
gdcloud auth activate-service-account --key-file=KEY_FILE将 KEY_FILE 替换为服务帐号 密钥文件的路径。
激活服务帐号后,
gdcloud会使用服务帐号的凭据执行后续命令,而不是您的用户凭据。