3.6 複数の名前付きポリシー式の作成および管理

名前付きの一元管理されるOracle Data Redactionポリシー式は、複数のリダクション・ポリシーで使用でき、複数の表またはビューに適用できます。

3.6.1 条件を定義するデータ・リダクション・ポリシー式について

Oracle Data Redaction名前付きポリシー式は、既存のデータ・リダクション・ポリシーで使用されているポリシー式に代わるものとして機能するよう設計されています。

ポリシー式により、実行時の条件に基づいてデータをリダクションできます。このタイプのポリシー式では、リダクション・ポリシーが定義されている表またはビューの列でリダイレクションが発生するかどうかに影響を与えることができます。デフォルトでは、データ・リダクション・ポリシー式は、その表またはビューに対して定義されているデータ・リダクション・ポリシーに属するすべての列に適用されます。あるいは、表またはビューの個々の列に対してポリシー式を作成して関連付けることもできます。これらの列レベルのポリシー式は、名前付きポリシー式と呼ばれます。名前付きポリシー式を適用する列は、すでにデータ・リダクション・ポリシーでリダクションされている必要があります。

データ・リダクション名前付きポリシー式は次の方法で使用できます。

  • 各名前付きポリシー式は、同じまたは異なる表またはビューの複数の列に関連付けることができます。

  • 各名前付きポリシー式は、同じまたは異なるデータ・リダクション・ポリシー内の列に関連付けることができます。

  • 名前付きポリシー式は、関連付けられた列のデフォルトのポリシー式をオーバーライドします。デフォルトのポリシー式は、名前付きポリシー式が適用されていない列には引き続き適用されます。

  • 名前付きポリシー式に対して行われた更新は、式のすべての列関連付けに適用されます。

  • 複数の名前付きポリシー式を同じ列に関連付けることはできません。

  • 名前付きポリシー式を異なるプラガブル・データベース(PDB)内の列に関連付けることはできません。

表3-8で、名前付きポリシー式の作成と管理に使用できるDBMS_REDACT PL/SQLプロシージャについて説明します。ポリシー式についての情報を検索するには、REDACTION_EXPRESSIONSデータ・ディクショナリ・ビューを問い合せます。

表3-8 DBMS_REDACTポリシー式プロシージャ

プロシージャ 説明

DBMS_REDACT.CREATE_POLICY_EXPRESSION

データ・リダクション名前付きポリシー式を作成します

DBMS_REDACT.UPDATE_POLICY_EXPRESSION

データ・リダクション名前付きポリシー式を更新します

DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL

データ・リダクション名前付きポリシー式を表またはビューの列に適用します

DBMS_REDACT.DROP_POLICY_EXPRESSION

データ・リダクション名前付きポリシー式を削除します

3.6.2 データ・リダクション名前付きポリシー式の作成および適用

