DLP プロキシを使用した Cloud SQL の操作

このチュートリアルでは、クエリで返された結果がトークン化または匿名化されるように、Cloud Data Loss Prevention(Cloud DLP)経由で結果を渡すプロキシの使用方法について説明します。このプロキシは、このチュートリアルの説明に使用するもので、本番環境での使用を想定したものではありません。

このチュートリアルは、Cloud SQL に保存されているデータを Cloud DLP でトークン化するデータベース管理者、セキュリティ担当者、クラウド アーキテクトを対象としています。このチュートリアルは、Cloud Shell と Cloud SQL に精通していることを前提としています。

どの組織でも、保存されるデータの量は増え続けています。また、その大半はセンシティブ データに分類されます。しかし、このようなデータにアクセスするすべてのユーザーが、データベースにクエリを実行したときにセンシティブ データの表示を必要としているわけではありません。

このチュートリアルでは、センシティブ データを含む Cloud SQL データベースへのアクセスは制限しませんが、クエリ結果を表示するときに、こうしたセンシティブ データが表示されないようにします。

次の図に、このチュートリアルのデプロイ アーキテクチャを示します。

ユーザーが Cloud SQL データベースにアクセスできるデプロイ アーキテクチャ。

このチュートリアルでは、Cloud SQL とシンプルな SQL クライアント間のインターフェースとして機能する DLP プロキシを設定します。

目標

  • データベースを作成して、センシティブ データのサンプルでテーブルを更新する。
  • Cloud DLP テンプレートを作成する。
  • DLP プロキシ サーバーとクライアント JAR ファイルをダウンロードする。
  • Cloud SQL インスタンス データベースに接続し、Cloud DLP テンプレートを使用するように DLP プロキシを構成する。
  • プロキシ機能をテストする。

費用

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. 必要な API を有効にします。

    API を有効にする

Cloud SQL for MySQL データベースの作成

