3.15 Oracle Data Redactionポリシーの変更

DBMS_REDACT.ALTER_POLICYプロシージャでは、Oracle Data Redactionポリシーを変更できます。

3.15.1 Oracle Data Redactionポリシーの変更について

DBMS_REDACT.ALTER_POLICYプロシージャは、データ・リダクション・ポリシーを変更します。

ポリシーがすでに有効化されている場合は、最初に無効化する必要はなく、またポリシーを変更した後でもポリシーは有効化された状態が維持されます。

REDACTION_POLICIESデータ・ディクショナリ・ビューのPOLICY_NAME列を問い合せて、既存のデータ・リダクション・ポリシーの名前を検索したり、REDACTION_COLUMNSビューを問い合せて、ポリシー内に指定された列、関数およびパラメータに関する情報を検索できます。完全データ・リダクションを使用するポリシーを現在の値から検索するには、REDACTION_VALUES_FOR_TYPE_FULLデータ・ディクショナリ・ビューを問い合せます。

actionパラメータは、実行する変更の型を指定します。このプロシージャを実行するときは、少なくともobject_nameおよびpolicy_nameパラメータを含める必要があります。

3.15.2 DBMS_REDACT.ALTER_POLICYプロシージャの構文

DBMS_REDACT.ALTER_POLICYプロシージャの構文を使用して、すべてのタイプのデータ・リダクション・ポリシーを変更できます。

DBMS_REDACT.ALTER_POLICYプロシージャの構文は次のとおりです。

DBMS_REDACT.ALTER_POLICY (
   object_schema          IN VARCHAR2 := NULL, 
   object_name            IN VARCHAR2, 
   policy_name            IN VARCHAR2, 
   action                 IN BINARY_INTEGER := DBMS_REDACT.ADD_COLUMN,
   column_name            IN VARCHAR2 := NULL,
   function_type          IN BINARY_INTEGER := DBMS_REDACT.FULL,
   function_parameters    IN VARCHAR2 := NULL,
   expression             IN VARCHAR2 := NULL,
   regexp_pattern         IN VARCHAR2 := NULL,
   regexp_replace_string  IN VARCHAR2 := NULL,
   regexp_position        IN BINARY_INTEGER := 1,
   regexp_occurrence      IN BINARY_INTEGER := 0,
   regexp_match_parameter IN VARCHAR2 := NULL,
   policy_description     IN VARCHAR2 := NULL,
   column_description     IN VARCHAR2 := NULL);

COMPATIBLEデータベース初期化パラメータを23以上に設定した後に、function_typeパラメータに値DBMS_REDACT.FULLを指定して実行し、ブール・データ型の列でデータ・リダクション・ポリシーを初めて変更して完全リダクション・ポリシーに変換すると、REDACTION_VALUES_FOR_TYPE_FULLのカタログ・ビューにBOOLEAN_VALUE列が表示され、BOOLCOL列がSYS.RADM_FPTM$データ・ディクショナリ表に表示されます。

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

  • action: 次のいずれかの値を1つ選択し、使用するアクションの種類を定義します。

    • DBMS_REDACT.ADD_COLUMN ((ポリシーですでに保護されている列に加えて)リダクションのために新しい列を追加する場合)この設定はactionパラメータのデフォルトです。

    • DBMS_REDACT.MODIFY_COLUMN (function_parametersregexp_*パラメータ、またはfunction_typeでのリダクション・タイプを変更する予定の場合)

    • DBMS_REDACT.DROP_COLUMN (列からリダクションを削除する場合)。

    • DBMS_REDACT.MODIFY_EXPRESSION (expressionの値を変更する場合)各ポリシーに指定できるポリシー式は1つのみです。つまり、ポリシー式を変更する際は、既存のポリシー式を新しいポリシー式で置換します。

      表の各列には、異なる名前付きポリシー式を指定できます。(複数の名前付きポリシー式を作成および管理できます。)名前付きポリシー式は、DBMS_REDACT.UPDATE_POLICY_EXPRESSIONを使用することで変更できます。DBMS_REDACT.MODIFY_EXPRESSIONの使用によって名前付きポリシー式を変更することはできません。

    • DBMS_REDACT.SET_POLICY_DESCRIPTION (ポリシーの説明を変更する場合)

    • DBMS_REDACT.SET_COLUMN_DESCRIPTION (列の説明を変更する場合)

