使用 CMEK 和 Cloud Storage 限制 Cloud KMS 密钥的加密/解密权限

0 google-cloud-storage google-cloud-kms

我在一个 Google 云项目中有两个存储桶,例如storage-project。一个使用默认加密的存储桶,另一个使用在另一个名为security-project. 我已授予的角色Cloud KMS CryptoKey Encrypter/Decrypter在云存储服务帐户(service-xxxxxxxx@gs-project-accounts.iam.gserviceaccount.com) storage-project。我可以使用拥有这两个项目的 Google 帐户成功将文件上传到此存储桶。这是预期的行为。

现在我有其他用户帐户,谁拥有的角色Viewer,并Storage Object Creatorstorage-project,并没有任何权限security-project。我担心的是,上述用户能够从第二个存储桶上传和下载文件,即使用户没有被授予对上述密钥的加密/解密权限。

根据链接https://cloud.google.com/storage/docs/encryption/customer-managed-keys#service-accounts使用客户管理的加密密钥进行加密和解密是使用服务帐户完成的。这隐含地意味着Storage Object Creator在 上有角色的任何人都storage-project可以使用该密钥进行加密/解密。

有什么方法可以限制用户的加密/解密权限?更具体地说,该用户应该能够将文件上传到第一个存储桶,而不是第二个存储桶,就像我们使用 AWS KMS + S3 所做的那样。

set*_*rgo 8

背景

一些背景背景对于这有意义很重要。在 Google Cloud 上,许多服务都以服务帐号的形式运行。例如,Google Cloud Storage 的每个 Google Cloud 项目都有一个唯一的服务帐号。您可以通过 Cloud Console、API 甚至 curl获取 Cloud Storage 服务帐户(如下所示):

$ curl https://storage.googleapis.com/storage/v1/projects/${PROJECT_ID}/serviceAccount \
    --header "Authorization: Bearer $(gcloud auth print-access-token)" 
Run Code Online (Sandbox Code Playgroud)

服务帐户通常表示为电子邮件,例如:

service-1234567890@gs-project-accounts.iam.gserviceaccount.com
Run Code Online (Sandbox Code Playgroud)

当 Cloud Storage 服务与其他 GCP 服务交互时,它会使用此服务帐号来授权这些操作。

客户管理的加密密钥

默认情况下,所有数据都在 Google Cloud 上进行静态加密。通常,此数据使用 Google 管理的密钥进行加密。当您为 Cloud Storage启用Customer Managed Encryption Keys (CMEK) 时,您将Cloud Storage 存储分区配置为使用提供的Cloud KMS密钥自动加密/解密上传/下载的数据。作为客户,您可以通过 Cloud KMS 控制该密钥。

注意:我将解释这是如何上传文件的,但同样的原则也适用于下载文件。

没有 CMEK

如果没有 CMEK,开发者会将对象上传到 Cloud Storage。Cloud Storage 使用 Google 管理的加密密钥加密对象并将加密的对象保存到磁盘:

+-----------+         +---------------+                           +-------+
| Developer |         | Cloud Storage |                           | Disk  |
+-----------+         +---------------+                           +-------+
      |                       |                                       |
      | Upload object         |                                       |
      |---------------------->|                                       |
      |                       | ----------------------------------\   |
      |                       |-| Encrypt with Google-managed key |   |
      |                       | |---------------------------------|   |
      |                       |                                       |
      |                       | Write encrypted object                |
      |                       |-------------------------------------->|
      |                       |                                       |
Run Code Online (Sandbox Code Playgroud)

与 CMEK

使用 CMEK,开发人员可以将对象上传到 Cloud Storage。Cloud Storage 使用 Cloud Storage 服务帐户调用 Cloud KMS API 来加密对象并将加密的对象持久化到磁盘:

+-----------+         +---------------+                     +-----------+ +-------+
| Developer |         | Cloud Storage |                     | Cloud KMS | | Disk  |
+-----------+         +---------------+                     +-----------+ +-------+
      |                       |                                   |           |
      | Upload object         |                                   |           |
      |---------------------->|                                   |           |
      |                       |                                   |           |
      |                       | Encrypt this object               |           |
      |                       |---------------------------------->|           |
      |                       |                                   |           |
      |                       |       Here's the encrypted object |           |
      |                       |<----------------------------------|           |
      |                       |                                   |           |
      |                       | Write encrypted object            |           |
      |                       |---------------------------------------------->|
      |                       |                                   |           |
Run Code Online (Sandbox Code Playgroud)

这里最重要的一点是 Cloud KMS API 是使用 Cloud Storage 服务帐户的身份调用的,而不是调用开发者的身份。

这是设计使然,因为大多数客户希望 CMEK 对开发人员透明。当您在 Cloud Storage 存储分区上启用 CMEK 时,开发人员无需了解 CMEK 配置。他们照常使用 Cloud Storage API,而 Cloud Storage 会使用您指定的密钥来处理加密/解密操作。开发人员不需要 Cloud KMS 密钥的权限,因为如上图所示,开发人员从不直接与 Cloud KMS 交互。

限制访问

所以,重新审视你原来的问题:

有什么方法可以限制用户的加密/解密权限?更具体地说,该用户应该能够将文件上传到第一个存储桶,而不是第二个存储桶,就像我们使用 AWS KMS + S3 所做的那样。

您在这里有几个选择:

  1. 您可以使用应用层加密 (ALE) 而不是 CMEK。您仍然可以使用 Cloud KMS,但保存到 Cloud Storage之前,开发人员会使用 Cloud KMS 对数据进行加密:

    +-----------+                       +-----------+ +---------------+                                      +-------+
    | Developer |                       | Cloud KMS | | Cloud Storage |                                      | Disk  |
    +-----------+                       +-----------+ +---------------+                                      +-------+
          |                                   |               |                                                  |
          | Encrypt this object               |               |                                                  |
          |---------------------------------->|               |                                                  |
          |                                   |               |                                                  |
          |       Here's the encrypted object |               |                                                  |
          |<----------------------------------|               |                                                  |
          |                                   |               |                                                  |
          | Upload KMS-encrypted object       |               |                                                  |
          |-------------------------------------------------->|                                                  |
          |                                   |               | ----------------------------------\              |
          |                                   |               |-| Encrypt with Google-managed key |              |
          |                                   |               | |---------------------------------|              |
          |                                   |               |                                                  |
          |                                   |               | Write KMS-encrypted, Google-encrypted object     |
          |                                   |               |------------------------------------------------->|
          |                                   |               |                                                  |
    
    Run Code Online (Sandbox Code Playgroud)
  2. 不要授予用户对存储桶的权限。您需要限制对存储桶的 IAM 权限,而不是限制对key 的IAM 权限。