Google Cloud CLI:隔离 configuration、活动账号与 project
gcloud 的命名 configuration 同时保存 account、project、region、zone 等属性,但这些属性不等于应用默认凭据,也不能证明目标 API 已启用。脚本必须把 configuration、活动账号、project 与实际资源名称一并验证。
configuration 是命名属性集合,不是权限边界
gcloud config configurations 管理多套命名配置,活动 configuration 决定未显式覆盖时使用的属性。gcloud auth list 展示 CLI 可用账号,gcloud config get-value project 展示项目落点。命令行的 --project、--account 等参数可以覆盖活动配置,因此运行证据要包含最终参数。
gcloud version
gcloud config configurations create dev-readonly
gcloud config set account developer@example.com --configuration dev-readonly
gcloud config set project example-dev --configuration dev-readonly
gcloud config list --configuration dev-readonly --format=json
gcloud auth list --configuration dev-readonly --filter=status:ACTIVE --format=jsonconfiguration 文件可能包含路径与账号信息,认证缓存另有敏感数据。项目内可用 CLOUDSDK_CONFIG 隔离配置根目录,先证明空目录没有借用全局会话,再完成受控登录。
人员登录、服务账号与 ADC 各有自己的消费者
gcloud auth login 为 CLI 建立人员身份。工作负载应使用 Workload Identity Federation、元数据服务或受控服务账号,不分发长期 JSON key。Application Default Credentials 由客户端库消费,gcloud auth application-default login 与普通 gcloud 登录不是同一凭据槽,不能因为 CLI 查询成功就断言应用 SDK 身份正确。
CLOUDSDK_CONFIG="$PWD/.tmp/gcloud" gcloud auth list
CLOUDSDK_CONFIG="$PWD/.tmp/gcloud" gcloud auth login
CLOUDSDK_CONFIG="$PWD/.tmp/gcloud" gcloud auth list --filter=status:ACTIVE
gcloud auth application-default print-access-token最后一条只用于诊断 ADC 是否存在,不把 token 输出进日志。项目接入时分别验证 CLI 和应用凭据的主体、project/quota project 与权限,避免本机开发凭据替代部署身份。
正反实验要钉住 project 与资源全名
正向实验查询目标 project 的一个只读资源集合,并以 URI 或完整资源名输出。反向实验切到未授权 project 或执行越权动作,预期得到 PERMISSION_DENIED。还要区分 API 未启用、配额 project 错误、Region 错误和资源不存在。
gcloud compute instances list \
--configuration dev-readonly \
--project example-dev \
--filter='labels.environment=dev' \
--format='json(name,zone,status,labels)'
gcloud compute instances delete intentional-deny-canary \
--project example-dev \
--zone asia-southeast1-a \
--quiet反例对象在隔离项目中准备,不能用生产资源试验拒绝。Cloud Audit Logs 中的 principal、method、resourceName 和 request metadata 要与终端错误关联,形成可复查证据。
format、filter 与分页决定脚本稳定性
--format=json、--filter 和 --flatten 的组合适合自动化,但字段随具体 API 资源模型而定。脚本固定所需字段并验证空集合,不把 table 文本当接口。批量 list 需要估算项目、区域、资源类型、分页和并发,避免触发配额或生成巨量审计日志。
变更脚本先读取活动账号和 project,比较白名单,再用显式 --project 与区域参数调用。创建资源写入 owner、environment、expires-at、cost-center 标签。组织策略、VPC Service Controls 与 IAM Deny 可能在项目角色之外继续拒绝,排障不能直接加 Editor。
actual_project=$(gcloud config get-value project --configuration dev-readonly)
actual_account=$(gcloud auth list --configuration dev-readonly --filter=status:ACTIVE --format='value(account)')
test "$actual_project" = "$EXPECTED_GCP_PROJECT" || exit 42
test "$actual_account" = "$EXPECTED_GCP_ACCOUNT" || exit 43联邦身份、审计与成本需要共同设计
CI 使用 Workload Identity Federation 时,provider 条件钉住仓库、分支、环境与 audience,服务账号 impersonation 只授予目标动作。人员与工作负载分别使用不同账号和 IAM 角色。服务账号 key 若确实存在,应纳入轮换、发现和立即撤销流程。
配置、token、ADC 文件、debug 日志与审计记录均按敏感资产管理。资源成本之外还要关注日志摄取、快照、静态 IP、出口流量和 API 配额。大规模资产查询可用 Cloud Asset Inventory 等专门入口,而不是让开发机 gcloud 遍历所有项目。
撤销认证与删除 configuration 要分别验证
删除 configuration 只移除属性集合,不一定撤销账号认证;gcloud auth revoke 撤销 CLI 凭据,也不会删除云资源、服务账号、联邦 provider 或 ADC。退出时先移交或删除资源,停止 CI 信任,再处理认证与配置。
gcloud auth revoke developer@example.com
gcloud config configurations delete dev-readonly --quiet
gcloud auth application-default revoke
gcloud config configurations list回滚需要恢复 CLI 版本、配置基线和工作负载身份,而不是复制旧 token。长期治理保存 configuration owner、允许账号/project、API 与 Region、结构化输出契约、拒绝金丝雀和清理结果,使 gcloud 的默认状态不再成为隐式控制面。
