前回は、Oracle Data Redaction の仕組み、リダクション方式、向いているユースケース、注意点を整理しました。

今回は、営業アプリケーション用ユーザーには社員名や連絡先の一部は参照させるが、給与や手数料率、個人を直接識別しやすい連絡先情報はそのまま表示させない、というシナリオを想定し、実際に Oracle Database にて Data Redaction ポリシーを作成し、接続ユーザーによって問い合わせ結果が変わることを確認してみます。


0. はじめに

本記事で実施する内容は以下のとおりです。

実施内容Data Redaction ポリシーの作成と動作確認
・HR サンプルスキーマの元データ確認
・営業アプリケーション用ユーザーの準備
SALARY 列と COMMISSION_PCT 列への完全リダクション設定
PHONE_NUMBER 列への部分リダクション設定
EMAIL 列への正規表現リダクション設定
・接続ユーザーによる表示差の確認
・作成したポリシーの削除
作業時間の目安環境構築済みの状態で 約 30 分
実行環境・Oracle AI Database 26ai FREE
・PDB 名: freepdb1
・HR サンプルスキーマ
・クライアントツール: SQLcl または SQL*Plus

本記事では、見やすさのために実行結果の一部を省略または加工しています。そのため、実際の出力と異なる場合があります。
また、本手順は検証環境で Data Redaction の動作を理解することを目的としています。本番環境で利用する場合は、権限設計、適用条件、アプリケーションへの影響をあらかじめ確認してください。


1. 環境の準備

1-1. Oracle Database の準備

この手順では、次の環境を前提にします。

  • Oracle AI Database 26ai FREE の環境があること
  • PDB 名は freepdb1
  • HR サンプルスキーマを準備していること
  • SQLcl または SQL*Plus で接続できる
  • Data Redaction ポリシーを作成できる管理者ユーザーで接続できる

実務では、ポリシー管理用のユーザーに必要な権限だけを付与して作業するのが望ましいです。このハンズオンでは、ローカル検証環境でのわかりやすさを優先し、管理者ユーザーでポリシーを作成します。

管理者ユーザーで PDB に直接接続する場合は、以下のように実行します。

$ sql sys/<password>@localhost:1521/freepdb1 AS SYSDBA

CDB に接続してから PDB に切り替える場合は、以下を実行します。

ALTER SESSION SET CONTAINER = freepdb1;

1-2. クライアントツールの用意

本手順では、Oracle Database に接続できるクライアントツールが必要です。
SQLcl、SQL*Plus、SQL Developer、VS Code の SQL Developer 拡張機能など、任意のツールで freepdb1 に接続できる環境を準備してください。本記事では SQLcl の形式でコマンドを記載します。

接続に必要なサービス名やリスナーの状態は、DB サーバーで以下のコマンドを実行することで確認できます。

$ lsnrctl status

1-3. SALES_APP ユーザーの準備

SALES_APP ユーザーは、管理者ユーザーで次のように作成します。すでに作成済みのユーザーを使用するのであれば、GRANT だけ確認してください。

create user sales_app identified by "<password>";

grant create session to sales_app;
grant select on hr.employees to sales_app;

これで、SALES_APP ユーザーが作成され、HR.EMPLOYEES 表を参照できる状態になりました。


2. デモ構成の概要

ここから、Data Redaction を使って、問い合わせ結果を返す直前に一部の列をマスキングする構成を作成します。
本記事では、検証用として以下の構成とします。

対象リダクション方式確認したいこと
HR.EMPLOYEESSALARY, COMMISSION_PCT完全リダクション給与や手数料率のように、利用者に値を見せない列を 0 として返す
HR.EMPLOYEESPHONE_NUMBER部分リダクション電話番号の国番号と市外局番だけを残し、残りを X で伏せる
HR.EMPLOYEESEMAIL正規表現リダクションSKING のようなメール名の先頭 1 文字だけを残して伏せる

適用条件はいずれも SESSION_USERSALES_APP の場合のみです。最後に HR ユーザーでは元データが見えることも確認します。


3. 事前確認

3-1. 既存の Data Redaction ポリシーを確認する

