Oracle Data Safeのデータ・マスキングを試してみる

ここではData Safeのデータ・マスキングの機能を使って、Oracle Cloudに格納されている氏名や住所などの機微な情報をマスキングする手順を紹介します。実際に、Autonomous Databaseにテストデータを作成して、Data Safeのマスキング機能でデータをマスキングする一連の流れを紹介します。

## 事前準備
- Data Safeが、以下の手順で有効化済み
    - https://qiita.com/western24/items/ce12012acfc429b363a7
- Data Safeと同じリージョンのAutonomous Transaction Processing 
- Compute Instance
    - 必須ではありません。OCIのVMインスタンスだとほぼCopy&Pasteで実行可能です。既にSQLPlusでの実行環境がある方は、そちらで実行して下さい
    
## テストデータの生成

- ATPのインスタンス詳細画面。DB接続をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/be8b4d21-ac5f-ed4a-7935-ff5c0ce6ab21.png)

- クライアント資格証明書のダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/aa99f6df-4c80-3e84-01b9-c779f1c57e5e.png)

- ローカルにダウンロードしたWallet_ATP名.zipをコンピュート内にコピーして、ログイン

```
※以降 Wallet_ATP名 = Wallet_demoatpとして記述
$ pwd
/home/opc
$ unzip Wallet_demoatp.zip -d Wallet_demoatp

Oracle Clientのインストール&設定
$ wget https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm
$ sudo rpm -ivh oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm
$ wget https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-sqlplus-19.3.0.0.0-1.x86_64.rpm
$ sudo rpm -ivh oracle-instantclient19.3-sqlplus-19.3.0.0.0-1.x86_64.rpm
$ export TNS_ADMIN=/home/opc/Wallet_demoatp
$ vi Wallet_demoatp/sqlnet.ora 
※Wallet_locationのDIRECTORYパスを変更
DIRECTORY="/home/opc/Wallet_demoatp"

Githubからテスト・データ作成スクリプトをダウンロード
$ wget https://raw.githubusercontent.com/westan24/datasafedemo/master/create_verification_data.sql

ATPへの接続 &テスト・データ作成スクリプト実行
$ sqlplus ADMIN/パスワード@demoatp_high
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
SQL> @create_verification_data

作成されたデータの確認
SQL> select * from DEMO.DEPARTMENTS;
DEPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID LOCATION_ID
------------- ------------------------------ ---------- -----------
           10 Administration                        200        1700
           20 Marketing                             201        1800
           30 Purchasing                            114        1700
```

## Data SafeにターゲットDBとして登録

- 言語をEnglishに変更し、Data SafeのRegisterをクリック ※日本語だとRegisterが表示されません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/a937e003-8e17-d285-5559-46242370a543.png)


- 登録完了後、View Consoleをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/afadc734-db99-2967-1d0a-588be7ecd26e.png)

- Targetsから登録するATP名をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/f579f16e-402a-a6cc-98ca-90f617f93a4c.png)

- Download Privilege Scriptリンクをクリックし、SQL権限スクリプトをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/2f901ac3-f730-18a7-6265-dbe0a0f1ff37.png)

- SQL権限スクリプトをComputeインスタンスにアップロードして、以下を実行
このスクリプトはATPのADMINユーザーで実行する必要があります

```
SQL>  @dscs_privileges.sql DS$ADMIN GRANT ALL
Done.
```

## ユーザ独自のマスキング定義を作成

EMPLOYEES表に格納されている列を下記のマスキング形式に従ってマスキングを実行する

|列名  |マスキング形式|マスキング結果|
|---|---|------|
|FIRST_NAME|Random Name|Urgejkhyrytmn
|LAST_NAME |Random Name|Rtjtnszncxa
|EMAIL |Email Address|CLHJEw@pxhxcxee.gov
|HIRE_DATE |Date-Past|1987-06-17T00:00:00Z
|CARD_NO |Credit Card Number|6212345678900016
|DEPARTMENT_ID |Format Preserving Randomization| 90
|<font color="Red">PHONE_NUMBER</font> |<font color="Red">ユーザー定義</font> |<font color="Red">080-9542-3091</font>

ここでは、Build-inで用意されていない日本の携帯番号のマスキング形式をユーザー定義として作成する

- Libraryタグを選択し、Masking Fromatsをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/9ab75f78-5235-530d-4b19-1a2c6c6e5fa8.png)

- Addをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/e6963535-424a-c803-9c44-4dc573296ec7.png)

- 以下のように作成する
    - Masking Format Name: Japanese Mobile Number
    - Add Formatをクリックして以下を追記
    - Random List: 070-, 080-, 090-
    - Random Digits: Start Length 4, End Length 4
    - Fixed String: -
    - Random Digits: Start Length 4, End Length 4
    - Resource Group: Default Resource Group
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/b9b26146-0abd-c5cc-96f1-705e3f160940.png)

- 独自のマスキング定義(Japanese Mobile Number)が作成された
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/54cee6ae-e6cf-21b8-bdf2-0cd060da8efa.png)

## 検証用のデータを確認する

- サービスコンソールをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/73e9ba3c-b307-c6d6-6399-dc2a7ef46044.png)

