You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动