我正在使用带有Pubsub触发器的Google云端功能(GCF),该触发器向第三方API发送HTTP请求。
GCF从服务使用的Pubsub主题接收通知,该主题不应该知道第三方API。
第三方API需要使用基本HTTP身份验证进行身份验证。
为了不必在我的源代码中对密码进行硬编码,我每次部署我的函数时都使用Google KMS生成新的加密密钥。每次实例化函数时,我都会使用Google Cloud KMS来解密密码。
对于使用KMS进行解密,我必须为NodeJS Google API提供服务帐户的私钥。
我今天的主要问题是,如果我希望我的GCF正常工作,我必须将私钥推送到GCloud Bucket。
是否可以使用Runtime Configurator或Deployment Manager为Google Cloud Function配置机密?
谢谢你。
答案 0 :(得分:2)
是否可以使用Runtime Configurator或Deployment Manager为Google Cloud Function配置机密?
目前没有内置服务可让您将秘密配置为Google Cloud Functions直接访问,因此您当前使用的方法是暂时处理云功能机密的正确方法。这可能会随着产品仍处于测试阶段而改变。
如果您愿意,可以使用相应的issue tracker向Cloud Function小组发出功能请求。
答案 1 :(得分:2)
仅在最近几个月推出的另一个解决方案是使用带有Firebase功能的Google Cloud Runtime配置: https://firebase.google.com/docs/functions/config-env
Firebase for Functions似乎可以访问通过其他方式尚未提供的多个功能。
运行时配置程序不收取使用费,但强制执行以下API限制和配额:
- 每分钟1200次查询(QPM),用于删除,创建和更新请求
- 600 QPM用于观看请求。
- 6000 QPM获取和列出请求。
- 每个用户4MB的数据,包括写入Runtime Configurator服务的所有数据和随附的元数据。
https://cloud.google.com/deployment-manager/pricing-and-quotas#runtime_configurator
顺便说一句,我发现Firebase for Functions中的这个冲突可笑:
Firebase SDK for Cloud Functions提供了内置的环境配置,可以轻松存储和检索项目的此类数据,而无需重新部署您的功能。
过了一会儿:
运行
functions:config:set
,后,您必须重新部署功能以使新配置可用。
KMS解决方案是一种可行的替代方案,但功能似乎很昂贵。 KMS的每个活动密钥每月收费0.06美元,每10,000次操作收费0.03美元。
然后,这会将您的Cloud功能的成本从每百万次调用0.40美元更改为每百万次调用3.40美元。这真是一个跳跃。
答案 2 :(得分:1)
截至2019年12月,在Secret Manager上存储和管理机密信息的首选方式是:
$ 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"),
},
});
然后,在您的Cloud Function中:
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
用于部署Cloud Function的服务帐户将需要roles/secretmanager.secretAccessor
权限。
答案 3 :(得分:0)
还有一项 Google Cloud 密钥管理服务: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();