目次


Optim

Optim Data Privacy Solution によるテストデータの自動生成

個人情報の疑似データを大量作成する

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: Optim

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:Optim

このシリーズの続きに乞うご期待。

1.はじめに

ソフトウェアを開発する際には、大量のテストデータを必要とすることがあります。たとえば、システムが大量のデータを処理できるかどうかの検証を行う場合(ストレス・テスト)や、処理性能の測定(パフォーマンス・テスト)がそれにあたります。ただし、個人情報などセンシティブなデータを処理するシステムでは、その扱いに十分な配慮が必要となり、実際のデータをそのまま使用できないケースが多くあります。その場合は、擬似的なデータを作成することになるのですが、大量のデータを手作業で作成するのは簡単ではありません。また、新しいシステムを構築する際に既存のデータが存在しない場合には、テストデータの作成が求められます。

IBM Optim Data Privacy Solution V2.1(以下、Optim V2.1) には、データをマスク(つまり元のデータを判別できないように変換)する機能があるため、これを使用すれば擬似的な個人情報データを自動的にかつ大量に生成することが可能です。本稿では製品の機能を説明し、そのようなデータを実際に生成する手法を紹介します。

なお、本稿は読者が IBM Optim 製品によるマスキングなど、製品の使用方法を理解していることを想定しています。基本的な概念については developerWorks の記事「Optim デザイナーを使用したデータ・マスキング」をお読み下さい。

2. 必要なツールとデータ生成の仕組み

2.1 IBM Optim Data Privacy Solution V2.1

IBM Optim Data Privacy Solution V2.1 (Optim V2.1) は、データ・マスキング機能を SOA (Service Oriented Architecture) のフレームワーク上で実現した製品です。ここでは、以下のコンポーネントを使用します。

  • Optim デザイナー
  • Optim 管理コンソール
  • Optim 管理サーバー
  • Optim プロキシー
  • Optim Executor

各コンポーネントの詳細や構成方法については、「Optim Data Privacy Solution インストール・ガイド」あるいは developerWorks 記事「Optim: IBM Optim Data Privacy Solution 2.1 のアーキテクチャー」を参照して下さい。

Optim 製品は基本的に入出力としてデータベース・テーブルを想定していますが、ここでは Optim管理サーバーに添付された Apache Derby(IBM外のサイトへ、英語) をデータベースとして使用します。また、デザインおよび実行は Windows XP 上で行います。

図1. システム全体図
図1. システム全体図
図1. システム全体図

2.2 データ生成手順

データベース・テーブルの設計が完了した時点で、そのテーブル用にテストデータを作成します。主な手順は以下の通りです。

  • 種データ作成
  • データ・マスキング方式の決定
  • Optim サービスの定義
  • Optim サービスの実行

2.3 生成するデータ

大量のデータを生成するために、まず種(seed)となるデータを用意します。レコード数が多いと、データのバリエーションが増えて望ましいのですが、今回は 図2. にある手作成の10レコード分のデータのみを使用します。このデータは Optim デザイナー上で入力することができます。

図2. 種データ
図2. 種データ
図2. 種データ

この10レコードを元に自動生成したのが、図3. に示したデータです。Optim デザイナーで表示させたものですが、全部で約23万件分あります。レコード番号は単純に1から振っています。姓 (LASTNAME) はルックアップ・テーブルを参照し、その他の項目は完全にランダムな数値から生成しています。

図3. 生成したデータ
図3. 生成したデータ
図3. 生成したデータ

2.4 データ・マスキング

出力データは Optim が持つ豊富なマスキング機能により種データから生成します。ただし、レコード番号だけはデータベースが持つ機能を利用して、1番から重複なく自動的に番号を振り当てます。表1. に各データ項目の定義と、マスキング方法をまとめました。

表1. テーブル構造とマスキング方法
列名データ型説明ポリシー・カテゴリーポリシー・タイプ備考
RECIDintレコード番号--主キー、データベースが自動採番する
LASTNAMEvarchar(20)個人情報ルックアップ表から日本の姓を選ぶ
FIRSTNAMEvarchar(20)スクランブル・マスクルールベースランダムな文字列
BIRTHDATEdate生年月日範囲内のランダム日付ルールベース1960-01-01 と 1990-12-31 の間で選択
EMAILvarchar(40)Eメール・アドレスターゲットJavaScriptサービス計画の中で定義
CREDITCARDvarchar(30)カード番号個人情報ルールベースカード発行企業コード以外はランダム