DBMS_REDACT.CREATE_POLICY_EXPRESSIONDBMS_REDACT.APPLY_POLICY_EXPR_TO_COLを使用すると、データ・リダクション名前付きポリシー式の作成と適用ができます。

  1. DBMS_REDACT PL/SQLパッケージに対するEXECUTE権限と、ADMINISTER REDACTION POLICYシステムまたはスキーマ権限があるユーザーでPDBに接続します。
  2. COMPATIBLE初期化パラメータが12.2.0.0以上に設定されていることを確認します。
    COMPATIBLEの現在の設定を確認するには、SHOW PARAMETERコマンドを使用します。
  3. 名前付きポリシー式を作成するには、DBMS_REDACT.CREATE_POLICY_EXPRESSIONプロシージャを実行します。

    例:

    BEGIN
     DBMS_REDACT.CREATE_POLICY_EXPRESSION (
      policy_expression_name        => 'redact_pol',
      expression                    => '1=1',
      policy_expression_description => 'Determines whether the column will be redacted');
    END;
    /
  4. DBMS_REDACT.APPLY_POLICY_EXPR_TO_COLプロシージャを実行して、表またはビューの列に名前付きポリシー式を適用します。

    たとえば、次のように、表HR.EMPLOYEESの列SALARYにすでにデータ・リダクション・ポリシーを作成していることを想定します。

    BEGIN
      DBMS_REDACT.ADD_POLICY  (
       object_schema           => 'hr',
       object_name             => 'employees',
       policy_name             => 'overall_policy',
       expression              => '1=0'); 
    END;
    /
    BEGIN
      DBMS_REDACT.ALTER_POLICY (
       object_schema           => 'hr',
       object_name             => 'employees' ,
       policy_name             => 'overall_policy',
       function_type           => DBMS_REDACT.FULL,
       action                  => DBMS_REDACT.ADD_COLUMN,
       column_name             => 'salary');
    END; 
    /

    すると、次のようにSALARY列にポリシー式を適用できます:

    BEGIN
     DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL (
       object_schema           => 'hr',
       object_name             => 'employees',
       column_name             => 'salary',
       policy_expression_name  => 'redact_pol');
    END;
    /

    ここでは次のように指定します:

    • object_schema: 名前付きポリシー式を適用するオブジェクトのスキーマを指定します。この設定を省略(またはNULLを入力)する場合、Oracle Databaseは現在のスキーマ名を使用します。

    • object_name: 名前付きポリシー式に使用する表またはビューの名前を指定します。

    • column_name: 名前付きポリシー式を適用する列を指定します。

    • policy_expression_name: 名前付きポリシー式の名前を指定します。

3.6.3 データ・リダクション名前付きポリシー式の更新

DBMS_REDACT.UPDATE_POLICY_EXPRESSIONプロシージャを使用してデータ・リダクション名前付きポリシー式を更新できます。更新はただちに行われ、名前付きポリシー式を使用するすべての列に反映されます。

REDACTION_EXPRESSIONSデータ・ディクショナリ・ビューを問い合せて、既存のデータ・リダクション・ポリシー式を検索できます。
  1. DBMS_REDACT PL/SQLパッケージに対するEXECUTE権限と、ADMINISTER REDACTION POLICYシステムまたはスキーマ権限があるユーザーでPDBに接続します。
  2. COMPATIBLE初期化パラメータが12.2.0.0以上に設定されていることを確認します。
    COMPATIBLEの現在の設定を確認するには、SHOW PARAMETERコマンドを使用します。
  3. DBMS_REDACT.UPDATE_POLICY_EXPRESSIONプロシージャを実行して更新を実行します。

    例:

    BEGIN
     DBMS_REDACT.UPDATE_POLICY_EXPRESSION(
      policy_expression_name => 'redact_pol',
      expression             => '1=0');
    END;
    /

3.6.4 データ・リダクション名前付きポリシー式の削除

DBMS_REDACT.DROP_POLICY_EXPRESSIONプロシージャを使用してデータ・リダクション名前付きポリシーを削除できます。

REDACTION_EXPRESSIONSデータ・ディクショナリ・ビューを問い合せて、既存のデータ・リダクション名前付きポリシー式を検索できます。
  1. DBMS_REDACT PL/SQLパッケージに対するEXECUTE権限と、ADMINISTER REDACTION POLICYシステムまたはスキーマ権限があるユーザーでPDBに接続します。
  2. COMPATIBLE初期化パラメータが12.2.0.0以上に設定されていることを確認します。
    COMPATIBLEの現在の設定を確認するには、SHOW PARAMETERコマンドを使用します。
  3. 名前付きポリシー式の表またはビューの列との関連付けを削除します。
    名前付きポリシー式は、既存の表またはビューの列に関連付けられている場合は削除できません。特定の列の名前付きポリシー式との関連付けを削除する(デフォルトのポリシー式の評価結果に基づいてその列のリダクションに戻す)には、DBMS_REDACT.APPLY_POLICY_EXPR_TO_COLプロシージャのpolicy_expression_nameパラメータをNULLに設定する必要があります。

    例:

    BEGIN
     DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL(
       object_schema          => 'hr',
       object_name            => 'employees', 
       column_name            => 'salary',
       policy_expression_name =>  null);
    END;
    /
  4. DBMS_REDACT.DROP_POLICY_EXPRESSIONを実行してポリシー式を削除します。

    例:

    BEGIN
     DBMS_REDACT.DROP_POLICY_EXPRESSION(
      policy_expression_name  => 'redact_pol');
    END;
    /

