👏

Cloud DLPの概要をまとめてみた。

2023/07/03に公開

Hello, DLP

こんにちは。

マッケイです。

今回は、株式会社Acompany社内で行なっている勉強会の内容をまとめます。

Acompanyでは、週に1回、データクリーンルームに関連する勉強会を行っており、今回はGCPのCloud DLPについて行った勉強会について書いていきます。

DLPとは

DLP(Data Loss Prevention)は、直訳で「データ損失防止」で、機密データが紛失したり、悪用されたり、権限範囲外のユーザーにアクセスされたりしないようにするツールとプロセスです。

各種規制対象データや機密データ、ビジネスクリティカルなデータを分類し、組織で定義されているポリシーや、GDPRやCPRAといった規制コンプライスの要件に基づくポリシーの違反を識別します。

一般的なDLPソフトウェアでは、このようなポリシー違反が検出されると、アラート、暗号化、その他の保護措置を施してデータを保護します。

そして、GCP上で管理されているDLPサービスが、Cloud DLPです。

特に機密性の高いデータを検出、分類、保護するためのフルマネージド サービス。
https://cloud.google.com/dlp?hl=ja

Cloud DLPも、GCP上で管理されているデータに対して、データの検出や暗号化、マスキングといった処理を行うことが可能です。

主な機能

  • データ ウェアハウス向けの自動化された機密データ検出
  • Cloud DLP は事実上クラウド内外のどこからでも利用可能
  • データを自動的にマスキングしてクラウドのデータをより安全に利用する
  • 構造化データにおける再識別リスクの測定
    https://cloud.google.com/dlp?hl=ja#section-2

GCPアカウントを所持していれば、すぐに始めることができます。

Cloud DLPの機能

Cloud DLPの機能は大きく分けて二つです。

  1. 機密データの検出
  2. 機密データの変換

機密データの検出: infoType検出器

Cloud DLPでは、情報タイプ(infoType)を使用して、名前、メールアドレス、電話番号、識別番号、クレジット カード番号などの機密データのタイプを定義します。

infoType検出器は、infoTypeによって一致した条件を照合し、機密データをスキャンする仕組みです。

infoTypeには、組み込みのinfoType検出器とカスタムの検出器が用意されています。

組み込みのinfoType検出器

Cloud DLPに予め組み込まれているinfoType検出器には、非常に多くのinfoTypeが用意されています。

https://cloud.google.com/dlp/docs/infotypes-reference?hl=ja

一般的なデータに対するinfoTypeをまとめる

グローバル

グローバルカテゴリで、43種類のinfoTypeが定義されています。

ここでは、PII(Personally Identifiable Information)に分類されるinfoTypeを列挙します。

概要 説明
広告識別子 Google Play 広告 ID、Amazon 広告 ID、Apple の identifierForAdvertising(IDFA)や identifierForVendor(IDFV)など
年齢 月数または年数で表されます。
出生地 出生地、居住地、市民権に言及するために使用される場合、国
生年月日 コンテキストによって生年月日として識別される日付
メールアドレス ドメイン名の最大長は 255 文字、ローカル部分の最大長は 64 文字
電話番号
女性の名前 一般的な女性の名前
男性の名前 一般的な男性の名前
名前 氏名(名、ミドルネーム、イニシャル、姓などが含まれます)
HTTP 基本認証ヘッダー 基本認証ヘッダーは、サーバーに対してユーザーを特定するために使用する HTTP ヘッダーです。RFC 1945 の HTTP 仕様の一部
HTTP Cookie と set-cookie ヘッダー サーバーに送信された Cookie またはサーバーから送信された Cookie を含むヘッダー
ICCID value for SIM cards SIMカードを一意に識別するもの
スマートフォンの IMEI 番号 携帯電話を識別するために使用される IMEI
User IMSI number 帯電話ネットワークのユーザーを識別するために使用される、IMSI識別子
IP アドレス インターネット プロトコル(IP)アドレス(IPv4 または IPv6)
MAC アドレス ネットワーク アダプタの識別子
ローカル MAC アドレス
番地 住所の番地
車両識別番号 車両識別番号(VIN)は、公道を走る自動車に割り当てられた固有の 17 桁のコード

PIIではないが、機密性が高い情報もあります。
これからのデータは大抵、SPII(Sensitive PII)に区分されています。

