皆様、こんにちは。y.kobayashiです。
Data Safeのデータ・マスキング機能を使用してデータをマスキングする方法をご紹介していきます。
目次
構成イメージ

はじめに
Data Safeとは
Oracle Data SafeはOracle Cloudが提供するデータベース・セキュリティサービスで、機密データの自動検出からマスキング、監査まで一括して管理できるツールです。
Data Safe データ・マスキング
Data Safeが提供するデータ・マスキング機能は、本番環境で扱う機密データを安全に非本番環境へ展開する為の機能です。
データの形式や特性を維持したまま別データに置き換えることができる為、開発やテストでの利用が安心して行えます。
マスキング方法はランダム、置換、シャッフル、Null値、正規表現など多彩で利用シーンに応じた柔軟な選択が可能です。
標準のマスキングテンプレートが用意されている為、短時間で導入を開始できる手軽さも特徴です。
事前準備
ユーザ・ロールの準備
最初にマスキングを実行する為のユーザの作成とロールの準備を行います。
OCIコンソールの左側メニューから「Oracle Database」→「Data Safe-データベース・セキュリィティ」を選択します。

「概要」からOracle Cloudデータベースの「ウィザードの起動」を選択します。
Data Safeターゲット情報から「権限スクリプトのダウンロード」を選択し、スクリプトをダウンロードします。
取得したスクリプトは、対象DBにアップロードします。
このスクリプトは、後で対象DB上のユーザに権限を付与する為に使用します。

対象DBに接続し、「DATASAFE$ADMIN」ユーザを作成します。
以下のSQLを実行します。
1.「DATASAFE$ADMIN」ユーザを作成
CREATE USER DATASAFE$ADMIN IDENTIFIED BY 'パスワード';
以下は、実際にSQLを実行した結果となります。

続いて、先ほどダウンロードして対象DBにアップロードしたスクリプトを実行します。
実行時には、以下の情報を順に入力します。
1.スクリプトを実行
@datasafe_privileges.sql
2.権限を付与するユーザ名を入力
DATASAFE$ADMIN
3.権限を付与 or 削除を選択
grant
4.付与モードを指定
all
このスクリプトを実行することで、「DATASAFE$ADMINユーザ」にData Safeの全機能(監査、ファイアウォール、マスキングなど)の権限が一括で付与されます。
以下は、実際にスクリプトを実行した結果となります。

Data Safeに対象DBの登録
ウィザードを使用して対象DBをData Safeに登録します。
OCIコンソールの左側メニューから「Oracle Database」→「Data Safe-データベース・セキュリィティ」を選択します。

今回はOracle ベース・データベースを使用する為、「概要」からOracle Cloudデータベースの「ウィザードの起動」を選択します。
Data Safeターゲット情報から以下の項目を入力し、「次」を選択します。
- クラウド・データベース・タイプ:Oracleベース・データベース
- DBシステムの選択:対象のDB
- Data Safeターゲット表示名:任意
- コンパートメント:任意
- 説明:任意
- データベース・サービス名:対象DBのサービス名
- データベース・ポート番号:1521
- TCP/TLS:TCP
- データベース・ユーザー名:DATASAFE$ADMIN
- データベース・パスワード:任意

Private endpoint informationから以下の項目を入力し、「次」を選択します。
- 名前:任意
- コンパートメント:任意
- 仮想クラウド・ネットワーク:任意
- Subnet:任意
- プライベートIP:空白

セキュリィティ・ルールの追加から以下の項目を入力し、「次」を選択します。
- 今すぐセキュリィティ・ルールを追加しますか?:はい、今すぐセキュリィティ・ルールを追加します。
- イングレス・セキュリティ・ルールを追加する対象:セキュリィティリスト
- セキュリティ・リストの選択:任意
- エグレス・セキュリティ・ルールを追加する対象:セキュリティリスト
- セキュリティ・リストの選択:任意
入力した情報に誤りがないか確認し、問題なければ「登録」を選択します。

マスキングポリシーの作成
機密データモデルの作成
マスキングポリシーを作成する為にまず機密データモデルを作成します。
OCIコンソールの左側メニューから「Oracle Database」→「データ検出」を選択します。

関連リソースから「機密データ・モデル」→「機密データ・モデルを作成してください」を選択します。

機密データ・モデル情報から以下の項目を入力し、「次」を選択します。
- 名前:任意
- コンパートメント:任意
- 説明:任意
- ターゲット・データベース:Data Safeに登録したDB

検出対象のスキーマ範囲は「特定のスキーマのみを選択」または「すべてのスキーマ」から選択できます。
ここでは「特定のスキーマのみを選択」を選び、対象としてTESTスキーマを指定します。
スキーマを選択したら「次」を選択します。

次に、選択したスキーマ内で対象とする表を指定します。
特定の表を選択する場合は、三点リーダーを選択して表を指定できます。
今回はすべての表を対象とする為、デフォルト設定のまま進めます。
「次」を選択します。

