Google Cloud功能:支持Google Cloud KMS

时间:2017-06-12 18:21:56

标签: node.js google-cloud-functions google-cloud-kms

我正在使用带有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配置机密?

谢谢你。

4 个答案:

答案 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();