GoogleのCloud DLP APIで機密データを検出

schedule 2019/10/07  refresh 2023/11/08

 

GoogleのCloud DLP APIは、テキストや画像などに含まれる機密データを検出するAPIです。

 

DLP(Data Loss Prevennsion)とは、情報漏洩対策という意味で、CASBでもコンプライアンス機能の1つとして使用されています。

 

今回は、Cloud DLP APIを使用して、テキストデータに含まれる機密データを検出る方法について、説明したいと思います。

 

1. Googleの設定

まず、Google Developer Consoleにログインして下さい。

 

”IAMと管理”の”サービスアカウント”から、DLP API用にサービスアカウントを作成して、キーを作成して、キーのjsonファイルをダウンロードして下さい。

 

次に、”APIとサービス”の”APIとサービスを有効化”から、”Cloud Data Prevension(DLP) API”を有効にして下さい。

 

 

2. Cloud DLP APIの実行環境

今回は、Cloud DLP APIのPHPライブラリを使用し、実行環境はCentOS 7とします。

 

ライブラリを使用するため、PHP 7とcomposerをインストールします。

 

# yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yum install --enablerepo=remi,remi-php72 php php-xml php-mbstring php-pearLog php-pear-HTTP-Request php-pecl-memcached php-ldap php-mcrypt php-bcmath

 

# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# php composer-setup.php
# mv compser.phar /usr/local/bin/composer

 

次に、Cloud DLP APIのライブラリをインストールします。

 

$ composer require google/cloud-dlp

 

 

3. Cloud DLP APIの実行

サンプルコード”dlp.php”は引数で指定したテキストファイル内の機密データを検出するスクリプトです。
”1. Googleの設定”でダウンロードしたキーのファイルも配置して下さい。

 

以下のテキストファイルに対して実行してみます。
Tokyo
大阪
03-1111-2222
田中 一郎
tanaka.ichiro@test.com

 

$ php dlp.php test.txt
Quote: Tokyo Info type: LOCATION Likelihood: Possible
Quote: 大阪 Info type: LOCATION Likelihood: Possible
Quote: 03-1111-2222 Info type: PHONE_NUMBER Likelihood: Possible
Quote: tanaka.ichiro@test.com Info type: EMAIL_ADDRESS Likelihood: Likely

 

現状、日本語の名前はうまく検出できないようなので、カスタムの辞書検出器などを使用して、日本語名の辞書データをもとに検出するなど、工夫が必要になります。

 

dlp.php


include "vendor/autoload.php";

use Google\Cloud\Dlp\V2\DlpServiceClient;
use Google\Cloud\Dlp\V2\ContentItem;
use Google\Cloud\Dlp\V2\InfoType;
use Google\Cloud\Dlp\V2\InspectConfig;
use Google\Cloud\Dlp\V2\Likelihood;
use Google\Cloud\Dlp\V2\InspectConfig_FindingLimits;

$projectid = 'サービスアカウントのプロジェクトID';
$credentials = 'サービスアカウントのキーのファイル名';

putenv('GOOGLE_APPLICATION_CREDENTIALS='.$credentials);

$maxFindings = 0;

if (!file_exists($argv[1])) {
print("file donesn't exist\n");
exit(1);
}

$client = new DlpServiceClient();

// The infoTypes of information to match
$cardNumberInfoType = (new InfoType())->setName('CREDIT_CARD_NUMBER');
$emailInfoType = (new InfoType())->setName('EMAIL_ADDRESS');
$locationInfoType = (new InfoType())->setName('LOCATION');
$personNameInfoType = (new InfoType())->setName('PERSON_NAME');
$phoneNumberInfoType = (new InfoType())->setName('PHONE_NUMBER');
$individualNumberInfoType = (new InfoType())->setName('JAPAN_INDIVIDUAL_NUMBER');
$infoTypes = [$cardNumberInfoType, $emailInfoType, $locationInfoType, $personNameInfoType, $phoneNumberInfoType, $individualNumberInfoType];

// The minimum likelihood required before returning a match
$minLikelihood = likelihood::LIKELIHOOD_UNSPECIFIED;

// Whether to include the matching string in the response
$includeQuote = true;

// Specify finding limits
$limits = (new InspectConfig_FindingLimits())
->setMaxFindingsPerRequest($maxFindings);

// Create the configuration object
$inspectConfig = (new InspectConfig())
->setMinLikelihood($minLikelihood)
->setLimits($limits)
->setInfoTypes($infoTypes)
->setIncludeQuote($includeQuote);

$parent = $client->projectName($projectid);

$likelihoods = ['Unknown', 'Very unlikely', 'Unlikely', 'Possible', 'Likely', 'Very likely'];

$content = (new ContentItem())
->setValue(file_get_contents($argv[1]));

// Run request
$response = $client->inspectContent($parent, [
'inspectConfig' => $inspectConfig,
'item' => $content
]);

$findings = $response->getResult()->getFindings();
foreach ($findings as $finding) {
$likelihoodString = $likelihoods[$finding->getLikelihood()];
print('Quote: ' . $finding->getQuote() . ' Info type: ' . $finding->getInfoType()->getName() . ' Likelihood: ' . $likelihoodString."\n");
}