Cloud Storage にアップロードされたデータの分類の自動化

このチュートリアルでは、Cloud Storage およびその他の Google Cloudプロダクトを使用して、自動データ隔離および分類システムを実装する方法を示します。このチュートリアルは、読者がGoogle Cloud と基本的な shell プログラミングに精通していることを前提としています。

あらゆる組織において、データ保護責任者は、常時増え続ける、適切な保護や扱いが必要なデータに対応します。特に 1 日に数百、数千のファイルに対応する場合、そのデータの隔離と分類は複雑で時間がかかる場合があります。

ファイルを取得して隔離場所にアップロードし、分類結果に基づいて適切な場所に自動的に移動することはできないものでしょうか。このチュートリアルでは、Cloud Run functionsCloud StorageSensitive Data Protection を使用して、このようなシステムを実装する方法を説明します。

サービス アカウントへの権限の付与

まず、Cloud Run functions サービス アカウントと Cloud Data Loss Prevention サービス エージェントに権限を付与します。

App Engine のデフォルトのサービス アカウントに権限を付与する

  1. Google Cloud コンソールで、[IAM と管理] ページを開き、作成したプロジェクトを選択します。

    IAM に移動

  2. App Engine のサービス アカウントを見つけます。このアカウントの形式は、[PROJECT_ID]@appspot.gserviceaccount.com です。ここで、[PROJECT_ID] は使用するプロジェクト ID に置き換えてください。

  3. サービス アカウントの横に表示された編集アイコン を選択します。

  4. 次のロールを追加します。

    • DLP 管理者
    • DLP API サービス エージェント
  5. [保存] をクリックします。

Cloud Data Loss Prevention サービス エージェントに権限を付与する

Cloud Data Loss Prevention サービス エージェントは、必要になったときに初めて作成されます。

  1. Cloud Shell で、InspectContent を呼び出して Cloud Data Loss Prevention サービス エージェントを作成します。

    curl --request POST 
    "https://dlp.googleapis.com/v2/projects/PROJECT_ID/locations/us-central1/content:inspect"
    --header "X-Goog-User-Project: PROJECT_ID"
    --header "Authorization: Bearer $(gcloud auth print-access-token)"
    --header 'Accept: application/json'
    --header 'Content-Type: application/json'
    --data '{"item":{"value":"google@google.com"}}'
    --compressed

    PROJECT_ID を実際のプロジェクト ID に置き換えます。

  2. Google Cloud コンソールで、[IAM と管理] ページを開き、作成したプロジェクトを選択します。

    IAM に移動

  3. [Google 提供のロール付与を含みます] チェックボックスをオンにします。

  4. Cloud Data Loss Prevention サービス エージェントを見つけます。このアカウントの形式は、service-[PROJECT_NUMBER]@dlp-api.iam.gserviceaccount.com です。[PROJECT_NUMBER] は、使用するプロジェクト番号に置き換えます。

  5. サービス アカウントの横に表示された編集アイコン を選択します。

  6. [Project] > [閲覧者] ロールを追加し、[保存] をクリックします。

隔離と分類のパイプラインを作成する

このセクションでは、次の図に示す隔離と分類のパイプラインを作成します。

隔離と分類のワークフロー

上のパイプラインの番号は、次のステップに対応しています。

  1. ファイルを Cloud Storage にアップロードします。
  2. Cloud Functions を起動します。
  3. Sensitive Data Protection がデータを検査して分類します。
  4. ファイルが適切なバケットに移動します。

Cloud Storage バケットを作成する

バケットの命名ガイドラインのガイダンスに沿って、このチュートリアルで使用する一意の名前付きバケットを 3 つ作成します。

  • バケット 1: [YOUR_QUARANTINE_BUCKET] を一意の名前に置き換えます。
  • バケット 2: [YOUR_SENSITIVE_DATA_BUCKET] を一意の名前に置き換えます。
  • バケット 3: [YOUR_NON_SENSITIVE_DATA_BUCKET] を一意の名前に置き換えます。

