前回は、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 サンプルスキーマを準備していること
- サンプルスキーマの準備については こちらの記事の「1-2. サンプルスキーマの準備」を参照ください
- 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.EMPLOYEES | SALARY, COMMISSION_PCT | 完全リダクション | 給与や手数料率のように、利用者に値を見せない列を 0 として返す |
HR.EMPLOYEES | PHONE_NUMBER | 部分リダクション | 電話番号の国番号と市外局番だけを残し、残りを X で伏せる |
HR.EMPLOYEES | EMAIL | 正規表現リダクション | SKING のようなメール名の先頭 1 文字だけを残して伏せる |
適用条件はいずれも SESSION_USER が SALES_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.
この時点では、EMAIL、PHONE_NUMBER、SALARY がそのまま表示されています。また、 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_USER が SALES_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_POLICIES と REDACTION_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 ユーザーに対して SALARY と COMMISSION_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.
制限の対象はexpression で SALES_APP のみに限定しているため、HR ユーザーでは実値が表示されます。
7. 他のリダクション方式を試してみる
ここまでで、数値列を完全リダクションすると 0 として返されることを確認しました。
次に、同じ HR.EMPLOYEES 表にある PHONE_NUMBER と EMAIL の見え方を変えてみます。
引き続き、既存の HR サンプルスキーマだけを使います。HR.EMPLOYEES には PHONE_NUMBER と EMAIL がすでに格納されています。
7-1. 電話番号に部分リダクションを設定する
まず、同じ POL_REDCT_EMP_INFO ポリシーに PHONE_NUMBER 列を追加します。
リダクション方式には部分リダクションを使用します。部分リダクションは「すべて隠す」のではなく、識別や業務処理に必要な一部だけを残したい場合に使いやすい方式です。一方で、列の中に複数の電話番号形式が混在している場合は、対象データの形式に合わせて設計する必要があります。
HR サンプルスキーマの PHONE_NUMBER には、1.515.555.0100 や 1.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 列には、SKING、NYANG、LGARCIA のようなメール名が格納されています。そこで、ここではカスタム正規表現を使い、先頭 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 としています。たとえば SKING は SXXXX、LGARCIA は LXXXX のように返されます。
正規表現リダクションでは、パターンが列の値に一致しない場合や、置換しても値が変わらない場合、実値を返さないように完全リダクション相当の動作になります。対象データの形式に合うパターンになっているかは、本番適用前に事前に確認するようにしてください。
設定後、対象列を確認します。
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句や副問合せなどを組み合わせることで、値の推測を行うことが可能です。そのため、アクセス制御機能としてはその他の機能を組み合わせて使用し、データの意図しない漏洩を防ぐための補助機能として活用するようにしてください。