【问题标题】:How do i handle secrets in Google Cloud Functions?如何处理 Google Cloud Functions 中的机密信息?
【发布时间】:2018-05-19 22:17:40
【问题描述】:

这里的常见做法是什么? gcloud 似乎没有提供任何工具。我现在正在从本地机器部署功能,所以我可以对秘密进行硬编码,但这似乎不合适。另外,CI/CD 呢?在这种情况下,我需要将秘密作为环境变量传递。这甚至可能atm吗?

【问题讨论】:

  • 不,很遗憾,这是不可能的。像谷歌这样的公司推出的产品不可能实现如此简单的功能,这真是太疯狂了,但我们只需要凑合。希望一旦 Cloud Functions 完成测试版,他们会添加此功能。

标签: google-cloud-platform google-cloud-functions


【解决方案1】:

您可以为此使用Secret Manager。按照链接上的说明添加密钥。

我发现的唯一 GOTCHA 是,默认情况下,服务帐户没有对机密的读取权限,您必须手动授予权限,如下所示:

【讨论】:

    【解决方案2】:

    自从发表评论以来,我找到了一种相对简单的方法 - 提供一个配置 .json 文件。这是我根据他们的 Slack 函数示例一起破解的示例:

    config.json 文件与 index.js 位于同一目录中:

    {
      "foo": "bar"
    }
    

    index.js

    const config = require('./config.json');
    
    exports.envTest = (req, res) => {
      res.status(200).send(config.foo);
    };
    

    当您部署函数并转到 URL 时,您应该会收到响应 bar

    优点和缺点:

    优点:

    1. 在您的 IDE 中轻松设置和配置
    2. 可以将配置文件放入.gitignore 以确保您的秘密不会最终被回购
    3. 文件本身可以存储在安全的位置,并且只提供给负责部署功能的个人

    缺点:

    1. 与适当的秘密管理相比显得笨拙
    2. 需要注意确保文件不会落入坏人之手
    3. 可以通过查看函数源在 Google Cloud 控制台中以明文形式读取文件

    总体而言,它与真正的机密管理系统相去甚远,但它足以让我坚持下去,直到此功能最终成为 Cloud Functions 核心。

    【讨论】:

    • 如果只能在云控制台或存储代码的存储桶中以纯文本形式查看机密。我不知道这个解决方案是否真的提供了很多价值。不妨硬编码你的仓库中的秘密。
    • 我不同意,你可以严格控制谁可以访问云控制台。这是您的整个开发人员群都可以访问这些秘密,而一个人被指定运行 GCP 门户之间的区别。不,这并不理想,但任何事情都比硬编码秘密更好。
    • 公平。是的,这比在源代码管理中进行硬编码要好。
    • 如果您的函数是供私人使用的,那么您可以加密文件并将解密密钥作为标题或帖子正文传递。这与某种嵌入的密钥可以结合起来解密文件并揭示秘密。但是,如果您的函数被其他人公开调用,那么使这项工作变得更加困难。这导致在一定程度上满足静态加密和通过混淆的安全性。同样,这不是最佳的,但 imo 甚至比其他解决方案更好。 p.s.嘿丹
    • 你也可以使用firebase functions:config:set api_key="whatever",见这里:firebase.google.com/docs/functions/config-env相信你的开发者。如果黑客访问了您的 GCP 帐户,他们无论如何都可以窃取所有机密。
    【解决方案3】:

    你应该使用Cloud Key Management Service(KMS)
    不要使用文件或环境变量将纯机密推送到 Cloud Functions。

    一个解决方案如下:

    1. 在 Cloud KMS 上创建密钥
    2. 使用该密钥加密机密文件
    3. 将加密的机密文件上传到 Google Cloud Storage(GCS)(指定用户可以访问)
    4. 在 Cloud Function Execution 中,从 GCS 获取上传的机密文件,解密并使用它

    [参考]Secret management using the Google Cloud Platform

    【讨论】:

    • 您能否详细说明上述答案?一篇简短的文章可能对每个人都有帮助。
    • 我建议使用这种方法,但使用环境变量而不是 GCS。这将使访问和更新密钥变得更加容易,但同样安全,因为您仍在使用 KMS 进行加密/解密。
    【解决方案4】:

    自 2021 年 8 月 25 日起,在 Google Cloud Functions 中处理机密的首选方式是使用 native Secret Manager integration。这种集成使您能够通过环境变量或文件系统在 Google Secret Manager 中挂载机密。

    1. 创建或将您的密钥迁移到 Google Secret Manager(有一个大方的永远免费层):

      $ gcloud secrets create "my-secret" --replication-policy="automatic" --data=...
      
    2. 更新您的 Cloud Function 部署以引用该密钥:

      作为环境变量:

      $ gcloud beta functions deploy "my-function" --set-secrets "MY_SECRET=my-secret:latest"
      

      通过文件系统:

      $ gcloud beta functions deploy "my-function" --set-secrets "/path/to/my/secret=my-secret:latest"
      

    为了实践最小权限原则,建议将每个 Cloud Functions 部署为专用服务帐户。您需要授予该服务帐户对您的应用程序所需机密的访问权限。

    【讨论】:

    • 这很好,但似乎 terraform 资源 google_cloudfunctions_function 尚不支持。有这方面的计划吗?
    • 我正在尝试完全做到这一点并将秘密安装为卷,但即使在 __dirname 中打印了整个目录树之后似乎也没有任何内容出现。任何想法为什么会这样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2018-01-02
    • 2021-08-21
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多