谷歌云功能:支持谷歌云KMS



我正在使用带有Pubsub触发器的Google Cloud Function(GCF),该触发器向第三方API发送HTTP请求。

GCF 接收来自服务使用的 Pubsub 主题的通知,该服务不应了解第三方 API。

第三方 API 需要使用基本 HTTP 身份验证进行身份验证。

为了不必在我的源代码中对密码进行硬编码,我每次部署函数时都使用 Google KMS 生成新的加密密钥。每次实例化函数时,我都使用谷歌云 KMS 解密密钥。

为了使用KMS解密,我必须向NodeJS Google API提供服务帐户的私钥。

我今天的主要问题是,如果我想让我的 GCF 正常工作,我必须将我的私钥推送到 GCloud 存储桶。

是否可以使用运行时配置器或部署管理器为 Google Cloud 函数配置机密?

谢谢。

自 2019 年 12 月起,在 Google Cloud 上存储和管理机密的首选方式是机密管理器:

$ echo -n "user:pass" | gcloud beta secrets create "my-basic-auth" 
--data-file=- 
--replication-policy "automatic"

您还可以从 API 创建和管理密钥:

// Import the library
const {SecretManagerServiceClient} = require('@google-cloud/secret-manager');
// Create the client
const client = new SecretManagerServiceClient();
// Create the secret
const [secret] = await client.createSecret({
parent: "projects/<YOUR-PROJECT-ID>",
secretId:"my-basic-auth",
secret: {
replication: {
automatic: {},
},
},
});
// Add the version with your data
const [version] = await client.addSecretVersion({
parent: secret.name,
payload: {
data: Buffer.from("user:pass", "utf8"),
},
});

然后,在您的云函数中:

const [version] = await client.accessSecretVersion({
name:"projects/<YOUR-PROJECT-ID>/secrets/<MY-SECRET>/versions/1",
});
const auth = version.payload.data.toString('utf-8');
// auth is user:pass

用于部署云函数的服务账号需要roles/secretmanager.secretAccessor权限。

另一个解决方案是将Google Cloud Runtime Configuration与Firebase for Functions一起使用: https://firebase.google.com/docs/functions/config-env

Firebase for Functions 似乎提供了对一些尚未通过其他方式获得的功能的访问。

运行时配置器不收取使用费,但强制执行以下 API 限制和配额:

  • 分钟 1200 次查询 (QPM),用于删除、创建和更新请求
  • 600 QPM 用于监视请求。
  • 6000 QPM 用于获取和列出请求。
  • 每个用户 4MB 的数据,包括写入运行时配置器服务的所有数据和随附的元数据。

https://cloud.google.com/deployment-manager/pricing-and-quotas#runtime_configurator


顺便说一句,我发现Firebase for Functions中的这种冲突很滑稽:

适用于云功能的 Firebase SDK 提供了内置的环境配置功能,因此您无需重新部署函数即可轻松存储和检索项目中的此类数据。

片刻之后:

运行functions:config:set,必须重新部署函数以使新配置可用。


KMS 解决方案是一种可行的替代方案,但对于功能来说似乎成本高昂。KMS 按每个活动密钥每月 0.06 USD 以及每 10000 次操作 0.03 USD 计费。

然后,这会将云函数的成本从每百万次调用 0.40 USD 更改为每百万次调用 3.40 USD。这是相当的跳跃。

  • https://cloud.google.com/kms/
  • https://cloud.google.com/functions/

是否可以使用运行时配置器或部署管理器来配置Google Cloud Function的机密?

目前没有内置服务可以让您将密钥配置为由 Google Cloud Functions 直接访问,因此您当前使用的方法暂时是处理 Cloud Functions 上的机密的正确方法。由于产品仍处于测试阶段,这可能会发生变化。

如果需要,可以使用相应的问题跟踪器向云功能团队提出功能请求。

还有一个Google Cloud Key Management Service:Node.js Client。

cd functions
npm install @google-cloud/kms

例如:

// Imports the Cloud KMS library
const {KeyManagementServiceClient} = require('@google-cloud/kms');
// Instantiates a client
const client = new KeyManagementServiceClient();
// Build the location name
const locationName = client.locationPath(functions.config().firebase.projectId, functions.config().firebase.locationId);
async function listKeyRings() {
const [keyRings] = await client.listKeyRings({
parent: locationName,
});
for (const keyRing of keyRings) {
console.log(keyRing.name);
}
return keyRings;
}
return listKeyRings();

最新更新