使用客户管理的加密密钥 (CMEK) 加密数据

本页介绍如何对存储在 AML AI 中的数据进行加密 具有客户管理的加密密钥 (CMEK) 的实例。

概览

AML AI 实例中的所有客户数据都会进行静态加密 使用 CMEK 密钥。您可以在 Cloud Key Management Service (Cloud KMS) 中管理该密钥,并使用 Identity and Access Management 控制对该密钥的访问权限。如果您暂时停用 或永久销毁 CMEK 密钥,则使用相应密钥加密的数据将无法用于 。

AML AI 仅支持使用 Cloud KMS 的 CMEK。不支持 Google 默认加密。

借助 CMEK,您可以控制 使用密钥,但也会产生额外的费用 Cloud KMS 服务。

Cloud KMS 可以在 AML AI 所在的 Google Cloud 项目中运行,也可以在用于集中管理多个项目密钥的另一个项目中运行。

加密配置是在创建实例时设置的。实例创建完毕后,您便无法再 分配一个不同的 Cloud KMS 密钥。您仍然可以轮替密钥

如需大致了解 CMEK,请参阅 Cloud KMS 文档

保护级别

Cloud KMS 支持从各种不同的保护级别中进行选择, 包括:

  • 软件密钥
  • 使用 Cloud HSM 的硬件安全模块 (HSM)

了解如何在 AML AI 中配置 CMEK。并非所有 所有区域都提供此功能。请注意,AML AI 不支持客户提供的加密密钥 (CSEK) 或 Cloud External Key Manager。

客户数据

AML AI 处理的所有客户数据都会使用相应父级实例资源中指定的 CMEK 密钥进行静态加密。这包括与 AML AI 关联的所有客户数据 例如数据集、引擎配置、模型等。所有临时文件和 客户数据的永久性存储,包括输入和输出的副本, 生成的机器学习特征、模型超参数、模型权重和预测 结果将使用相应实例的 CMEK 密钥进行加密。

有关 客户数据,这可能不包括资源标识符、属性或其他 数据标签。

加密输入和输出数据

实例中的 AML AI 加密配置仅使用 AML AI 资源及其数据。AML AI 不管理 Google Cloud 中输入或输出数据的加密 项目。如果您希望使用 CMEK 对这些数据进行加密,则必须设置 与您在 BigQuery 数据集。您还可以重复使用 AML AI 所用的相同密钥。

详细了解 BigQuery 中的加密

密钥轮替

定期自动轮替密钥是推荐的安全做法。 有了 CMEK,密钥轮替将由您控制。轮替密钥时,数据 使用先前的密钥版本加密时,系统将不会使用 新密钥版本。

一项 AML AI 资源在内部可以存储为多个 单位。如果在 AML AI 资源的生命周期内 版本轮替,因此并非所有单元都可能使用相同的密钥版本进行加密。

如果轮替密钥,则无法在 AML AI 中强制 或确定较旧的密钥版本是否可安全删除。

详细了解使用 Cloud KMS 轮替密钥

创建密钥并授予权限

