Data Redaction
Data Redaction とは
Section titled “Data Redaction とは”Data Redaction(データ・リダクション)は、クエリ結果として返される列の値を動的に隠す(マスキングする)機能です。 DB 内部のデータ自体は変更されず、アプリケーションに返すタイミングでのみ値が置き換えられます(Data in Use の保護)。
DBMS_REDACT パッケージでポリシーを管理し、「誰が・どのオブジェクトの・どの列を照会したとき」 にマスキングを適用するかを条件式(expression)で制御します。
リダクション・タイプ
Section titled “リダクション・タイプ”| タイプ | 定数 | 動作 |
|---|---|---|
| 完全リダクション | DBMS_REDACT.FULL | 数値は 0、文字列は空文字に置き換え |
| 部分リダクション | DBMS_REDACT.PARTIAL | 一部の文字だけをマスク(例:クレジットカード番号の末尾4桁のみ表示) |
| ランダム | DBMS_REDACT.RANDOM | ランダムな値を返す(毎回変わる) |
| 正規表現 | DBMS_REDACT.REGEXP | 正規表現パターンに一致した部分を置換 |
| リダクションなし | DBMS_REDACT.NONE | 実際の値をそのまま返す(ポリシーの一時無効化などに使用) |
ポリシーの仕組み
Section titled “ポリシーの仕組み”- 1オブジェクト(表/ビュー)につき 1 ポリシーのみ作成できる
- 1 つのポリシーに複数列を追加するには
DBMS_REDACT.ALTER_POLICYを使う expressionパラメータで適用条件を指定(例:SYS_CONTEXT('USERENV','SESSION_USER') = 'SALES_APP')- ポリシーの状態は
redaction_policies/redaction_columnsビューで確認できる
クエリ実行時、対象列に対して次のようにマスキングの適用が判定されます。
主要プロシージャ
Section titled “主要プロシージャ”| プロシージャ | 用途 |
|---|---|
DBMS_REDACT.ADD_POLICY | 新規ポリシーを作成(最初の列を定義) |
DBMS_REDACT.ALTER_POLICY | 既存ポリシーに列の追加・変更・有効/無効化 |
DBMS_REDACT.DROP_POLICY | ポリシーを削除 |
注意:アクセス制御機能ではない
Section titled “注意:アクセス制御機能ではない”Data Redaction はデータを「見えにくくする」機能であり、アクセスを遮断する機能ではありません。
WHERE 句や副問い合わせを使った条件フィルタリングは元データに対して実行されるため、絞り込み件数などからデータを推測できる場合があります。
機密データの保護には、VPD や Database Vault などのアクセス制御機能と組み合わせることが重要です。
詳しくは「注意点」ページを参照してください。
このサイトで扱う内容
Section titled “このサイトで扱う内容”HR スキーマの EMPLOYEES 表を題材に、SALARY / COMMISSION_PCT 列に対して完全リダクションを適用し、ユーザー別の見え方の違いを確認します。
-
比較用ユーザー(
SALES_APP)への権限付与と、DBMS_REDACT.ADD_POLICY/ALTER_POLICYを使ったリダクションポリシーの作成を行います。 -
HRユーザーとSALES_APPユーザーでそれぞれ同じクエリを実行し、列の値がマスキングされることを確認します。最後にポリシーを削除して後片付けも行います。
関連ブログと手順の差分
Section titled “関連ブログと手順の差分”このサイトのチュートリアルをベースに、Oracle Blogs で解説記事を公開しています。記事では扱うリダクション方式を増やし、手順を再構成しているため、主な差分を以下にまとめます。
概念の整理と WHERE 句・副問い合わせによる推測リスクの詳細は前回記事(#9)に対応し、このサイトでは 注意点 ページに相当します。
実行環境・実行ユーザー
Section titled “実行環境・実行ユーザー”-
ブログは Oracle AI Database 26ai FREE / PDB
freepdb1を前提とし、ポリシーの作成・削除をすべてSYS(AS SYSDBA) で実行します。このサイトの手順は実行ユーザーを明示していません。 -
ブログでは
SALES_APPの作成と権限付与を明示しています。表単位の付与です。create user sales_app identified by "<password>";grant create session to sales_app;grant select on hr.employees to sales_app; -
ハンズオン専用に作成した場合は
DROP USER sales_app CASCADE;も実施します。
扱うリダクション方式
Section titled “扱うリダクション方式”- このサイトは 完全リダクション(
DBMS_REDACT.FULL) のみをSALARY/COMMISSION_PCTに適用します。 - ブログはこれに加えて、部分リダクション(
PARTIAL)をPHONE_NUMBER、正規表現リダクション(REGEXP)をEMAILに適用し、1 つのポリシー内で列ごとに方式を変えられることを確認します。
ポリシー名・ALTER_POLICY の書き方
Section titled “ポリシー名・ALTER_POLICY の書き方”- ポリシー名: このサイトは
POL_REDCT_EMPLOYEES_SALARY、ブログは複数種の列を含むためPOL_REDCT_EMP_INFOに改称。 - 列を追加する際、このサイトは
ALTER_POLICY(... column_name => ..., function_type => ...)。ブログはaction => DBMS_REDACT.ADD_COLUMNを明示します(既定動作ですが明示的)。
部分リダクション(PHONE_NUMBER、ブログのみ)
Section titled “部分リダクション(PHONE_NUMBER、ブログのみ)”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 | リダクション部分の置換文字 |
5,11 | 数字部分の 5〜11 桁目をリダクション |
- 部分リダクションは 固定形式 の値向けです。
HR.EMPLOYEESのPHONE_NUMBERには1.650.555.0135と44.1632.960000が混在するため、形式の異なる行は4..16.XXX.XXXXのように崩れて表示されます。本番適用前にデータ形式の確認が必要です。
正規表現リダクション(EMAIL、ブログのみ)
Section titled “正規表現リダクション(EMAIL、ブログのみ)”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 文字だけを残して伏せます(
SKING→SXXXX、LGARCIA→LXXXX)。 - パターンが値に一致しない、または置換しても値が変わらない場合は、完全リダクション相当(実値を返さない)の動作になります。
確認用クエリ・ビュー参照
Section titled “確認用クエリ・ビュー参照”- このサイトは
select first_name, salary, commission_pct from hr.employees;(107 行)。ブログはWHERE employee_id BETWEEN 135 AND 150(16 行)に絞り、EMAIL/PHONE_NUMBERも含めて表示差を確認します。 - ブログは
redaction_policies/redaction_columnsをWHERE object_owner = 'HR' AND object_name = 'EMPLOYEES'で絞り、expression/enable列も確認します。ADD_POLICY 前に既存ポリシーが無いことも確認します。
数値列の完全リダクション値
Section titled “数値列の完全リダクション値”NUMBER型にFULLを適用した場合の既定のリダクション値は0です。元データがNULLの行(COMMISSION_PCTの一部)は空欄のまま、値のある行が0になります。