まず、PDB「FREEPDB1」へ管理者で接続し、対象スキーマに既存の Data Redaction ポリシーがないことを確認します。
同じ表やビューには 1 つの Data Redaction ポリシーだけを定義できます。すでにポリシーが存在している場合、後続の ADD_POLICY でエラーとなります。

sql sys@localhost:1521/freepdb1 as sysdba

select * from redaction_policies where object_owner = 'HR';

ポリシーが存在しない場合は、次のように表示されます。

no rows selected

3-2. 元データを確認する

一旦、HR.EMPLOYEES 表を確認します。以降の確認では、出力が長くなりすぎないよう、リダクション対象の列と 16 行だけを表示するクエリを用います。

-- ここでは SALES_APP ユーザーで接続していますが、ユーザーは任意です
sql sales_app/<password>@localhost:1521/freepdb1

show con_name
show user

SELECT employee_id, first_name, email, phone_number, salary, commission_pct
	FROM hr.employees
	WHERE employee_id BETWEEN 135 AND 150
	ORDER BY employee_id;

実行例は次のようになります。

CON_NAME
------------------------------
FREEPDB1
USER is "SALES_APP"

   EMPLOYEE_ID FIRST_NAME    EMAIL       PHONE_NUMBER         SALARY    COMMISSION_PCT
______________ _____________ ___________ _________________ _________ _________________
           135 Ki            KGEE        1.650.555.0135         2400
           136 Hazel         HPHILTAN    1.650.555.0136         2200
           137 Renske        RLADWIG     1.650.555.0137         3600
           138 Stephen       SSTILES     1.650.555.0138         3200
           139 John          JSEO        1.650.555.0139         2700
           140 Joshua        JPATEL      1.650.555.0140         2500
           141 Trenna        TRAJS       1.650.555.0141         3500
           142 Curtis        CDAVIES     1.650.555.0142         3100
           143 Randall       RMATOS      1.650.555.0143         2600
           144 Peter         PVARGAS     1.650.555.0144         2500
           145 John          JSINGH      44.1632.960000        14000               0.4
           146 Karen         KPARTNER    44.1632.960001        13500               0.3
           147 Alberto       AERRAZUR    44.1632.960002        12000               0.3
           148 Gerald        GCAMBRAU    44.1632.960003        11000               0.3
           149 Eleni         EZLOTKEY    44.1632.960004        10500               0.2
           150 Sean          STUCKER     44.1632.960005        10000               0.3

16 rows selected.

この時点では、EMAILPHONE_NUMBERSALARY がそのまま表示されています。また、 COMMISSION_PCT は一部の行は値を持っていますが、NULL のため空欄のものもあります。


4. Data Redaction の設定

4-1. 管理者ユーザーで接続する

ここからは、Data Redaction ポリシーを作成できる管理者ユーザーで作業します。管理者ユーザーで接続し、SALARY 列に完全リダクションのポリシーを作成します。

$ sql sys/<password>@localhost:1521/freepdb1 as sysdba

4-2. SALARY 列にポリシーを作成する

BEGIN
  DBMS_REDACT.ADD_POLICY(
    object_schema => 'HR',
    object_name   => 'EMPLOYEES',
    policy_name   => 'POL_REDCT_EMP_INFO',
    column_name   => 'SALARY',
    function_type => DBMS_REDACT.FULL,
    expression    => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') = ''SALES_APP'''
  );
END;
/

このポリシーでは、expression で定義した通り、SESSION_USERSALES_APP の場合だけリダクションを適用します。HR ユーザーや管理者ユーザーで参照した場合は、条件が FALSE になるため実値が返ります。

このあとの手順で確認は行いますので実行は不要ですが、この時点で SALES_APP から同じ確認 SQL を実行すると、以下のようになります。
SELECT employee_id, first_name, email, phone_number, salary, commission_pct
	FROM hr.employees
	WHERE employee_id BETWEEN 135 AND 150
	ORDER BY employee_id;
   EMPLOYEE_ID FIRST_NAME    EMAIL       PHONE_NUMBER         SALARY    COMMISSION_PCT