以下说明介绍了如何为实例创建密钥并授予 拥有使用密钥加密和解密实例数据的权限。您可以使用直接在 Cloud KMS 中创建的密钥,也可以使用由 Cloud External Key Manager 提供的外部管理的密钥。

  1. 在您要用于管理密钥的 Google Cloud 项目中,执行以下操作:

    1. 启用 Cloud KMS API

    2. 使用 projects.locations.keyRings.create 方法。Cloud KMS 密钥环位置 必须与 位置 您加密的实例

      REST

      在使用任何请求数据之前,请先进行以下替换:

      • KMS_PROJECT_ID:Google Cloud 项目 包含密钥环的项目的 ID
      • LOCATION:密钥环的位置; 请使用 支持的区域
        显示位置
        • us-central1
        • us-east1
        • asia-south1
        • europe-west1
        • europe-west2
        • europe-west4
        • northamerica-northeast1
        • southamerica-east1
      • KEY_RING_ID:用户定义的标识符 密钥环

      如需发送请求,请选择以下方式之一:

      curl

      执行以下命令:

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d "" \
      "https://cloudkms.googleapis.com/v1/projects/KMS_PROJECT_ID/locations/LOCATION/keyRings?key_ring_id=KEY_RING_ID"

      PowerShell

      执行以下命令:

      $cred = gcloud auth print-access-token
      $headers = @{ "Authorization" = "Bearer $cred" }

      Invoke-WebRequest `
      -Method POST `
      -Headers $headers `
      -Uri "https://cloudkms.googleapis.com/v1/projects/KMS_PROJECT_ID/locations/LOCATION/keyRings?key_ring_id=KEY_RING_ID" | Select-Object -Expand Content

      您应该收到类似以下内容的 JSON 响应:

      {
        "name": "projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_ID",
        "createTime": "2023-03-14T15:52:55.358979323Z"
      }
      

      gcloud

      在使用下面的命令数据之前,请先进行以下替换:

      • KMS_PROJECT_ID:Google Cloud 项目 包含密钥环的项目的 ID
      • LOCATION:密钥环的位置; 请使用 支持的区域
        显示位置
        • us-central1
        • us-east1
        • asia-south1
        • europe-west1
        • europe-west2
        • europe-west4
        • northamerica-northeast1
        • southamerica-east1
      • KEY_RING_ID:用户定义的标识符 密钥环

      执行以下命令:

      Linux、macOS 或 Cloud Shell

      gcloud kms keyrings create KEY_RING_ID \
        --project KMS_PROJECT_ID --location LOCATION

      Windows (PowerShell)

      gcloud kms keyrings create KEY_RING_ID `
        --project KMS_PROJECT_ID --location LOCATION

      Windows (cmd.exe)

      gcloud kms keyrings create KEY_RING_ID ^
        --project KMS_PROJECT_ID --location LOCATION
      您应该会收到空响应:
      $

    3. 使用 projects.locations.keyRings.cryptoKeys 方法。

      REST

      在使用任何请求数据之前,请先进行以下替换:

      • KMS_PROJECT_ID:包含密钥串的项目的 Google Cloud 项目 ID
      • LOCATION:密钥环的位置; 请使用 支持的区域
        显示位置
        • us-central1
        • us-east1
        • asia-south1
        • europe-west1
        • europe-west2
        • europe-west4
        • northamerica-northeast1
        • southamerica-east1
      • KEY_RING_ID:用户定义的 ID 密钥环
      • KEY_ID:用户定义的密钥标识符

      请求 JSON 正文:

      {
        "purpose": "ENCRYPT_DECRYPT"
      }
      

      如需发送请求,请选择以下方式之一:

      curl

      将请求正文保存在名为 request.json 的文件中。在终端中运行以下命令,在当前目录中创建或覆盖此文件:

      cat > request.json << 'EOF'
      {
        "purpose": "ENCRYPT_DECRYPT"
      }
      EOF

      然后,执行以下命令以发送 REST 请求:

      curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @request.json \
      "https://cloudkms.googleapis.com/v1/projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_ID/cryptoKeys?crypto_key_id=KEY_ID"

      PowerShell

      将请求正文保存在名为 request.json 的文件中。在终端中运行以下命令,在当前目录中创建或覆盖此文件:

      @'
      {
        "purpose": "ENCRYPT_DECRYPT"
      }
      '@  | Out-File -FilePath request.json -Encoding utf8

      然后,执行以下命令以发送 REST 请求:

      $cred = gcloud auth print-access-token
      $headers = @{ "Authorization" = "Bearer $cred" }

      Invoke-WebRequest `
      -Method POST `
      -Headers $headers `
      -ContentType: "application/json; charset=utf-8" `
      -InFile request.json `
      -Uri "https://cloudkms.googleapis.com/v1/projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_ID/cryptoKeys?crypto_key_id=KEY_ID" | Select-Object -Expand Content

      您应该收到类似以下内容的 JSON 响应:

      {
        "name": "projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_ID/cryptoKeys/KEY_ID",
        "primary": {
          "name": "projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING_ID/cryptoKeys/KEY_ID/cryptoKeyVersions/1",
          "state": "ENABLED",
          "createTime": "2023-03-14T15:52:55.358979323Z",
          "protectionLevel": "SOFTWARE",
          "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION",
          "generateTime": "2023-03-14T15:52:55.358979323Z"
        },
        "purpose": "ENCRYPT_DECRYPT",
        "createTime": "2023-03-14T15:52:55.358979323Z",
        "versionTemplate": {
          "protectionLevel": "SOFTWARE",
          "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION"
        },
        "destroyScheduledDuration": "86400s"
      }
      

      gcloud

      在使用下面的命令数据之前,请先进行以下替换:

      • KMS_PROJECT_ID:Google Cloud 项目 包含密钥环的项目的 ID
      • LOCATION:密钥环的位置; 请使用 支持的区域
        显示位置
        • us-central1
        • us-east1
        • asia-south1
        • europe-west1
        • europe-west2
        • europe-west4
        • northamerica-northeast1
        • southamerica-east1
      • KEY_RING_ID:用户定义的 ID 密钥环
      • KEY_ID:用户定义的键标识符

      执行以下命令:

      Linux、macOS 或 Cloud Shell

      gcloud kms keys create KEY_ID \
        --keyring KEY_RING_ID \
        --project KMS_PROJECT_ID \
        --location LOCATION \
        --purpose "encryption"

      Windows (PowerShell)

      gcloud kms keys create KEY_ID `
        --keyring KEY_RING_ID `
        --project KMS_PROJECT_ID `
        --location LOCATION `
        --purpose "encryption"

      Windows (cmd.exe)

      gcloud kms keys create KEY_ID ^
        --keyring KEY_RING_ID ^
        --project KMS_PROJECT_ID ^
        --location LOCATION ^
        --purpose "encryption"
      您应该会收到空响应:
      $

  2. 如果您尚未在 AML AI 项目和 AML AI 服务 账号尚不存在。创建服务账号。

    在使用下面的命令数据之前,请先进行以下替换:

    • PROJECT_ID:Google Cloud 项目 运行 AML AI 的项目的 ID

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud beta services identity create --service=financialservices.googleapis.com --project=PROJECT_ID

    Windows (PowerShell)

    gcloud beta services identity create --service=financialservices.googleapis.com --project=PROJECT_ID

    Windows (cmd.exe)

    gcloud beta services identity create --service=financialservices.googleapis.com --project=PROJECT_ID

    您应该会收到类似如下所示的响应:

    Service identity created: service-PROJECT_NUMBER@gcp-sa-financialservices.iam.gserviceaccount.com

  3. 向 AML AI 服务账号授予 CryptoKey Encrypter/Decrypter IAM 角色 (roles/cloudkms.cryptoKeyEncrypterDecrypter)。为您创建的密钥授予此权限。

    在使用下面的命令数据之前,请先进行以下替换:

    • PROJECT_ID:Google Cloud 项目 运行 AML AI 的项目的 ID
    • KEY_ID:用户定义的键标识符
    • LOCATION:密钥环的位置; 请使用 支持的区域
      显示位置
      • us-central1
      • us-east1
      • asia-south1
      • europe-west1
      • europe-west2
      • europe-west4
      • northamerica-northeast1
      • southamerica-east1
    • KEY_RING_ID:用户定义的标识符 密钥环
    • PROJECT_NUMBER:Google Cloud 项目编号 (针对运行 AML AI 的项目)

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud kms keys add-iam-policy-binding KEY_ID --project=PROJECT_ID \
      --location LOCATION --keyring=KEY_RING_ID \
      --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-financialservices.iam.gserviceaccount.com \
      --role roles/cloudkms.cryptoKeyEncrypterDecrypter

    Windows (PowerShell)

    gcloud kms keys add-iam-policy-binding KEY_ID --project=PROJECT_ID `
      --location LOCATION --keyring=KEY_RING_ID `
      --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-financialservices.iam.gserviceaccount.com `
      --role roles/cloudkms.cryptoKeyEncrypterDecrypter

    Windows (cmd.exe)

    gcloud kms keys add-iam-policy-binding KEY_ID --project=PROJECT_ID ^
      --location LOCATION --keyring=KEY_RING_ID ^
      --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-financialservices.iam.gserviceaccount.com ^
      --role roles/cloudkms.cryptoKeyEncrypterDecrypter

    您应该会收到类似如下所示的响应:

    Updated IAM policy for key KEY_ID.
    bindings:
    - members:
      - serviceAccount:service-PROJECT_NUMBER@gcp-sa-financialservices.iam.gserviceaccount.com
      role: roles/cloudkms.cryptoKeyEncrypterDecrypter
    etag: BwYCq0Sq4Ho=
    version: 1
    

    有关此命令的详细信息,请参阅 gcloud kms keys add-iam-policy-binding 文档。

