機密データの匿名化と再識別

このドキュメントでは、機密データの保護を使用して、テキスト コンテンツ内の機密データを匿名化し、再識別する方法について説明します。このプロセスでは、Cloud Key Management Service を使用してラップされた鍵を作成する方法について説明します。この鍵は、匿名化リクエストと再識別リクエストで必要になります。

このドキュメントで説明するプロセスは、仮名化(またはトークン化)と呼ばれます。このプロセスでは、機密データの保護で暗号鍵を使用して機密テキストをトークンに変換(再識別)します。そのテキストを復元(再識別)するには、匿名化中に使用した暗号鍵とトークンが必要です。

機密データの保護は、可逆と非可逆の両方の暗号方式をサポートします。コンテンツを再識別するには、可逆方式を選択する必要があります。

ここで説明する暗号方式は、AES-SIV を使用した確定的暗号化(合成初期化ベクトルモードの高度暗号化標準: AES-SIV)と呼ばれます。機密データの保護がサポートしているすべての可逆暗号方法の中で、最高レベルのセキュリティを提供するため、この方法をおすすめします。

このドキュメントの手順(始める前にの手順は除く)は 10〜20 分で完了できます。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.

  3. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  4. gcloud CLI を初期化するには、次のコマンドを実行します。

    gcloud init
  5. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. このガイドで既存のプロジェクトを使用する場合は、このガイドを完了するために必要な権限があることを確認します。新しいプロジェクトを作成した場合は、必要な権限がすでに付与されています。

  7. Verify that billing is enabled for your Google Cloud project.

  8. Enable the Sensitive Data Protection and Cloud KMS APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable dlp.googleapis.com cloudkms.googleapis.com
  9. Install the Google Cloud CLI.

  10. 外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

  11. gcloud CLI を初期化するには、次のコマンドを実行します。

    gcloud init
  12. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  13. このガイドで既存のプロジェクトを使用する場合は、このガイドを完了するために必要な権限があることを確認します。新しいプロジェクトを作成した場合は、必要な権限がすでに付与されています。

  14. Verify that billing is enabled for your Google Cloud project.

  15. Enable the Sensitive Data Protection and Cloud KMS APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable dlp.googleapis.com cloudkms.googleapis.com
  16. 必要なロール

    ラップされた AES 鍵の作成、機密データの匿名化、再識別に必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

    ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

    必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

    キーリングと鍵を作成する

    この手順を開始する前に、機密データの保護で匿名化と再識別リクエストを処理する場所を決定してください。Cloud KMS 鍵を作成するときは、global か、機密データの保護リクエストに使用するリージョンと同じリージョンに保管する必要があります。そうしないと、Sensitive Data Protection リクエストは失敗します。

    サポートされているロケーションのリストについては、機密データの保護のロケーションをご覧ください。選択したリージョンの名前をメモします(例: us-west1)。

    この手順では、すべての API リクエストのロケーションとして global を使用します。別のリージョンを使用する場合は、global をリージョン名に置き換えます。

    1. キーリングの作成

      gcloud kms keyrings create "dlp-keyring" \
          --location "global"
      
    2. 鍵を作成します。

      gcloud kms keys create "dlp-key" \
          --location "global" \
          --keyring "dlp-keyring" \
          --purpose "encryption"
      
    3. キーリングと鍵をリスティングします。

      gcloud kms keys list \
          --location "global" \
          --keyring "dlp-keyring"
      

      次の出力が表示されます。

      NAME: projects/<var>PROJECT_ID</var>/locations/global/keyRings/dlp-keyring/cryptoKeys/dlp-key
      PURPOSE: ENCRYPT_DECRYPT
      ALGORITHM: GOOGLE_SYMMETRIC_ENCRYPTION
      PROTECTION_LEVEL: SOFTWARE
      LABELS:
      PRIMARY_ID: 1
      PRIMARY_STATE: ENABLED
      

      この出力では、PROJECT_ID はプロジェクトの ID です。

      NAME の値は、Cloud KMS 鍵の完全リソース名です。この値は、匿名化リクエストと再識別リクエストで必要になるため、メモしておいてください。

    base64 でエンコードされた AES 鍵を作成する

    このセクションでは、Advanced Encryption Standard(AES)鍵を作成して、base64 形式でエンコードする方法について説明します。

    1. 128 ビット、192 ビット、256 ビットの AES 鍵を作成します。次のコマンドは、openssl を使用して、現在のディレクトリに 256 ビットのキーを作成します。

      openssl rand -out "./aes_key.bin" 32
      

      ファイル aes_key.bin が現在のディレクトリに追加されます。

    2. AES 鍵を base64 文字列としてエンコードします。

      base64 -i ./aes_key.bin
      

      次のような出力が表示されます。

      uEDo6/yKx+zCg2cZ1DBwpwvzMVNk/c+jWs7OwpkMc/s=
      

    Cloud KMS 鍵を使用して AES 鍵をラップする

    このセクションでは、キーリングと鍵を作成するで作成した Cloud KMS 鍵を使用して、base64 でエンコードされた AES 鍵を作成するで作成した base64 でエンコードされた AES 鍵をラップする方法について説明します。

    AES 鍵をラップするには、curl を使用して次のリクエストを Cloud KMS API projects.locations.keyRings.cryptoKeys.encrypt メソッドに送信します。

    curl "https://cloudkms.googleapis.com/v1/projects/PROJECT_ID/locations/global/keyRings/dlp-keyring/cryptoKeys/dlp-key:encrypt" \
        --request "POST" \
        --header "Authorization:Bearer $(gcloud auth application-default print-access-token)" \
        --header "content-type: application/json" \
        --data "{\"plaintext\": \"BASE64_ENCODED_AES_KEY\"}"
    

    次のように置き換えます。

    Cloud KMS からのレスポンスは、次の JSON のようになります。

    {
      "name": "projects/<var>PROJECT_ID</var>/locations/global/keyRings/dlp-keyring/cryptoKeys/dlp-key/cryptoKeyVersions/1",
      "ciphertext": "CiQAYuuIGo5DVaqdE0YLioWxEhC8LbTmq7Uy2G3qOJlZB7WXBw0SSQAjdwP8ZusZJ3Kr8GD9W0vaFPMDksmHEo6nTDaW/j5sSYpHa1ym2JHk+lUgkC3Zw5bXhfCNOkpXUdHGZKou1893O8BDby/82HY=",
      "ciphertextCrc32c": "901327763",
      "protectionLevel": "SOFTWARE"
    }
    

    この出力では、PROJECT_ID はプロジェクトの ID です。

    レスポンスの ciphertext の値をメモします。それがラップされた鍵です。

    匿名化リクエストを DLP API に送信する

    このセクションでは、テキスト コンテンツ内の機密データを匿名化する方法について説明します。

    このタスクを完了するには、次のものが必要です。

    サンプル リクエストを JSON ファイルに保存する必要があります。Cloud Shell を使用する場合は、Cloud Shell エディタを使用してファイルを作成します。エディタを起動するには、Cloud Shell ツールバーにある [エディタを開く] をクリックします。

    テキスト コンテンツ内の機密データを匿名化するには、次の手順を行います。

    1. 次のテキストを含む deidentify-request.json という JSON リクエスト ファイルを作成します。

      {
        "item": {
          "value": "My name is Alicia Abernathy, and my email address is aabernathy@example.com."
        },
        "deidentifyConfig": {
          "infoTypeTransformations": {
            "transformations": [
              {
                "infoTypes": [
                  {
                    "name": "EMAIL_ADDRESS"
                  }
                ],
                "primitiveTransformation": {
                  "cryptoDeterministicConfig": {
                    "cryptoKey": {
                      "kmsWrapped": {
                        "cryptoKeyName": "projects/PROJECT_ID/locations/global/keyRings/dlp-keyring/cryptoKeys/dlp-key",
                        "wrappedKey": "WRAPPED_KEY"
                      }
                    },
                    "surrogateInfoType": {
                      "name": "EMAIL_ADDRESS_TOKEN"
                    }
                  }
                }
              }
            ]
          }
        },
        "inspectConfig": {
          "infoTypes": [
            {
              "name": "EMAIL_ADDRESS"
            }
          ]
        }
      }
      

      次のように置き換えます。

      cryptoKeyName の結果の値が Cloud KMS 鍵の完全リソース名を形成していることを確認します。

      この JSON リクエストのコンポーネントの詳細については、projects.locations.content.deidentify をご覧ください。このタスクを完了したら、このリクエストに対して異なる入力をテストしてみてください。ここで説明するように、curl を使用できます。または、[このメソッドを試す] で当該 API リファレンス ページの API Explorer を使用することもできます。

    2. curl を使用して projects.locations.content.deidentify リクエストを作成します。

      curl -s \
          -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
          -H "Content-Type: application/json" \
          https://dlp.googleapis.com/v2/projects/PROJECT_ID/locations/global/content:deidentify \
          -d @deidentify-request.json
      

      PROJECT_ID は、プロジェクトの ID に置き換えます。

      curl にファイル名を渡すには、-d オプション(データの場合)を使用して、ファイル名の前に @ 記号を付けます。このファイルは、curl コマンドを実行するディレクトリと同じディレクトリに存在する必要があります。

      機密データの保護からのレスポンスは、次の JSON のようになります。

      {
        "item": {
          "value": "My name is Alicia Abernathy, and my email address is EMAIL_ADDRESS_TOKEN(52):AVAx2eIEnIQP5jbNEr2j9wLOAd5m4kpSBR/0jjjGdAOmryzZbE/q."
        },
        "overview": {
          "transformedBytes": "22",
          "transformationSummaries": [
            {
              "infoType": {
                "name": "EMAIL_ADDRESS"
              },
              "transformation": {
                "cryptoDeterministicConfig": {
                  "cryptoKey": {
                    "kmsWrapped": {
                      "wrappedKey": "CiQAYuuIGo5DVaqdE0YLioWxEhC8LbTmq7Uy2G3qOJlZB7WXBw0SSQAjdwP8ZusZJ3Kr8GD9W0vaFPMDksmHEo6nTDaW/j5sSYpHa1ym2JHk+lUgkC3Zw5bXhfCNOkpXUdHGZKou1893O8BDby/82HY=",
                      "cryptoKeyName": "projects/<var>PROJECT_ID</var>/locations/global/keyRings/dlp-keyring/cryptoKeys/dlp-key"
                    }
                  },
                  "surrogateInfoType": {
                    "name": "EMAIL_ADDRESS_TOKEN"
                  }
                }
              },
              "results": [
                {
                  "count": "1",
                  "code": "SUCCESS"
                }
              ],
              "transformedBytes": "22"
            }
          ]
        }
      }
      

      item フィールドで、メールアドレスが EMAIL_ADDRESS_TOKEN(52):AVAx2eIEnIQP5jbNEr2j9wLOAd5m4kpSBR/0jjjGdAOmryzZbE/q のようなトークンに置き換えられます。レスポンスのトークンの値をメモします。匿名化されたコンテンツを再識別するには、再識別リクエストでトークン全体を渡します。

    再識別リクエストを DLP API に送信する

    このセクションでは、テキスト コンテンツ内のトークン化されたデータを再識別する方法について説明します。

    このタスクを完了するには、次のものが必要です。

    トークン化されたコンテンツを再識別するには、次の手順に従います。

    1. 次のテキストを含む reidentify-request.json という JSON リクエスト ファイルを作成します。

      {
        "reidentifyConfig":{
          "infoTypeTransformations":{
            "transformations":[
              {
                "infoTypes":[
                  {
                    "name":"EMAIL_ADDRESS_TOKEN"
                  }
                ],
                "primitiveTransformation":{
                  "cryptoDeterministicConfig":{
                    "cryptoKey":{
                    "kmsWrapped": {
                      "cryptoKeyName": "projects/PROJECT_ID/locations/global/keyRings/dlp-keyring/cryptoKeys/dlp-key",
                      "wrappedKey": "WRAPPED_KEY"
                    }
                  },
                    "surrogateInfoType":{
                      "name":"EMAIL_ADDRESS_TOKEN"
                    }
                  }
                }
              }
            ]
          }
        },
        "inspectConfig":{
          "customInfoTypes":[
            {
              "infoType":{
                "name":"EMAIL_ADDRESS_TOKEN"
              },
              "surrogateType":{
      
              }
            }
          ]
        },
        "item":{
          "value": "My name is Alicia Abernathy, and my email address is TOKEN."
        }
      }
      

      次のように置き換えます。

      cryptoKeyName の結果の値が Cloud KMS 鍵の完全リソース名を形成していることを確認します。

      この JSON リクエストのコンポーネントの詳細については、projects.locations.content.reidentify をご覧ください。このタスクを完了したら、このリクエストに対して異なる入力をテストしてみてください。ここで説明するように、curl を使用できます。または、[このメソッドを試す] で当該 API リファレンス ページの API Explorer を使用します。

    2. curl を使用して projects.locations.content.reidentify リクエストを作成します。

      curl -s \
          -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
          -H "Content-Type: application/json" \
          https://dlp.googleapis.com/v2/projects/PROJECT_ID/locations/global/content:reidentify \
          -d @reidentify-request.json
      

      PROJECT_ID は、プロジェクトの ID に置き換えます。

      curl にファイル名を渡すには、-d オプション(データの場合)を使用して、ファイル名の前に @ 記号を付けます。このファイルは、curl コマンドを実行するディレクトリと同じディレクトリに存在する必要があります。

      機密データの保護からのレスポンスは、次の JSON のようになります。

      {
        "item": {
          "value": "My name is Alicia Abernathy, and my email address is aabernathy@example.com."
        },
        "overview": {
          "transformedBytes": "70",
          "transformationSummaries": [
            {
              "infoType": {
                "name": "EMAIL_ADDRESS"
              },
              "transformation": {
                "cryptoDeterministicConfig": {
                  "cryptoKey": {
                    "kmsWrapped": {
                      "wrappedKey": "CiQAYuuIGo5DVaqdE0YLioWxEhC8LbTmq7Uy2G3qOJlZB7WXBw0SSQAjdwP8ZusZJ3Kr8GD9W0vaFPMDksmHEo6nTDaW/j5sSYpHa1ym2JHk+lUgkC3Zw5bXhfCNOkpXUdHGZKou1893O8BDby/82HY=",
                      "cryptoKeyName": "projects/<var>PROJECT_ID</var>/locations/global/keyRings/dlp-keyring/cryptoKeys/dlp-key"
                    }
                  },
                  "surrogateInfoType": {
                    "name": "EMAIL_ADDRESS_TOKEN"
                  }
                }
              },
              "results": [
                {
                  "count": "1",
                  "code": "SUCCESS"
                }
              ],
              "transformedBytes": "70"
            }
          ]
        }
      }
      

      item フィールドで、メールアドレス トークンは元のテキストの実際のメールアドレスに置き換えられています。

      これで、確定的暗号化を使用して、テキスト コンテンツ内の機密データの匿名化と再識別が完了しました。

    クリーンアップ

    このページで使用したリソースについて、 Google Cloud アカウントに課金されないようにするには、リソースを含む Google Cloud プロジェクトを削除します。

    鍵バージョンを破棄する

    このタスクで作成した鍵がもう不要になった場合は、そのバージョンを破棄します。

    自分の鍵で使用できるバージョンを一覧表示します。

    gcloud kms keys versions list \
        --location "global" \
        --keyring "dlp-keyring" \
        --key "dlp-key"
    

    バージョンを破棄するには、次のコマンドを実行します。

    gcloud kms keys versions destroy KEY_VERSION \
        --location "global" \
        --keyring "dlp-keyring" \
        --key "dlp-key"
    

    KEY_VERSION は、破棄するバージョン番号(1 など)に置き換えます。

    プロジェクトの削除

    このタスク用に新しいプロジェクトを作成した場合、追加料金の発生を防ぐ最も簡単な方法としては、プロジェクトを削除します。

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    認証情報を取り消す

    Optional: Revoke credentials from the gcloud CLI.

    gcloud auth revoke

    次のステップ