3.15.3 DBMS_REDACT.ALTER_POLICY操作に必要なパラメータ

DBMS_REDACT.ALTER_POLICYプロシージャには、列の追加や変更などの様々な操作を実行できるパラメータが用意されています。

表3-12では、これらのパラメータの組合せを示します。

表3-12 様々なDBMS_REDACT.ALTER_POLICYの操作に必要なパラメータ

変更内容 設定パラメータ

列の追加

  • action (DBMS_REDACT.ADD_COLUMN、オプション、デフォルトはDBMS_REDACT.ADD_COLUMN)

  • column_name (必須)

  • function_type (オプション、デフォルトはDBMS_REDACT.FULL)

  • function_parameters (function_typeDBMS_REDACT.PARTIALの場合のみ)

  • regexp* (function_typeDBMS_REDACT.REGEXPまたはDBMS_REDACT.REGEXP_WIDTHの場合のみ)

  • policy_description (オプション)

  • column_description (オプション)

列の変更

  • action (DBMS_REDACT.MODIFY_COLUMN、必須)

  • column_name (必須)

  • function_type (オプション、デフォルトはDBMS_REDACT.FULL)

  • function_parameters (function_typeDBMS_REDACT.PARTIALの場合のみ)

  • regexp* (function_typeDBMS_REDACT.REGEXPまたはDBMS_REDACT.REGEXP_WIDTHの場合のみ)

  • policy_description (オプション)

  • column_description (オプション)

列の削除

  • action (DBMS_REDACT.DROP_COLUMN、必須)

  • column_name (必須)

ポリシー式の変更

  • action (DBMS_REDACT.MODIFY_EXPRESSION、必須)

  • expression (必須)

  • policy_description (オプション)

ポリシーの説明の変更

  • action (DBMS_REDACT.SET_POLICY_DESCRIPTION、必須)

  • policy_description (必須)

列の説明の変更

  • action (DBMS_REDACT.SET_COLUMN_DESCRIPTION、必須)

  • column_description (必須)

  • column_name (必須)

3.15.4 チュートリアル: Oracle Data Redactionポリシーの変更

列ごとにそれ固有のリダクション設定および名前付きポリシー式を使用して、表内やビュー内の複数の列をリダクションできます。

