如何使用公钥和 GPG 加密自动加密 GCS 存储桶中的文件

ETD*_*per 1 encryption gnupg google-cloud-storage google-cloud-platform google-cloud-build

我正在开发一个自动化流程,在某些特定步骤中需要检测文件何时“登陆”或在特定 GCS 存储桶中创建。然后使用公钥对其进行加密,生成一个扩展名为“.gpg”的文件并将其存储在另一个文件夹或存储桶中,因此链中的下一步将查找这些加密文件并对其执行其他操作。

也许我只是把这个问题复杂化了,但我曾想过使用Cloud Storage 的Pub/sub 通知并激活将运行 gpg 命令的 Cloud Build 触发器,如下所示:

gpg --import a_public_key.pub.asc
gpg --encrypt-files -r some@email.com gs://some_bucket/somefodler/some_file_here.gz
Run Code Online (Sandbox Code Playgroud)

我觉得必须存在一种更直接的方法来做到这一点。顺便说一句,我试图避免(如果可能的话)任何需要先下载对象、加密它们然后将它们上传回来的替代方案。每个文件大小约为 5 GB。

我非常感谢您提供的任何帮助。

我注意到您可以指定您希望在特定存储桶中使用的“加密类型”: https: //cloud.google.com/storage/docs/encryption。但是,它看起来不像我需要的。据我了解,这样做的作用是在对象“生存”在存储桶中时对它们进行加密。但一旦下载或传输,GCP 就会解密它们。(可能是我理解错了,不过我是这么理解的,如有错误请指正)

gui*_*ere 6

你的问题有很多部分。

事件触发

首先,在云存储上创建的文件的 PubSub 通知是一个很好的解决方案。更现代的方法是使用新的 Eventarc 服务,但最后它会执行相同的操作(在 PubSub 中接收消息)。

事件处理

Cloud Build 的使用可能会令人惊讶,但它是您运行 bash 命令的便捷方式。对于某些边缘情况,这可能是一个解决方案,对于 5GB 文件,您可以使用 Cloud Functions gen2 或 Cloud Run。云构建在并行性(并发构建)方面存在限制,并且您的解决方案的可扩展性不太好

  • Cloud Functions gen2 允许您拥有高达 32Gb 的内存,足以下载 1 个文件并将其加密的等效项保留在内存中。您可以使用 Python 或 或语言库通过代码(而不是通过 bash CLI)执行相同的操作。在我的公司,我们使用Gnupg
  • Cloud Run 与 Cloud Functions gen2 非常相似(具有相同的底层基础设施),但您可以完全控制容器,从而完全控制运行时环境。您可以创建一个安装了 GPG 的容器,并用 Python 或任何其他语言调用 bash 操作来使用已安装的系统二进制文件

在这两种情况下,将并发设置为 1 以确保每个实例仅处理 1 个文件并防止内存不足错误

文件下载

您必须下载文件才能对其进行加密吗?这里有什么问题?我的第一个答案是:您必须读取文件的所有字节才能对其进行加密。因此,您将完整下载它,至少仅用于阅读,即使在流媒体模式下也是如此。我个人更喜欢下载文件然后对其进行处理,而不是流式读取它。特别是如果您的加密校验和错误,重试会更容易,因为文件已经下载。

但是,当然,您必须考虑在进程结束后删除文件,除非您仅将内容保留在内存中的变量中,这样,它将自动交换。

加密和安全

你关于加密的问题很好。事实上,一切都取决于您想要实现的目标。

Google Cloud 确保您的数据无论在传输过程中还是静态时始终都是加密的。

当您上传或下载文件(或访问 API 之类的其他内容)时,您始终处于 HTTPS 状态,因此您的数据会被加密

在 Cloud Storage 上,数据使用内部 Google Cloud 密钥进行加密。您可以使用 CMEK 选项(客户管理的加密密钥)选择密钥的位置和轮换频率。但密钥仍然由 Google Cloud 拥有/托管。

您还可以与提供不属于 Google Cloud 的安全密钥的第三方公司合作,并使用 CSEK(客户提供的加密密钥)配置您的存储桶。这次,Google Cloud 不会保留密钥,如果无法访问第三方公司密钥,也无法解密您的数据。

所以,是的,如果您有权限,数据将由 Google 解密并以 HTTPS 加密方式发送。

GPG的使用

GPG 的使用有 2 个特定用例:

  • 您不信任 Google,并且希望拥有自己的加密层,由您管理
  • 您希望将数据发送给拥有解密密钥的第三方来读取数据。这样,即使许多第三方公司都可以访问同一个存储桶并可以下载任何文件,只有那些拥有正确密钥的公司才能解密其专用文件。

链接所有步骤的更好解决方案是使用PubSub (或 Eventarc)触发的云工作流。像这样,您可以为上传到 Cloud Storage 的每个文件创建一个管道,然后

  • 调用 Cloud Run/Cloud Functions gen2 来加密文件
  • 之后做某事
  • 做点别的事
  • ....