Google Cloud Compute Engine实例模板启动脚本中API密钥的安全存储与读取方法问询
Google Cloud Compute Engine实例模板启动脚本中API密钥的安全存储与读取方法问询
嗨,这个问题问到点子上了——直接把API密钥明文写在启动脚本里绝对不安全,风险还不小:
- 实例模板的内容对有权限查看模板的人完全透明,很容易被误泄露;
- 实例创建后,启动脚本的内容会被记录到实例的日志文件(比如
/var/log/startupscript.log)里,只要能访问实例的人都能看到密钥。
所以必须把密钥迁移到Google Cloud的Secret Manager里,这是GCP官方推荐的敏感信息存储方案,安全性和可管理性都强得多。下面是具体的操作步骤:
1. 把API密钥存入Secret Manager
你可以用Google Cloud控制台或者gcloud命令行工具来操作:
- 先创建一个新的密钥:
gcloud secrets create SUPER_SECRET_API_KEY --replication-policy="automatic" - 然后把你的API密钥添加到这个密钥的版本里(可以直接输入或者从文件读取):
# 直接输入密钥的方式 echo "你的真实API密钥内容" | gcloud secrets versions add SUPER_SECRET_API_KEY --data-file=- # 或者从本地文件读取密钥的方式 gcloud secrets versions add SUPER_SECRET_API_KEY --data-file=/path/to/your/api-key-file.txt
2. 给实例的服务账号赋予读取密钥的权限
实例模板创建实例时会使用一个服务账号(默认是Compute Engine默认服务账号),你需要给这个账号添加读取该密钥的权限:
gcloud projects add-iam-policy-binding 你的GCP项目ID \ --member="serviceAccount:你的服务账号邮箱(比如xxxx-compute@developer.gserviceaccount.com)" \ --role="roles/secretmanager.secretAccessor"
如果想更严格,也可以创建自定义角色,只允许读取这个特定的密钥,不过一般用secretmanager.secretAccessor角色就够了。
3. 修改启动脚本,读取Secret Manager中的密钥
在启动脚本里,我们可以用gcloud命令来获取密钥,然后再发起请求:
# 获取最新版本的API密钥 API_KEY=$(gcloud secrets versions access latest --secret="SUPER_SECRET_API_KEY") # 用获取到的密钥发起请求 curl --location "https://my-side.com/hello?hostname=$hostname" \ --header "Authorization: $API_KEY"
要注意的是,Compute Engine的官方公共镜像一般都预装了gcloud CLI,所以这个方法直接能用;如果是你自己的自定义镜像没装gcloud,也可以用curl调用Secret Manager的REST API,但需要先获取实例的身份令牌来认证,步骤会繁琐一些,优先推荐上面的gcloud方式。
另外,如果你的实例模板是用Terraform这类IaC工具管理的,也别把密钥硬编码在配置文件里,要通过引用Secret Manager的方式来传递,确保整个链路都没有明文密钥。
备注:内容来源于stack exchange,提问作者Europa