表1.において、RECID は自動採番するため、種データには元となる連番を入力しておきます。LASTNAMEBIRTHDATEEMAIL はそれぞれ Optim V2.1 が勝手に文字列を生成してくれるので、空白でも構いません。 FIRSTNAME はランダムな文字列になりますが、バリエーションを増やすために、種データでは漢字・ひらがな・カタカナを網羅させておきます。最後の CREDITCARD には何種類かの発行企業コードを含んだカード番号を入力しておきます。

2.5 サービス

作成した Optim サービスはデータのマスキングを行うものと、テーブルの内容を単純コピーするものの2種類です。これらを、バッチ・コマンドで実行します。

表2. 作成した Optim サービス
サービス名入力スキーマ名出力スキーマ名機能備考
SVC_MaskDataTEMPTESTDATAデータをマスク出力先のテーブルに生成したデータを追加
SVC_CopyDataTESTDATATEMPデータの単純コピー生成したデータを元のテーブルに追加

2.6 データ増殖

データベース・テーブルと Optim サービスが定義できたところで、データの生成を行います。

まず種データをスキーマ TEMP にあるテーブル CUSTOMER にロードします。次にサービス SVC_MaskData を実行し最初の10レコードをマスクして、スキーマ TESTDATA にある同名のテーブルに格納します。これで10レコード分のクリーンなデータが完成しました。今度は、サービス SVC_AddData を実行して生成したデータをスキーマ TEMP のテーブルに戻します。ここで20レコード分の元データができあがります。さらに、マスキングを行いデータを生成します(合計で30レコード)。この処理を繰り返すと、倍々の割合でデータが増殖します。

図4. データ増殖のしくみ
図4. データ増殖のしくみ
図4. データ増殖のしくみ

ここで注意しなければならないのは、スキーマ TESTDATAのテーブルの先頭には種データがそのまま残っている点です。ここに保護が必要なデータが使用されている場合は、不用意に公開されないよう気をつけて下さい。

上記方法の応用として、スキーマ TEMP のテーブルのサイズがある程度大きくなったところで(数万件など)、マスクキングのみを繰り返し実行するやり方があります。これだと、TEMP のテーブルが無用に肥大するのを防げます。

3. Optim サービスの作成と実行

3.1 データベースの準備

Optim V2.1 ではルックアップ・テーブルを格納するデータベースとして通常 Apache Derby を使用します。Optime 管理サーバーをインストールすると、Derby が稼働する環境が自動的に構築されるので、今回はデータ生成用にそのまま流用します。

まず、WAS-CE (WebSphere Application Server Community Edition) を起動して Derby が使える状態にします。次に Optim デザイナーの「データ・ソース・エクスプローラー」ビュー内にある「データベース」で右クリック「新規」を選択します。そこで 図5. に示すように JDBC ドライバーの設定を行います。Derby の ドライバーにはいくつか種類がありますが、「Derby クライアント JDBC ドライバー」を使用します。ドライバーの JAR ファイルは Optim V2.1 に添付されているので、そのパス名を指定します。

ここではデータベース名を mydb としました。ユーザ名とパスワードは空欄でなければ何でも構いません。設定が終わった時点で、Derby への接続が正しく行われることを確認します。

図5. Derby JDBC ドライバーの設定
図5. Derby JDBC ドライバーの設定
図5. Derby JDBC ドライバーの設定

データベースが生成されたら、テーブルの作成を行います。以下の SQL 文を Optim デザイナーの中で実行します。この定義では、列 REC_ID の値として Apache Derby が1から順に自動的に生成する連番を使用するので Optim で処理を行う必要はありません。また、その値が重複することはありません。

create schema TESTDATA;
create schema TEMP;
create table TESTDATA."CUSTOMER" (
	RECID		int not null primary key 
			generated always as identity (start with 1), 
	LASTNAME	varchar(20), 
	FIRSTNAME	varchar(20), 
	BIRTHDATE	date, 
	EMAIL 		varchar(40),
	CREDITCARD 	varchar(30) );
create table TEMP."CUSTOMER" (
	RECID 		int not null primary key 
			generated always as identity (start with 1), 
	LASTNAME 	varchar(20), 
	FIRSTNAME 	varchar(20), 
	BIRTHDATE 	date, 
	EMAIL 		varchar(40),
	CREDITCARD 	varchar(30) );

サンプルのSQLファイル(ダウンロードできます)では同時に種データのロードも行います。10件のデータがテーブルに追加されます。ここで使用しているカード番号はさまざまなクレジット発行会社のものを網羅してあります。