3.6.5 チュートリアル: データ・リダクション名前付きポリシー式の作成および共有

このチュートリアルでは、Oracle Data Redaction名前付きポリシー式を作成して複数の表に適用し、この名前付きポリシー式を集中的に管理する方法を説明します。

3.6.5.1 ステップ1: このチュートリアル用のユーザーの作成

このチュートリアルでは、Oracle Data Redactionポリシーを作成するdr_adminと、それらをテストするhr_clerkの2人のユーザーを作成する必要があります。

このチュートリアルを開始する前に、COMPATIBLE初期化パラメータが12.2.0.0以上に設定されていることを確認します。この設定は、SHOW PARAMETERコマンドを使用して確認できます。
  1. SYSDBA管理権限を持つユーザーSYSとして、PDBに接続します。
  2. ユーザー・アカウントdr_adminおよびhr_clerkを作成します。
    GRANT CREATE SESSION TO dr_admin IDENTIFIED BY password;
    GRANT CREATE SESSION TO hr_clerk IDENTIFIED BY password;
  3. dr_adminユーザーに次の権限を付与します:
    GRANT EXECUTE ON DBMS_REDACT TO dr_admin;
    GRANT ADMINISTER REDACTION POLICY TO dr_admin;
  4. ユーザーHRとして接続します。
  5. hr_clerkに表EMPLOYEESおよびJOBSに対するSELECT権限を付与します。
    GRANT SELECT on EMPLOYEES to hr_clerk;
    GRANT SELECT on JOBS to hr_clerk;

3.6.5.2 ステップ2: Oracle Data Redactionポリシーの作成

ユーザーdr_adminは、表HR.EMPLOYEESおよびHR.JOBSを保護するOracle Data Redactionポリシーを作成する準備ができています。

  1. ユーザーdr_adminとしてPDBに接続します。
  2. HR.EMPLOYEES.SALARY列の完全リダクションを実行するhr_emp_redact_comp_polポリシーを作成します。
    BEGIN
     DBMS_REDACT.ADD_POLICY(
       object_schema       => 'hr', 
       object_name         => 'employees', 
       column_name         => 'salary',
       policy_name         => 'hr_emp_redact_comp_pol', 
       function_type       => DBMS_REDACT.FULL,
       expression          => '1=1');
    END;
    /
  3. hr_redact_comp_polポリシーを表HR.EMPLOYEESの列COMMISSION_PCTもリダクションするように変更します。
    BEGIN
     DBMS_REDACT.ALTER_POLICY(
       object_schema       => 'hr', 
       object_name         => 'employees', 
       policy_name         => 'hr_emp_redact_comp_pol', 
       action              => DBMS_REDACT.ADD_COLUMN,
       column_name         => 'commission_pct',
       function_type       => DBMS_REDACT.FULL);
    END;
    /
  4. HR.JOBSの列max_salaryに対してhr_jobs_redact_comp_polポリシーを作成します。
    BEGIN
     DBMS_REDACT.ADD_POLICY(
       object_schema       => 'hr', 
       object_name         => 'jobs', 
       column_name         => 'max_salary',
       policy_name         => 'hr_jobs_redact_comp_pol', 
       function_type       => DBMS_REDACT.FULL,
       expression          => '1=1');
    END;
    /