现在,您可以 创建实例 并指定用于加密的密钥。

移除访问权限

您可以通过以下几种方法从 CMEK 加密的实例中移除对密钥的访问权限:

我们建议您先撤消 AML AI 服务账号的权限,然后再停用或销毁密钥。对权限的变更 因此您可以观察停用 销毁密钥的行为。

停用或销毁实例的加密密钥后,您将丢失 使用或检索与实例关联的客户数据的能力。全部 存储在该实例中的客户数据(包括模型、 引擎配置、回测结果和预测结果。具有任何 AML AI 查看器角色的用户仍然可以查看实例名称或检索 AML AI 资源返回的其他资源字段等字段。

任何使用或导出客户数据的操作(例如导出 backtestResults 元数据)都将失败。

具有 AML AI Administrator 角色的用户 或所有者角色可以删除实例。

CMEK 组织政策

AML AI 不支持 CMEK 组织政策。不过, 无论客户采用哪种方式,AML AI 始终需要使用 CMEK。 constraints/gcp.restrictNonCmekServices 项组织政策。

与 VPC-SC 交互

如果您已在 VPC-SC 边界内配置 AML AI,则服务账号必须仍然能够访问 CMK 密钥。如果密钥不是 位于同一个 VPC-SC 边界内,可以通过多种方式来实现, 包括:

  • 使用出站规则将资源列入许可名单
  • 使用 VPC 边界对等互连

后续步骤