insert into TEMP."CUSTOMER"
	("LASTNAME","FIRSTNAME","BIRTHDATE","EMAIL","CREDITCARD")
	values ('井上','いちろう','1985-08-23','E10000@optim.jp','3088000520741744');
insert into TEMP."CUSTOMER" 
	("LASTNAME","FIRSTNAME","BIRTHDATE","EMAIL","CREDITCARD")
	values ('山田','二郎','1972-02-15','E20000@optim.jp','4111117204008379');
...

3.2 プロジェクトの作成

いよいよ実際の Optim サービスの作成に取りかかります。大まかな流れとしては [プロジェクト作成] -> [物理データ・モデル作成] -> [論理データ・モデル作成] -> [サービス定義] の各作業を行います。

まず、通常通り Optim デザイナーで新規の「データ設計プロジェクト」を作成します。プロジェクト名は「DW」にしましたが、何でも構いません。

図6. 新規プロジェクトの作成
図6. 新規プロジェクトの作成
図6. 新規プロジェクトの作成

3.3 物理データ・モデルの作成

「データ・プロジェクト・エクスプローラー」ビューの中で、データベース・スキーマ TEMPTESTDATA からそれぞれ物理データ・モデルを生成します。モデル名の先頭には後で分かりやすいように DBM_ を付けました。「リバース・エンジニアリングから作成」オプションを指定して、作成済みのテーブルから属性などを自動的に取り込みます。

図7. 物理データ・モデルの作成
図7. 物理データ・モデルの作成
図7. 物理データ・モデルの作成

3.4 論理データ・モデルの作成

続いて、これら物理モデルから「Optim プロパティーを含む論理データ・モデルに変換」を選択します。設定値には全てデフォルトを選び、終了します。

図8. 論理データ・モデルの作成
図8. 論理データ・モデルの作成
図8. 論理データ・モデルの作成

物理データ・モデルと論理データ・モデルは 図9. のように表示されます。次に論理データ・モデルの中でデータ・アクセス計画を定義します。データベース・スキーマ TEMPTESTDATA で、それぞれ DAP_TEMPDAP_TESTDATA という名前にします。データ・アクセス計画の中で、個々のデータ項目(列)についてポリシーを定義しマスキング方法の指定を行います。

図9. データ・アクセス計画の作成
図9. データ・アクセス計画の作成
図9. データ・アクセス計画の作成

3.4.1 ソース・ポリシーの作成

それぞれのデータ・アクセス計画の中で、「ポリシーの追加」ボタンを押し、「選択ポリシー」を設定します。ここでは単にどのテーブルを入力にするかを指定します。それぞれ SEL_TEMPSEL_TESTDATA というポリシー名にします。

図10. 選択ポリシーの選択
図10. 選択ポリシーの選択
図10. 選択ポリシーの選択

DBM_TESTDATA のポリシーは単純なデータコピーのみなので、これでデータ・アクセス計画の作成は完了です。

DBM_TEMP のポリシーでは、更に個々のデータ項目のマスキング方法を指定します。「ポリシーの追加」ボタンを押し、順番に定義していきます。

LASTNAME では、ルックアップ・テーブルを参照して日本の名字をランダムに取り出します。元の(ソース)データは使われません。乱数の種となる値には1を設定しますが、これ以外の数字でも構いません。この値を固定にしておけば、サービスを実行するたびに、同じ順番で名字がランダムに選ばれます。つまり、データの再現性が保たれます。また、テーブルに収納されている名字の種類は6千件を超えますが、数万件あるいはそれ以上のデータを生成すると、どうしても名前の重複が起こります。ただし、現実社会において同姓はよくあることなので問題はないでしょう。ちなみに、このテーブルでは RECID のみがユニークな値であることが保証されています。ということは、非常に少ない確率ですがこれ以外の項目が全て重複しているレコードが生成される可能性があります。処理系によっては重複データの処理を行わなければいけないので、テストデータとして見れば有益な特徴であると言うこともできます。

FIRSTNAME ではランダムな漢字・ひらがな・カタカナの文字列が生成され、元のデータに置き換えられます。元のデータが漢字であればランダムな漢字に、カタカナはカタカナにといった処理がされます。この点を考慮して、最初に入力する種(seed)データには漢字のみ、カタカナのみ、平仮名のみの名前がそれぞれ含まれています。

BIRTHDATE には1960年1月1日から1990年12月31日の間の日付をランダムに選ぶことにします。日付の形式はデータベースのデータ定義に合わせて、「yyyy-MM-dd」とします。日付のバリエーションを増やしたい場合は、範囲を調整して下さい。