Console

  1. Google Cloud コンソールで、Cloud Storage ブラウザを開きます。

    [Cloud Storage] に移動

  2. [バケットを作成] をクリックします。

  3. [バケット名] テキスト ボックスに、[YOUR_QUARANTINE_BUCKET] に選択した名前を入力して、[作成] をクリックします。

  4. [YOUR_SENSITIVE_DATA_BUCKET] バケットと [YOUR_NON_SENSITIVE_DATA_BUCKET] バケットに対して同じ操作を繰り返します。

gcloud

  1. Cloud Shell を開きます。

    Cloud Shell に移動

  2. 次のコマンドを実行して、3 つのバケットを作成します。

    gcloud storage buckets create gs://[YOUR_QUARANTINE_BUCKET]
    gcloud storage buckets create gs://[YOUR_SENSITIVE_DATA_BUCKET]
    gcloud storage buckets create gs://[YOUR_NON_SENSITIVE_DATA_BUCKET]
    

Pub/Sub トピックとサブスクリプションを作成する

コンソール

  1. [Pub/Sub トピック] ページを開きます。

    Pub/Sub トピックに移動

  2. [トピックを作成] をクリックします。

  3. テキスト ボックスにトピック名を入力します。

  4. [デフォルトのサブスクリプションを追加する] チェックボックスをオンにします。

  5. [トピックを作成] をクリックします。

gcloud

  1. Cloud Shell を開きます。

    Cloud Shell に移動

  2. トピックを作成します。[PUB/SUB_TOPIC] は任意の名前で置き換えてください。

    gcloud pubsub topics create [PUB/SUB_TOPIC]
  3. サブスクリプションを作成します。[PUB/SUB_SUBSCRIPTION] は任意の名前で置き換えてください。

    gcloud pubsub subscriptions create [PUB/SUB_SUBSCRIPTION] --topic [PUB/SUB_TOPIC]

Cloud Run functions を作成する

このセクションでは、次の 2 つの Cloud Run functions を含む Python スクリプトをデプロイする方法について説明します。

  • オブジェクトが Cloud Storage にアップロードされたときに呼び出される関数。
  • Pub/Sub キューでメッセージを受信したときに呼び出される関数。

このチュートリアルを完了するために使用する Python スクリプトは、GitHub リポジトリに含まれています。最初の Cloud Functions の関数を作成するには、正しい API を有効にする必要があります。

API を有効にする方法は次のとおりです。

  • コンソールで作業中に [関数を作成] をクリックすると、Cloud Functions を使用するために必要な API を有効にする方法を示すガイドが表示されます。
  • gcloud CLI を使用している場合は、次の API を手動で有効にする必要があります。
    • Artifact Registry API
    • Eventarc API
    • Cloud Run Admin API

1 つ目の関数の作成

コンソール

  1. Cloud Run functions の概要ページを開きます。

    Cloud Run 関数に移動します

  2. Cloud Run functions を有効にしたプロジェクトを選択します。

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

  4. [関数名] ボックスで、デフォルトの名前を create_DLP_job で置き換えます。

  5. [トリガー] フィールドで、[Cloud Storage] を選択します。

  6. [イベントタイプ] フィールドで、[ファイナライズ/作成] を選択します。

  7. [バケット] フィールドで [参照] をクリックします。プルダウン リストでバケットをハイライト表示して隔離バケットを選択し、[選択] をクリックします。

  8. [保存] をクリックします。

  9. [次へ] をクリックします。

  10. [ランタイム] で Python 3.7 を選択します。

  11. [ソースコード] で [インライン エディタ] をオンにします。

  12. [main.py] ボックス内のテキストを次のファイルの内容に置き換えます。https://github.com/GoogleCloudPlatform/dlp-cloud-functions-tutorials/blob/master/gcs-dlp-classification-python/main.py

    以下を置き換えます。

    • [PROJECT_ID_DLP_JOB & TOPIC]: Cloud Run functions と Pub/Sub トピックをホストしているプロジェクト ID。
    • [YOUR_QUARANTINE_BUCKET]: 処理されるファイルのアップロード先のバケットの名前。
    • [YOUR_SENSITIVE_DATA_BUCKET]: 機密ファイルの移動先のバケットの名前。
    • [YOUR_NON_SENSITIVE_DATA_BUCKET]: 処理されるファイルのアップロード先のバケットの名前。
    • [PUB/SUB_TOPIC]: 前に作成した Pub/Sub トピックの名前。
  13. [エントリ ポイント] テキスト ボックスで、デフォルトのテキストを create_DLP_job に置き換えます。

  14. requirements.txt テキスト ボックス内のテキストを次のファイルの内容に置き換えます。https://github.com/GoogleCloudPlatform/dlp-cloud-functions-tutorials/blob/master/gcs-dlp-classification-python/requirements.txt.

  15. [デプロイ] をクリックします。

    関数の横にある緑のチェックマークは、デプロイに成功したことを示します。

    デプロイに成功

