认证:gcloud、ADC 与 impersonation
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
CLI 使用 gcloud credentials;SDK / Terraform 通常使用 ADC,分别管理。
推荐做法#
- 人用个人或公司身份;以 SA 测试时显式 impersonate,避免分发长期 key。
- ADC 优先级:GOOGLE_APPLICATION_CREDENTIALS → 本地 ADC 文件 → 平台 metadata。
- 认证只决定身份;资源访问仍需 IAM,目标 Project 由命令/应用配置决定。
常用操作#
gcloud auth list --filter=status:ACTIVE
gcloud config get-value auth/impersonate_service_account
# 按使用方执行所需登录;两者不会互相替代。
# CLI:gcloud auth login
# SDK / Terraform:gcloud auth application-default login容易踩的坑#
gcloud CLI 与 ADC 是两套凭据选择。 切换 configuration 不切换 ADC;
GOOGLE_APPLICATION_CREDENTIALS还可能使应用读取另一份文件。
- access token 用于 Google API;Cloud Run 调用通常要求匹配 audience 的 ID token。
配置说明与完整示例(按需展开)
本篇回答“命令和应用用谁的凭据”。授权模型见 IAM,多账号切换见 配置隔离。
用户、 Service Account 与 federated identity 如何认证#
Principal 由请求使用的凭据和 impersonation 配置决定;在终端敲命令的人不一定是 API 看到的身份。认证证明身份,授权决定它能做什么。
| 方式 | 如何证明身份 | 是否需要浏览器登录 Google 用户 |
|---|---|---|
| Google 用户 | 用户完成登录授权,gcloud 用用户凭据获取短期 access token | 通常需要 |
| impersonate SA | 原始身份先认证,GCP 检查 impersonation 权限后签发目标 SA 的短期凭据 | 取决于原始身份;本篇用已登录用户 |
| SA 密钥 | 工具使用 JSON 中的私钥签署请求,取得 SA 凭据 | 不需要 |
| 运行环境绑定的 SA | VM、Cloud Run 等平台通过元数据服务提供绑定 SA 的短期凭据 | 不需要 |
| federated identity | 外部平台或企业身份系统提供身份证明,GCP 验证后交换短期凭据 | 工作负载通常不需要;员工可能登录企业身份系统 |
这些是不同场景的选项,下面命令不要连续执行。用户登录:
gcloud auth login使用已有 SA 密钥让 gcloud CLI 认证并切换到该 SA(与仅给应用设置 GOOGLE_APPLICATION_CREDENTIALS 不同):
gcloud auth activate-service-account "$READER" --key-file=./sa-key.json此命令使用私钥认证,无须用户登录或 Token Creator;创建 key 则需 iam.serviceAccountKeys.create 且 Organization Policy 允许。操作见 密钥管理、CLI 认证。
GitHub federated identity 流程是 OIDC token → GCP 验证签名与信任条件 → STS 交换凭据 → 直接访问或 impersonate SA。配置 JSON 只指定外部凭据来源和 Provider,不授予权限。实验见 无密钥发布。
已有 Workload federated identity 配置且外部凭据来源可用时,可以让 CLI 使用它:
gcloud auth login --cred-file=./workload-credentials.jsonWorkforce 用户登录企业 IdP(如 Entra ID、Okta)。CLI 可用 gcloud auth login --login-config=./workforce-login.json;这是按已有 Provider 生成的浏览器登录配置,区别于 create-cred-config 的外部凭据文件。Workforce 登录
impersonate SA 的 CLI 命令及授权步骤见 Bucket 授权与撤权实验。以下再区分 CLI 登录与应用使用的 ADC:
| 凭据 | 消费者 | 常见误区 |
|---|---|---|
gcloud auth login |
gcloud CLI | 不等于本地 SDK 已配置 ADC |
gcloud auth application-default login |
本地 SDK / Terraform 等 ADC 消费者 | 不自动切换 gcloud 账号 |
| 运行环境绑定的 SA | Cloud Run、VM 等的 SDK | SDK 从环境获取短期凭据,无需 JSON key |
| OAuth access token | Google API | 不用它代替 Cloud Run 调用的 ID token |
| OIDC ID token | 验证调用者身份的服务 | audience 应匹配目标服务要求 |
Terraform:AWS 与 GCP 的凭据来源差异#
本地 Google Provider 默认使用 ADC,普通 gcloud auth login 不生成它。AWS Provider 则可与 AWS CLI 共用配置和凭据文件:
| 对比 | Terraform AWS Provider | Terraform Google Provider |
|---|---|---|
| 常见本地凭据来源 | 与 AWS CLI 共用的配置、凭据文件等 | ADC,与普通 gcloud CLI 登录凭据分开 |
| 多账号选择示例 | AWS_PROFILE=work |
GOOGLE_APPLICATION_CREDENTIALS=/绝对路径/work.json |
| 仅完成 CLI 登录是否足够 | 取决于所选认证方式及其共享凭据是否可用 | 普通 gcloud auth login 不会生成 ADC |
以下是本地使用用户身份的两项独立登录,按消费者需要执行:
# 供 gcloud CLI 使用;Terraform 不要求先完成这项登录
gcloud auth login
# 供 Terraform Google Provider、SDK 等 ADC 消费者使用
gcloud auth application-default login有效 ADC 可直接供 Google Provider 使用,无需在代码中填凭据或每次 plan/apply 前登录。云上/CI 可用绑定 SA 或 federation;目标 Project 仍由 Provider 配置指定。多账号见 配置隔离。Terraform GCP 认证
application-default 与凭据查找顺序#
Application Default Credentials(ADC) 是应用查找凭据的机制,与 CLI 配置分开;application-default 不是 profile 名。
使用 ADC 且未显式指定凭据的应用,按以下顺序查找:
- 环境变量
GOOGLE_APPLICATION_CREDENTIALS指向的 JSON 文件。 gcloud auth application-default login生成的本地 ADC 文件。- 在 GCP 运行环境中,通过元数据服务取得绑定的 SA 凭据。
本地 ADC 默认路径:macOS/Linux 为 ~/.config/gcloud/application_default_credentials.json,Windows 为 %APPDATA%\gcloud\application_default_credentials.json。官方查找顺序
本地认证不要求创建或指定 Service Account。 gcloud auth login 本身会保存供 CLI 使用的用户凭据;若本地 SDK / Terraform 等应用要直接使用用户身份,再执行:
gcloud auth application-default login完成浏览器登录后,gcloud 将该 Google 用户的 ADC 写入上述默认路径。应用使用的是此次 ADC 登录用户的资源权限,不涉及 SA 或 Token Creator 授权。CLI 登录与 ADC 登录分别保存,所选用户可以不同;这条命令不会给用户新增资源权限。用户 ADC 配置
只有希望应用改用 SA 身份时,才选择 impersonation (客户端库需支持这种 impersonation):
gcloud auth application-default login --impersonate-service-account="$READER"该方式保存用户凭据与 SA impersonation 配置,不含 SA 私钥,也不切换 CLI 身份。两种 ADC 登录二选一,均覆盖默认 ADC;已有 GOOGLE_APPLICATION_CREDENTIALS 时优先使用它指向的文件。
GOOGLE_APPLICATION_CREDENTIALS 指定什么#
GOOGLE_APPLICATION_CREDENTIALS 指向本地凭据 JSON 路径,例如 SA key 或 federation 配置,不是邮箱、Project ID 或 token。
# 可选:已准备好相应凭据文件时,让当前终端启动的 ADC 应用优先使用它。
export GOOGLE_APPLICATION_CREDENTIALS="/absolute/path/to/credentials.json"若之前设置过该变量,现在要恢复使用默认位置的本地 ADC,在当前终端取消它:
unset GOOGLE_APPLICATION_CREDENTIALS实验结束后,再撤销本地 ADC:
# 本地实验结束,删除此 ADC;后续需要时重新登录
gcloud auth application-default revoke生产优先使用绑定身份或 Identity Federation。不要下载 SA key 放进 GitHub Secret 来替代 federated identity;长寿命 key 难以审计和轮换。ADC