1

我正在使用 GCP KMS,似乎当我将文件发送到 GCP 存储桶(使用 gustil cp)时,它是加密的。

但是,我有一个与使用不同服务帐户从同一存储桶恢复该文件的权限有关的问题。我的意思是,我用来从存储桶中恢复文件的服务帐户没有解密权限,即使如此,gustil cp 也可以工作。

我的问题是这是正常行为,还是我遗漏了什么?

让我描述一下我的问题:

  1. 首先,我确认bucket的默认加密是我之前设置的KEY:

    $ kms encryption gs://my-bucket
    
    Default encryption key for gs://my-bucket:
    projects/my-kms-project/locations/my-location/keyRings/my-keyring/cryptoKeys/MY-KEY
    
  2. 接下来,使用 gcloud config,我设置了一个服务帐户,该帐户具有“Storage Object Creator”和“Cloud KMS CryptoKey Encrypter”权限:

    $ gcloud config set account my-service-account-with-Encrypter-and-object-creator-permissions
    Updated property [core/account].
    
  3. 我将本地文件发送到存储桶:

    $ gsutil cp my-file gs://my-bucket
    
    Copying file://my-file [Content-Type=application/vnd.openxmlformats-officedocument.presentationml.presentation]...
    | [1 files][602.5 KiB/602.5 KiB]
    Operation completed over 1 objects/602.5 KiB.
    

    将文件发送到存储桶后,我确认文件已使用我之前创建的 KMS 密钥加密:

    $ gsutil ls -L gs://my-bucket
    
    gs://my-bucket/my-file:
        Creation time:          Mon, 25 Mar 2019 06:41:02 GMT
        Update time:            Mon, 25 Mar 2019 06:41:02 GMT
        Storage class:          REGIONAL
        KMS key:                projects/my-kms-project/locations/my-location/keyRings/my-keyring/cryptoKeys/MY-KEY/cryptoKeyVersions/1
        Content-Language:       en
        Content-Length:         616959
        Content-Type:           application/vnd.openxmlformats-officedocument.presentationml.presentation
        Hash (crc32c):          8VXRTU==
        Hash (md5):             fhfhfhfhfhfhfhf==
        ETag:                   xvxvxvxvxvxvxvxvx=
        Generation:             876868686868686
        Metageneration:         1
        ACL:                    []
    
  4. 接下来,我设置了另一个服务帐户,但这次没有 DECRYPT 权限和对象查看器权限(以便它能够从存储桶中读取文件):

    $ gcloud config set account my-service-account-WITHOUT-DECRYPT-and-with-object-viewer-permissions
    
    Updated property [core/account].
    
  5. 设置新的服务帐户(没有解密权限)后,从存储桶中恢复文件的 gustil 工作顺利......

    gsutil cp gs://my-bucket/my-file .
    
    Copying gs://my-bucket/my-file...
    \ [1 files][602.5 KiB/602.5 KiB]                                                
    Operation completed over 1 objects/602.5 KiB.        
    

我的问题是这是否是正常行为?或者,由于新的服务帐户没有解密权限,gustil cp恢复文件应该不起作用?我的意思是,这不是使用 KMS 加密的想法,第二个gustil cp命令应该失败并出现“403 权限被拒绝”错误消息或其他东西..

如果我从第二个服务帐户撤消“存储对象查看器”权限(从存储桶中恢复文件),在这种情况下,gustil 失败,但这是因为它没有读取文件的权限:

$ gsutil cp gs://my-bucket/my-file . 
AccessDeniedException: 403 my-service-account-WITHOUT-DECRYPT-and-with-object-viewer-permissions does not have storage.objects.list access to my-bucket.

如果其他人可以帮助我并澄清问题,我将不胜感激......特别是我不确定该命令是否gsutil cp gs://my-bucket/my-file .应该工作。

我认为它不应该工作(因为服务帐户没有解密权限),还是应该工作?

4

2 回答 2

1

这工作正常。当您将 Cloud KMS 与 Cloud Storage 结合使用时,数据的加密和解密是在 Cloud Storage 服务的权限下进行的,而不是在请求访问对象的实体的权限下进行的。这就是为什么您必须将 Cloud Storage 服务帐户添加到您的密钥的 ACL 才能使 CMEK 工作。

当一个加密的 GCS 对象被访问时,访问者的 KMS 解密权限永远不会被使用,并且它的存在是不相关的。

如果您不希望第二个服务帐户能够访问该文件,请移除其读取权限。

于 2019-03-25T14:02:17.913 回答
0

默认情况下,Cloud Storage 使用 Google 管理的加密密钥加密所有对象数据。您可以改为提供自己的密钥。有两种类型:

  1. 您必须提供的 CSEK
  2. 您还提供了 CMEK,但这次由 Google KMS 服务管理(这是您正在使用的服务)。

当你使用时gsutil cp,你已经在使用幕后的加密方法了。因此,如Using Encryption Keys的文档中所述:

虽然解密 CSEK 加密的对象需要在其中一个解密密钥属性中提供 CSEK,但这对于解密 CMEK 加密的对象不是必需的,因为用于加密对象的 CMEK 的名称存储在对象的元数据中。

如您所见,密钥不是必需的,因为它已经包含在gsutil正在使用的对象的元数据中。

如果未提供 encryption_key,gsutil 确保它写入或复制的所有数据改为使用目标存储桶的默认加密类型 - 如果存储桶设置了默认 KMS 密钥,则使用 CMEK 进行加密;如果不是,则使用 Google 管理的加密。

于 2019-03-25T15:20:20.377 回答