概要 説明
認証トークン この検出器は OAuth 認証または Bearer 認証に準拠するトークンを識別
AWSの認証情報 AWSののアカウントアクセスキー
Azure JSON ウェブトークン Azure 証明書の認証情報
クレジット カード番号 12〜19 桁のクレジット カード番号
クレジット カード トラック番号 クレジット カード トラック番号は可変長の英数字の文字列です。カード所有者に関する重要な情報の格納に使用されます
暗号鍵
Google Cloud Platform API キー GCPのAPIキー
Google Cloud Platform サービス アカウント認証情報 GCPのサービスアカウント認証情報
OAuthのクライアントシークレット 構成、コード、その他のテキスト内のクリアテキストのパスワード
SSL 証明書 セキュア ソケット レイヤ プロトコルを使用して、本人確認と安全な接続を確立するために使用される暗号証明書
最もよく使われている脆弱なハッシュ化パスワードの上位 100,000 件 ハッシュを簡単に推測できる、よく使用されるパスワード

グローバルで、PIIでかつ機密性が高い情報

  • 健康保険番号(ケベック州)
  • 出生地
  • ICCID value for SIM cards
  • スマートフォンの IMEI 番号
  • User IMSI number
  • 車両識別番号

Japan

日本で利用されるデータのifoTypeもあります。
日本のデータはどれもSPIIに区分されており、機密性はいずれも「高」で設定されています。

概要 説明
銀行口座番号
運転免許証番号
個人番号または「マイナンバー」
パスポート番号 パスポート番号はアルファベット 2 文字と 7 桁の数字で構成される

カスタムのinfoType検出器

組み込みのinfoTypeを使用しない場合、カスタムのinfoTypeを作成する必要があります。

作成には二つの方法があります。

  • カスタム辞書検出器
  • カスタム正規表現検出器

カスタム辞書検出器

辞書型のカスタム検出器を作成するには、JSON オブジェクトで任意のプロパティを指定します。

メソッドの説明

  • InfoType: 検出器に付ける名前
  • Likelihood: フィールドを指定しない場合、辞書項目と一致したものについて、デフォルトの値 VERY_LIKELYを返却
    • 検出器の誤検出の閾値を設定
  • DetectionRule: 楽観的なマッチングパターンを設定する
    • 例えば、電話番号を検出するInfoTypeに対して、先頭にTELが付いている場合を許容するなど
  • SensitivityScore: InfoTypeの機密レベルを設定
  • データのプロファイルで使用される
  • WordList: 一致させる文字列
{
  "customInfoTypes":[
    {
      "infoType":{
        "name":"CUSTOM_INFOTYPE_NAME"
      },
      "likelihood":"LIKELIHOOD_LEVEL",
      "detectionRules":[
        {
          "hotwordRule":{
            HOTWORD_RULE
          }
        },
        ...
      ],
      "sensitivityScore":{
          "score": "SENSITIVITY_SCORE"
        },
      "dictionary":
      {
        "cloudStoragePath":
        {
          "path": "gs://PATH_TO_TXT_FILE"
        }
      }
    }
  ],
  ...
}

例えば、通院患者の治療に使用された病室の情報を含むデータがあった場合、その特定のワードが入っているデータを検出します。

{
  "item":{
    "value":"Patient was seen in RM-YELLOW then transferred to rm green."
  },
  "deidentifyConfig":{
    "infoTypeTransformations":{
      "transformations":[
        {
          "primitiveTransformation":{
            "replaceWithInfoTypeConfig":{

            }
          }
        }
      ]
    }
  },
  "inspectConfig":{
    "customInfoTypes":[
      {
        "infoType":{
          "name":"CUSTOM_ROOM_ID"
        },
        "dictionary":{
          "wordList":{
            "words":[
              "RM-GREEN",
              "RM-YELLOW",
              "RM-ORANGE"
            ]
          }
        }
      }
    ]
  }
}

組み込みの infoType 検出器の拡張することも可能

...
  "inspectConfig":{
    "customInfoTypes":[
      {
        "infoType":{
          "name":"PERSON_NAME"
        },
        "dictionary":{
          "wordList":{
            "words":[
              "quasimodo"
            ]
          }
        }
      }
    ]
  }
