Google Cloud のストレージとデータベースに含まれる機密データの検査

ストレージ リポジトリに保存されている機密データを適切に管理する第一歩は、ストレージの分類です。これは、機密データが置かれているリポジトリ内の場所、機密データのタイプ、機密データの使用方法を識別することです。これを知っていると、アクセス制御および共有権限を適切に設定するのに役立ち、継続的なモニタリング計画に含めることができます。

機密データの保護により、Cloud Storage のロケーション、Datastore の種類、BigQuery テーブルに保存されている機密データを検出して分類できます。Cloud Storage の領域にあるファイルをスキャンする場合、機密データの保護では、バイナリ、テキスト、画像、Microsoft Word、Microsoft Excel、Microsoft PowerPoint、PDF、Apache Avro ファイルのスキャンがサポートされます。認識されない形式のファイルは、バイナリ ファイルとしてスキャンされます。サポートされているファイル形式の詳細については、サポートされているファイル形式をご覧ください。

ストレージとデータベースの機密データを検査するには、データのロケーションと、機密データの保護が必要とする機密データの種類を指定します。機密データの保護では、指定された場所のデータを検査し、コンテンツ内の infoTypelikelihood の値などに関する詳細を使用できるようにするジョブを開始します。

ストレージとデータベースの検査は、 Google Cloud コンソールの Sensitive Data Protection、RESTful DLP API、またはSensitive Data Protection クライアント ライブラリ(複数の言語で利用可能)を使用してプログラムから設定できます。

このトピックには以下の情報が含まれます。

  • ストレージ リポジトリとデータベースのスキャンを設定するためのベスト プラクティス。 Google Cloud
  • Google Cloud コンソールで Sensitive Data Protection を使用して検査スキャンを設定する手順と、オプションで定期的な検査スキャンをスケジュールする手順。
  • 各 Google Cloud ストレージ リポジトリ タイプ(Cloud Storage、Datastore モードの Firestore(Datastore)、BigQuery)の JSON の例とコードサンプル。
  • スキャンジョブの構成オプションの詳細。
  • スキャン結果の取得方法と、正常に行われた各リクエストから作成されたスキャンジョブの管理方法に関する手順。

ベスト プラクティス

スキャンを特定して優先順位を付ける

まずアセットを評価し、どのアセットに対するスキャンの優先度を最も高くするかを指定することが重要です。開始直後は、分類が必要なデータのバックログが大量にあるため、すべてをすぐにスキャンすることはできません。アクセス頻度が高いデータ、大勢がアクセスできるデータ、不明なデータなど、潜在的なリスクが最も高いデータを最初に選択します。

機密データの保護がデータにアクセスできることを確認する

機密データの保護は、スキャン対象のデータにアクセスできる必要があります。機密データの保護のサービス アカウントにリソースの読み取りを許可してください。

最初のスキャンの範囲を制限する

最良の結果を得るには、最初のジョブで全データをスキャンするのではなく、範囲を制限します。1 つのテーブル、1 つのバケット、または少数のファイルから開始し、サンプリングを使用します。最初のスキャンの範囲を限定することで、有効にする検出器と除外ルールを効果的に決定できます。これにより、誤検出が減り、検出結果がより有意なものなります。誤検出や役に立たない検出結果により、リスクの評価が難しくなる可能性があるため、その必要がないときにすべての infoType をオンにすることは避けてください。DATETIMEDOMAIN_NAMEURL などの infoType は幅広い検出結果に一致するため、特定のシナリオを除き、大規模なデータスキャンでの使用は逆効果になる可能性があります。

CSV、TSV、Avro ファイルなどの構造化ファイルをサンプリングする場合、サンプルサイズがファイルのヘッダーとデータ行の全体に対応できるほど十分なサイズであることを確認してください。詳細については、構造化解析モードで構造化ファイルをスキャンするをご覧ください。

スキャンのスケジュールを設定する

機密データの保護のジョブトリガーを使用して、スキャンを自動的に実行し、毎日、毎週、または四半期ごとに検出結果を生成します。 また、前回のスキャン以降に変更されたデータのみを検査するように構成することもできるため、時間とコストを節約できます。定期的にスキャンを実行すると、スキャン結果の傾向や異常を特定できます。

ジョブのレイテンシ

ジョブとジョブトリガーに対するサービスレベル目標(SLO)は保証されません。レイテンシは、スキャンするデータの量、スキャン対象のストレージ リポジトリ、スキャン対象の infoType のタイプと数、ジョブが処理されるリージョン、そのリージョンで使用可能なコンピューティング リソースなどさまざまな要因に影響を受けます。したがって、検査ジョブのレイテンシは事前に決定できません。