この段階で、列HR.EMPLOYEES.SALARYHR.EMPLOYEES.COMMISSION_PCTおよびHR.JOBS.MAX_SALARYのデータはリダクションされます。

3.6.5.3 ステップ3: Oracle Data Redactionポリシーのテスト

ユーザーhr_clerkは、リダクションされたデータのある表を問い合せる準備ができています。

  1. ユーザーhr_clerkとして接続します。
  2. HR.EMPLOYEES表を問い合せます。
    SELECT SALARY, COMMISSION_PCT FROM HR.EMPLOYEES WHERE SALARY > 15000;
    
    出力は次のようになります。
        SALARY COMMISSION_PCT
    ---------- --------------
             0
             0
             0
    
  3. HR.JOBS表を問い合せます。
    SELECT MAX_SALARY FROM HR.JOBS WHERE MAX_SALARY > 15000;
    
    出力は次のようになります。
    MAX_SALARY
    ----------
             0
             0
             0
             0
             0
    

3.6.5.4 ステップ4: リダクションされる表列に対する名前付きポリシー式の作成および適用

次に、ユーザーdr_adminは、データ・リダクション名前付きポリシー式(hr_redact_pol)を作成して、それを3つのリダクション済の表の列のうちの2つに適用する準備ができています。

このポリシー式は、ユーザーhr_clerkがリダクション済のデータを表示できるようにします。
  1. ユーザーdr_admin.として接続します
  2. ポリシー式を作成します。
    BEGIN
     DBMS_REDACT.CREATE_POLICY_EXPRESSION(
       policy_expression_name  => 'hr_redact_pol',
       expression              => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''HR_CLERK''');
    END;
    /

    この式は、ユーザーhr_clerkに対してFALSEを返し、これによりユーザーhr_clerkは、データ・リダクション・ポリシーの対象となる表HR.EMPLOYEESおよびHR.JOBS内の実際のデータを表示できるようになります。

  3. hr_redact_polポリシー式を列HR.EMPLOYEES.SALARYに適用します。
    BEGIN
     DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL(
       object_schema          => 'hr',
       object_name            => 'employees', 
       column_name            => 'salary',
       policy_expression_name => 'hr_redact_pol');
    END;
    /
  4. hr_redact_polポリシー式を列HR.JOBS.MAX_SALARYに適用します。
    BEGIN
     DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL(
       object_schema          => 'hr',
       object_name            => 'jobs', 
       column_name            => 'max_salary',
       policy_expression_name => 'hr_redact_pol');
    END;
    /
ユーザーhr_clerkは、HR.EMPLOYEES.SALARYおよびHR.JOBS.MAX_SALARY内のデータを表示できますが、列HR.EMPLOYEES.COMMISSION_PCT内のデータはこのユーザーに対してはまだリダクションされます。

3.6.5.5 ステップ5: データ・リダクション名前付きポリシー式のテスト

ここでは、ユーザーhr_clerkは、hr_redact_pol名前付きポリシー式をテストする準備ができています。

  1. ユーザーhr_clerkとして接続します。
  2. HR.EMPLOYEES表を問い合せます。
    SELECT SALARY, COMMISSION_PCT FROM HR.EMPLOYEES WHERE SALARY > 15000;
    
    出力は次のようになります。
        SALARY COMMISSION_PCT
    ---------- --------------
         24000
         17000
         17000
    

    これでユーザーhr_clerkは、列SALARYのデータを表示できますが、列COMMISSION_PCTのデータにはまだアクセスできません。

  3. HR.JOBS表を問い合せます。
    SELECT MAX_SALARY FROM HR.JOBS WHERE MAX_SALARY > 15000;
    
    出力は次のようになります。
    MAX_SALARY
    ----------
         40000
         30000
         16000
         16000
         20080

    これでユーザーhr_clerkは、列MAX_SALARYのデータを表示できます。

3.6.5.6 ステップ6: データ・リダクション名前付きポリシー式の変更

ユーザーdr_adminは、ユーザーHRではなくユーザーhr_clerkがリダクション済のデータを取得できるように、データ・リダクション名前付きポリシー式を変更することを決定します。

  1. ユーザーdr_adminとして接続します。
  2. hr_redact_polポリシーを次のように変更します。
    BEGIN
     DBMS_REDACT.UPDATE_POLICY_EXPRESSION(
      policy_expression_name => 'hr_redact_pol',
      expression             => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''HR''');
    END;
    /

