如何排查GCP第二代Node.js函数调用所用的服务账号密钥?
排查GCP第二代Node.js函数使用的服务账号密钥
一、先明确核心前提
第二代Cloud Functions默认采用工作负载身份机制,如果你仅在HttpsOptions中指定服务账号、未配置额外密钥相关内容,函数运行时不会使用IAM中创建的服务账号持久化密钥——它会自动从GCP元数据服务器获取短期有效、动态生成的临时凭证,这类凭证不关联你看到的已生成/禁用的密钥。
只有当函数代码中显式加载了服务账号密钥文件时,才会用到持久化密钥。
二、排查实际使用的密钥(若确实用了持久化密钥)
1. 检查函数代码
搜索代码中是否存在加载密钥的逻辑,比如:
const {GoogleAuth} = require('google-auth-library'); // 显式指定密钥文件 const auth = new GoogleAuth({keyFilename: './your-key-file.json'}); // 或直接传入密钥内容 const auth = new GoogleAuth({credentials: require('./your-key-file.json')});
找到对应的密钥文件名或private_key_id字段,即可对应到IAM中服务账号的具体密钥。
2. 查看函数运行日志
在Cloud Logging中筛选函数日志,查找包含密钥ID的条目:
- 使用过滤器:
resource.type="cloud_function" AND resource.labels.function_name="你的函数名" AND (textPayload:"private_key_id" OR jsonPayload.private_key_id) - 若函数加载了密钥,部分客户端库会在日志中记录密钥的
private_key_id(注意:禁止在日志中输出完整密钥,这会引发安全风险)。
3. 核对密钥的最后使用时间
进入IAM控制台的目标服务账号详情页,查看密钥列表中的最后使用时间:
- 路径:IAM > 服务账号 > 目标账号 > 密钥
- 结合函数的活跃运行时段,对比密钥的最后使用时间,可推断哪个密钥被函数调用过。
三、多活跃密钥的清理建议
- 若函数未使用持久化密钥,建议禁用/删除所有服务账号的持久化密钥,降低安全风险。
- 若必须使用密钥,仅保留当前在用的1个密钥,定期轮换,并将密钥文件存储在Secret Manager中,避免硬编码到代码或部署包内。
内容的提问来源于stack exchange,提问作者toom501
相关产品推荐
相关产品推荐