ジョブのレイテンシを短縮するため、次の方法を試すことができます。

  • ジョブまたはジョブトリガーでサンプリングを利用できる場合は、有効にします。
  • 不要な infoType は有効にしないでください。以下は特定のシナリオで有用ですが、これらの infoType により、リクエストの実行速度がこれらを含まないリクエストよりもはるかに遅くなる可能性があります。

    • PERSON_NAME
    • FEMALE_NAME
    • MALE_NAME
    • FIRST_NAME
    • LAST_NAME
    • DATE_OF_BIRTH
    • LOCATION
    • STREET_ADDRESS
    • ORGANIZATION_NAME
  • infoType は常に明示的に指定します。空の infoType リストを使用しないでください。

  • 可能であれば、処理を行う別のリージョンを使用します。

これらの手法を試してもジョブに関するレイテンシの問題が解決しない場合は、ジョブではなく content.inspect リクエストまたは content.deidentify リクエストの使用を検討してください。これらのメソッドはサービスレベル契約の対象となります。詳細については、機密データの保護のサービスレベル契約をご覧ください。

準備

このトピックで説明する手順は、次のことを前提としています。

ストレージの分類には OAuth スコープ https://www.googleapis.com/auth/cloud-platform が必要です。詳細については、DLP API に対する認証をご覧ください。

Cloud Storage のロケーションを検査する

Cloud Storage のロケーションの Sensitive Data Protection 検査は、 Google Cloud コンソール、REST または RPC リクエストでの DLP API を使用、またはクライアント ライブラリ(複数の言語で利用可能)を使用してプログラムから設定できます。次の JSON とコードサンプルに含まれるパラメータの詳細については、このトピックで後述する「ストレージ検査を構成する」をご覧ください。

機密データの保護は、ファイル拡張子とメディア(MIME)タイプを使用して、スキャンするファイルの形式と、適用するスキャンモードを識別します。たとえば、機密データの保護では、通常は構造化解析モードでスキャンされる CSV ファイルとしてファイルが構造化されている場合でも、書式なしテキストモードで .txt ファイルをスキャンします。

機密データの保護を使用して Cloud Storage バケットのスキャンジョブを設定するには、次のようにします。

コンソール

このセクションでは、Cloud Storage バケットまたはフォルダの検査方法について説明します。Sensitive Data Protection でデータの匿名化コピーも作成する場合は、 Google Cloud コンソールを使用して Cloud Storage に保存されているセンシティブ データを匿名化するをご覧ください。

  1. Google Cloud コンソールの [Sensitive Data Protection] セクションで、[ジョブまたはジョブトリガーを作成] ページに移動します。

    [ジョブまたはジョブトリガーを作成] に移動

  2. 機密データの保護ジョブの情報を入力し、[続行] をクリックして各手順を完了します。

    • [入力データの選択] で、[名前] フィールドに値を入力して、ジョブに名前を付けます。[ロケーション] セクションで、[ストレージの種類] メニューから [Google Cloud Storage] を選択し、スキャンするデータのロケーションを入力します。[サンプリング] セクションは、データに対してサンプル スキャンを実行するように事前構成されています。大量のデータがある場合、[バケット内のスキャン対象オブジェクトの割合] フィールドを調整することでリソースを節約できます。詳細については、入力データの選択をご覧ください。

    • (省略可)[検出を構成する] では、「infoTypes」と呼ばれる検索するデータのタイプを構成できます。事前定義済みの infoType リストから選択するか、テンプレートが存在する場合はテンプレートを選択することもできます。詳細については、検出の構成をご覧ください。

    • [アクションの追加] で、ジョブの完了後に Sensitive Data Protection に実行させる 1 つ以上のアクションを選択します。詳細については、検査またはリスク分析アクションを有効にするをご覧ください。

      アクションを選択したら、[続行] をクリックします。

    • (省略可)スケジュールでは、スキャンを実行するのが 1 度のみの場合、このメニューを [なし] のままにします。スキャンを定期的に実行するには、[周期スケジュールでジョブを実行するトリガーを作成] をクリックします。詳細については、スケジュールをご覧ください。

  3. [作成] をクリックします。

  4. 機密データの保護ジョブが完了すると、ジョブの詳細ページにリダイレクトされ、メールで通知されます。検査の結果はジョブの詳細ページで確認できます。

  5. (省略可)機密データの保護の検出結果を BigQuery に公開することを選択した場合は、[ジョブの詳細] ページで [検出結果を BigQuery で表示] をクリックすると、BigQuery ウェブ UI にテーブルが開きます。その後、テーブルをクエリし、検出結果を分析できます。BigQuery での結果のクエリの詳細については、BigQuery で機密データ保護の検出結果をクエリするをご覧ください。

