レベル: 初級 難波 かおり (knamba@jp.ibm.com), ソフトウェア開発研究所 IM&Lotus開発, IBM
2009年 4月 10日 IBM Optim Data Privacy Solutionは、データソース内の機密情報をマスクすることで、データの安全性を保持するソリューションです。2008年12月に発表されたIBM Optim Data Privacy Solution バージョン1.2 (以下Optim V1.2)は、今までのOptimとは全く異なるアーキテクチャーとインターフェースを実装したことで、より使いやすくよりスケーラブルなデータのマスク環境を提供しています。本稿ではOptim V1.2を使用したデータのマスク方法を、例を交えながら具体的に紹介します。
1. はじめに
IBM Optim Data Privacy Solutionは、データソース内の機密情報をマスクすることで、データの安全性を保持するソリューションです。顧客データ等の機密を守ることは、健全なビジネスに通じるだけでなく、その大部分が法規制に直結しています。Optimは、その優れたデータ変換能力により、本番環境の機密情報をマスクし、安全な開発テスト環境の構築を支援します。脆弱になりがちなテスト環境を保護しながらも、容易に実環境に極めて近い状態で正確なテストを実施することができます。
2008年12月に発表されたIBM Optim Data Privacy Solution バージョン1.2 (以下Optim V1.2)は、Eclipseベースの開発環境とJava Enterprise Edition (J2EE 5) ベースの実行環境を実装することで、より使いやすくよりスケーラブルなデータのマスク環境を提供しています。特に、Optim Studioと呼ばれるEclipseベースの開発環境は、直感的で分かりやすい操作環境を実現しました。マウス操作だけでOptim V1.2のデータ変換能力のほぼ全てを利用することが可能です。
Optim V1.2でデータをマスクすることを、データ・プライバシー・ポリシーを適用するといいます。データ・プライバシー・ポリシーとは、データ属性に応じた個々の具体的なマスク手法のことです。Optim V1.2は機密データの属性に合わせ、多岐に渡ったデータ・プライバシー・ポリシーを提供しています。本稿ではOptim V1.2を使用したデータのマスク手法を、実際の操作方法を含めて具体的に紹介します。
2. データ・プライバシー・ポリシーのタイプ
データ・プライバシー・ポリシーとは、Optim V1.2における具体的なデータのマスク手法を指します。データの種類や属性に応じ、さまざまなデータ・プライバシー・ポリシーを適用することで、データのマスクを行います。データ・プライバシー・ポリシーには、「ルックアップ・ポリシー」、「ルール・ベース・ポリシー」、「インライン式ポリシー」の3タイプがあります。これらのタイプを意識せずとも、データ・プライバシー・ポリシーを利用できますが、より効率よく、その特性を十分に生かすには、タイプを念頭に置きながら作業することが重要です。
2.1. ルックアップ・ポリシー
ルックアップ・ポリシーとは、マスク・データを予め定義されたルックアップ表から取得し、データをマスクする手法です。Optim V1.2では、各国別にさまざまな個人識別データのルックアップ表を提供しています。ルックアップ・ポリシーにはランダム・ルックアップとハッシュ・ルックアップの2つのオプションがあります。ランダム・ルックアップはルックアップ表からランダムにマスク・データを取り出します。ハッシュ・ルックアップは、入力キーからハッシュ値を計算し、ハッシュ値を索引としてルックアップ表からマスク・データを取り出します。入力キーはソース・データもしくはソース・データがある同じ行の別の列の値を利用できます。ハッシュ・ルックアップを利用することで、反復可能なマスクを実行できるようになります。
ルックアップ・ポリシーは、ソースのリレーショナル・データ・モデル(RDM)もしくはリレーショナル・データ・アクセス・モデル(RDAM)に適用します。RDMに適用すると、複数のグループで適用したプライバシー・ポリシーを共有できます。RDAMに適用した場合は、そのRDAMが存在するグループの中だけで有効になります。
RDMもしくはRDAM内の表に対して、[プライバシー・ポリシーの適用]コンテキスト・メニューを選択すると、[プライバシー・ポリシーの適用]ウィザード(図1)が表示され、使用可能なポリシーがリストされます。ポリシーの詳細な設定はこのウィザードを通して行います。
図1. [プライバシー・ポリシーの適用]ウィザード
2.2. ルール・ベース・ポリシー
ルール・ベース・ポリシーとは、マスク・データをプログラム的に生成し、データをマスクする手法です。Optim V1.2では、日付やクレジット・カード番号等を生成するポリシーを提供しています。ルール・ベース・ポリシーも、ルックアップ・ポリシー同様、ソース・データとは無関係にランダムにマスク・データを生成したり、ソース・データに基づいてマスク・データを生成したりできます。
ルール・ベース・ポリシーは、ルックアップ・ポリシー同様、ソースのリレーショナル・データ・モデル(RDM)もしくはリレーショナル・データ・アクセス・モデル(RDAM)に適用します。ルール・ベース・ポリシーの詳細な設定も、[プライバシー・ポリシーの適用]ウィザード(図1)を通して行います。
2.3. インライン式ポリシー
 |