データ検出の機密タイプを選択します。
ここでは「All」を選択し、「次」を選択します。

検出オプションの選択から「サンプル・データを収集、表示および格納」を選択し、「機密データ・モデルを作成してください」を選択します。

マスキングルールの設定
次に、先ほど作成した機密データ・モデルを基に検出された機密列へ適用するマスキングポリシーを作成します。
マスキングポリシーを設定することで、対象列の機密情報を安全にマスクする方法やルールを定義できます。
OCIコンソールの左側メニューから「Oracle Database」→「データ・マスキング」を選択します。

Related resourcesから「マスキング・ポリシー」→「マスキング・ポリシーを作成してください」を選択します。

マスキング・ポリシーを作成してくださいから以下の項目を入力し、「マスキング・ポリシーを作成してください」を選択します。
- 名前:任意
- コンパートメント:任意
- 説明:任意
- マスキング・ポリシーの作成方法を選択:機密データ・モデルを使用
- 機密データ・モデル:作成した機密データ・モデル

マスキングの実行
先ほど作成した「マスキング・ポリシー」を選択し、対象となる列を確認します。
この確認により、どの列に対してマスキングが適用されるかを事前に把握できます。
今回はFULL_NAME列、EMAIL列、PHONE_NUMBER列、DATE_OF_BIRTH列、CREDIT_CARD_NUMBER列にマスキングを実施します。
マスキング前チェック
マスキングを実施する前に「マスキング前チェック」を行います。
OCIコンソールの左側メニューから「Oracle Database」→「データ・マスキング」を選択します。

データ・マスキングから「マスキング前チェック」を選択します。

マスキング前チェックから以下の項目を入力し、「送信」を選択します。
- ターゲット・データベース:Data Safeに登録したDB
- マスキング・ポリシー:作成したマスキング・ポリシー
- コンパートメント:任意
- マスキングに使用する表領域:空白

マスキング前チェック完了後、ログメッセージにエラーが出力されていないかを確認します。
今回のケースでは「Tables in the masking policy have stale statistics {TEST.CUSTOMERS}」というエラーが表示されています。
これはマスキング対象テーブルの統計情報が古いことを意味します。
統計情報は通常パフォーマンスや実行計画の最適化に影響しますが、今回のテーブルはレコード数が1件のみであり処理への影響はありません。
その為、本検証ではこのエラーを無視してマスキングを進めます。

機密データのマスク
データ・マスキングから「機密データのマスク」を選択します。

機密データのマスクから以下の項目を入力します。
- ターゲット・データベース:Data Safeに登録したDB
- マスキング・ポリシー:作成したマスキング・ポリシー
- マスキングに使用する表領域:空白
入力内容を確認したら「データのマスク」を選択します。
これで指定した列に対してマスキング処理が実行され完了となります。

結果確認
マスキングのデータ確認
マスキング実行前のデータを確認します。
FULL_NAME列、EMAIL列、PHONE_NUMBER列、DATE_OF_BIRTH列、CREDIT_CARD_NUMBER列には実際の個人情報がそのまま保持されていることがわかります。

続いて、マスキング実行後のデータを確認します。
マスキング対象列の値がランダムに変換され、元の個人情報が判別できない状態になっています。
一方でCUSTOMER_ID列やREGISTERED列といったマスキング対象外の列は変更されていないことが確認できます。

マスキングする際の注意点
公式ドキュメントには記載されていませんが、現状、Data Safeのマスキング機能においてIDENTITY属性を持つ列を含むテーブルのマスキングにつきましては対応しておりません。
その為、IDENTITY属性を持つ列を含むテーブルに対してマスキング・ポリシーを作成しても列を追加することはできません。
本件につきましては、SR(サポートリクエスト)にて問い合わせ済みで、サポートからもIDENTITY属性を持つ列を含むテーブルのマスキングには現状対応していないことが確認できています。
また、将来的には公式ドキュメントにも、この制約事項が追記される予定です。
さいごに
本記事では、Data Safeのデータ・マスキング機能を使用しGUIからデータをマスキングする方法についてご紹介しましたがいかがでしたでしょうか。
スクリプトを準備する必要がなく、直感的に操作できる点が大きなメリットです。
テストデータの準備やセキュリティ対策にぜひご活用ください。
以上となります。最後までご覧頂きありがとうございました。
参考記事・ドキュメント
以下の参考記事・ドキュメントもあわせてご参照ください。
参考記事
Autonomous Databaseをデータ・セーフ(Data Safe)に登録して監視してみた【登録編】 | Oracle Cloud のことなら Cloudii(クラウディ)
Data Safe機能詳細
Data Safeの機能詳細 - Speaker Deck
Data Safeデータ・マスキングマニュアル
https://docs.oracle.com/en/cloud/paas/data-safe/udscs/data-masking.html#GUID-0C99A9B2-AE57-4D10-944A-6F3CAC94B8EC