______________ _____________ ___________ _________________ _________ _________________
           135 Ki            KGEE        1.650.555.0135            0
           136 Hazel         HPHILTAN    1.650.555.0136            0
           137 Renske        RLADWIG     1.650.555.0137            0
           138 Stephen       SSTILES     1.650.555.0138            0
           139 John          JSEO        1.650.555.0139            0
           140 Joshua        JPATEL      1.650.555.0140            0
           141 Trenna        TRAJS       1.650.555.0141            0
           142 Curtis        CDAVIES     1.650.555.0142            0
           143 Randall       RMATOS      1.650.555.0143            0
           144 Peter         PVARGAS     1.650.555.0144            0
           145 John          JSINGH      44.1632.960000            0               0.4
           146 Karen         KPARTNER    44.1632.960001            0               0.3
           147 Alberto       AERRAZUR    44.1632.960002            0               0.3
           148 Gerald        GCAMBRAU    44.1632.960003            0               0.3
           149 Eleni         EZLOTKEY    44.1632.960004            0               0.2
           150 Sean          STUCKER     44.1632.960005            0               0.3


16 rows selected.

SALARY列が完全リダクションされ、値がすべて0になっていることが確認できます。

4-3. 同じポリシーに列を追加する

COMMISSION_PCT 列も同じ条件でリダクションします。

Data Redaction では、1 つの表やビューに定義できるポリシーは 1 つとなります。そのため、2 つ目のポリシーを作成する代わりに、先ほど作成した POL_REDCT_EMP_INFO に列を追加します。

BEGIN
  DBMS_REDACT.ALTER_POLICY(
    object_schema => 'HR',
    object_name   => 'EMPLOYEES',
    policy_name   => 'POL_REDCT_EMP_INFO',
    action        => DBMS_REDACT.ADD_COLUMN,
    column_name   => 'COMMISSION_PCT',
    function_type => DBMS_REDACT.FULL
  );
END;
/

もし同じ HR.EMPLOYEES 表に対して別の ADD_POLICY を実行すると、すでにポリシーが存在するため ORA-28069 が発生します。複数列を対象にしたい場合は、ALTER_POLICY で列を追加します。

4-4. 設定内容を確認する

ポリシーと対象列は、REDACTION_POLICIESREDACTION_COLUMNS で確認できます。

SELECT object_owner, object_name, policy_name, expression, enable
	FROM redaction_policies
	WHERE object_owner = 'HR' AND object_name = 'EMPLOYEES';

SELECT object_owner, object_name, column_name, function_type
	FROM redaction_columns
	WHERE object_owner = 'HR' AND object_name = 'EMPLOYEES'
	ORDER BY column_name;

以下は実行した結果です。

OBJECT_OWNER    OBJECT_NAME    POLICY_NAME           EXPRESSION                                              ENABLE
_______________ ______________ _____________________ _______________________________________________________ _________
HR              EMPLOYEES      POL_REDCT_EMP_INFO    SYS_CONTEXT('USERENV', 'SESSION_USER') = 'SALES_APP'    YES


OBJECT_OWNER    OBJECT_NAME    COLUMN_NAME       FUNCTION_TYPE
_______________ ______________ _________________ _________________
HR              EMPLOYEES      COMMISSION_PCT    FULL REDACTION
HR              EMPLOYEES      SALARY            FULL REDACTION

これで、SALES_APP ユーザーに対して SALARYCOMMISSION_PCT が完全リダクションされる状態になりました。


5. 動作確認

SALES_APP ユーザーで接続し、HR ユーザーで実行したものと同じ SQL を実行します。

$ sql sales_app/<password>@localhost:1521/freepdb1

SELECT employee_id, first_name, email, phone_number, salary, commission_pct
	FROM hr.employees
	WHERE employee_id BETWEEN 135 AND 150
	ORDER BY employee_id;

実行結果は以下のようになります。

   EMPLOYEE_ID FIRST_NAME    EMAIL       PHONE_NUMBER         SALARY    COMMISSION_PCT
