Data Redaction とは?
Oracle Data Redaction は、検索データの自動マスキングを行う機能です。データベースに格納されるデータは変更されず、検索時にのみマスキングが行われます。マスキングはテーブルの列単位で指定でき、列データの一部分のみマスキングを行うこともできます。
この機能は Oracle Database Enterprise Edition に加えて、Advanced Security オプションの購入が必要です。機能自体はデフォルトで有効化されるため特に準備は不要です。
ポリシーの作成
ポリシーを作成するために以下の項目を決定します。
- 対象テーブル名
- 対象列名
- ポリシー名
- マスキング種別
- マスキング条件
マスキング種別(function_type オプション)には以下の値を指定できます。
| 設定値 | 説明 | 備考 |
|---|---|---|
| DBMS_REDACT.FULL | 列値全体を単一値でマスキング | デフォルト |
| DBMS_REDACT.PARTIAL | 特定の部分をマスキング | |
| DBMS_REDACT.REGEXP | 正規表現に一致する部分のマスキング | |
| DBMS_REDACT.REGEXP_WIDTH | 列幅を維持する正規表現に一致する部分のマスキング | |
| DBMS_REDACT.RANDOM | ランダムな値でマスキング | |
| DBMS_REDACT.NULLIFY | NULL 値にマスキング | |
| DBMS_REDACT.NONE | マスキング無し |
マスキング条件(expression )には、マスキングを行う条件を記述します。
指定された条件が真になる場合にのみマスキングが行われます。
# 実行例
以下はVARCHAR2 形の列をランダムな文字でマスキングする例です。ポリシー名(policy_name)はテーブルに対して一意である必要があります。expression オプションは、マスキングを行う条件を指定します。'1=1' の指定は無条件でマスキングを行います。
SQL> BEGIN
2 DBMS_REDACT.ADD_POLICY(
3 object_schema => 'SCOTT',
4 object_name => 'REDACT1',
5 policy_name => 'REDACT1_POLICY1',
6 column_name => 'COL2',
7 function_type => DBMS_REDACT.RANDOM,
8 expression => '1=1'
9 );
10 END;
11 /
PL/SQL procedure successfully completed.
一般ユーザーで検索を行うとマスキングが行われます。ランダム・マスキング時にマルチバイト文字はより長い ASCII 文字にマスキングされます。このため文字数が変更される可能性があります。
SQL> INSERT INTO redact1 VALUES (10000, '漢字ABC');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM redact1 WHERE col1=10000;
COL1 COL2
---------- ------------------------------
10000 XmaalEKK`uiitMSSh}qq|
テーブルに対して複数のポリシーを指定することはできません。マスキング対象ではない列を指定して、別名でポリシーを追加しようとするとエラーになります。またポリシー名はテーブル名と同じ名前にできます。
SQL> BEGIN
2 DBMS_REDACT.ADD_POLICY(
3 object_schema => 'SCOTT',
4 object_name => 'REDACT1',
5 policy_name => 'REDACT1_POLICY2',
6 column_name => 'COL3',
7 function_type => DBMS_REDACT.RANDOM,
8 expression => '1=1'
9 );
10 END;
11 /
BEGIN
*
ERROR at line 1:
ORA-28069: A data redaction policy already exists on this object.
ORA-06512: at "SYS.DBMS_REDACT_INT", line 3
ORA-06512: at "SYS.DBMS_REDACT", line 53
ORA-06512: at line 2
Help: https://docs.oracle.com/error-help/db/ora-28069/
ポリシーの有効化と無効化
ポリシーを作成するとすぐに有効になります。ポリシーの有効/無効を切り替える場合には DBMS_REDACT.ENABLE_POLICY プロシージャと DBMS_REDACT.DISABLE_POLICY プロシージャを実行します。
SQL> EXECUTE DBMS_REDACT.DISABLE_POLICY('SCOTT', 'REDACT1', 'REDACT1_POLICY1');
PL/SQL procedure successfully completed.
SQL> EXECUTE DBMS_REDACT.ENABLE_POLICY('SCOTT', 'REDACT1', 'REDACT1_POLICY1');
PL/SQL procedure successfully completed.
ポリシーの変更
ポリシーの変更は DBMS_REDACT.ALTER_POLICY プロシージャを使います。変更する操作を action オプションに指定します。マスキング対象列を追加するには DBMS_REDACT.ADD_COLUMN を指定します。下記の例では列 COL1 を NULL に変換するようにポリシーを変更しています。
SQL> BEGIN
2 DBMS_REDACT.ALTER_POLICY(
3 object_schema => 'SCOTT',
4 object_name => 'REDACT1',
5 policy_name => 'REDACT1_POLICY1',
6 action => DBMS_REDACT.ADD_COLUMN,
7 column_name => 'COL1',
8 function_type => DBMS_REDACT.NULLIFY
9 );
10 END;
11 /
PL/SQL procedure successfully completed.
マスキングが行われるか確認します。
SQL> SET NULL NULL
SQL> INSERT INTO redact1 VALUES (10002, 'MASK1');
1 row created.
SQL> SELECT * FROM redact1 WHERE col1=10001;
COL1 COL2
---------- ------------------------------
NULL ?K]*O5
変更方法(action)には以下を指定できます。
| 変更内容 | action 指定 | 備考 |
|---|---|---|
| 列の追加 | DBMS_REDACT.ADD_COLUMN | |
| 列の削除 | DBMS_REDACT.DROP_COLUMN | |
| 列の変更 | DBMS_REDACT.MODIFY_COLUMN | |
| 条件の変更 | DBMS_REDACT.MODIFY_EXPRESSION | |
| ポリシー説明の変更 | DBMS_REDACT.SET_POLICY_DESCRIPTION | |
| 列説明の変更 | DBMS_REDACT.SET_COLUMN_DESCRIPTION |
ポリシーが有効になる条件を変更する場合は action オプションに DBMS_REDACT.MODIFY_EXPRESSION を指定します。変更条件は expression オプションに指定します。以下の例では MGR ユーザーはマスキング対象外に変更します。
SQL> BEGIN
2 DBMS_REDACT.ALTER_POLICY(
3 object_schema => 'SCOTT',
4 object_name => 'REDACT1',
5 policy_name => 'REDACT1_POLICY1',
6 action => DBMS_REDACT.MODIFY_EXPRESSION,
7 expression => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') != ''MGR'''
8 );
9 END;
10 /
PL/SQL procedure successfully completed.
MGR ユーザーで接続してマスキングされないことを確認します。
SQL> SELECT * FROM scott.redact1 WHERE col1=10001;
COL1 COL2
---------- ------------------------------
10001 ABCDEF
マスキングのパターン
上記の例では NULL 値に変換する方法と、ランダム値に変換する方法を試しましたが、電話番号のように特定のパターンでマスキングを行うことができます。パターンを指定する場合は、タイプ(function_type)に DBMS_REDACT.PARTIAL を指定し、マスキングのパターン(function_parameters)を設定します。パターンはマスキング対象列のデータ型によって指定が異なります。以下は VARCHAR2 型の列に郵便番号が格納されている場合の例です。よく使われるパターンは Oracle Database 側で定義されています。以下は米国の社会保障番号(SSN)の「最初の5桁」をマスクする設定です(DBMS_REDACT.REDACT_US_SSN_F5)。
SQL> BEGIN
2 DBMS_REDACT.ADD_POLICY(
3 object_schema => 'SCOTT',
4 object_name => 'REDACT2',
5 column_name => 'COL2',
6 policy_name => 'REDACT2_POLICY1',
7 function_type => DBMS_REDACT.PARTIAL,
8 function_parameters => DBMS_REDACT.REDACT_US_SSN_F5,
9 expression => '1=1'
10 );
11 END;
12 /
PL/SQL procedure successfully completed.
SQL> SELECT * FROM redact2 WHERE col1 = 123;
COL1 COL2
---------- ----------
123 XXX-XX-123
任意のパターンを指定することもできます。function_parameters オプションに入力パターン、出力パターン、変換文字、開始位置、終了位置等を指定します(文字列型の場合)。
SQL> BEGIN
2 DBMS_REDACT.ADD_POLICY(
3 object_schema => 'SCOTT',
4 object_name => 'REDACT4',
5 policy_name => 'REDACT4_POLICY1',
6 column_name => 'COL2',
7 function_type => DBMS_REDACT.PARTIAL,
8 function_parameters => 'VVVVFVVVVVV,VVVV-VVVVVV,*,1,10',
9 expression => '1=1'
10 );
11 END;
12 /
PL/SQL procedure successfully completed.
マスキング内容を確認します。
SQL> SELECT * FROM redact4 WHERE col1=1234;
COL1 COL2
---------- ----------
1234 ****-*****
ポリシーの確認
ポリシーの情報は REDACTION_POLICIES ビューで確認できます。
SQL> SELECT object_name, policy_name, expression, enable FROM redaction_policies;
OBJECT_NAME POLICY_NAME EXPRESSION ENA
-------------------- -------------------- -------------------------------------------------- ---
REDACT1 REDACT1_POLICY1 SYS_CONTEXT('USERENV', 'SESSION_USER') != 'MGR' YES
REDACT2 REDACT1_POLICY1 1=1 YES
REDACT3 REDACT3 1=1 YES
列単位の設定は REDACTION_COLUMNS ビューで確認できます。
SQL> SELECT object_name, column_name, function_type FROM redaction_columns;
OBJECT_NAME COLUMN_NAM FUNCTION_TYPE
-------------------- ---------- ---------------------------
REDACT1 COL1 NULLIFY REDACTION
REDACT1 COL2 RANDOM REDACTION
REDACT2 COL2 RANDOM REDACTION
REDACT3 COL2 RANDOM REDACTION
マスキング設定を無視するシステム権限
EXEMPT REDACTION POLICY システム権限を持つユーザーは Data Redaction ポリシーを無視してレコード確認を行うことができます。
Author: Noriyoshi Shinoda / Date: October 29, 2026