プライバシー・ポリシーのカスタマイズ
簡単なマスク手法であれば、インライン式ポリシーでカスタマイズ可能ですが、Javaプログラミングによる、より複雑なマスク手法の実装も可能です。詳細は、「Data Privacy開発マニュアル」を参照下さい。
|
|
ルックアップ・ポリシーやルール・ベース・ポリシーでは行うことのできないデータ変換を、JavaScriptによるプログラミングで実現するものです。例えば、ルックアップ・ポリシーでマスクした2つのデータを連結して新たなマスク・データを生成したり、ルール・ベース・ポリシーで生成した数値データを元に計算をしてマスク・データを生成するときに使用します。
インライン式ポリシーは、コピー・サービス定義に対して適用します。コピー・サービス定義をダブルクリックすると、サービスの[プロパティ]パネルが表示されます。その[構成]タブ(図2)にある、インライン式テキスト・エリアにJavaScriptを記述していきます。スクリプト内で、他の列はもちろん他の表のデータを参照することも可能です。
図2. コピー・サービス定義の[プロパティ]パネルの[構成]タブ
3. Optim V1.2の提供するデータ・プライバシー・ポリシー
Optim V1.2が提供するプライバシー・ポリシーは、「日付モデル」、「身元モデル」、「スクランブル・モデル」の3つのグループに分けられています。機密情報のほとんどは、これらの組み合わせでマスクすることが可能です。これらのポリシーは、ルックアップ・ポリシーもしくはルール・ベース・ポリシーにて実装されています。Eメール・アドレス・ポリシー以外のルール・ベース・ポリシーは、インライン式の中で使用できるインターフェースも提供されています。
3.1. 日付モデル
日付モデルは、全てルール・ベースのポリシーです。指定した範囲内の日付をマスク・データとして取得できます。出力フォーマットを指定することも可能です。クレジット・カードの有効期限や生年月日のマスクに使用できます。
表 1. 日付モデル
| ポリシー名 | インライン式 | 説明 |
|---|
| 範囲内のランダム日付 | DateMask.randomDateInRange | 指定範囲内でランダムに日付を生成します。 | | 日付を月に丸める | DateMask.roundDateToMonth | ソース・データの日付を、その月の最初の日付に丸めます(例: 8月21日 -> 8月1日)。 | | 日付を年に丸める | DateMask.roundDateToYear | ソース・データの日付を、その年の最初の日付に丸めます(例: 2008年8月21日 -> 2008年1月1日)。 |
3.2. 身元モデル
身元モデルは、5つのルックアップ・ポリシーと3つのルール・ベース・ポリシーから構成され、個人に関するさまざまな情報をマスクします。これら8つのポリシーの中には、切り替えオプションをサポートしているものがあります。切り替えオプションとは、切り替え値として指定した列の値に応じて、ポリシーの種類を変えることです。例えば、ある表のCOL1列に国籍が、COL2列に姓が格納されているとします。このときCOL1列を切り替え値としてCOL2列をラストネーム・ポリシーでマスクすると、COL1の値が「U.S.A.」の場合COL2はアメリカ用のラストネーム・ポリシーでマスクされ、COL1が「Japan」の場合は日本用のラストネーム・ポリシーでマスクされます。
表 2. 身元モデル: ルックアップ・ポリシー・タイプ
| ポリシー名 | インライン式 | 切り替えオプション | 説明 |
|---|
| 個人 | - | 可 (国名) | 各種個人情報をマスクします。各国用(オーストラリア(AU)、カナダ(CA)、ドイツ(DE)、スペイン(ES)、フランス(FR)、イタリア(IT)、日本(JP)、英国(UK)、米国(US))のポリシーが用意されています。日本用の場合、名前、住所、電話番号、生年月日、性別、住基コード、Eメール・アドレスを同時にマスクすることができます。 | | 住所 | 可 (国名) | 住所をマスクします。各国用のポリシーがあります。 | | 会社 | 不可 | 会社名をマスクします。英語名のみサポートしています。 | | ファーストネーム | 可 (国名) | 名前をマスクします。各国毎に女性用、男性用、男女兼用のポリシーがあります。 | | ラストネーム | 可 (国名) | 姓をマスクします。各国用のポリシーがあります。 |
表 3. 身元モデル: ルール・ベース・タイプ
| ポリシー名 | インライン式 | 切り替えオプション | 説明 |
|---|
| クレジット・カード | CCNmask.maskCCN, CCNmake.randomCCN | 可 (発行者名) | クレジット・カード番号をマスクします。ソース・データの発行者番号を維持し、発行者のルールに従ってアカウント番号とチェック・ディジットを生成します。 | | ID | CFmask.maskCF, CFmask.randomCF (IT) INSEEmask.maskINSEE, INSEEmask.randomINSEE (FR)
NIFmask.maskNIF, NIFmask.randomNIF (ES) NINOmask.maskNINO, NINOmask.randomNINO (UK)
SINmask.maskSIN, SINmask.randomSIN (CA) SSNmask.maskSSN, SSNmask.randomSSN (US)
| 可 (国名) | アメリカの社会保障番号やカナダの社会保険番号等を、その国のルールに従って生成しマスクします。日本の住基コードは未サポートです。 | | Eメール・アドレス | - | 不可 | Eメール・アドレスをマスクします。ドメイン名はソース・データのものが使用され、ユーザー名のみがマスクされます。ユーザー名は、固定文字列に連番を連結したものか、他の列の値を使用できます。 |
3.3 スクランブル・モデル
スクランブル・モデルは、全てルール・ベースのポリシーです。Optim V1.2で新たに追加されました。文字タイプ毎に文字を置き換えるスクランブル(例: 英大文字は英大文字に、数字は数字に、ひらがなはひらがなに等)、ソース・データ内で文字を入れ替えるスワップ、指定範囲の数値を生成するランダムの3つに大別されます。全く意味のない文字列、数値でマスクしたい場合に使用します。
表 4. スクランブル・モデル
| ポリシー名 | インライン式 | 説明 |
|---|
| 文字のスクランブル | ScrambleMask.scrambleCharacters | ランダムに生成した文字で、スクランブルします。 | | 正規表現による文字のスクランブル | ScrambleMask.scrambleCharactersByRegularExpression | 指定した正規表現に一致する文字のみを、ランダムに生成した文字でスクランブルします。 | | メソッドを使用した文字のスクランブル | ScrambleMask.repeatableScramble | 指定したメソッドで生成された文字で、スクランブルします。メソッドを使用することで、反復可能なマスクを実現しています。メソッドには、巡回冗長検査(CRC) 関数、ハッシュ・メソッド、マップ・メソッドを使用することができます。 | | メソッドを使用した正規表現による文字のスクランブル | ScrambleMask.repeatableScrambleByRegularExpression | 指定した正規表現に一致する文字のみを、指定したメソッドで生成された文字で、スクランブルします。メソッドを使用することで、反復可能なマスクを実現しています。メソッドには、巡回冗長検査(CRC) 関数、ハッシュ・メソッド、マップ・メソッドを使用することができます。 | | 文字のスワップ | ScrambleMask.swapCharacters | ソース・データ内の文字の順序を、ランダムに変更します。 | | 正規表現による文字のスワップ | ScrambleMask.swapCharactersByRegularExpression | ソース・データ内の、指定した正規表現に一致する文字のみの順序を、ランダムに変更します。 | | 文字の決定論的スワップ | ScrambleMask.deterministicSwap | ソース・データ内の文字の順序を、反復可能な方法で変更します。 | | 範囲内一様ランダム・ダブル | ScrambleMask.uniformRandomDoubleInRange | 倍精度浮動小数点数をランダムに生成します。生成される数値の分布は、一様です。 | | 範囲内一様ランダム・ロング | ScrambleMask.uniformRandomLongInRange | 長整数をランダムに生成します。生成される数値の分布は、一様です。 | | ガウス・ランダム・ダブル | ScrambleMask.gaussianRandomDouble | 倍精度浮動小数点数をランダムに生成します。生成される数値の分布は、ガウス分布になります。 | | ガウス・ランダム整数 | ScrambleMask.gaussianRandomInteger | 整数をランダムに生成します。生成される数値の分布は、ガウス分布になります。 |

 |