CREDITCARD には、クレジット・カードの番号がランダムに設定されます。ただし、カード会社が固有に持つ発行企業コード(最初の6から9桁)は変えません。また、末尾の数字はチェック・ディジットなので、正しい値が計算されてセットされます。データをより現実的にするため、種データでは数種類の発行企業コードを含んでいます。乱数の種となる値には、単に素数であるという理由から 1031 を設定します。

表3. マスキング・ポリシーの設定値
列名ポリシー名説明ポリシー・カテゴリーポリシー・タイプ設定値
LASTNAMEPLC_LastName個人情報マスク・ポリシー日本のラストネーム情報lastNameLookupType.LastName / ランダム・キー / 乱数シード=1
FIRSTNAMEPLC_FirstNameスクランブル・マスク・ポリシー文字の置換言語文字セットは「日本語」
BIRTHDATEPLC_BirthDate生年月日日付マスク・ポリシー範囲内のランダム日付1960-01-01 / 1990-12-31 / yyyy-MM-dd
CREDITCARDPLC_CreditCardカード番号個人情報マスク・ポリシーすべての提供者からのクレジット番号をマスクランダム値の生成 / 乱数シード=1031

Table 3 に示した設定が完了すると、Optim デザイナー上には以下のように各ポリシーが表示されます。

図11. ソース・ポリシーの定義
図11. ソース・ポリシーの定義
図11. ソース・ポリシーの定義

3.5 Optim サービスの作成

Optim V2.1 では実行の最小単位をサービスと呼んでいます。ここでは2つのサービスを作成します。ひとつは単純にデータベース・テーブルの全内容を他のテーブルにコピーするサービス SVC_CopyData、もう一つはマスキングを行いながらテーブルのデータをコピーするサービス SVC_MaskData です。では、メニューから新規のサービス SVC_CopyData を作成します。

図12. サービスの作成
図12. サービスの作成
図12. サービスの作成

ソース・論理データモデルには DBM_TESTDATA を選び、先ほど定義した DAP_TESTDATA をデータ・アクセス計画とします。ターゲットには DBM_TEMP を選び「自動マッピング」を指定します。ターゲットの操作タイプは「挿入」にします。これで完成です。

同様に SVC_MaskData サービスも作成します。ソース・論理データモデルは DBM_TEMP、データ・アクセス計画は DAP_TEMP、ターゲットは DBM_TESTDATA、そして「自動マッピング」を指定します。ターゲットの操作タイプは同じく「挿入」にします。

このサービスではさらに EMAIL をマスクします。この項目は文字列の整形を必要とするので JavaScript ポリシーを使います。他のマスキング・ポリシーと異なり、JavaScript ポリシーはサービス計画の中で定義します。

図13. サービス・ポリシーの定義
図13. サービス・ポリシーの定義
図13. サービス・ポリシーの定義

ポリシー名は PLC_Email とし、ターゲット・ポリシーとして「JavaScript(TM)ポリシー」を選択します。次に「JavaScriptの追加」ボタンを押して、属性として EMAIL を選びます。さらに、JavaScript ファイルとして SVC_MaskData_EMAIL.js を新規に作成します。JavaScript のエディター画面が現れるので後述のコードを入力して、結果を保存します。

JavaScript ポリシーでは、その名の通り JavaScript でマスキング処理を記述するため、ほとんど何でもできてしまいます。ここでは、ランダムに生成された名前 FIRSTNAME の文字列を加工してメール・アドレスを生成します。

var name = record.getItem('/TEMP/CUSTOMER/FIRSTNAME') + '  ';
'E'+ name.charCodeAt(0) + name.charCodeAt(1) + '@optim.jp'

最初の行では、FIRSTNAME の文字列を取り出します。二行目ではこの文字列の先頭の2文字を整数値に変換してから、前後に定型文字列を繋げてメール・アドレスの形 (Exxxxxxxx@optim.jp) にします。FIRSTNAME はすでにランダムな文字列になっているので、メールアドレスもランダムな数字を含む文字列となります。なお、整数値から文字列への変換は JavaScript が自動的に行ってくれます。このコードを参考にロジックを追加すれば、さらに多彩なバリエーションのメールアドレスが生成できることが分かるでしょう。

JavaScript ポリシーを追加後のサービス計画は以下のようになります。

図14. サービス・ポリシーの完成
図14. サービス・ポリシーの完成
図14. サービス・ポリシーの完成

3.6 Optim サービスの公開

