Google Cloud Secret Manager 基础:核心概念与架构
好,咱们今天聊聊 Google Cloud Secret Manager。这个服务,说白了就是 GCP 原生的密钥管理服务。我习惯把它比作一个加密保险柜——你往里边放密码、、证书文件,它帮你锁好。你用的时候,通过 API 或控制台去取。核心就这么简单。
但你别小看这个保险柜。Secret Manager 不是简单的存和取,它背后有一套成熟的架构设计。咱们一个一个拆开看。
核心概念与架构
Secret Manager 的架构很清晰。我画了一张图帮你理解它的整体结构。
我解释一下这张图。最顶层是 Secret,它代表一个密钥资源。每个 Secret 可以包含多个 版本。版本管理是这个服务最漂亮的设计之一,我待会细说。
中间层是 IAM 权限 和 审计日志。这两块是安全基座。你在哪个云上做密钥管理,权限和日志都是必须绑定的。Secret Manager 的 IAM 集成得很顺,几乎感觉不到额外配置。
底层是访问方式。gcloud 命令行、REST API、客户端库,三种手段都支持。你想想看,不管你是运维、开发还是测试,总能找到自己习惯的工具。
bytes 类型的数据,大小限制为 64 KB。超过这个容量?你得考虑用 Cloud Storage 或其他方案。
版本管理:不只是迭代
版本管理这块,我多说两句。为什么呢?我自己在管理 时,就吃过亏。
每个 Secret 可以拥有多个版本。每个版本就是一个不可变的数据快照。你创建新版本时,老版本不会自动删除。这个设计很关键——万一新密钥出了问题,你可以立刻回滚到旧版本。
版本状态有四种:
| 状态 | 说明 | 能用吗? |
|---|---|---|
| 启用 | 版本是活的,可以正常访问 | ✅ 可以 |
| 禁用 | 版本还在,但暂时不可用 | ❌ 不可以 |
| 销毁 | 永久删除,不可恢复 | ❌ 不可以 |
| 待销毁 | 设置了定时销毁,还没到时间 | ❌ 不可以 |
我在项目中遇到过这样一个场景:轮换 时,需要先创建新版本、验证新密钥可用、再禁用旧版本、观察一段时间、最后销毁。这个过程用 Secret Manager 的版本管理实现起来非常丝滑。
v2024-01-15-payment。这样在审计时,一眼就能看出哪个版本作用于哪个业务。
IAM 集成:权限给对,不出事
Secret Manager 的 IAM 集成,说白了就是两个角色:谁可以管理密钥,谁可以使用密钥。
- Secret Manager Admin:创建、删除、修改密钥。存疑时,权限给最小化。
- Secret Manager Secret Accessor:只能读取密钥值。不能修改、不能删除。
嗯,这里要留意。我在项目里见过不少团队,直接给服务账号绑定 roles/editor 或 roles/owner。这是非常危险的。你想想看,一个误操作删除了生产环境的数据库密码,那后果...我经历过一次,真的不想再经历第二次。
我强烈建议,能绑定 Secret Accessor 就绝不用 Admin。哪怕你觉得自己很小心,也要按最小权限原则来。
还有一个细节:Secret Manager 支持在 项目级、密钥级 和 版本级 设置 IAM 策略。我一般在密钥级别做细粒度控制。项目级别只设定基础权限。
API 使用方式:三选一,总有一款适合你
Secret Manager 的 API 设计非常 RESTful。我带你看看三种主流方式。
gcloud 命令行
这是我最常用的方式。快速验证、脚本编写都靠它。
# 创建一个密钥
gcloud secrets create my- --replication-policy="automatic"
# 添加一个版本
echo -n "sk-xxxxx" | gcloud secrets versions add my- --data-file=-
# 访问最新版本
gcloud secrets versions access latest --secret=my-
REST API
适合集成到 CI/CD 流程中。直接使用 HTTP 请求。
# 获取密钥列表
GET https://secretmanager.googleapis.com/v1/projects/{PROJECT_ID}/secrets
# 访问指定版本
GET https://secretmanager.googleapis.com/v1/projects/{PROJECT_ID}/secrets/my-/versions/1:access
客户端库
如果你用 Go 写服务,官方客户端库体验不错。
import secretmanager "cloud.google.com/go/secretmanager/apiv1"
import secretmanagerpb "google.golang.org/genproto/googleapis/cloud/secretmanager/v1"
ctx := context.Background()
client, _ := secretmanager.NewClient(ctx)
req := &secretmanagerpb.AccessSecretVersionRequest{
Name: "projects/my-project/secrets/my-/versions/latest",
}
result, _ := client.AccessSecretVersion(ctx, req)
secretValue := string(result.Payload.Data)
我个人习惯在开发时用客户端库,在运维脚本里用 gcloud。为什么?客户端库可以自动处理重试和令牌刷新,gcloud 命令结构清晰,容易 debug。
如果让我推荐一个最稳妥的实践:先在控制台创建密钥、配置 IAM、添加版本。然后用 gcloud 验证一下。最后再让应用通过客户端库接入。这个顺序踩坑最少。
好了,这一章的内容就这些。希望这篇分享能让你对 Secret Manager 有个清晰的认知。咱们下次见。