0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle Data Redaction 機能を試す(Oracle AI Database 26ai)

0
Posted at

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.

マスキングが行われるか確認します。

COL1 のマスキング追加
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)。

パターン指定マスキング#1
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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?