完成したサービスをさっそく実行してみましょう。その前に実行環境の準備が必要です。

Optim 管理サーバーは既に立ち上がっているはずなので、Optim プロキシーを起動します。次に Web ブラウザーから Optim 管理コンソール (通常は http://localhost:8080/optim/console) にログインします。そして、Apache Derby の JDBC ドライバーを登録します。このドライバーは Optim Executor が実行時に Apache Derby のテーブルをアクセスする時に使用します。Optim Executor は元々ルックアップ・テーブルを参照する際に Apache Derby を使用しますが、そのための JDBC ドライバーは別に管理されているため、Optim ユーザーが作成したサービスには明示的にドライバーを登録する必要があります。

図15. Apache Derby JDBC ドライバーの登録
図15. Apache Derby JDBC ドライバーの登録
図15. Apache Derby JDBC ドライバーの登録

その一方で、Optim デザイナーから前述の2つのサービスを公開 (publish) します。公開されると、Optim サービスは Optim 管理サーバのリポジトリーに格納され、サービス割り当てを待ちます。

図16. Optim サービスの公開
図16. Optim サービスの公開
図16. Optim サービスの公開

Optim 管理コンソールで公開済みの2つのサービスを割り当てます。これにより、Optim サービスの実行を行う Optim 管理サーバーと Optim プロキシーが特定されます。Optim V2.1 では複数の管理サーバーとプロキシーを登録できるため、この手順が必要になります。

図17. Optim サービスの割り当て
図17. Optim サービスの割り当て
図17. Optim サービスの割り当て

それが完了したら Optim 管理コンソールで、割り当てが済んだサービスを確認します。割り当てが正しく行われたら、Optim サービスの実行の準備は整いました。

図18. Optim 割り当て済みサービスの確認
図18. Optim 割り当て済みサービスの確認
図18. Optim 割り当て済みサービスの確認

3.7 Optim サービスの実行

Optim サービスは Optim 管理コンソールから起動できますが、ここではバッチ・ファイルにより実行します。大量のデータを自動生成するために、連続してサービスを起動する必要があるからです。具体的には以下のようなバッチ・ファイルを作成します。

01|  SET JAR_PATH="C:\IBM\IDA\optim\designer\runservice\com-ibm-nex-runservice-tool.jar"
02|  java -jar %JAR_PATH% -s SVC_MaskData:1.0.0
03|  
04|  for /L %%i in (1,1,10) do (
05|		ping localhost -n 120 > nul	# sleep here
06|		echo -- Iteration # %%i ----------
07|		java -jar %JAR_PATH% -s SVC_AddData:1.0.0 -c true
08|		ping localhost -n 120 > nul	# sleep here
09|		java -jar %JAR_PATH% -s SVC_MaskData:1.0.0 -c true
10|  )

最初の行では Optim サービスを起動する Java ライブラリのパスを指定します。実際のパスに合わせて編集して下さい。2行目でサービス SVC_MaskData を実行して、種データをマスクします。その後は、SVC_AddDataSVC_MaskData を交互に繰り返し実行して、データを増殖します。この例では10回ループしていますが、生成するデータ量に合わせて回数を決めます(4行目)。5行目・8行目の「ping」コマンドは Unix の「sleep」コマンドの代わりとして使われています。連続してサービスを起動すると同時に多数のプロセスが並列して実行されるのを防ぐ目的があります。この例では 120 秒間スリープしていますが、実行するマシンの性能により調整して下さい。バッチ・ファイルの実行の模様は以下の通りです。

図19. バッチ・ファイルによる Optim サービスの実行
図19. バッチ・ファイルによる Optim サービスの実行
図19. バッチ・ファイルによる Optim サービスの実行

Optim サービスの実行が全て終了したら、Optim デザイナーで結果確認をします。バッチ・ファイルの中でループを10回実行すると、以下のようなデータが生成されるはずです。

図20. Optim サービスの実行結果
図20. Optim サービスの実行結果
図20. Optim サービスの実行結果

4. おわりに

IBM Optim Data Privacy Solution V2.1 (Optim V2.1) が持つ豊富なマスキング機能を使って、擬似的な個人情報データを大量に生成する手法を紹介しました。ここで説明したテクニックを応用すれば、さまざまな種類のデータを簡単に生成することができるはずです。また、Optim V2.1 には本稿では触れなかった数々のマスキング用のツールが用意されています。ぜひ、それらも試してみて下さい。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Information Management
ArticleID=489620
ArticleTitle=Optim: Optim Data Privacy Solution によるテストデータの自動生成
publish-date=04242010