...

カスタム正規表現検出器の作成

正規表現を定義して、パターンマッチングによる検出を行います。

メソッドの説明
~カスタム辞書検出器と重複する箇所は省略~

  • Regex : 正規表現を定義する単一のパターンで構成される
{
  "customInfoTypes":[
    {
      "infoType":{
        "name":"CUSTOM_INFOTYPE_NAME"
      },
      "likelihood":"LIKELIHOOD_LEVEL",
      "detectionRules":[
        {
          "hotwordRule":{
            HOTWORD_RULE
          }
        },
      "sensitivityScore":{
          "score": "SENSITIVITY_SCORE"
        },
      ],
      "regex":{
        "pattern":"REGULAR_EXPRESSION_PATTERN"
      }
    }
  ],
  ...
}

機密データの変換: 分類、秘匿化、匿名化

infoType検出器で検出したデータは、分類、秘匿化、匿名化を行うことで、データの保護を行うことができます。

変換手法については、以下が用意されています。

削除: 検出された機密値のすべてまたは一部を削除します。
置換: 検出された機密値を指定されたサロゲート値に置換します。
マスキング: 機密値の文字数をハッシュ(#)やアスタリスク(*)などの指定された代替文字に置き換えます。
暗号ベースのトークン化: 暗号鍵を使用して元の機密値を暗号化します。Cloud DLP は、逆行または「再識別」できる変換を含む数種類のトークン化をサポートしています。
バケット化: 機密値をある範囲の値に置き換えることによって「一般化」します(たとえば、特定の年齢を年齢の範囲に、気温を「暑い」「ふつう」「寒い」に対応する範囲に置き換えます)。
日付シフト: 機密の日付値をランダムな日数だけシフトします。
時間抽出: 日付と時刻の値の指定部分を抽出または保存します。

削除

検出したパターンを削除します。

DLP API: ReDactConfig

Input
{
  "item":{
    "value":"My name is Alicia Abernathy, and my email address is aabernathy@example.com."
  },
  "deidentifyConfig":{
    "infoTypeTransformations":{
      "transformations":[
        {
          "infoTypes":[
            {
              "name":"EMAIL_ADDRESS"
            }
          ],
          "primitiveTransformation":{
            "redactConfig":{
            }
          }
        }
      ]
    }
  },
  "inspectConfig":{
    "infoTypes":[
      {
        "name":"EMAIL_ADDRESS"
      }
    ]
  }
}

上記のJSONをCloud DLP APIにレクえすとをすると、My name is Alicia Abernathy, and my email address is aabernathy@example.com.が下記のように変換されます。

Output
{
  "item":{
    "value":"My name is Alicia Abernathy, and my email address is ."
  },
}

置換

検出したパターンを任意の文字列で置換します。

DLP API: ReplaceValueConfig, ReplaceDictionaryConfig,ReplaceWithInfoTypeConfig

Input
{
  "item":{
    "value":"My name is Alicia Abernathy, and my email address is aabernathy@example.com."
  },
  "deidentifyConfig":{
    "infoTypeTransformations":{
      "transformations":[
        {
          "infoTypes":[
            {
              "name":"EMAIL_ADDRESS"
            }
          ],
          "primitiveTransformation":{
            "replaceConfig":{
              "newValue":{
                "stringValue":"[email-address]"
              }
            }
          }
        }
      ]
    }
  },
  "inspectConfig":{
    "infoTypes":[
      {
        "name":"EMAIL_ADDRESS"
      }
    ]
  }
}

上記のJSONをCloud DLP APIにレクえすとをすると、My name is Alicia Abernathy, and my email address is aabernathy@example.com.が下記のように変換されます。

Output
{
  "item":{
    "value":"My name is Alicia Abernathy, and my email address is [email-address]."
  },
}

辞書置換も可能です。

その場合、wordListで指定されたものがランダムで出力されます。

Input
{
  "item": {
    "value": "My name is Alicia Abernathy, and my email address is aabernathy@example.com."
  },
  "deidentifyConfig": {
    "infoTypeTransformations": {
      "transformations": [
        {
          "infoTypes": [
            {
              "name": "EMAIL_ADDRESS"
            }
          ],
          "primitiveTransformation": {
            "replaceDictionaryConfig": {
              "wordList": {
                "words": [
                  "izumi@example.com",
                  "alex@example.com",
                  "tal@example.com"
                ]
              }
            }
          }
        }
      ]
    }
  },
  "inspectConfig": {
    "infoTypes": [
      {
        "name": "EMAIL_ADDRESS"
      }
    ]
  }
}
Output
{
  "item":{
    "value":"My name is Alicia Abernathy, and my email address is tal@example.com."
  },
}

infoTypeの置換も可能です。

この変換では、基本置換変換と同じ操作が行われたうえで、検出された各機密データ値が検出値の infoType に置換されます。

My name is Alicia Abernathy, and my email address is aabernathy@example.com.

次の文字列が返されます。

My name is Alicia LAST_NAME, and my email address is EMAIL_ADDRESS.

マスキング

検出した文字を、*#といった文字列で置換します。

置換処理と異なり、一部だけ適応するなどの処理も可能です。

DLP API: CharacterMaskConfig

メソッド

  • maskingCharacter: 置換文字
  • numberToMask: 先頭(または後尾)からのマスキング文字数
  • reverseOrder: 逆順にすると、一致した値の文字は値の終わりから始まりに向かってマスキングされる
  • charactersToIgnore: マスキングを無視する文字列。
Input
{
  "item":{
    "value":"My name is Alicia Abernathy, and my email address is aabernathy@example.com."
  },
  "deidentifyConfig":{
    "infoTypeTransformations":{
      "transformations":[
        {
          "infoTypes":[
            {
              "name":"EMAIL_ADDRESS"
            }
          ],
          "primitiveTransformation":{
            "characterMaskConfig":{
              "maskingCharacter":"#",
              "reverseOrder":false,
              "charactersToIgnore":[
                {
                  "charactersToSkip":".@"
                }
              ]
            }
          }
        }
      ]
    }
  },
  "inspectConfig":{
    "infoTypes":[
      {
        "name":"EMAIL_ADDRESS"
      }
    ]
  }
}
Output
{
  "item":{
    "value":"My name is Alicia Abernathy, and my email address is ##########@#######.###."
  },
  ...
}

暗号ベースのトークン化変換

暗号ベースのトークン化(「仮名化」とも呼ばれます)変換を行います。

  • 暗号ハッシュ
  • フォーマット保持暗号化
  • 確定的暗号化

暗号ハッシュ

DLP API: CryptoHashConfig

暗号ハッシュ変換を行うと、検出された情報をBase64 エンコードで変換して出力します。

以下の注意点があります。

  • 入力値は暗号化されずにハッシュされます。
  • この操作は元に戻せません。
  • ハッシュできるのは文字列と整数値のみです。

フォーマット保持暗号化

DLP API: CryptoReplaceFfxFpeConfig

入力値(Cloud DLP が検出した機密データの一部)を受け取り、それを FFX モードのフォーマット保持暗号化と CryptoKey を使用して元の値を暗号化された値(トークン)に置き換えます。

生成されるトークンは次のとおりです。

  • 暗号化された入力値です。
  • 暗号化後の文字セット(「アルファベット」)と入力値の長さを保持します。
  • 指定された暗号鍵をキーとした FFX モードのフォーマット保持暗号化を使用して計算されます。
  • 同じ入力値の各インスタンスが同じトークンに匿名化されるため、必ずしも一意ではありません。これにより参照整合性が有効になり、匿名化されたデータでより効率的な検索が可能になります。コンテキストで説明されているとおり、コンテキストの「微調整」によりこの動作を変更できます。

フォーマット保持暗号化は、Cloud DLPで用意されているCloud DLP クライアント ライブラリを用いて行えます。

Node.js
// Imports the Google Cloud Data Loss Prevention library
const DLP = require('@google-cloud/dlp');

// Instantiates a client
const dlp = new DLP.DlpServiceClient();

// The project ID to run the API call under
// const projectId = 'my-project';

// The string to deidentify
// const string = 'My SSN is 372819127';

// The set of characters to replace sensitive ones with
// For more information, see https://cloud.google.com/dlp/docs/reference/rest/v2/organizations.deidentifyTemplates#ffxcommonnativealphabet
// const alphabet = 'ALPHA_NUMERIC';

// The name of the Cloud KMS key used to encrypt ('wrap') the AES-256 key
// const keyName = 'projects/YOUR_GCLOUD_PROJECT/locations/YOUR_LOCATION/keyRings/YOUR_KEYRING_NAME/cryptoKeys/YOUR_KEY_NAME';

// The encrypted ('wrapped') AES-256 key to use
// This key should be encrypted using the Cloud KMS key specified above
// const wrappedKey = 'YOUR_ENCRYPTED_AES_256_KEY'

// (Optional) The name of the surrogate custom info type to use
// Only necessary if you want to reverse the deidentification process
// Can be essentially any arbitrary string, as long as it doesn't appear
// in your dataset otherwise.
// const surrogateType = 'SOME_INFO_TYPE_DEID';

async function deidentifyWithFpe() {
  // Construct FPE config
  const cryptoReplaceFfxFpeConfig = {
    cryptoKey: {
      kmsWrapped: {
        wrappedKey: wrappedKey,
        cryptoKeyName: keyName,
      },
    },
    commonAlphabet: alphabet,
  };
  if (surrogateType) {
    cryptoReplaceFfxFpeConfig.surrogateInfoType = {
      name: surrogateType,
    };
  }

  // Construct deidentification request
  const item = {value: string};
  const request = {
    parent: `projects/${projectId}/locations/global`,
    deidentifyConfig: {
      infoTypeTransformations: {
        transformations: [
          {
            primitiveTransformation: {
              cryptoReplaceFfxFpeConfig: cryptoReplaceFfxFpeConfig,
            },
          },
        ],
      },
    },
    item: item,
  };

  // Run deidentification request
  const [response] = await dlp.deidentifyContent(request);
  const deidentifiedItem = response.item;
  console.log(deidentifiedItem.value);
}
deidentifyWithFpe();

確定的暗号化

DLP API: CryptoDeterministicConfig

検出した情報を、[AES-SIV[(https://datatracker.ietf.org/doc/html/rfc5297)とCryptoKeyで暗号化してから、元の値を Base64 エンコードの暗号化された値に置換します。

生成されるトークンは次のとおりです。

  • 暗号化された値の Base64 エンコード表現です。
  • 暗号化後の文字セット(「アルファベット」)と入力値の長さを保持しません。
  • CryptoKey に基づき SIV モードでの AES 暗号化(AES-SIV)を使用して計算されます。
Input
{
  "deidentifyConfig":{
    "infoTypeTransformations":{
      "transformations":[
        {
          "infoTypes":[
            {
              "name":"PHONE_NUMBER"
            }
          ],
          "primitiveTransformation":{
            "cryptoDeterministicConfig":{
              "cryptoKey":{
                "unwrapped":{
                  "key":"[CRYPTO_KEY]"
                }
              },
              "surrogateInfoType":{
                "name":"PHONE_SURROGATE"
              }
            }
          }
        }
      ]
    }
  },
  "inspectConfig":{
    "infoTypes":[
      {
        "name":"PHONE_NUMBER"
      }
    ]
  },
  "item":{
    "value":"My phone number is 206-555-0574, call me"
  }
}
output
My phone number is PHONE_SURROGATE(36):ATZBu5OCCSwo+e94xSYnKYljk1OQpkW7qhzx, call me

ちなみに、暗号鍵があれば戻ります。

INPUT
{
  "reidentifyConfig":{
    "infoTypeTransformations":{
      "transformations":[
        {
          "infoTypes":[
            {
              "name":"PHONE_SURROGATE"
            }
          ],
          "primitiveTransformation":{
            "cryptoDeterministicConfig":{
              "cryptoKey":{
                "unwrapped":{
                  "key":"[CRYPTO_KEY]"
                }
              },
              "surrogateInfoType":{
                "name":"PHONE_SURROGATE"
              }
            }
          }
        }
      ]
    }
  },
  "inspectConfig":{
    "customInfoTypes":[
      {
        "infoType":{
          "name":"PHONE_SURROGATE"
        },
        "surrogateType":{

        }
      }
    ]
  },
  "item":{
    "value":"My phone number is [PHONE_SURROGATE](36):ATZBu5OCCSwo+e94xSYnKYljk1OQpkW7qhzx, call me"
  }
}
Output
My phone number is 206-555-0574, call me

バケット

バケット変換は、数値データを範囲ごとに「バケット化」することによる数値データの匿名化手法です

Cloud DLP: FixedSizeBucketingConfig, BucketingConfig

Input
"bucketingConfig":{
  "buckets":[
    {
      "min":{
        "integerValue":"1"
      },
      "max":{
        "integerValue":"30"
      },
      "replacementValue":{
        "stringValue":"LOW"
      }
    },
    {
      "min":{
        "integerValue":"31"
      },
      "max":{
        "integerValue":"65"
      },
      "replacementValue":{
        "stringValue":"MEDIUM"
      }
    },
    {
      "min":{
        "integerValue":"66"
      },
      "max":{
        "integerValue":"100"
      },
      "replacementValue":{
        "stringValue":"HIGH"
      }
    }
  ]
}
Output
1〜30: LOW で置換
31〜65: MEDIUM で置換
66~100: HIGHで置換

日付シフト

日付がランダムな日数だけシフトされる

DLP API: DateShiftConfig

Input
deidentify_config {
  record_transformations {
    field_transformations {
      fields {
        name: "date"
      }
      primitive_transformation {
        date_shift_config {
          upper_bound_days: 100
          lower_bound_days: -100
          entity_field_id {
            name: "user_id"
          }
          crypto_key {
            unwrapped {
              key: "123456789012345678901234567890ab"
            }
          }
        }
      }
    }
  }
}

日付シフト手法では、日付のセットがランダムにシフトされますが、期間の順序と持続時間は保持されます。通常、日付シフトは、個人またはエンティティのコンテキストで使用されます。つまり、各個人の日付は、その個人に固有の時間だけシフトされます。

user_id date action
1 2009-06-09 run
1 2009-06-03 walk
1 2009-05-23 crawl
2 2010-11-03 crawl
2 2010-11-22 walk

日付シフトを適用します。

user_id date action
1 2009-07-17 run
1 2009-07-11 walk
1 2009-06-30 crawl
2 2011-01-26 crawl
2 2011-02-14 walk

日付は変わりましたが、順序と持続時間は保持されていることに注目してください。日付がシフトされた量は user_id 1 と 2 で異なります。

時間抽出

日付、時刻、タイムスタンプに一致した値の箇所が保持されます。
DLP API: TimePartConfig

元の値 変換後の値
9/21/1976 1976
6/7/1945 1945
1/20/2009 2009
7/4/1776 1776
8/1/1984 1984
4/21/1982 1982

TimePartで抽出する条件を指定できます。

Enums
TIME_PART_UNSPECIFIED Unused
YEAR [0-9999]
MONTH [1-12]
DAY_OF_MONTH [1-31]
DAY_OF_WEEK [1-7]
WEEK_OF_YEAR [1-53]
HOUR_OF_DAY [0-23]

実際に使ってみる

Cloud DLPは、GCP上で管理されているマネージドなDLPサービスです。

Cloud DLP APIを有効にすることですぐに利用することができます。

せっかくなので、実際のデータに似せた擬似データを用いてCloud DLPを触ってみようと思います。

インプットデータ

兎にも角にも、データが無いと始まらないので、データを用意します。

https://testdata.userlocal.jp/

氏名 氏名(ひらがな) 年齢 生年月日 性別 電話番号 携帯電話番号
市村 真実 いちむら まみ 31 1992年05月02日 03-2276-8209 080-9088-4995
山本 友美 やまもと ゆみ 58 1965年03月18日 06-0480-3414 080-3250-5536
関本 静香 せきもと しずか 62 1960年06月18日 0796-81-8283 070-7545-6535
三好 圭佑 みよし けいすけ 33 1989年12月17日 0438-41-4660 070-6698-5240
塚原 和人 つかはら かずと 24 1999年05月29日 0790-09-5129 090-9826-0599
葛西 研介 かさい けんすけ 65 1957年11月05日 06-9352-4000 090-7392-1853
清水 麗子 しみず れいこ 36 1987年05月02日 01392-8-1755 090-4604-4421
大野 哲也 おおの てつや 72 1950年08月05日 03-9839-2740 080-0536-5890
森井 寛之 もりい ひろゆき 28 1994年09月09日 03-1764-3629 080-9162-0903
松原 貴司 まつばら たかし 50 1973年06月04日 03-8929-1171 050-0750-1756

DLP API

Cloud DLPではAPI経由で出力まで可能なジョブを作成ができます。

下記は、DLP APIに gs://input/blob/data.csvからgs://output/blob/data.csvへ電話番号を匿名化しコピーするジョブ作成をリクエストしています。

curl -X POST \               
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "x-goog-user-project: <PROJECT_ID>" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @dlp.json \
    "https://dlp.googleapis.com/v2/projects/<PROJECT_ID>/dlpJobs"

リクエストで指定しているJSONは以下の通りです。

{
  "inspectJob": {
    "storageConfig": {
      "cloudStorageOptions": {
        "fileSet": {
          "url": "gs://input/blob/data.csv"
        }
      }
    },
    "inspectConfig": {
      "infoTypes": [
        {
          "name": "PHONE_NUMBER"
        }
      ],
      "excludeInfoTypes": false,
      "includeQuote": true,
      "minLikelihood": "LIKELY"
    },
    "actions": [
      {
        "deidentify": {
          "cloudStorageOutput": "gs://output/",
          "fileTypesToTransform": [
            "CSV"
          ]
        }
      }
    ]
  }
}

アウトプットデータ

APIへリクエストを送って、得られたデータは以下のとおりです。

氏名 氏名(ひらがな) 年齢 生年月日 性別 電話番号 携帯電話番号
市村 真実 いちむら まみ 31 1992年05月02日 [PHONE_NUMBER] [PHONE_NUMBER]
山本 友美 やまもと ゆみ 58 1965年03月18日 [PHONE_NUMBER] [PHONE_NUMBER]
関本 静香 せきもと しずか 62 1960年06月18日 [PHONE_NUMBER] [PHONE_NUMBER]
三好 圭佑 みよし けいすけ 33 1989年12月17日 [PHONE_NUMBER] [PHONE_NUMBER]
塚原 和人 つかはら かずと 24 1999年05月29日 [PHONE_NUMBER] [PHONE_NUMBER]
葛西 研介 かさい けんすけ 65 1957年11月05日 [PHONE_NUMBER] [PHONE_NUMBER]
清水 麗子 しみず れいこ 36 1987年05月02日 [PHONE_NUMBER] [PHONE_NUMBER]
大野 哲也 おおの てつや 72 1950年08月05日 [PHONE_NUMBER] [PHONE_NUMBER]
森井 寛之 もりい ひろゆき 28 1994年09月09日 [PHONE_NUMBER] [PHONE_NUMBER]
松原 貴司 まつばら たかし 50 1973年06月04日 [PHONE_NUMBER] [PHONE_NUMBER]

APIのリクエストで、infoTypesPHONE_NUMBERを指定しているので、ルール通りに電話番号の値が全て変換することに成功しています。

まとめ

今回は、Cloud DLPの概要について、勉強会の内容をまとめました。

Cloud DLPは特に個人情報やそれに関する情報を識別し、変換などを行うことができるサービスです。

例えば、組織などで、Big QueryやGCSなどに大量のデータが保管されているとき、これらのデータに個人情報などが含まれていないかを一つづつ確認することはNot Hackです。

Cloud DLPを用いれば、全てのデータを検査しながら、個人情報の検出から変換まで自動で行ってくれます。

また、Cloud DLPはGCPのDataflowと組み合わせて利用することができ、例えばDataflowを用いて構築してあるETLパイプラインなどにCloud DLPを噛ませることで、個人情報をコピーしないETLなども実現可能です。

DLPソフトウェア自体が、まだまだ利用ユースケースも多くなく、これから利用するユーザーも増えていくソフトウェアになっていくと思います。

これからのデータ利用におけるデータガバナンスのソリューションとして、今後もその動向を探っていきたい所存です。

それでは、今回のところはこれまで。

Happy Hacking😎

参照

https://zenn.dev/ustato/scraps/85c09ee4f07e41
https://zenn.dev/mackay/scraps/d898ef378a958f
https://cloud.google.com/dlp/docs?hl=ja
https://www.microsoft.com/en-us/security/business/security-101/what-is-data-loss-prevention-dlp
https://www.digitalguardian.com/blog/what-data-loss-prevention-dlp-definition-data-loss-prevention

Acompany

Discussion