4. データ・プライバシー・ポリシーの適用
では、どのようなデータがどのようにマスクされるのか、具体的な操作を含めて紹介しましょう。ここでは表5のような架空の顧客データ(表名: DEMO.CUSTOMERS)があると仮定します(表定義とサンプル・データはこちらからダウンロードできます)。この顧客データは非常にセンシティブな情報ばかりです。Optim V1.2を使って、顧客番号以外を全てマスクし、DEMOTARGET.CUSTOMERS表に挿入してみます。
表 5. サンプル顧客データと適用するプライバシー・ポリシー
| 列名 | データ・タイプ | 説明 | 適用するポリシー名 | ポリシー・タイプ |
|---|
| CUSTOMER_ID | char(5) | 顧客番号 | (マスクなし) |
|---|
| FAMILY_NAME | varchar(15) | 姓 | ラストネーム | ルックアップ |
|---|
| GIVEN_NAME | varchar(15) | 名 | ファーストネーム | ルックアップ |
|---|
| CREDIT_CARD_NUM | varchar(19) | クレジット・カード番号 | クレジット・カード | ルール・ベース |
|---|
| PASSPORT_NUM | char(9) | パスポート番号 | 文字のスクランブル | ルール・ベース |
|---|
| BIRTH_DATE | date | 生年月日 | 範囲内のランダム日付 | ルール・ベース |
|---|
| AGE | int | 年齢 | インライン式 |
|---|
予めOptim Studioを使用して、データベース上のDEMO.CUSTOMERS表からDEMOTARAGET.CUSTOMERS表へ、データを挿入するサービスを作成しておきます。その方法は、「Optim Studio ユーザー・マニュアル」を参考にしてください。作成後のOptim Studio画面は、例えば図3の様になります。
図 3. サービスの構成例
4.1 ルックアップ・プライバシー・ポリシーの適用
始めに、ルックアップ・ポリシーのラストネーム・ポリシーとファーストネーム・ポリシーを使用して、姓と名前が入っている列(FAMILY_NAMEとGIVEN_NAME)をマスクします。
ルックアップ・ポリシーを適用するには、まず、ソースのRDM(図3のdW Demo Source.rdsm)もしくはRDAM(図3のDemo Source.rdam)を展開し、DEMO.CUSTOMERS表を選択、[プライバシーポリシーの適用]コンテキスト・メニューをクリックします。[プライバシー・ポリシーの適用]ウィザードの[プライバシー・グループ・セレクター]ページ(図1)が表示されますので、身元モデルを展開し、名前グループの下のラストネーム・ポリシー・グループを選択します。
次に表示される[切り替えオプション]ページは、デフォルト設定のまま、[次へ]ボタンをクリックします。先に述べた、切り替えオプションを使用したい場合は、このパネルの[切り替え値'国'を使用する]チェックボックスをオンにして次に進みます。
切り替え値オプションを指定しない場合は、[プライバシー・ポリシー・セレクター]ページ(図4)が表示されます。このページでは、使用するプライバシー・ポリシーを選択できます。今回は日本の姓でマスクしたいので、JP Last Name Lookupを選択し、[次へ]ボタンを選択します。
図 4. [プライバシー・ポリシー・セレクター]ページ (ラストネーム)
次に表示される[ルックアップ・キー・ジェネレーター]ページでは、生成されるマスク・データをランダムにするかハッシュ値を利用するかを選択します。デフォルトの[ランダム・キーの生成]を選択したまま、[次へ]ボタンをクリックします。[列のマップ]ページ(図5)で、マスクするソースの列とターゲットの列を指定します。FAMILY_NAME列を、lastNameType.Lastnameとマップして[終了]ボタンをクリックします。以上で姓のマスク処理は終了です。名前も同様の手法で、ファーストネーム・ポリシーを使ってマスクできます。
図 5. [列のマップ]ページ
4.2 ルール・ベース・ポリシーの適用 その1: 範囲内のランダム日付
次に、範囲内のランダム日付ポリシーを利用して、生年月日(BIRTH_DATE列)をマスクしましょう。
ルール・ベース・ポリシーを適用するには、ルックアップ・ポリシーと同様の方法で、[プライバシー・ポリシーの適用]ウィザードを表示させます。[プライバシー・グループ・セレクター]ページ(図1)で、日付モデルを展開し、範囲内のランダム日付ポリシーを選択します。次に表示される[ポリシー・プロパティ・エディター]ページで、マスクに必要な情報を表6の通りに入力すれば終了です。1940年1月1日から2008年1月1日までの日付がランダムに生成され、/DEMO/CUSTOMERS/BIRTH_DATE列のデータをマスクします。
表 6. ランダム日付のプロパティー値
| プロパティ名 | 値 |
|---|
| 範囲開始日 | 1940-1-1 | | 範囲終了日 | 2008-1-1 | | 日付マスクのターゲット列 | /DEMO/CUSTOMERS/BIRTH_DATE |
図 6. [ポリシー・プロパティ・エディター]ページ
4.3 ルール・ベース・ポリシーの適用 その2: クレジット・カード
クレジット・カード番号(CREDIT_CARD_NUM列)は、クレジット・カード・ポリシーを利用してマスクします。
[プライバシー・ポリシーの適用]ウィザードを表示させ、[プライバシー・グループ・セレクター]ページ(図1)で、身元モデルを展開し、クレジット・カード・ポリシー・グループを選択します。次に表示される[切り替えオプション]ページは、デフォルト設定のまま、[次へ]ボタンをクリックします。
切り替え値オプションを指定しない場合は、[プライバシー・ポリシー・セレクター]ページ(図7)が表示されます。このページでは、使用するクレジット会社のルールを選択できます。今回、サンプル・データにはさまざまなクレジット会社のカード番号が格納されているので、Generic Credit Card Ruleを選択します。最後に、[データ・マスク列セレクター]ページで、マスクする値の入ったCUREDIT_CARD_NUM列を選択すれば終了です。CREDIT_CARD_NUM列は、ソース・データの発行者番号を維持したまま、発行者のルールに従って生成されたアカウント番号とチェック・ディジットでマスクされます。
図 7. [プライバシー・ポリシー・セレクター]ページ (クレジット・カード)
4.4 ルール・ベース・ポリシーの適用 その3: 文字のスクランブル
日本のパスポート番号は、2文字の英字と7桁の数字で構成されます。先頭の英字は、有効年数によって決まっていますが、その他の桁に規定はありません。ここでは文字のスクランブル・ポリシーを使用し、先頭の英字も含め、全てランダムな文字でマスクします。
[プライバシー・ポリシーの適用]ウィザードを表示させ、[プライバシー・グループ・セレクター]ページ(図1)で、スクランブル・モデルを展開し、文字のスクランブル・ポリシーを選択します。[データ・マスク・メソッド・セレクター]ページは、デフォルトの「'値'をマスクする」をオンにしたまま、[次へ]ボタンをクリックします。次に表示される[ポリシー・プロパティー・エディター]ページ(図6)で、入力値列に「/DEMO/CUSTOMERS/PASSPORT_NUM」を指定すれば終了です。先頭2文字はランダムな英字で、残りの7桁の数字はランダムな数字でマスクされます。
4.5 インライン式ポリシーの適用
最後に、インライン式ポリシーを利用して、年齢(AGE列)をマスクします。年齢は、セクション4.2でマスクした生年月日と一致していなければなりません。適当なポリシーがありませんので、インライン式ポリシーで実装する必要があります。
インライン式ポリシーを適用するには、サービス(図3のInsert.svc)をダブルクリックし、コピー・サービスの[プロパティ]パネルの[構成]タブ(図2)を表示させます。CUSTOMERS表を展開し、AGE列を選択します。インライン式のテキスト・エリアが入力可能になりますので、以下の通り計算式を入力します。入力後、[適用]ボタンをクリックし、[ファイル - 保存]メニューを選択してサービスを保存します。
new Date().getFullYear()
- parseInt(record.getItem('/DEMO/CUSTOMERS/BIRTH_DATE').substr(0,4)) |
インライン式ポリシーは、ルックアップ・ポリシーやルールベース・ベース・ポリシーが適用された後に実行されます。ですので、record.getItem('/DEMO/CUSTOMERS/BIRTH_DATE')によって生年月日のマスク・データを取得し、それを元に計算した年齢でAGE列がマスクされることになります。
4.6 実行結果
以上のポリシーを適用し、サービスを実行した場合の結果例を表7に示します。ランダムなマスクを実行している列は、マスク・データは必ずしも表の値通りとはなりません。
表 7. マスク結果の例
| 列名 | 適用したポリシー名 | ソース・データ | マスク・データ |
|---|
| CUSTOMER_ID | (マスクなし) | 00001 | 00001 |
|---|
| FAMILY_NAME | ラストネーム | 受川 | 沢橋 |
|---|
| GIVEN_NAME | ファーストネーム | きみ子 | 剛崇 |
|---|
| CREDIT_CARD_NUM | クレジット・カード | 30000080320405 | 30009981847929 |
|---|
| PASSPORT_NUM | 文字のスクランブル | MU3538517 | GG3594949 |
|---|
| BIRTH_DATE | 範囲内のランダム日付 | 1997-11-23 | 1941-03-29 |
|---|
| AGE | インライン式 | 11 | 67 |
|---|
5. おわりに
このように、Optim V1.2はさまざまなプライバシー・ポリシーを提供することで、機密情報のマスクを簡単な操作で実現しています。ポリシーの組み合わせ次第で、マスクできるデータは無限に広がります。
あるデータに対するマスク手法は一つに限られません。データの性質およびデータを利用するアプリケーションの厳密さにより変わります。例えばクレジット・カード番号の場合、アプリケーションがクレジット・カード番号の有効性を確認している場合は、クレジット・カード・ポリシーを利用して、実際に有効なカード番号でマスクする必要があります。しかし、カード番号の有効性を確認しないアプリケーションの場合は、スクランブル・ポリシーを使用して、単純に意味のない数字列に変換することでも対応可能です。
機密性の高いデータの漏洩を防ぐには、機密性を失わせることがひとつの解となります。機密性を失わせても、データとしての意味を保持し続ける点に、IBM Optim Data Privacy Solutionの価値があります。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| サンプル顧客データ | create_demo_table.txt | 3KB | HTTP |
|---|
参考文献
著者について  | |  | 難波かおりはソフトウェア開発研究所のIM&Lotus開発に所属し、データベース関連製品の開発に携わってきました。現在はIBM Optim製品群の品質保証および支援業務を担当しています。 |
記事の評価
|