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"); }