プロトコル

以下は、POST リクエストによって、指定された機密データの保護 REST エンドポイントに送信できるサンプル JSON です。この JSON の例では、DLP API を使用して Cloud Storage バケットを検査する方法について説明します。リクエストに含まれるパラメータの詳細については、このトピックで後述する「ストレージ検査を構成する」をご覧ください。

これは、content.inspect のリファレンスページの API Explorer で簡単に試すことができます。

API Explorer に移動

API Explorer でリクエストが成功した場合でも、新しいスキャンジョブが作成されます。スキャンジョブを制御する方法については、このトピックで後述する「検査結果を取得する」をご覧ください。JSON を使用して DLP API にリクエストを送信する方法については、JSON クイックスタートをご覧ください。

JSON 入力:

POST https://dlp.googleapis.com/v2/projects/[PROJECT-ID]/dlpJobs?key={YOUR_API_KEY}

{
  "inspectJob":{
    "storageConfig":{
      "cloudStorageOptions":{
        "fileSet":{
          "url":"gs://[BUCKET-NAME]/*"
        },
        "bytesLimitPerFile":"1073741824"
      },
      "timespanConfig":{
        "startTime":"2017-11-13T12:34:29.965633345Z",
        "endTime":"2018-01-05T04:45:04.240912125Z"
      }
    },
    "inspectConfig":{
      "infoTypes":[
        {
          "name":"PHONE_NUMBER"
        }
      ],
      "excludeInfoTypes":false,
      "includeQuote":true,
      "minLikelihood":"LIKELY"
    },
    "actions":[
      {
        "saveFindings":{
          "outputConfig":{
            "table":{
              "projectId":"[PROJECT-ID]",
              "datasetId":"[DATASET-ID]"
            }
          }
        }
      }
    ]
  }
}

JSON 出力:

{
  "name":"projects/[PROJECT-ID]/dlpJobs/[JOB-ID]",
  "type":"INSPECT_JOB",
  "state":"PENDING",
  "inspectDetails":{
    "requestedOptions":{
      "snapshotInspectTemplate":{

      },
      "jobConfig":{
        "storageConfig":{
          "cloudStorageOptions":{
            "fileSet":{
              "url":"gs://[BUCKET-NAME]/*"
            },
            "bytesLimitPerFile":"1073741824"
          },
          "timespanConfig":{
            "startTime":"2017-11-13T12:34:29.965633345Z",
            "endTime":"2018-01-05T04:45:04.240912125Z"
          }
        },
        "inspectConfig":{
          "infoTypes":[
            {
              "name":"PHONE_NUMBER"
            }
          ],
          "minLikelihood":"LIKELY",
          "limits":{

          },
          "includeQuote":true
        },
        "actions":[
          {
            "saveFindings":{
              "outputConfig":{
                "table":{
                  "projectId":"[PROJECT-ID]",
                  "datasetId":"[DATASET-ID]",
                  "tableId":"[NEW-TABLE-ID]"
                }
              }
            }
          }
        ]
      }
    }
  },
  "createTime":"2018-11-07T18:01:14.225Z"
}

Java

機密データの保護用のクライアント ライブラリをインストールして使用する方法については、機密データの保護のクライアント ライブラリをご覧ください。

機密データの保護のために認証するには、アプリケーションのデフォルト認証情報を設定します。 詳細については、ローカル開発環境の認証の設定をご覧ください。


import com.google.api.core.SettableApiFuture;
import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.privacy.dlp.v2.Action;
import com.google.privacy.dlp.v2.CloudStorageOptions;
import com.google.privacy.dlp.v2.CloudStorageOptions.FileSet;
import com.google.privacy.dlp.v2.CreateDlpJobRequest;
import com.google.privacy.dlp.v2.DlpJob;
import com.google.privacy.dlp.v2.GetDlpJobRequest;
import com.google.privacy.dlp.v2.InfoType;
import com.google.privacy.dlp.v2.InfoTypeStats;
import com.google.privacy.dlp.v2.InspectConfig;
import com.google.privacy.dlp.v2.InspectDataSourceDetails;
import com.google.privacy.dlp.v2.InspectJobConfig;
import com.google.privacy.dlp.v2.LocationName;
import com.google.privacy.dlp.v2.StorageConfig;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import