Optim Test Data Management SolutionのData Privacy Option(以下Optim)は、リレーショナル・データベース上の個人情報を隠蔽する(Optimでは「マスクする」と言います)ソリューションです。デフォルトで提供されているデータ・プライバシー関数を適用することで、人名や住所、クレジット・カード番号を簡単にマスクできます。テスト・データの作成時や、顧客データの解析時に有用なソリューションです。
しかし、そのような個人情報はデータベースだけでなく、CSV形式や他の表構造形式でファイルに保存されている場合も少なくありません。Optimはリレーショナル・データベースを対象にした製品ですので、ファイルそのものをマスクできません。ファイルを仮想的にデータベースとして見せる必要があります。
ファイルを仮想的にデータベースとして見せる製品のひとつに、InfoSphere Federation Server(以下Federation Server)があります。Federation Serverは分散した異種データソースをDB2上に統合する製品です。Federation Serverを用いてCSVファイルに対するニックネームを作成すると、CSVファイルをあたかもDB2上の表として扱うことができます。Optimはこのニックネームを操作することで、CSVファイルのマスクを実現します。
本稿では、Optim V8.1とFederation Server V9.7を使用した、CSVファイルのマスク方法について説明します。
Optimを用いてCSVファイルをマスクするとき、マスク・データの出力手法によって2つの構成方法が考えられます。
- Convertリクエストの利用
OptimのConvertリクエストは、Extractファイルを直接CSVファイルに変換する機能があります。この機能を利用する場合、Federation Serverの表構造ファイル・ラッパーを利用でき、構成を容易に行うことが可能です。ただし、出力されるファイルのコードページはユニコード(UTF-8)のみになります。
図 1. Convertリクエストを利用する構成図
- Insertリクエストの利用
OptimのInsertリクエストを実行することで、Federation Serverを介してCSVデータを出力する手法です。Federation ServerのODBCラッパーを利用するため、やや煩雑な構成が必要になります。出力されるファイルのコードページはソース・ファイルと同じになりますが、サポートされるコードページは使用するODBCドライバーの仕様に依存します。
図 2. Insertリクエストを利用する構成図
以上より、ソース・ファイルのコードページがASCIIかユニコードの場合はConvertリクエストで、それ以外はInsertリクエストで構成することをお勧めします。
3. Convertリクエストを利用したCSVファイル・マスキング
では、Convertリクエストを利用したCSVファイルのマスキング方法(図 1)について説明します。本章では、ソース・ファイルC:\data\dw\csv_demo\customers_utf8.csvに、リスト 1の様に、識別ID、姓、名、出身地、生年月日がCSV形式で保存されている場合を考えます。ファイルのコードページはユニコード(UTF-8)です。表構造ファイル・ラッパーを使用する場合、Federationデータベースのコードページはソース・ファイルと同一である必要があります。本章の場合、Federationデータベースのコードページは、ユニコード(IBM-1208)で作成しておきます。
リスト 1. ソース・ファイルのデータ
1,徳川,慶喜,東京都,1837/9/29 2,西郷,隆盛,鹿児島県,1828/1/23 3,勝,海舟,東京都,1823/3/12 4,坂本,龍馬,高知県,1836/1/3 5,松平,容保,東京都,1836/2/15 6,桂,小五郎,山口県,1833/8/11 |
ソース・ファイルcustomers_utf8.csv中の名と出身地、生年月日をマスクし、ターゲット・ファイルcustomers_utf8_masked.csvに保存してみましょう。
まず始めに、ソース・ファイルを仮想的にデータベースと見せるために、Federation Server上でソース・ファイルに対応するニックネームを作成します。本章で使用するラッパーは、表構造ファイル・ラッパーです。表構造ファイル・ラッパーのニックネームの作成には、特別な準備は必要なく、DB2コマンド・プロンプトにてSQLを実行するだけで作成できます。リスト 1のソース・ファイルに対してニックネームを作成するSQL文は、リスト 2の通りです。
リスト 2. 表構造ファイル・ラッパーに対してニックネームを作成するSQL文
1) CREATE WRAPPER CSVWRAPPER LIBRARY 'db2lsfile.dll'; 2) CREATE SERVER CSVSERVER WRAPPER CSVWRAPPER; 3) CREATE NICKNAME UTF8.CUSTOMERS 4) ( 5) PID INTEGER NOT NULL, 6) LASTNAME VARCHAR(16), 7) FIRSTNAME VARCHAR(16), 8) BIRTHPLACE VARCHAR(16), 9) BIRTHDATE VARCHAR(10) 10) ) 11) FOR SERVER CSVSERVER 12) OPTIONS(FILE_PATH 'C:\data\dw\csv_demo\customers_utf8.csv', 13) COLUMN_DELIMITER ','); |
- 1行目: Windows上で表構造ファイルのラッパー・オブジェクトを作成するSQL文。CSVWRAPPERは任意の名前です。LIBRARYオプションで指定するライブラリ名は、Federation Serverが動作するOSにより異なります。詳しくは、DB2のインフォメーション・センター[1]を参照してください。
- 2行目: 表構造ファイルのサーバー・オブジェクトを作成するSQL文。CSVSERVERは任意の名前です。
- 3-12行目: 表構造ファイル・ラッパーに対してニックネームを作成するSQL文。スキーマ名とニックネーム名(UTF8.CUSTOMERS)は任意の名前です。
- 5-9行目: ソース・ファイルのデータ構造に合わせて、列名とデータ型を定義しています。表構造ファイル・ラッパーはDATE型を持たないため、BIRTHDATE列に対してもVARCHAR型を指定します。
- 11行目: 使用するFederationサーバー名を指定します。
- 12行目: FILE_PATHオプションには、ソース・ファイルへの絶対パスを指定します。
- 13行目: COLUMN_DELIMITERオプションには、ファイル内のフィールドを区切るのに使用される区切り文字を指定します。このオプションを変更すれば、CSV形式以外の表構造ファイルを取り扱うことが可能になります。
準備したFederationデータベースに接続し、リスト 2のSQL文を実行します。ニックネームの作成に成功したら、SELECT文を発行し、ソース・ファイルの内容を正しく取得できるか確認してください。
次に、Optimを使用して、ニックネームからデータを抽出し、個人情報をマスクします。予め、Optim Directoryを構成し、FederationデータベースをDB Aliasとして登録しておいてください[2][3]。本章では、「IBM1208」という名前でDB Aliasを登録したと仮定しています。また、製品付属のプライバシー・データ表をFederationデータベースにロードしておいてください。
- Optim起動し、File -> Optim Directory...メニューを選択します。リストから使用したいOptim Directoryを選択し、OKボタンをクリックします。
- File -> New -> Extractメニューを選択します。
- Extract Request Editor(図 3)のExtract Fileフィールドに、マスクされたデータを格納するファイル名(customers_utf8_masked.XF)を入力します。この時点で作成されるファイルは、OptimのExtractファイルですので、拡張子はXFです。
図 3. Extract Request Editor
- Access Definition OptionsグループにてLocalラジオボタンを選択し、Tools -> Edit Access Definitionメニューをクリックします。
- Access Definition Editor(図 4)にて、Default QualifierフィールドにDB Alias名.スキーマ名(IBM1208.UTF8)、Start Tableフィールドにニックネーム名(CUSTOMERS)を入力します。各フィールド脇の[...]ボタンをクリックすることで、リストから選択することもできます。
図 4. Access Definition Editor
- File -> Closeメニューをクリックし、Access Definition Editorを閉じます。「Save changes to Access Definition?」と聞かれますのでYesボタンをクリックしてください。以上で、ニックネームからデータを抽出する設定は終わりです。
- データを抽出後、続けてマスクを行う設定をします。Extract Request Editor(図 3)にて、Run Convert After Extractチェックボックスをクリックします。
- 新たに表示されたConvertタブを表示します。
- Convert Request OptionsグループにてLocalラジオボタンを選択し、Tools -> Edit Convert Requestメニューをクリックします。
- 表示されたConvert Request Editor(図 5)上で、Control Fileフィールドに適切なコントロール・ファイル名(例: customers_utf8_masked.CF)を入力します。コントロール・ファイルとは、リクエストの実行プロセスをトラックするためのファイルです。データのマスク中にエラーが発生した場合等に、リクエストのプロセス解析のために使用します。
図 5. データをマスクするConvert Request Editor
- Table Map OptionsグループのLocalラジオボタンを選択し、Tools -> Edit Table Mapメニューをクリックします。
- 表示されたTable Map Editor(図 6)上で、QualifierフィールドにDB Alias名.スキーマ名(IBM1208.UTF8)を入力します。
図 6. データをマスクするTable Map Editor
- CUSTOMERS行の「Column Map or "LOCAL"」列に、LOCALと入力します。
- LOCALと入力したセル上で右クリックし、Open Column Mapコンテキストメニューをクリックします。
- 表示されたColumn Map Editor(図 7)上で、マスクしたい列のSourceセルに、対応するデータ・プライバシー関数を下表の通り記述していきます。今回は製品付属のプライバシー・データ表からランダムに値を取得し、データをマスクする手法(RAND_LOOKUP関数)を採ります。
列名 入力するデータ・プライバシー関数 FIRSTNAME RAND_LOOKUP(LOOKUP.OPTIM_JP_FIRSTNAME_M, FIRSTNAME) BIRTHPLACE RAND_LOOKUP(LOOKUP.OPTIM_JP_ADDRESSES, PREFECTURE) BIRTHDATE RAND_LOOKUP(LOOKUP.OPTIM_JP_PERSON, BIRTHDATE)
図 7. Column Map Editor
- File -> Closeメニューをクリックし、Column Map Editorを閉じます。「Save changes to Column Map Definition?」と聞かれますのでYesボタンをクリックしてください。
- File -> Closeをクリックし、Table Map Editorを閉じます。「Save changes to Table Map Definition?」と聞かれますのでYesボタンをクリックしてください。
- File -> Closeをクリックし、Convert Request Editorを閉じます。「Save changes to Convert Request?」と聞かれますのでYesボタンをクリックしてください。以上でデータをマスクする設定は終わりです。
- Extract Request Editor(図 3)にて、File -> Runメニューをクリックし、リクエストを実行します。リクエストが正常に終了したら、作成されたExtractファイルをUtilities -> Browse...メニューから開き、期待通りにデータがマスクされていることを確認してください。
最後に、Convertリクエストを利用して、マスク・データの入ったExtractファイルをCSVに変換します。
- Optimにて、File -> New -> Convertメニューを選択します。
- Convert Request Editor(図 8)のFile Format Typesドロップダウン・ボックスにて、「Comma Separated Value(CSV)」を選択します。
図 8. CSVを作成するConvert Request Editor
- Source Fileフィールドに3.2節で作成したExtractファイル名(customers_utf8_masked.XF)、Control Fileフィールドに適切なコントロール・ファイル名(例: customers_utf8_masked2.CF)を、Destination FileフィールドにターゲットのCSVファイル名(customers_utf8_masked.csv)を入力します。
- Table Map OptionsグループのLocalラジオボタンを選択し、Tools -> Edit Table Mapメニューをクリックします。
- 表示されたTable Map Editor(図 9)で、QualifierフィールドにDB Alias名.スキーマ名(IBM1208.UTF8)を入力します。
図 9. CSVを作成するTable Map Editor
- File -> Closeをクリックし、Table Map Editorを閉じます。「Save changes to Table Map Definition?」と聞かれますのでYesボタンをクリックしてください。以上で、CSVファイル作成の準備は終了です。
- Convert Request Editor(図 8)にて、File -> Runメニューをクリックし、リクエストを実行します。
リクエストが正常に終了したら、ターゲット・ファイルをテキスト・エディタにて開き、内容を確認します。リスト 3のように、名、出生地、生年月日がマスクされたCSV形式のデータが出力されているはずです。
リスト 3. マスクされたCSVファイルの例
1,徳川,隆直,福島県,1948/07/07 2,西郷,雅義,山口県,1964/07/21 3,勝,春男,石川県,1983/04/07 4,坂本,重治,秋田県,1969/09/05 5,松平,佳史,岩手県,1987/03/16 6,桂,隆彦,茨城県,1975/01/15 |
4. Insertリクエストを利用したCSVファイル・マスキング
続いて、Insertリクエストを利用したCSVファイルのマスキング方法(図 2)について説明します。本章では、ソース・ファイルC:\data\dw\csv_demo\customers_sjis.csvに、リスト 1の内容がShift_JISで保存されている場合を考えます。ODBCラッパーを使用する場合、Federationデータベースのコードページに制約はありませんが、ファイルのコードページと同一にすることをお勧めします。本章の場合、FederationデータベースのコードページをIBM-943で作成しておきます。
では、ソース・ファイルcustomers_sjis.csv中の名と出身地、生年月日をマスクし、ターゲット・ファイルcustomers_sjis_masked.csvに保存してみましょう。
まず、ソース・ファイルとターゲット・ファイルに対応するニックネームを作成します。本章で使用するラッパーは、ODBCラッパーです。ODBCラッパーはニックネーム作成前に、ODBCドライバーの構成が必要になります。本章ではFederation ServerがWindows上で稼動しているものとし、Microsoft社が提供しているMicrosoft Text Driverを使用します。Federation ServerがUNIX上で稼動している場合は、IBM-Branded ODBC Driverを導入、構成してください[4]。
- Windowsのコントロール パネルから、管理ツール -> データソース(ODBC)を選択し、ODBCデータ ソース アドミニストレータを起動します。
- システム DSNタブを開き、追加ボタンをクリックします。
- データ ソースの新規作成ダイアログにて、「Microsoft Text Driver」を選択し、完了ボタンをクリックします。
- ODBC テキスト セットアップダイアログ(図 10)にて、適切なデータソース名(例: csv_demo)を入力し、フォルダの選択ボタンをクリックして、マスクしたいファイルが存在するフォルダ「C:\data\dw\csv_demo」を指定します。
図 10. [ODBC テキスト セットアップ]ダイアログ
- OKボタンをクリックして、ODBCデータ ソース アドミニストレータを閉じます。
- C:\data\dw\csv_demo内にschema.iniファイルを作成し、ソースとターゲット双方のCSVファイルのデータ構造をテキスト・エディタにて記述します(リスト 4)。各フィールド値の詳細については、Microsoft Text Driverのマニュアル[5]を参照してください。
リスト 4. schema.iniの内容[customers_sjis.csv] ColNameHeader=False Format=CSVDelimited MaxScanRows=0 CharacterSet=OEM DateTimeFormat="yyyy/mm/dd" TextDelimiter=none Col1=PID Integer Col2=LASTNAME Char Width 16 Col3=FIRSTNAME Char Width 16 Col4=BIRTHPLACE Char Width 16 Col5=BIRTHDATE Date [customers_sjis_masked.csv] ColNameHeader=False Format=CSVDelimited MaxScanRows=0 CharacterSet=OEM DateTimeFormat="yyyy/mm/dd" TextDelimiter=none Col1=PID Integer Col2=LASTNAME Char Width 16 Col3=FIRSTNAME Char Width 16 Col4=BIRTHPLACE Char Width 16 Col5=BIRTHDATE Date
- ニックネームを作るためには実体が必要であるため、空のターゲット・ファイルを作成します。
C:\data\dw\csv_demo> type nul > customers_sjis_masked.csv
- 準備したFederationデータベースに接続し、リスト 5のSQL文を実行します。
リスト 5. ODBCラッパーに対するニックネームの作成1) CREATE WRAPPER ODBC; 2) CREATE SERVER ODBCSERVER TYPE ODBC VERSION 5 WRAPPER ODBC 3) OPTIONS (NODE 'csv_demo'); 4) CREATE NICKNAME SJIS.CUSTOMERS FOR ODBCSERVER."customers_sjis.csv"; 5) ALTER NICKNAME SJIS.CUSTOMERS ALTER BIRTHDATE LOCAL TYPE DATE; 6) CREATE NICKNAME SJIS.CUSTOMERS_MASKED FOR ODBCSERVER."customers_sjis_masked.csv"; 7) ALTER NICKNAME SJIS.CUSTOMERS_MASKED ALTER BIRTHDATE LOCAL TYPE DATE;
- 1行目: ODBCラッパー・オブジェクトを作成しています。
- 2-3行目: ODBCサーバー・オブジェクトを作成しています。NODEオプションの値には、ODBCのデータソース名を指定します。ODBCSERVERは任意の名前です。
- 4, 6行目: ソース・ファイル、ターゲット・ファイルに対して、ニックネームを作成しています。
- 5, 7行目: Microsoft Text DriverのDATE型はデフォルトでTIMESTAMP型にマップされるため、BIRTHDATE列のデータ型をDATE型に変更しています。
ニックネームの作成に成功したら、SELECT文を発行し、ソース・ファイルの内容を正しく取得できるか確認してください。
次に、ニックネームからデータを抽出し、マスクします。方法は3.2節と同様です。
最後に、4.2節で作成したマスク・データの入ったExtractファイル(customers_sjis_masked.XF)を、ターゲット・ニックネームに挿入することで、CSVファイルを生成します。Optim上で、Insertリクエストを作成し実行することで、Extractファイルのデータを挿入することができます。
- OptimにてFile -> New -> Insertメニューを選択します。
- Insert Request Editor(図 11)のSource Fileフィールドに、4.2節で作成したExtractファイル名(customers_sjis_masked.XF)を、Control Fileフィールドに適切なコントロール・ファイル名(例: customers_sjis_masked2.CF)を入力します。
図 11. Insert Request Editor
- Process OptionsグループにてInsertラジオボタンを選択します。
- Table Map OptionsグループにてLocalラジオボタンを選択し、Tools -> Edit Table Mapメニューをクリックします。
- Table Map Editor(図 12)にて、Default Qualifierフィールドに「DB Alias名.スキーマ名(IBM943.SJIS)」、Destination Tableセルにターゲット・ニックネーム名(CUSTOMERS_MASKED)を入力します。
図 12. InsertリクエストのTable Map Editor
- File -> Closeメニューをクリックし、Table Map Editorを閉じます。「Save changes to Table Map Definition?」と聞かれますのでYesボタンをクリックしてください。以上で、Extractファイルのデータをニックネームに挿入する準備は終了です。
- Insert Request Editor(図 11)にて、File -> Runメニューをクリックし、リクエストを実行します。
リクエストが正常に終了したら、ターゲット・ファイルをテキスト・エディタにて開き、内容を確認します。リスト 3のように、名、出生地、生年月日がマスクされたCSV形式のデータが出力されているはずです。
本稿では、OptimとFederation Serverを組み合わせてCSVファイルの個人情報をマスクする方法を説明しました。データを正しくマスクしてしまえば、テストやデータ解析時に個人情報の漏洩を心配する必要はありません。Optimを利用することで、より安全で快適な作業環境を構築することが可能となるのです。