この項の演習は、データ・リダクション・ポリシーを変更して、複数の列をリダクションする方法を示しています。また、ポリシーのexpression設定を変更する方法も示しています。これを実行するには、各段階でDBMS_REDACT.ALTER_POLICYプロシージャを実行する必要があります。

  1. ユーザーの作成およびそれらのユーザーへの権限の付与を行う権限を持つユーザーとして、PDBに接続します。

  2. 次のユーザーを作成します。

    GRANT CREATE SESSION TO dr_admin IDENTIFIED BY password;
    GRANT CREATE SESSION TO sales_rep IDENTIFIED BY password;
    GRANT CREATE SESSION TO support_rep IDENTIFIED BY password;
  3. ユーザーdr_adminに、DBMS_REDACT PL/SQLパッケージに対するEXECUTEを付与します。

    GRANT EXECUTE ON DBMS_REDACT TO dr_admin;
  4. ユーザーdr_adminに、ADMINISTER REDACTION POLICYシステム権限を付与します。
    GRANT ADMINISTER REDACTION POLICY TO dr_admin;
  5. ユーザーOEとして接続します。

  6. 顧客のクレジット・カード情報を含む表を作成し移入します。

    CREATE TABLE cust_order_info(
     first_name varchar2(20),
     last_name varchar2(20),
     address varchar2(30),
     city varchar2(30),
     state varchar2(3),
     zip varchar2(5),
     cc_num varchar2(19),
     cc_exp varchar2(7));
    
    
    INSERT INTO cust_order_info VALUES ('Jane','Doe','39 Mockingbird Lane', 'San Francisco', 'CA', 94114, '5105 1051 0510 5100', '10/2018');
    INSERT INTO cust_order_info VALUES ('Mary','Hightower','2319 Maple Street', 'Sonoma', 'CA', 95476, '5111 1111 1111 1118', '03/2019'); 
    INSERT INTO cust_order_info VALUES ('Herbert','Donahue','292 Winsome Way', 'San Francisco', 'CA', 94117, '5454 5454 5454 5454', '08/2018'); 
  7. ユーザーsales_repおよびsupport_repに、表cust_order_infoに対するSELECT権限を付与します。
    GRANT SELECT ON cust_order_info TO sales_rep, support_rep;
  8. ユーザーdr_adminとして接続します。

  9. ポリシーを有効期限のリダクションを含めるよう変更します。
    BEGIN DBMS_REDACT.ALTER_POLICY(
        object_schema     => 'oe',
        object_name       => 'cust_order_info',
        policy_name       => 'redact_cust_cc_info',
        action            => DBMS_REDACT.ADD_COLUMN,
        column_name       => 'cc_exp',
        function_type     => DBMS_REDACT.RANDOM);
    END;
    /
  10. ユーザーsales_repがリダクション済の値を表示し、ユーザーsupport_repが実際のデータを表示する条件を使用するよう、再度ポリシーを変更します。

    BEGIN
       DBMS_REDACT.ALTER_POLICY(
       object_schema     => 'oe',
       object_name       => 'cust_order_info',
       policy_name       => 'redact_cust_cc_info',
       action            => DBMS_REDACT.MODIFY_EXPRESSION,
       expression        => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''SALES_REP''');
    END;
    /
  11. ポリシーをテストするために、2人のユーザーに表cust_order_infoを問い合せさせます。

    まず、support_repで接続し、表を問い合せます。

    SELECT cc_num, cc_exp FROM OE.cust_order_info;
    
    CC_NUM               CC_EXP
    -------------------  -------
    5105 1051 0510 5100  10/2018
    5111 1111 1111 1118  03/2019
    5454 5454 5454 5454  08/2018
    

    ユーザーsupport_repは実際のデータを表示できます。次に、sales_repで接続し、表を問い合せます。

    SELECT cc_num, cc_exp FROM OE.cust_order_info;
    
    CC_NUM             CC_EXP
    ----------------   -------
    ************5100   lST=033
    ************1118   OZA.w4C
    ************5454   B(9+;O1
    

    データは、ユーザーsales_rep用にリダクションされています。

  12. support_repのみにリダクション済データが表示され、sales_repには実際のデータが表示されるようにする条件を含めるよう、ユーザーdr_admincust_order_infoを変更します。

    BEGIN
       DBMS_REDACT.ALTER_POLICY(
       object_schema      => 'oe',
       object_name        => 'cust_order_info',
       policy_name        => 'redact_cust_cc_info',
       action             => DBMS_REDACT.MODIFY_EXPRESSION,
       expression         => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''SUPPORT_REP''');
    END;
    /
  13. ユーザーに再度ポリシーをテストさせます。

    まず、support_repでポリシーをテストします:

    SELECT cc_num, cc_exp FROM OE.cust_order_info;
    
    CC_NUM             CC_EXP
    ----------------   -------
    ************5100   1^XMF~`
    ************1118   qz+9=#S
    ************5454   *KCaUkm
    

    これで実際のデータがリダクションされるため、ユーザーsupport_repはこのデータを表示できなくなります。

    次に、sales_repで接続し、表を問い合せます。

    SELECT cc_num, cc_exp FROM OE.cust_order_info;
    
    CC_NUM               CC_EXP
    -------------------  -------
    5105 1051 0510 5100  10/2018
    5111 1111 1111 1118  03/2019
    5454 5454 5454 5454  08/2018
    

    これでユーザーsales_repは実際のデータを表示できます。

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

    dr_adminで接続し、ポリシーを削除します。

    BEGIN
      DBMS_REDACT.DROP_POLICY (
        object_schema  => 'oe',
        object_name    => 'cust_order_info',
        policy_name    => 'redact_cust_cc_info');
    END;
    /

    セキュリティ管理者で接続し、ユーザーを削除します。

    DROP USER dr_admin;
    DROP USER sales_rep;
    DROP USER support_rep;

    ユーザーOEで接続し、cust_order_info表を削除します。

    DROP TABLE cust_order_info;