3.6.5.7 ステップ7: 変更した名前付きポリシー式のテスト

ユーザーHRおよびhr_clerkは、変更済のデータ・リダクション名前付きポリシー式をテストする準備ができています。

  1. ユーザーHRとして接続します。
  2. HR.EMPLOYEES表を問い合せます。
    SELECT SALARY, COMMISSION_PCT FROM HR.EMPLOYEES WHERE SALARY > 15000;
    
    出力は次のようになります。
        SALARY COMMISSION_PCT
    ---------- --------------
         24000
         17000
         17000
    

    これでユーザーHRが、実際のデータにアクセスできるようになりました。HRによる列HR.JOBS.MAX_SALARYへの問合せは、同様の結果が得られます。

    SELECT MAX_SALARY FROM HR.JOBS WHERE MAX_SALARY > 15000;
    
    MAX_SALARY
    ----------
         40000
         30000
         16000
         16000
         20080
    
  3. ユーザーhr_clerkとして接続します。
  4. HR.EMPLOYEESおよびHR.JOBSを問い合せて、結果を確認します。
    SELECT SALARY, COMMISSION_PCT FROM HR.EMPLOYEES WHERE SALARY > 15000;
    
        SALARY COMMISSION_PCT
    ---------- --------------
             0
             0
             0
    
    SELECT MAX_SALARY FROM HR.JOBS WHERE MAX_SALARY > 15000;
    
    MAX_SALARY
    ----------
             0
             0
             0
             0
             0
    

3.6.5.8 ステップ8: このチュートリアルのコンポーネントの削除

このチュートリアルのコンポーネントが不要になった場合、それらを削除できます。

  1. ユーザーdr_adminとして接続します。
  2. ポリシー式を、式に関連付けられた表の列に関連付けられないように変更します。
    これを行うには、policy_expression_nameパラメータをNULLに設定する必要があります。
    BEGIN
     DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL(
       object_schema          => 'hr',
       object_name            => 'employees', 
       column_name            => 'salary',
       policy_expression_name =>  null);
    END;
    /
    
    BEGIN
     DBMS_REDACT.APPLY_POLICY_EXPR_TO_COL(
       object_schema          => 'hr',
       object_name            => 'jobs', 
       column_name            => 'max_salary',
       policy_expression_name =>  null);
    END;
    /
  3. ポリシー式を削除します。
    BEGIN
     DBMS_REDACT.DROP_POLICY_EXPRESSION(
      policy_expression_name  => 'hr_redact_pol');
    END;
    /
    
  4. データ・リダクション・ポリシーhr_emp_redact_comp_polおよびhr_jobs_redact_comp_polを削除します。
    BEGIN
      DBMS_REDACT.DROP_POLICY (
        object_schema  => 'hr',
        object_name    => 'employees',
        policy_name    => 'hr_emp_redact_comp_pol');
    END;
    /
    
    BEGIN
      DBMS_REDACT.DROP_POLICY (
        object_schema  => 'hr',
        object_name    => 'jobs',
        policy_name    => 'hr_jobs_redact_comp_pol');
    END;
    /
  5. SYSTEMユーザーまたはユーザー・アカウントの削除権限を持つユーザーとして、接続します。
  6. ユーザー・アカウントdr_adminおよびhr_clerkを削除します。
    DROP USER dr_admin;
    DROP USER hr_clerk;