6

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

GCF 从不应知道第三方 API 的服务使用的 Pubsub 主题接收通知。

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

为了不必在我的源代码中硬编码密码,我每次部署我的函数时都使用 Google KMS 生成一个新的加密密钥。每次实例化函数时,我都使用 Google Cloud KMS 来解密密钥。

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

我今天的主要问题是,如果我希望我的 GCF 正常工作,我必须将我的私钥推送到 GCloud Bucket。

是否可以使用 Runtime Configurator 或 Deployment Manager 为 Google Cloud Function 配置机密?

谢谢。

4

4 回答 4

4

仅在过去几个月中出现的另一个解决方案是将 Google Cloud Runtime Configuration 与 Firebase 一起用于功能: https ://firebase.google.com/docs/functions/config-env

Firebase for Functions 似乎提供了对通过其他方式尚不可用的几个功能的访问。

Runtime Configurator 不收取使用费,但会强制执行以下 API 限制和配额:

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

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 Function 的成本从每百万次调用 0.40 美元更改为每百万次调用 3.40 美元。那是相当的跳跃。

于 2017-07-17T04:44:40.117 回答
4

截至 2019 年 12 月,在 Google Cloud 上存储和管理机密的首选方式是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"),
  },
});

然后,在您的云函数中:

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 Functions 的服务帐户将需要roles/secretmanager.secretAccessor权限。

于 2019-12-22T17:07:09.597 回答
2

是否可以使用 Runtime Configurator 或 Deployment Manager 为 Google Cloud Function 配置机密?

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

如果您愿意,可以使用适当的问题跟踪器向 Cloud Function 团队提出功能请求。

于 2017-06-14T13:30:14.717 回答
0

还有一个谷歌云密钥管理服务: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();
于 2021-02-11T03:20:29.417 回答