为什么gsutil从使用KMS加密的存储桶中还原文件(使用未经DECRYPT许可的服务帐户)?

时间:2019-03-25 07:21:31

标签: google-cloud-kms

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

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

我的问题是这是否是正常行为,或者我是否缺少某些东西?

让我描述一下我的问题:

  1. 首先,我确认存储桶的默认加密是我之前设置的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配置,我设置了一个服务帐户,该帐户具有“存储对象创建者”和“ Cloud KMS CryptoKey加密器”权限:

    $ 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会失败,但这是因为它没有读取文件的权限: / p>

$ 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 .是否有效。

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

2 个答案:

答案 0 :(得分:1)

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

访问加密的GCS对象时,将永远不会使用访问器的KMS解密权限,并且它的存在与否无关。

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

答案 1 :(得分:0)

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

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

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

  

解密CSEK加密的对象时,需要提供CSEK   在decryption_key属性之一中,对于   解密CMEK加密的对象,因为CMEK的名称用于   加密对象存储在对象的元数据中。

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

  

如果未提供encryption_key,则gsutil会确保所有数据   写入或复制,而是使用目标存储桶的默认值   加密类型-如果存储桶具有默认的KMS密钥集,则该CMEK   用于加密;如果没有,则使用Google管理的加密。