gcloud

  1. Cloud Shell セッションを開き、コードといくつかのサンプル データファイルを含む GitHub リポジトリをクローニングします。

    Cloud Shell で開く

  2. リポジトリのクローンを作成したフォルダに移動します。

    cd ~dlp-cloud-functions-tutorials/gcs-dlp-classification-python/
  3. main.py ファイルで次のように置き換えます。

    • [PROJECT_ID_DLP_JOB & TOPIC]: Cloud Run functions と Pub/Sub トピックをホストしているプロジェクト ID。
    • [YOUR_QUARANTINE_BUCKET]: 処理されるファイルのアップロード先のバケットの名前。
    • [YOUR_SENSITIVE_DATA_BUCKET]: 機密ファイルの移動先のバケットの名前。
    • [YOUR_NON_SENSITIVE_DATA_BUCKET]: 処理されるファイルのアップロード先のバケットの名前。
    • [PUB/SUB_TOPIC: 前に作成した Pub/Sub トピックの名前。
  4. 関数をデプロイします。[YOUR_QUARANTINE_BUCKET] はバケット名で置き換えます。

    gcloud functions deploy create_DLP_job --runtime python37 \
        --trigger-resource [YOUR_QUARANTINE_BUCKET] \
        --trigger-event google.storage.object.finalize
    
  5. 関数が正常にデプロイされたことを確認します。

    gcloud functions describe create_DLP_job

    デプロイに成功すると、次のような ready ステータスが表示されます。

    status:  READY
    timeout:  60s
    

1 つ目の Cloud Functions の関数が正常にデプロイされたら、次のセクションに進んで 2 つ目の Cloud Functions の関数を作成します。

2 つ目の関数の作成

コンソール

  1. Cloud Run functions の概要ページを開きます。

    Cloud Run functions の概要ページに移動

  2. Cloud Run functions を有効にしたプロジェクトを選択します。

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

  4. [関数名] ボックスで、デフォルトの名前を resolve_DLP で置き換えます。

  5. [トリガー] フィールドで [Pub/Sub] を選択します。

  6. [Cloud Pub/Sub トピックを選択してください] フィールドで、前の手順で作成した Pub/Sub トピックを検索します。

  7. [保存] をクリックします。

  8. [次へ] をクリックします。

  9. [ランタイム] で Python 3.7 を選択します。

  10. [ソースコード] で [インライン エディタ] をオンにします。

  11. [エントリ ポイント] テキスト ボックスで、デフォルトのテキストを resolve_DLP に置き換えます。

  12. [main.py] ボックス内のテキストを次のファイルの内容に置き換えます。https://github.com/GoogleCloudPlatform/dlp-cloud-functions-tutorials/blob/master/gcs-dlp-classification-python/main.py次のように置き換えます。

    • [PROJECT_ID_DLP_JOB & TOPIC]: Cloud Run functions と Pub/Sub トピックをホストしているプロジェクト ID。
    • [YOUR_QUARANTINE_BUCKET]: 処理されるファイルのアップロード先のバケットの名前。
    • [YOUR_SENSITIVE_DATA_BUCKET]: 機密ファイルの移動先のバケットの名前。
    • [YOUR_NON_SENSITIVE_DATA_BUCKET]: 処理されるファイルのアップロード先のバケットの名前。
    • [PUB/SUB_TOPIC: 前に作成した Pub/Sub トピックの名前。
  13. [デプロイ] をクリックします。

    関数の横にある緑のチェックマークは、デプロイに成功したことを示します。

    デプロイに成功

gcloud

  1. Cloud Shell セッションを開くか再開し、コードといくつかのサンプル データファイルを含む GitHub リポジトリをクローニングします。

    Cloud Shell で開く

  2. Python コードが格納されているフォルダのディレクトリに移動します。

    cd gcs-dlp-classification-python/

  3. main.py ファイルで次のように置き換えます。

    • [PROJECT_ID_DLP_JOB & TOPIC]: Cloud Run functions と Pub/Sub トピックをホストしているプロジェクト ID。
    • [YOUR_QUARANTINE_BUCKET]: 処理されるファイルのアップロード先のバケットの名前。
    • [YOUR_SENSITIVE_DATA_BUCKET]: 機密ファイルの移動先のバケットの名前。
    • [YOUR_NON_SENSITIVE_DATA_BUCKET]: 処理されるファイルのアップロード先のバケットの名前。
    • [PUB/SUB_TOPIC: 前に作成した Pub/Sub トピックの名前。
  4. 関数をデプロイします。[PUB/SUB_TOPIC] は Pub/Sub トピックで置き換えます。

    gcloud functions deploy resolve_DLP --runtime python37 --trigger-topic [PUB/SUB_TOPIC]
  5. 関数が正常にデプロイされたことを確認します。

    gcloud functions describe resolve_DLP

    デプロイに成功すると、次のような ready ステータスが表示されます。

    status:  READY
    timeout:  60s
    

Cloud Functions が正常にデプロイされたら、次のセクションに進みます。

隔離バケットにサンプル ファイルをアップロードする

この記事に関連する GitHub リポジトリには、サンプル データファイルが含まれています。このフォルダには、機密データを含むいくつかのファイルと機密データを含まないファイルが含まれています。機密データは、次の INFO_TYPES 値の 1 つ以上を含むものとして分類されます。

US_SOCIAL_SECURITY_NUMBER
EMAIL_ADDRESS
PERSON_NAME
LOCATION
PHONE_NUMBER

サンプル ファイルの分類に使用されるデータ型は、main.py ファイルの INFO_TYPES 定数で定義されます。この定数は、最初は 'FIRST_NAME,PHONE_NUMBER,EMAIL_ADDRESS,US_SOCIAL_SECURITY_NUMBER' に設定されています。

  1. リポジトリがまだクローニングされていない場合は、Cloud Shell を開き、コードといくつかのサンプル データファイルを含む GitHub リポジトリをクローニングします。

    Cloud Shell で開く

  2. サンプル データファイルのあるフォルダに移動します。

    cd ~/dlp-cloud-functions-tutorials/sample_data/
  3. cp コマンドを使用して隔離バケットにサンプル データファイルをコピーします。[YOUR_QUARANTINE_BUCKET] を隔離バケットの名前に置き換えてください。

    gcloud storage cp * gs://[YOUR_QUARANTINE_BUCKET]/

    Sensitive Data Protection は、隔離バケットにアップロードされた各ファイルを検査、分類し、その分類に基づいて適切なターゲット バケットに移動します。

  4. Cloud Storage Console で、Storage ブラウザページを開きます。

    Cloud Storage ブラウザに移動

  5. 作成したターゲット バケットのうちの 1 つを選択して、アップロードされたファイルを確認します。また、作成した他のバケットも確認します。