上传服务账号密钥

本页面介绍如何上传服务账号的公钥。上传公钥后,您可以使用密钥对中的私钥通过服务账号进行身份验证。

准备工作

所需的角色

如需获得上传服务账号密钥所需的权限,请让管理员向您授予项目或者您要管理其密钥的服务账号的 Service Account Key Admin (roles/iam.serviceAccountKeyAdmin) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

如需了解详情,请参阅服务账号角色

根据您的组织政策配置,您可能还需要在项目中允许上传服务账号密钥,然后才能上传密钥。

如需获得允许在项目中上传服务账号密钥所需的权限,请让管理员向您授予贵组织的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

这些预定义角色包含允许在项目中上传服务账号密钥所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需允许在项目中上传服务账号密钥,您需要具有以下权限:

  • orgpolicy.constraints.list
  • orgpolicy.customConstraints.create
  • orgpolicy.customConstraints.delete
  • orgpolicy.customConstraints.get
  • orgpolicy.customConstraints.list
  • orgpolicy.customConstraints.update
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set
  • resourcemanager.organizations.get
  • resourcemanager.projects.listTagBindings
  • resourcemanager.projects.listEffectiveTags
  • resourcemanager.tagKeys.get
  • resourcemanager.tagKeys.list
  • resourcemanager.tagValues.list
  • resourcemanager.tagValues.get

您也可以使用自定义角色或其他预定义角色来获取这些权限。

允许上传服务账号密钥

在创建服务账号密钥之前,请确保未对您的项目强制执行 iam.disableServiceAccountKeyUpload 组织政策限制条件。如果对您的项目强制执行此限制,您将无法在该项目中上传服务账号密钥。

我们建议您对大多数项目强制执行此限制,仅豁免真正需要服务账号密钥的项目。如需详细了解其他身份验证方法,请参阅为您的使用场景选择合适的身份验证方法

如需将项目排除在 iam.disableServiceAccountKeyUpload 组织政策限制之外,请让组织政策管理员执行以下操作:

  1. 在组织级层,创建标记键和标记值,您将使用该标记值来定义项目或文件夹是否应豁免该组织政策。我们建议使用键 disableServiceAccountKeyUpload 和值 enforcednot_enforced 创建标记。

    如需了解如何创建标记键和标记值,请参阅创建和定义新标记

  2. disableServiceAccountKeyUpload 标记附加到组织,并将其值设置为 enforced。组织中的所有项目或文件夹都会继承此标记值,除非该标记值被其他标记值覆盖。

    如需了解如何将标记附加到资源,请参阅将标记附加到资源

  3. 对于要从组织政策中豁免的每个项目或文件夹,请附加 disableServiceAccountKeyUpload 标记并将其值设置为 not_enforced。以这种方式设置项目或文件夹的标记值会替换从组织继承的标记值。
  4. 创建或更新组织政策,以防止上传服务账号密钥,以便该政策不会对豁免资源强制执行限制。 此政策应具有以下规则:

    • 配置 iam.disableServiceAccountKeyUpload 限制条件,使其不对具有 disableServiceAccountKeyUpload: not_enforced 标记的资源强制执行。此规则中的条件应如下所示:

      resource.matchTag(\"ORGANIZATION_ID/disableServiceAccountKeyUpload\", \"not_enforced\")
      
    • 配置对所有其他资源强制执行的 iam.disableServiceAccountKeyUpload 限制条件。

    如需了解如何使用标记条件创建组织政策,请参阅设置带有标记的组织政策

上传服务账号的公钥

您可以上传用户管理的密钥对的公钥部分,以将其与服务账号相关联。上传公钥后,您可以将密钥对中的私钥用作服务账号密钥。

您上传的密钥必须是封装在 X.509 v3 证书中并以 base64 编码的 RSA 公钥。您可以使用 OpenSSL 等工具生成此格式的密钥和证书。

请勿在 X.509 证书中包含任何私密信息。具体来说,请使用通用主题,并且不要添加任何可选特性。证书会公开显示;证书中的任何私密信息对检索证书的所有人都可见。如需了解详情,请参阅避免在上传的 X.509 证书中披露机密信息

例如,以下命令会生成 2048 位 RSA 密钥对,并将公钥封装在有效期为 365 天的自签名证书中:

openssl req -x509 -nodes -newkey rsa:2048 -days 365 \
    -keyout /path/to/private_key.pem \
    -out /path/to/public_key.pem \
    -subj "/CN=unused"

然后,您可以上传 public_key.pem 文件作为服务账号的公钥。

控制台

  1. 在 Google Cloud 控制台中,转到服务账号页面。

    转到“服务账号”

    其余步骤会显示在 Google Cloud 控制台中。

  2. 选择一个项目。
  3. 服务账号页面上,点击要为其上传密钥的服务账号的电子邮件地址。
  4. 点击密钥标签页。
  5. 点击添加键下拉菜单,然后选择上传现有密钥
  6. 点击浏览,然后找到并选择您的公钥文件。或者,您也可以复制公钥文件的内容,并将其粘贴到粘贴现有密钥框中。
  7. 点击上传

gcloud

执行 gcloud iam service-accounts keys upload 命令来上传用于签署服务账号密钥的公钥。

替换以下值:

  • KEY_FILE:包含要上传的密钥数据的文件的路径,例如 ./public_key.pem
  • SA_NAME:要为其上传密钥的服务账号的名称。
  • PROJECT_ID:您的 Google Cloud 项目 ID。
gcloud iam service-accounts keys upload KEY_FILE \
    --iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com

输出包含所上传密钥的唯一标识符:

Name: projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0

如需确定该命令是否成功运行,请执行 gcloud iam service-accounts keys list 命令:

gcloud iam service-accounts keys list \
    --iam-account=SA_NAME@PROJECT_ID.iam.gserviceaccount.com

输出将包含创建密钥后返回的相同唯一标识符:

KEY_ID CREATED_AT EXPIRES_AT 已停用
c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0 2019-06-26T21:01:42Z 9999-12-31T23:59:59Z  

REST

projects.serviceAccounts.keys.upload 方法可上传用户管理的密钥对中的公钥,并将此公钥添加到服务账号。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project
  • SA_NAME:要与密钥关联的服务账号的名称。
  • PUBLIC_KEY_DATA:密钥对的公钥数据。必须是封装在 X.509 v3 证书中的 RSA 公钥。使用 base64 对公钥数据进行编码,包括第一行 -----BEGIN CERTIFICATE----- 和最后一行 -----END CERTIFICATE-----

HTTP 方法和网址:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys:upload

请求 JSON 正文:

{
  "publicKeyData": "PUBLIC_KEY_DATA"
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0",
  "validAfterTime": "2020-05-17T19:31:19Z",
  "validBeforeTime": "2021-05-17T19:31:19Z",
  "keyAlgorithm": "KEY_ALG_RSA_2048",
  "keyOrigin": "USER_PROVIDED",
  "keyType": "USER_MANAGED"
}

停用公钥上传功能

如需停用为项目上传密钥的功能,请参阅限制服务账号密钥上传

后续步骤

自行试用

如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费开始使用