______________ _____________ ___________ _________________ _________ _________________
           135 Ki            KGEE        1.650.555.0135            0
           136 Hazel         HPHILTAN    1.650.555.0136            0
           137 Renske        RLADWIG     1.650.555.0137            0
           138 Stephen       SSTILES     1.650.555.0138            0
           139 John          JSEO        1.650.555.0139            0
           140 Joshua        JPATEL      1.650.555.0140            0
           141 Trenna        TRAJS       1.650.555.0141            0
           142 Curtis        CDAVIES     1.650.555.0142            0
           143 Randall       RMATOS      1.650.555.0143            0
           144 Peter         PVARGAS     1.650.555.0144            0
           145 John          JSINGH      44.1632.960000            0                 0
           146 Karen         KPARTNER    44.1632.960001            0                 0
           147 Alberto       AERRAZUR    44.1632.960002            0                 0
           148 Gerald        GCAMBRAU    44.1632.960003            0                 0
           149 Eleni         EZLOTKEY    44.1632.960004            0                 0
           150 Sean          STUCKER     44.1632.960005            0                 0


16 rows selected.

SALES_APP では、完全リダクションを NUMBER 型に適用した場合、既定のリダクション値が 0 になるため、SALARY 列が 0 として表示されています。また、COMMISSION_PCT は、元データが NULL の行では空欄のままですが、値が入っている行では 0 として返されます。


6. 別の条件で確認する

念のため、条件として設定していない SALES_APP 以外のユーザーである HR ユーザーでも同じ SQL を再実行してみます。

$ sql hr/<password>@localhost:1521/freepdb1

SELECT employee_id, first_name, email, phone_number, salary, commission_pct
	FROM hr.employees
	WHERE employee_id BETWEEN 135 AND 150
	ORDER BY employee_id;
   EMPLOYEE_ID FIRST_NAME    EMAIL       PHONE_NUMBER         SALARY    COMMISSION_PCT
______________ _____________ ___________ _________________ _________ _________________
           135 Ki            KGEE        1.650.555.0135         2400
           136 Hazel         HPHILTAN    1.650.555.0136         2200
           137 Renske        RLADWIG     1.650.555.0137         3600
           138 Stephen       SSTILES     1.650.555.0138         3200
           139 John          JSEO        1.650.555.0139         2700
           140 Joshua        JPATEL      1.650.555.0140         2500
           141 Trenna        TRAJS       1.650.555.0141         3500
           142 Curtis        CDAVIES     1.650.555.0142         3100
           143 Randall       RMATOS      1.650.555.0143         2600
           144 Peter         PVARGAS     1.650.555.0144         2500
           145 John          JSINGH      44.1632.960000        14000               0.4
           146 Karen         KPARTNER    44.1632.960001        13500               0.3
           147 Alberto       AERRAZUR    44.1632.960002        12000               0.3
           148 Gerald        GCAMBRAU    44.1632.960003        11000               0.3
           149 Eleni         EZLOTKEY    44.1632.960004        10500               0.2
           150 Sean          STUCKER     44.1632.960005        10000               0.3

16 rows selected.

制限の対象はexpressionSALES_APP のみに限定しているため、HR ユーザーでは実値が表示されます。


7. 他のリダクション方式を試してみる

ここまでで、数値列を完全リダクションすると 0 として返されることを確認しました。
次に、同じ HR.EMPLOYEES 表にある PHONE_NUMBEREMAIL の見え方を変えてみます。

引き続き、既存の HR サンプルスキーマだけを使います。HR.EMPLOYEES には PHONE_NUMBEREMAIL がすでに格納されています。

7-1. 電話番号に部分リダクションを設定する

まず、同じ POL_REDCT_EMP_INFO ポリシーに PHONE_NUMBER 列を追加します。

リダクション方式には部分リダクションを使用します。部分リダクションは「すべて隠す」のではなく、識別や業務処理に必要な一部だけを残したい場合に使いやすい方式です。一方で、列の中に複数の電話番号形式が混在している場合は、対象データの形式に合わせて設計する必要があります。

