1. Data Redactionの準備#

SALES_APPユーザーを作成#

HRユーザーとリダクションの結果を比較するために、マスキングされたデータを返すユーザーとしてSALES_APP ユーザーを作成します。

まず、SALES_APP ユーザーを作成します。

CREATE USER SALES_APP IDENTIFIED BY <password> DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP;
CREATE USER SALES_APP IDENTIFIED BY Welcome1#Welcom1# DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP;

以下は実行例です。証跡としてパスワードが残らないよう、2つのコマンドに分けて設定しています。

SQL> create user sales_app
2     default tablespace users
3     temporary tablespace temp;

-- passwordを設定
SQL> password sales_app
Changing password for sales_app
New password: <パスワードを入力>
Retype new password: <パスワードを再入力>
Password changed

次に、SALES_APP ユーザーにセッション作成権限を付与します。

SQL> grant create session to sales_app;
さらに、HRスキーマに対して SELECT 権限を付与します。
スキーマ単位で権限付与する方法は23aiの新機能となっており、これにより、SALES_APP ユーザーは HR スキーマのテーブルに対してデータを参照できるようになります。
-- 23aiの新機能、スキーマ権限
SQL> grant select any table on schema HR to sales_app;

リダクションポリシーを作成する#

次に、SALES_APP ユーザーには EMPLOYEES テーブルの SALARY 列と COMMISSION_PCT 列をマスキングするポリシーを作成します。
営業が使用するアプリケーションでは給与と手数料の値は使用しないため閲覧は必要ない、という架空の設定です。

一度に一つの列にしかリダクションポリシーを適用できないため、 SALARY 列と COMMISSION_PCT 列に別々にポリシーを適用します。

まず、SALARY 列に対してリダクションポリシーを作成します。以下のコマンドを実行します:

BEGIN
    DBMS_REDACT.ADD_POLICY(
        object_schema       => 'HR',
        object_name         => 'EMPLOYEES',
        column_name         => 'SALARY',
        policy_name         => 'POL_REDCT_EMPLOYEES_SALARY',
        function_type       => DBMS_REDACTION.CONSTANT,
        function_parameters => 0,
        expression          => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') = ''SALES_APP'''
    );
END;
/

次に、先に作成したPOL_REDCT_EMPLOYEES_SALARYポリシーに新たに列を追加する形で COMMISSION_PCT 列に対してリダクションポリシーを追加します。

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

リダクションポリシーが正常に作成されたかを確認します。

-- ポリシーの作成を確認
SQL> select * from redaction_policies;
"OBJECT_OWNER","OBJECT_NAME","POLICY_NAME"               ,"EXPRESSION"                                          ,"ENABLE","POLICY_DESCRIPTION"
"HR"          ,"EMPLOYEES"  ,"POL_REDCT_EMPLOYEES_SALARY","SYS_CONTEXT('USERENV', 'SESSION_USER') = 'SALES_APP'","YES"   ,

-- リダクション対象の列を確認
SQL> select object_owner, object_name, column_name, function_type from redaction_columns;
"OBJECT_OWNER","OBJECT_NAME","COLUMN_NAME"   ,"FUNCTION_TYPE"
"HR"          ,"EMPLOYEES"  ,"SALARY"        ,"FULL REDACTION"
"HR"          ,"EMPLOYEES"  ,"COMMISSION_PCT","FULL REDACTION"

これで、SALES_APPユーザーが EMPLOYEES テーブルの SALARY 列と COMMISSION_PCT 列へのアクセスに対して、リダクションが適用されるようになりました。