本页面介绍如何上传服务账号的公钥。上传公钥后,您可以使用密钥对中的私钥通过服务账号进行身份验证。
准备工作
Enable the IAM API.
了解服务账号凭据。
所需的角色
如需获得上传服务账号密钥所需的权限,请让管理员向您授予项目或者您要管理其密钥的服务账号的 Service Account Key Admin (roles/iam.serviceAccountKeyAdmin
) IAM 角色。
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
如需了解详情,请参阅服务账号角色。
根据您的组织政策配置,您可能还需要在项目中允许上传服务账号密钥,然后才能上传密钥。
如需获得允许在项目中上传服务账号密钥所需的权限,请让管理员向您授予贵组织的以下 IAM 角色:
-
Organization Policy Administrator (
roles/orgpolicy.policyAdmin
) -
Organization Viewer (
roles/resourcemanager.organizationViewer
) -
Tag Administrator (
roles/resourcemanager.tagAdmin
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
这些预定义角色包含允许在项目中上传服务账号密钥所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
如需允许在项目中上传服务账号密钥,您需要具有以下权限:
-
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
组织政策限制之外,请让组织政策管理员执行以下操作:
-
在组织级层,创建标记键和标记值,您将使用该标记值来定义项目或文件夹是否应豁免该组织政策。我们建议使用键
disableServiceAccountKeyUpload
和值enforced
和not_enforced
创建标记。如需了解如何创建标记键和标记值,请参阅创建和定义新标记。
-
将
disableServiceAccountKeyUpload
标记附加到组织,并将其值设置为enforced
。组织中的所有项目或文件夹都会继承此标记值,除非该标记值被其他标记值覆盖。如需了解如何将标记附加到资源,请参阅将标记附加到资源。
-
对于要从组织政策中豁免的每个项目或文件夹,请附加
disableServiceAccountKeyUpload
标记并将其值设置为not_enforced
。以这种方式设置项目或文件夹的标记值会替换从组织继承的标记值。 -
创建或更新组织政策,以防止上传服务账号密钥,以便该政策不会对豁免资源强制执行限制。 此政策应具有以下规则:
-
配置
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
文件作为服务账号的公钥。
控制台
- 在 Google Cloud 控制台中,转到服务账号页面。
其余步骤会显示在 Google Cloud 控制台中。
- 选择一个项目。
- 在服务账号页面上,点击要为其上传密钥的服务账号的电子邮件地址。
- 点击密钥标签页。
- 点击添加键下拉菜单,然后选择上传现有密钥。
- 点击浏览,然后找到并选择您的公钥文件。或者,您也可以复制公钥文件的内容,并将其粘贴到粘贴现有密钥框中。
- 点击上传。
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" }
停用公钥上传功能
如需停用为项目上传密钥的功能,请参阅限制服务账号密钥上传。
后续步骤
- 了解如何创建和删除服务账号密钥。
- 了解如何列出和获取服务账号密钥。
- 了解使用服务账号密钥进行身份验证的替代方案。
- 了解如何使用服务账号密钥进行服务账号身份验证。
- 了解管理服务账号密钥的最佳实践。