HR サンプルスキーマの PHONE_NUMBER には、1.515.555.01001.650.555.0144 のような形式と、営業部門の一部の行で使われている 44.1632.960000 のような形式が混在しています。
部分リダクションは固定形式の値で使う機能ですが、今回はデモとして主に 1.650.555.0144 形式の行を対象に確認し、同時に 44.1632... 形式に対する注意点も確認することとします。

この例では、1.650.555.0144 のような値を 1.650.XXX.XXXX のように表示させます。国番号と市外局番に相当する部分は残しつつ、個人に紐づきやすい番号部分は伏せる、という使い方を想定しています。

BEGIN
  DBMS_REDACT.ALTER_POLICY(
    object_schema       => 'HR',
    object_name         => 'EMPLOYEES',
    policy_name         => 'POL_REDCT_EMP_INFO',
    action              => DBMS_REDACT.ADD_COLUMN,
    column_name         => 'PHONE_NUMBER',
    function_type       => DBMS_REDACT.PARTIAL,
    function_parameters => 'VFVVVFVVVFVVVV,V.VVV.VVV.VVVV,X,5,11'
  );
END;
/

ここで指定している function_parameters では、入力形式、出力形式、置換文字、リダクション開始位置、終了位置を指定しています。

指定意味
VFVVVFVVVFVVVV入力値が 1 桁 + 区切り + 3 桁 + 区切り + 3 桁 + 区切り + 4 桁 であることを示す
V.VVV.VVV.VVVV出力時も . 区切りの形式を保つ
Xリダクション部分を X に置き換える
5,11数字部分の 5 桁目から 11 桁目までをリダクションする
ここまで確認すると、結果は以下のようになります。
SQL> SELECT employee_id, first_name, email, phone_number, salary, commission_pct
  2     FROM hr.employees
  3     WHERE employee_id BETWEEN 135 AND 150
  4*    ORDER BY employee_id;

   EMPLOYEE_ID FIRST_NAME    EMAIL       PHONE_NUMBER         SALARY    COMMISSION_PCT
______________ _____________ ___________ _________________ _________ _________________
           135 Ki            KGEE        1.650.XXX.XXXX            0
           136 Hazel         HPHILTAN    1.650.XXX.XXXX            0
           137 Renske        RLADWIG     1.650.XXX.XXXX            0
           138 Stephen       SSTILES     1.650.XXX.XXXX            0
           139 John          JSEO        1.650.XXX.XXXX            0
           140 Joshua        JPATEL      1.650.XXX.XXXX            0
           141 Trenna        TRAJS       1.650.XXX.XXXX            0
           142 Curtis        CDAVIES     1.650.XXX.XXXX            0
           143 Randall       RMATOS      1.650.XXX.XXXX            0
           144 Peter         PVARGAS     1.650.XXX.XXXX            0
           145 John          JSINGH      4..16.XXX.XXXX            0                 0
           146 Karen         KPARTNER    4..16.XXX.XXXX            0                 0
           147 Alberto       AERRAZUR    4..16.XXX.XXXX            0                 0
           148 Gerald        GCAMBRAU    4..16.XXX.XXXX            0                 0
           149 Eleni         EZLOTKEY    4..16.XXX.XXXX            0                 0
           150 Sean          STUCKER     4..16.XXX.XXXX            0                 0


16 rows selected.

今回の場合、同じ PHONE_NUMBER 列には 44.1632.960000 のように 2 桁 + 区切り + 4 桁 + 区切り + 6 桁 の行もあります。部分リダクションでは 1 つの列に対して 1 つの固定的な入力形式を指定するため、この形式に対して上記の 1.650.555.0144 形式用の指定をそのまま使うと、桁や区切り位置が合わず、4..16.XXX.XXXX のような意図しない表示になることがあります。両方の形式を同じ列で扱いたい場合は、列の値の形式をそろえる、形式ごとに対象を分ける、または後半で扱う正規表現リダクションの利用を検討してください。

7-2. EMAIL 列に正規表現リダクションを追加する

次に、同じポリシーに EMAIL 列を追加します。HR サンプルスキーマの EMAIL 列には、SKINGNYANGLGARCIA のようなメール名が格納されています。そこで、ここではカスタム正規表現を使い、先頭 1 文字だけを残して残りを固定文字列に置き換えます。

