👀

Cloud DLP(Data Loss Prevention)で機密情報を検出し置き換え、マスキングしてみる

2024/05/30に公開

はじめに

Cloud DLPを使うと個人情報やカード番号などのセンシティブデータを検出し、それを指定文字列に置き換えたりマスキングできます。

何をセンシティブデータとして検出するかはinfoType検出器で指定できます。
多種多様な組み込みのinfoType検出器が用意されており、それだけでなくカスタマイズしたものも指定できます。

また、Cloud Storageのデータにバッチジョブで適用したり、BigQueryと組み合わせて特定の列のデータに適用するのも可能です。

本記事ではCloud DLPのAPIを直接呼び出して、センシティブデータの入った文字列に変換をかけてみます。

Cloud DLPによる検出、マスキングと置換

Cloud DLPのAPIを有効にしたプロジェクトで、Cloud Shellエディタを使ってソースコードの作成、実行します。

dlp_test.py
from google.cloud import dlp_v2
from google.cloud.dlp_v2 import types


def deidentify_with_mask(project, text, info_types, masking_character='*'):
    """文字列中の機密情報をマスキング"""
    
    dlp = dlp_v2.DlpServiceClient()

    # 検査対象
    item = {'value': text}

    # 非識別化設定
    deidentify_config = {
        'info_type_transformations': {
            'transformations': [
                {
                    'primitive_transformation': {
                        'character_mask_config': {
                            'masking_character': masking_character,
                        }
                    }
                }
            ]
        }
    }

    # 検査設定
    inspect_config = {
        'info_types': info_types,
        'include_quote': True
    }

    # DLP APIを呼び出して文字列を非識別化
    response = dlp.deidentify_content(
        request={
            'parent': f'projects/{project}',
            'inspect_config': inspect_config,
            'deidentify_config': deidentify_config,
            'item': item
        }
    )

    # 非識別化された文字列を表示
    print(response.item.value)


def deidentify_with_replace(project, text, info_types, replace_string='[REDACTED]'):
    """文字列内の機密情報を置換"""
    
    dlp = dlp_v2.DlpServiceClient()

    # 検査対象
    item = {'value': text}

    # 非識別化設定
    deidentify_config = {
        'info_type_transformations': {
            'transformations': [
                {
                    'primitive_transformation': {
                        'replace_config': {
                            'new_value': {
                                'string_value': replace_string
                            }
                        }
                    }
                }
            ]
        }
    }

    # 検査設定
    inspect_config = {
        'info_types': info_types,
        'include_quote': True
    }

    # DLP APIを呼び出して文字列を非識別化
    response = dlp.deidentify_content(
        request={
            'parent': f'projects/{project}',
            'inspect_config': inspect_config,
            'deidentify_config': deidentify_config,
            'item': item
        }
    )

    # 非識別化された文字列を表示
    print(response.item.value)


if __name__ == '__main__':
    project_id = 'my-project'

    text_to_deidentify = """
My name is John Connor. I'm 35 years old.
My email is foobar@example.com.
My credit card number is 4242424242424242.
"""

    # 適用するinfoType検出器
    info_types = [
        'FIRST_NAME',
        'AGE',
        'EMAIL_ADDRESS',
        'CREDIT_CARD_NUMBER',
    ]
    # infoType検出器を辞書のリストに変換
    info_types = [{'name': info_type} for info_type in info_types]

    deidentify_with_mask(project_id, text_to_deidentify, info_types, '#')
    deidentify_with_replace(project_id, text_to_deidentify, info_types)

$ python3 dlp_test.py

My name is #### Connor. I'm ############.
My email is ##################.
My credit card number is ################.


My name is [REDACTED] Connor. I'm [REDACTED].
My email is [REDACTED].
My credit card number is [REDACTED].

センシティブデータがマスキング及び置換されたことを確認できました。

GitHubで編集を提案
アイレット株式会社

Discussion