【问题标题】:Can we save wrapped keys generated with cloud KMS keys in DLP deidentification templates(using Python Api)?我们可以将使用云 KMS 密钥生成的打包密钥保存在 DLP 去识别模板中(使用 Python Api)吗?
【发布时间】:2020-12-11 12:53:45
【问题描述】:

我正在做一个 PII 去识别项目并使用谷歌云的数据丢失防护 api。

用例:使用云 KMS 密钥加密字段。

  • 创建了一个 dlp-deidentification 模板,这里是 sn-p:
{
  "deidentify_template":{
    "display_name":"deidentification_encryption",
    "description":"deidentification_encryption",
    "deidentify_config":{
      "record_transformations":{
        "field_transformations":[
          {
            "fields":[
              {
                "name":"password"
              }
            ],
            "primitive_transformation":{
              "crypto_hash_config": {
                "crypto_key": {
                    "kms_wrapped": {
                      "wrapped_key": "[base64 encoded]",
                      "crypto_key_name": "kms-key-resource-name"
                    }
              }
              }
            }
  • 将模板保存为 JSON 文件。

  • 当我尝试使用 python Api 构建模板时,出现以下错误:

TypeError: Cannot set google.privacy.dlp.v2.KmsWrappedCryptoKey.wrapped_key [base64-encoded]: [base64-encoded] has type <class 'str'>, but expected one of: (<class 'bytes'>,) for field KmsWrappedCryptoKey

我们如何在 json 中写入字节?不确定是否可行

我使用的解决方法:

  • 使用临时加密密钥创建了一个模板:
                      "cryptoKey": {
                        "transient": {
                            "name": "ola-32"
                      }
                    }
                }
  • 在 DLP UI 中修改了模板配置。
  • 将密码字段的转换更改为 KMS 包装的加密密钥。
  • 添加了资源名称和 KMS 生成的密钥。
  • 它工作正常,测试了模板。

补充观察:

  • 我调用了一个 API 来检查配置,在我使用 UI 添加 KMS 密钥后,我看到了这样的包装密钥:

据我所知,无法在 json 中使用这种格式的包装密钥。

有没有办法通过保存为 json 的模板来使用 KMS 密钥?

【问题讨论】:

    标签: google-cloud-platform google-cloud-kms google-cloud-dlp


    【解决方案1】:

    是的,您应该能够在模板中使用 KMSWrapped 密钥。您可以使用 JSON 并调用 API 或通过 Cloud Console UI here 来执行此操作。

    您遇到的错误可能是由于密钥以错误的格式包装。

    我刚刚完成了这些步骤,并通过KMSWrappedKey 获得了一个成功运行的 DLP deidentify_template

    要创建包装密钥,您可以尝试以下步骤:

    1. 创建一个KMS Key Ring and Key。稍后您将使用它来包装您的去标识化密钥。
    2. 创建一个 128/192/256 加密密钥以用作您的 DLP 去标识化密钥。
    3. Base64 对步骤 #2 中的密钥进行编码。
    4. 使用第 1 步中的 KMS 密钥对第 3 步中的这个 base64 编码密钥进行包装/加密。

    示例KMS 调用:

    curl "https://cloudkms.googleapis.com/v1/projects/<project-id>/locations/global/keyRings/<key-ring-id>/cryptoKeys/<key-id>:encrypt" \
      --request "POST" \
      --header "Authorization:Bearer $(gcloud auth application-default print-access-token)" \
      --header "content-type: application/json" \
      --data "{\"plaintext\": \"<your base64 encoded key>\"}"
    

    这应该产生类似的输出

    {
      "name": "projects/<project-id>/locations/global/keyRings/<key-ring-id>/cryptoKeys/<key-id>/cryptoKeyVersions/1",
      "ciphertext": "<cipher text>",
      "ciphertextCrc32c": "<some number>"
    }
    
    1. name 字段中的内容复制到DLP cryptoKeyName,但删除最后一部分/cryptoKeyVersions/1 并将ciphertext 值中的内容复制到DLP wrappedKey 字段中。

    例子:

    ...
            "crypto_hash_config": {
              "crypto_key": {
                  "kmsWrapped": {
                    "wrappedKey": "CiQA4yqJRKIrMRQCdYdsSHIhqGthDuuxnhBOLN512drs6f59tt4SOQAwcYzUXvT1tJQmHHhqycGMj/lB+UPkmIb7j+QcIGxtQuMbuqG2xdRC8WVMQ9MFJ9tuOO6vxJqaVw==",
                    "cryptoKeyName": "projects/<project-id>/locations/global/keyRings/<key-ring-id>/cryptoKeys/<key-id>"
                  }
              }
            }
    
    1. 保存您的模板并尝试一下。您可以在API tester hereCloud DLP Console template tester here 中对其进行测试(只需单击您创建的模板,然后单击Test 选项卡)。

    2. 下面是creating a template 的完整 JSON 示例。您只需要在您的项目下以您的项目作为父 ID 运行它,并且需要确保您的关键资源 ID 与您的匹配。这里我在一个名为project-test-123的项目中使用了一个名为keyring1的密钥环和一个名为key1的密钥:

    {
      "deidentifyTemplate": {
        "deidentifyConfig": {
          "infoTypeTransformations": {
            "transformations": [
              {
                "primitiveTransformation": {
                  "cryptoHashConfig": {
                    "cryptoKey": {
                      "kmsWrapped": {
                        "cryptoKeyName": "projects/project-test-123/locations/global/keyRings/keyring1/cryptoKeys/key1",
                        "wrappedKey": "CiQA4yqJRKIrMRQCdYdsSHIhqGthDuuxnhBOLN512drs6f59tt4SOQAwcYzUXvT1tJQmHHhqycGMj/lB+UPkmIb7j+QcIGxtQuMbuqG2xdRC8WVMQ9MFJ9tuOO6vxJqaVw=="
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      },
      "templateId": "test1"
    }
    

    注意:这是一个随机生成的 128 位密钥,已使用 KMS 包装。请不要在任何生产系统中使用此实际密钥或保护任何数据,因为它已在此处公开发布。

    【讨论】:

    • 嘿@Scott:我遇到了同样的错误,你是如何创建 128 位加密密钥的?我正在使用 openssl openssl rand -base64 16。如果我遵循解决方法,相同的键正在工作。如果格式错误,它不应该双向工作。
    • 我使用的解决方法:创建了一个简单的瞬态加密。转到 UI 将其修改为 KMS 密钥加密(添加了资源名称和 KMS 生成的密钥)。它工作正常。如果您需要更多详细信息,请告诉我。
    • 编辑了问题,提供了更多解决方法的细节。当在 json 文件中使用相同的密钥时,它会失败,但它使用 UI 工作。
    • 即使我使用 UI 创建模板时它也能正常工作。 我在尝试使用保存的 json 文件中的 API 调用创建模板时遇到问题。
    • 我测试了这个 JSON 以使用 CURL 命令或直接在 API Explorer/tester 中创建模板:cloud.google.com/dlp/docs/reference/rest/v2/… re: Python,你的 Python 代码是否有可能是 base64 编码的东西两次或做其他类型的字节处理?
    猜你喜欢
    • 2020-02-21
    • 2021-02-09
    • 2020-10-08
    • 2018-07-28
    • 2016-12-31
    • 1970-01-01
    • 2015-10-08
    • 2016-05-01
    • 2016-10-04
    相关资源
    最近更新 更多