BEGIN
  DBMS_REDACT.ALTER_POLICY(
    object_schema          => 'HR',
    object_name            => 'EMPLOYEES',
    policy_name            => 'POL_REDCT_EMP_INFO',
    action                 => DBMS_REDACT.ADD_COLUMN,
    column_name            => 'EMAIL',
    function_type          => DBMS_REDACT.REGEXP,
    regexp_pattern         => '^(.).*$',
    regexp_replace_string  => '\1XXXX',
    regexp_position        => 1,
    regexp_occurrence      => 0,
    regexp_match_parameter => 'i'
  );
END;
/

この例では、^(.).*$ で値の先頭 1 文字をグループとして取り出し、置換後の値を \1XXXX としています。たとえば SKINGSXXXXLGARCIALXXXX のように返されます。

正規表現リダクションでは、パターンが列の値に一致しない場合や、置換しても値が変わらない場合、実値を返さないように完全リダクション相当の動作になります。対象データの形式に合うパターンになっているかは、本番適用前に事前に確認するようにしてください。

設定後、対象列を確認します。

SELECT object_owner, object_name, column_name, function_type
	FROM redaction_columns
	WHERE object_owner = 'HR' AND object_name = 'EMPLOYEES'
	ORDER BY column_name;

実行例です。

OBJECT_OWNER    OBJECT_NAME    COLUMN_NAME       FUNCTION_TYPE
_______________ ______________ _________________ ____________________
HR              EMPLOYEES      COMMISSION_PCT    FULL REDACTION
HR              EMPLOYEES      EMAIL             REGEXP REDACTION
HR              EMPLOYEES      PHONE_NUMBER      PARTIAL REDACTION
HR              EMPLOYEES      SALARY            FULL REDACTION

同じ表の同じポリシーに含まれる列でも、列ごとに異なるリダクション方式を指定できます。

7-3. SALES_APP ユーザーで表示を確認する

ではここまでの設定で、 SALES_APP ユーザーで接続し、HR.EMPLOYEES 表を参照します。

$ sql sales_app/<password>@localhost:1521/freepdb1

SELECT employee_id, first_name, email, phone_number, salary, commission_pct
	FROM hr.employees
	WHERE employee_id BETWEEN 135 AND 150
	ORDER BY employee_id;

実行例です。

   EMPLOYEE_ID FIRST_NAME    EMAIL    PHONE_NUMBER         SALARY    COMMISSION_PCT
______________ _____________ ________ _________________ _________ _________________
           135 Ki            KXXXX    1.650.XXX.XXXX            0
           136 Hazel         HXXXX    1.650.XXX.XXXX            0
           137 Renske        RXXXX    1.650.XXX.XXXX            0
           138 Stephen       SXXXX    1.650.XXX.XXXX            0
           139 John          JXXXX    1.650.XXX.XXXX            0
           140 Joshua        JXXXX    1.650.XXX.XXXX            0
           141 Trenna        TXXXX    1.650.XXX.XXXX            0
           142 Curtis        CXXXX    1.650.XXX.XXXX            0
           143 Randall       RXXXX    1.650.XXX.XXXX            0
           144 Peter         PXXXX    1.650.XXX.XXXX            0
           145 John          JXXXX    4..16.XXX.XXXX            0                 0
           146 Karen         KXXXX    4..16.XXX.XXXX            0                 0
           147 Alberto       AXXXX    4..16.XXX.XXXX            0                 0
           148 Gerald        GXXXX    4..16.XXX.XXXX            0                 0
           149 Eleni         EXXXX    4..16.XXX.XXXX            0                 0
           150 Sean          SXXXX    4..16.XXX.XXXX            0                 0


16 rows selected.

PHONE_NUMBER は、国番号と市外局番に相当する部分だけが残り、それ以外は X に置き換わったことが確認できたと思います。また、EMAIL は先頭 1 文字だけを残し、残りは XXXX に置き換わっています。なお、後半行の 44.1632... 形式の値は、今回指定した 1.650.555.0144 形式とは桁や区切り位置が異なるため、4..16.XXX.XXXX のような表示になっていることが確認できます。

