Skip to content

Data Redaction

Data Redaction(データ・リダクション)は、クエリ結果として返される列の値を動的に隠す(マスキングする)機能です。 DB 内部のデータ自体は変更されず、アプリケーションに返すタイミングでのみ値が置き換えられます(Data in Use の保護)。

DBMS_REDACT パッケージでポリシーを管理し、「誰が・どのオブジェクトの・どの列を照会したとき」 にマスキングを適用するかを条件式(expression)で制御します。

タイプ定数動作
完全リダクションDBMS_REDACT.FULL数値は 0、文字列は空文字に置き換え
部分リダクションDBMS_REDACT.PARTIAL一部の文字だけをマスク(例:クレジットカード番号の末尾4桁のみ表示)
ランダムDBMS_REDACT.RANDOMランダムな値を返す(毎回変わる)
正規表現DBMS_REDACT.REGEXP正規表現パターンに一致した部分を置換
リダクションなしDBMS_REDACT.NONE実際の値をそのまま返す(ポリシーの一時無効化などに使用)
  • 1オブジェクト(表/ビュー)につき 1 ポリシーのみ作成できる
  • 1 つのポリシーに複数列を追加するには DBMS_REDACT.ALTER_POLICY を使う
  • expression パラメータで適用条件を指定(例:SYS_CONTEXT('USERENV','SESSION_USER') = 'SALES_APP'
  • ポリシーの状態は redaction_policies / redaction_columns ビューで確認できる

クエリ実行時、対象列に対して次のようにマスキングの適用が判定されます。

Data Redaction の適用フロー

クエリ実行時に DBMS_REDACT ポリシーの expression を評価し、条件に一致するセッションにはマスクした値を、一致しないセッションには実際の値を返す。テーブルの実データは変更されない。

クエリ実行SELECT … FROM 表DBMS_REDACT ポリシー評価対象列に対し expression を判定マスクした値を返すFULL=0 / 空文字、PARTIAL、RANDOM、REGEXP実際の値を返すexpression 不一致 / NONE条件に一致一致しないテーブルの実データは変更されない(Data in Use の保護)。WHERE 句・副問い合わせは実データに対して評価される点に注意。
プロシージャ用途
DBMS_REDACT.ADD_POLICY新規ポリシーを作成(最初の列を定義)
DBMS_REDACT.ALTER_POLICY既存ポリシーに列の追加・変更・有効/無効化
DBMS_REDACT.DROP_POLICYポリシーを削除

注意:アクセス制御機能ではない

Section titled “注意:アクセス制御機能ではない”

Data Redaction はデータを「見えにくくする」機能であり、アクセスを遮断する機能ではありませんWHERE 句や副問い合わせを使った条件フィルタリングは元データに対して実行されるため、絞り込み件数などからデータを推測できる場合があります。 機密データの保護には、VPD や Database Vault などのアクセス制御機能と組み合わせることが重要です。

詳しくは「注意点」ページを参照してください。

HR スキーマの EMPLOYEES 表を題材に、SALARY / COMMISSION_PCT 列に対して完全リダクションを適用し、ユーザー別の見え方の違いを確認します。

  1. Data Redactionの準備

    比較用ユーザー(SALES_APP)への権限付与と、DBMS_REDACT.ADD_POLICY / ALTER_POLICY を使ったリダクションポリシーの作成を行います。

  2. Redactionを体験する

    HR ユーザーと SALES_APP ユーザーでそれぞれ同じクエリを実行し、列の値がマスキングされることを確認します。最後にポリシーを削除して後片付けも行います。

このサイトのチュートリアルをベースに、Oracle Blogs で解説記事を公開しています。記事では扱うリダクション方式を増やし、手順を再構成しているため、主な差分を以下にまとめます。

概念の整理と WHERE 句・副問い合わせによる推測リスクの詳細は前回記事(#9)に対応し、このサイトでは 注意点 ページに相当します。

  • ブログは 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; も実施します。

  • このサイトは 完全リダクション(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.EMPLOYEESPHONE_NUMBER には 1.650.555.013544.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 文字だけを残して伏せます(SKINGSXXXXLGARCIALXXXX)。
  • パターンが値に一致しない、または置換しても値が変わらない場合は、完全リダクション相当(実値を返さない)の動作になります。
  • このサイトは select first_name, salary, commission_pct from hr.employees;(107 行)。ブログは WHERE employee_id BETWEEN 135 AND 150(16 行)に絞り、EMAIL / PHONE_NUMBER も含めて表示差を確認します。
  • ブログは redaction_policies / redaction_columnsWHERE object_owner = 'HR' AND object_name = 'EMPLOYEES' で絞り、expression / enable 列も確認します。ADD_POLICY 前に既存ポリシーが無いことも確認します。
  • NUMBER 型に FULL を適用した場合の既定のリダクション値は 0 です。元データが NULL の行(COMMISSION_PCT の一部)は空欄のまま、値のある行が 0 になります。