- SQL Developer Webを起動してログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/473408c5-9d5b-16d9-308f-cc76b96fd63f.png)

- 確認用スクリプトをコピーする
    - https://github.com/western24/datasafedemo/blob/master/confirm_masking_result.sql


-　スクリプト実行。EMPLOYEE_IDでソートし、マスク後の結果と見比べるために現在のデータを確認しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/335614ed-8bbc-eb03-1c7a-3f2e62b1b3aa.png)

## Sensitive Data Discoveryでマスキング対象列の検出

- TargetDBを選択し、Continueをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/2964a79f-f0ee-7786-86c9-14c747f7f95e.png)

- 以下のように入力し、Continueをクリック
    - Masking Policy: Create
    - Sensitive Data Model: Create
    - Resource Group: Default Resource Group
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/4c4416bd-9cb7-9614-5303-02b8696bdff3.png)

- Continueをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/709ade60-9d1b-e709-eb9d-14dc32364bf8.png)

- Demoスキーマをチェックして、Continueをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/3fe20451-dfd1-7ffc-ae58-b18c99b68c2a.png)

- Select Allをチェックして、Oracle定義済のSensitive Data Typeをすべて選択し、Continueをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/1cd210fe-3ba0-f8cb-a377-a04cacb8b9ab.png)

- Discoveryの完了。Continueをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/fefc4e7f-aa5d-190a-2085-a69fcc561333.png)

## データ・マスキング列とフォーマットの指定

- Expand Allをスライド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/7487cd96-449e-64a0-61d7-e9db2d5ba3b7.png)

- 1, 2を順に実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/9614925f-9ae5-6c9e-57d4-02b22c4e1845.png)

- Sensitive TypeにCard Numberを選択。DEMOスキーマのEMPLOYEESテーブルのCARD_NO列をチェックしてAdd to Resultをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/b4c51aa7-771e-fefd-cea6-99d34a644ba6.png)

- Sensitive TypeにWork Permit Numberを選択。DEMOスキーマのDEPARTMENTSテーブルのDEPARTMENT_ID列をチェックしてAdd to Resultをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/0cc8db96-73fb-4b0c-bc5a-dbf9de7a0e23.png)

- チェックされているのが今回のマスキング対象列、Save and Continueをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/dd07116e-3e09-dde7-c1e9-bc2babb8525c.png)

- それぞれの列には、対応するマスキング・フォーマットが自動設定されている
PHONE_NUMBER列だけをデフォルトから作成済みの独自のマスキングフォーマットに変更する。PHONE_NUMBER列の編集アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/09529852-062a-2b90-1d10-65f0424126ad.png)

- PHONE_NUMBER列をJapanese Mobile Numberに変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/36f1191a-0207-8f8a-e22d-31478e1b103d.png)

- Create Policyをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/bdab31a9-f966-9981-3182-be9d6567071f.png)

## データ・マスキングの実行

- Right Nowをチェックし、Reviewをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/aab3680f-93c7-ad6d-60a1-8dad0304cf56.png)

- 本番の環境でないことの最終確認。データをマスキングすると元に戻すことはできない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/038a411a-e031-6351-0e78-9f061d0ae7d9.png)

- 1-2分程度でマスキングの完了。Reportをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/bf68f5f5-e27b-c24a-ba91-6f6eb944ca97.png)

- データ・マスキング結果のレポート概要が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/78cea9ee-2d90-e15d-0fad-9c001aa2b07d.png)

- スクリプトを再実行。マスキング結果が定義通りに実行されているか確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/7e34aa9a-2163-6667-94c6-d2f32afc2a92.png)

データ・マスキングの応用編として、ハッシュのように毎回同じ値にマスキング、日本語を含んだマルチバイトデータを含むマスキングをしたい場合など、ビルトインのマスキング形式だけではもの足りない場合は、User Defined Function(ユーザー定義関数)を使います。

例えば、以下のような独自の関数を作成しておき、それをマスキング形式で選択しておくことで実行することができます。

```
/*　文字列をハッシュ値に変換する関数
CREATE OR REPLACE FUNCTION Hash_SHA1(rid varchar2,column_name varchar2,orig_val VARCHAR2) RETURN VARCHAR2
IS
   stext varchar2(50);
   vHashed  RAW(20);
   vText    VARCHAR2(2000);
BEGIN 

  vText := orig_val;
  vHashed := DBMS_CRYPTO.HASH(
  src => UTL_I18N.STRING_TO_RAW (vText, 'AL32UTF8'),
  typ => DBMS_CRYPTO.HASH_SH1
  );
   RETURN  TO_CHAR (vHashed);
END;
```

今回は、対象のデータベースにAutonomous DBを使用しました。Autonomous DB以外のDatabase Cloudサービスのインスタンスを対象にする場合は、登録手順が若干異なります。

従来通りのTCPによるアクセス、またはOracle Walletを利用したTLSアクセスのいずれかの方式で登録設定を行います。詳しくを[ドキュメント](https://docs.cloud.oracle.com/iaas/data-safe/doc/register-db-system.html)を参照下さい。


次はアクテビティ監査の設定を追加する手順をご紹介します。

Oracle Data Safeの関連情報は[こちら](https://qiita.com/western24/items/4824e4b3799b824197c6)