7-4. HR ユーザーでは元データが見えることを確認する

最後に、HR ユーザーで同じ表を参照します。

$ sql hr/<password>@localhost:1521/freepdb1

SELECT employee_id, first_name, email, phone_number, salary, commission_pct
	FROM hr.employees
	WHERE employee_id BETWEEN 135 AND 150
	ORDER BY employee_id;
   EMPLOYEE_ID FIRST_NAME    EMAIL       PHONE_NUMBER         SALARY    COMMISSION_PCT
______________ _____________ ___________ _________________ _________ _________________
           135 Ki            KGEE        1.650.555.0135         2400
           136 Hazel         HPHILTAN    1.650.555.0136         2200
           137 Renske        RLADWIG     1.650.555.0137         3600
           138 Stephen       SSTILES     1.650.555.0138         3200
           139 John          JSEO        1.650.555.0139         2700
           140 Joshua        JPATEL      1.650.555.0140         2500
           141 Trenna        TRAJS       1.650.555.0141         3500
           142 Curtis        CDAVIES     1.650.555.0142         3100
           143 Randall       RMATOS      1.650.555.0143         2600
           144 Peter         PVARGAS     1.650.555.0144         2500
           145 John          JSINGH      44.1632.960000        14000               0.4
           146 Karen         KPARTNER    44.1632.960001        13500               0.3
           147 Alberto       AERRAZUR    44.1632.960002        12000               0.3
           148 Gerald        GCAMBRAU    44.1632.960003        11000               0.3
           149 Eleni         EZLOTKEY    44.1632.960004        10500               0.2
           150 Sean          STUCKER     44.1632.960005        10000               0.3

16 rows selected.

HR ユーザーでは、電話番号もメール名も元データのまま表示されることが確認できます。

ここまでの結果のように、Data Redaction では次のような表示制御ができることがわかります。

  • 列全体を見せない
  • 固定形式の文字列の一部だけを見せる
  • メール名のような可変長の文字列をパターンに基づいて伏せる
  • 同じ表でも、接続ユーザーによって表示内容を変える

8. 後片付けを行う

最後に作成したポリシーの削除を行います。

$ sql sys/<password>@localhost:1521/freepdb1 AS SYSDBA

管理者ユーザーで接続し、以下を実行します。

BEGIN
  DBMS_REDACT.DROP_POLICY(
    object_schema => 'HR',
    object_name   => 'EMPLOYEES',
    policy_name   => 'POL_REDCT_EMP_INFO'
  );
END;
/

削除後、ディクショナリ・ビューでポリシーが残っていないことを確認します。

SELECT object_owner, object_name, policy_name
	FROM redaction_policies
	WHERE object_owner = 'HR' AND object_name = 'EMPLOYEES';

SELECT object_owner, object_name, column_name, function_type
	FROM redaction_columns
	WHERE object_owner = 'HR' AND object_name = 'EMPLOYEES';
no rows selected

no rows selected

今回の検証用に SALES_APP ユーザーを作成した場合は、必要に応じて削除します。

DROP USER sales_app CASCADE;

9. まとめ

この記事では、実際にSALES_APP ユーザーに対して Data Redaction を適用することで、データの見え方が変わることを確認しました。ポイントは次の 4 つとなります。

  • Data Redaction は元データを変更せず、問い合わせ結果を返す直前にマスキングする
  • 適用条件は expression の条件式で制御する
  • 1 つの表やビューに作成できるポリシーは 1 つ、複数列は ALTER_POLICY で追加する
  • 列ごとに完全、部分、正規表現などの方式を選び、業務上必要な情報だけを残すように設計する

一方で注意点もあります。Data Redaction は最終的に返却される結果に対して値をマスクするため、where句や副問合せなどを組み合わせることで、値の推測を行うことが可能です。そのため、アクセス制御機能としてはその他の機能を組み合わせて使用し、データの意図しない漏洩を防ぐための補助機能として活用するようにしてください。