このセクションでは、Cloud SQL インスタンスを作成し、Cloud SQL for MySQLデータベースを作成して、センシティブ データのサンプルを追加します。

  1. Cloud Console で、Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

    Cloud Console の下部にある Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。gcloud コマンドライン ツールなどの Cloud SDK がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  2. このチュートリアルのすべてのコマンドは Cloud Shell で実行されます。
  3. このチュートリアルに必要なファイルを Google の一般公開 Cloud Storage バケットから gcp-dlp-tutorial フォルダにコピーします。
    mkdir gcp-dlp-proxy-tutorial
    gsutil cp  gs://solutions-public-assets/dlp-cloudsql-proxy/*.* gcp-dlp-proxy-tutorial
    
  4. Cloud プロジェクトを設定します。
    gcloud config set project project-id
    

    以下を置き換えます。

    • project-id: 実際の Cloud プロジェクトの ID。
  5. チュートリアル ファイルをコピーしたフォルダに移動します。
    cd  gcp-dlp-proxy-tutorial
    
  6. ゾーンのリストを表示するには、次のコマンドを実行します。
    gcloud compute zones list
    

    ゾーンの詳細については、地域とリージョンをご覧ください。

  7. ゾーンを選択して Cloud SQL インスタンスを作成し、ゾーンを環境変数としてエクスポートします。
    export ZONE=zone
    

    以下を置き換えます。

    • zone: Cloud SQL インスタンスを作成するゾーン。
  8. dlp-test-instance という名前で Cloud SQL for MySQL インスタンスを作成します。
    gcloud sql instances create dlp-test-instance  --zone  $ZONE
    

    インスタンスが作成されると、次のような出力が表示されます。

    Creating Cloud SQL instance...done.
    Created [https://www.googleapis.com/sql/v1beta4/projects/[PROJECT_ID]/instances/dlp-test-instance].
    NAME               DATABASE_VERSION  LOCATION  TIER              PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS
    dlp-test-instance  MYSQL_5_7         [ZONE]    db-n1-standard-1  35.195.26.16     -                RUNNABLE
    
  9. MySQL ユーザー root@% のパスワードを設定します。
    gcloud sql users set-password root \
      --host=% --instance=dlp-test-instance \
      --password=password
    

    以下を置き換えます。

    • password: 安全なパスワード。

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

    Updating Cloud SQL user...done.
    
  10. インスタンスに dlp-test-db という名前のデータベースを作成します。
    gcloud sql databases create  dlp-test-db --instance dlp-test-instance
    

    出力は次のようになります。

    Creating Cloud SQL database...done.
    Created database [dlp-test-db].
    instance: dlp-test-instance
    name: dlp-test-db
    project: project-id
    
  11. dlptester というデータベース ユーザーを作成します。
    gcloud sql users create dlptester \
      --host=% --instance=dlp-test-instance --password=password-database
    

    以下を置き換えます。

    • password-database: 安全なパスワードで置き換えます。パスワードは後で必要になるため、メモしておいてください。

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

    Creating Cloud SQL user...done.
    Created user [dlptester].
    
  12. Cloud SQL for MySQL インスタンスに接続します。
    gcloud sql connect dlp-test-instance  --user=dlptester
    

    プロンプトが表示されたら、「password-database」と入力します。

  13. MySQL プロンプトで、TEST_DATA というテーブルを作成し、センシティブ データのサンプルを数行入力します。
    source create_test_data.sql
    
  14. MySQL プロンプトでクエリを実行し、テストデータがテーブルに読み込まれたことを確認します。
    select * from TEST_DATA LIMIT 10;
    

    クエリの結果は次のようになります。

    MySQL [dlp-test-db]> select * from TEST_DATA LIMIT 10;
    +------+---------------------+--------------+-------------+--------+
    | id   | email               | phone        | ssn         | metric |
    +------+---------------------+--------------+-------------+--------+
    |    1 | mallory@example.org | 858-222-0222 | 222-22-2222 |      5 |
    |    2 | james@example.org   | 858-333-0333 | 333-33-3333 |      8 |
    |    3 | mallory@example.org | 858-222-0222 | 222-22-2222 |      8 |
    |    4 | maria@example.org   | 858-444-0444 | 444-44-4444 |      1 |
    |    1 | mallory@example.org | 858-222-0222 | 222-22-2222 |      5 |
    |    2 | james@example.org   | 858-333-0333 | 333-33-3333 |      8 |
    |    3 | mallory@example.org | 858-222-0222 | 222-22-2222 |      8 |
    |    4 | maria@example.org   | 858-444-0444 | 444-44-4444 |      1 |
    +------+---------------------+--------------+-------------+--------+
    8 rows in set (0.00 sec)
    
  15. MySQL クライアントを終了します。
    exit
    

Cloud DLP テンプレートの作成

このセクションでは、2 つの Cloud DLP テンプレートを作成します。最初のテンプレートは、TEST_DATA テーブルを検査して、InfoType でセンシティブ データと定義されているデータを識別するためのテンプレートです。2 つ目のテンプレートは、InfoType で定義されたセンシティブ データをトークン化し、匿名化するためのテンプレートです。

検査テンプレートを作成する

  1. Cloud Console で、[Cloud DLP] ページに移動します。

    Cloud DLP に移動

  2. [作成] をクリックして、[テンプレート] を選択します。

  3. [テンプレート ID] フィールドに「inspect-template-1」と入力します。

  4. [続行] をクリックします。

  5. InfoTypesEMAIL_ADDRESSPHONE_NUMBERUS_SOCIAL_SECURITY_NUMBER に設定します。

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

匿名化テンプレートを作成する

このセクションでは、de-identify-template-1 という名前の匿名化テンプレートを作成し、暗号ハッシュで生成されたサロゲート値でセンシティブ情報を置き換えます。詳細については、Cloud DLP ドキュメントの cryptoHashConfig をご覧ください。

  1. API Explorer に移動します。

  2. [parent] フィールドで、[YOUR-PROJECT] を実際の Cloud プロジェクトの ID に置き換えます。

  3. [Execute] を選択します。プロンプトが表示されたら、もう一度 [Execute] を選択します。

    次のような 200 レスポンスと出力が返されます。

    {
      "name": "projects/YOUR-PROJECT-ID/deidentifyTemplates/de-identify-template-1",
      "createTime": "2019-10-15T12:46:51.944253Z",
      "updateTime": "2019-10-15T12:46:51.944253Z",
      "deidentifyConfig": {
        "infoTypeTransformations": {
          "transformations": [
            {
              "infoTypes": [
                {
                  "name": "PHONE_NUMBER"
                },
                {
                  "name": "US_SOCIAL_SECURITY_NUMBER"
                },
                {
                  "name": "EMAIL_ADDRESS"
                }
              ],
              "primitiveTransformation": {
                "cryptoDeterministicConfig": {
                  "cryptoKey": {
                    "transient": {
                      "name": "abc"
                    }
                  },
                  "surrogateInfoType": {
                    "name": "S1"
                  }
    
  4. 匿名化テンプレートが正常に保存されたことを確認するため、API Explorer に戻り、テンプレートの一覧を表示します。

  5. [parent] フィールドに「projects/project-id」と入力します。

  6. [Execute] を選択します。プロンプトが表示されたら、もう一度 [Execute] を選択します。

    次のような出力が表示されます。作成したテンプレートが含まれています。

    API Explorer の出力。

DLP プロキシの構成と使用

このセクションでは、DLP プロキシを構成し、クライアントを使用してプロキシに接続して、クエリ結果が Cloud DLP によって処理されることを確認します。

  1. Cloud Shell で、チュートリアル ファイルをコピーしたフォルダのディレクトリに移動します。

    cd  ~/gcp-dlp-proxy-tutorial
    
  2. DLP プロキシ サーバーの構成ファイルを編集します。

    nano config.json
    
  3. 次の行を編集して、プレースホルダを構成の値で置き換えます。

    "db_instance": "project_id:region:instance_name",
    "db_dbname": "dbase_name",
    "projectID": "project_id",
    "audit_template": "inspect_template",
     "deidentify_template": "deidentify_template",
    

    以下を置き換えます。

    • project_id: 実際の Cloud プロジェクトの ID。
    • region: Cloud SQL インスタンスを作成したゾーンに対応するリージョン名。たとえば、インスタンスを us-central1-a ゾーンに作成した場合、リージョンは us-central1. です。
    • instance_name: Cloud SQL インスタンス名(dlp-test-instance など)。
    • dbase_name: データベース名(dlp-test-db など)。
    • inspect_template: 検査テンプレートの名前(inspect-template-1 など)。
    • inspect_template: 匿名化テンプレートの名前(de-identify-template-1 など)。
  4. DLP プロキシを起動するには、ターミナルの出力を log.txt ファイルにリダイレクトし、バックグラウンドでプロキシを実行します。

    java -jar dlp-cloudsql-proxy-server.jar database_userpassword-databaselog.txt 2>&1 &
    

    以下を置き換えます。

    • database_user: データベース ユーザーのユーザー名。
    • password-database: 以前に作成したデータベース ユーザーのパスワード。
  5. DLP プロキシが動作していることを確認するため、プロセスが実行されていることを確認します。

    ps -ax | grep dlp-cloudsql-proxy-server.jar
    

    DLP プロキシを実行しているプロセスが出力に表示されます。

    1233 pts/1    Sl     0:08 java -jar dlP-cloudsql-proxy-Server.jar dlptester XXXXXXXX
    1266 pts/1    S+     0:00 grep --color=auto dlp-cloud sql-proxy-Server
    

    プロセスが実行されていない場合は、log.txt ファイルでエラー メッセージを確認します。

  6. 付属のシンプルなクライアントを起動し、ポート 5000 で DLP プロキシに接続します。

    java -jar dlp-sql-proxy-client-0.1.0.jar 5000
    
  7. クライアントから簡単なクエリを実行します。このコマンドは、Cloud DLP がデータを処理してから結果を返すため、しばらく時間がかかることがあります。

    select * from TEST_DATA LIMIT 10;
    

    出力では、クエリ結果に含まれる電話番号、メールアドレス、SSN の値がハッシュ値で暗号化されたサロゲート値で置き換えられています。プロキシを使用しない場合に返された結果と比べてください。

    Connected to SQL Proxy
    Enter query here (enter "quit" to disconnect):
    select * from TEST_DATA LIMIT 10;
    id: 1
    phone: S1(40):AYnPXA6QcxlpOITeaZZM3+U/s7KtXyTqv5KAbB8=
    metric: 5
    email: S1(48):AS8hnzz6g1fGCabK2cbhPn5X7Qvc7FKmLTXnKF1iKF2nRjGQ
    ssn: S1(40):AQ1jSCdIsctniCkCHNEbsc+kliJArHmM6bOJRg==
    
    id: 2
    phone: S1(40):AfiaKlOYHAzgWGtrkpvaCWUY1e2yvMaK7IQvM/M=
    metric: 8
    email: S1(48):ASF7UBFuZ/xUzXJjD1Ap745xcGmKpTjw+IwIBB/F/OX53w==
    ssn: S1(40):AWYXh7U8PhNUZu+fXLuLFS0KCMmcM5uKH17rig==
    
    id: 3
    phone: S1(40):AYnPXA6QcxlpOITeaZZM3+U/s7KtXyTqv5KAbB8=
    metric: 8
    email: S1(48):AS8hnzz6g1fGCabK2cbhPn5X7Qvc7FKmLTXnKF1iKF2nRjGQ
    ssn: S1(40):AQ1jSCdIsctniCkCHNEbsc+kliJArHmM6bOJRg==
    
    id: 4
    phone: S1(40):AXFnPkf620wIBXxW0uuBXSVERzRzvhdgbCdaYIw=
    metric: 1
    email: S1(48):AZgs1pfjEPLL6sDAcIZWuCZhC/saw/rQrujxAFy/O60uIA==
    ssn: S1(40):AatdICHDpwCc19ELEjCS8zAmeSVvx/1KB5/S2Q==
    
    End of query results
    
  8. クライアントを終了します。

    quit
    
  9. DLP プロキシ サーバーを終了します。

    killall java
    
  10. log.txt ファイルをターミナルに出力し、DLP プロキシからの出力を表示します。

    cat  log.txt
    

    前に構成した 3 つの InfoType と一致するファイルの最後に監査フェーズの出力が表示されます。

    RunCommand
    DLP Result
    DLP Findings:
            Quote:                          Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
            Quote:                          Info type: EMAIL_ADDRESS        Likelihood: LIKELY
            Quote:                          Info type: US_SOCIAL_SECURITY_NUMBER    Likelihood: VERY_LIKELY
            Quote:                          Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
            Quote:                          Info type: EMAIL_ADDRESS        Likelihood: LIKELY
            Quote:                          Info type: US_SOCIAL_SECURITY_NUMBER    Likelihood: VERY_LIKELY
            Quote:                          Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
            Quote:                          Info type: EMAIL_ADDRESS        Likelihood: LIKELY
            Quote:                          Info type: US_SOCIAL_SECURITY_NUMBER    Likelihood: VERY_LIKELY
            Quote:                          Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
            Quote:                          Info type: EMAIL_ADDRESS        Likelihood: LIKELY
            Quote:                          Info type: US_SOCIAL_SECURITY_NUMBER    Likelihood: VERY_LIKELY
    
    Got DLP Result
    Sensitive information found
    write log: 1503994
    Logged Main.Query: 1503994
    

クリーンアップ

課金を停止する最も簡単な方法は、チュートリアル用に作成した Cloud プロジェクトを削除することです。また、リソースを個別に削除することもできます。

プロジェクトの削除

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