8 チュートリアル: Oracle Label Securityでのレベルの構成

このチュートリアルでは、Oracle Label Securityレベルの作成方法を示します。

8.1 このチュートリアルについて

このチュートリアルでは、HRスキーマを使用してOracle Label Securityレベルの使用方法について学習します。

人事管理担当Susan Mavrisには、彼女を補佐するIda Neauがいます。Susan Mavrisは、会社を退職した従業員のレコードを含むすべての従業員レコードにアクセスする必要があります。Ida Neauは、現在の従業員のみにアクセスできる必要があります。

現在および以前の従業員へのアクセスを制御するために、次のレベルの機密性を使用するOracle Label Securityポリシーを作成します。

  • SENSITIVEでは、現在の従業員のみにアクセスできます。ユーザーIda Neauに、このレベルが割り当てられます。
  • HIGHLY_SENSITIVEでは、以前の従業員にアクセスできます。ユーザーSusan Mavrisに、このレベルが割り当てられます。このレベルはSENSITIVEよりも高いレベルであり、SENSITIVEによって保護されている行へのアクセスも提供されます。つまり、Susan Mavrisは、以前の従業員レコードと現在の従業員レコードの両方にアクセスできます。

8.2 ステップ1: ロールおよびユーザー・アカウントの作成

作成するロールが付与されたユーザーは、HR.EMPLOYEES表に対するSELECT権限を持つことができます。ユーザー・アカウントは、Susan MavrisおよびIda Neauという2名の人事管理従業員用です。

  1. ロールの作成、権限の付与およびユーザー・アカウントの作成を行う権限を持つユーザーとしてSQL*Plusにログインします。
    たとえば:
    sqlplus sec_admin
    Enter password: password
  2. 次のようにロールを作成します。
    CREATE ROLE HR_ROLE;
  3. HR.EMPLOYEESに対するSELECT権限をHR_ROLEに付与します。
    GRANT SELECT ON HR.EMPLOYEES TO HR_ROLE;
  4. Susan MavrisおよびIda Neau用のユーザー・アカウントを作成し、HR_ROLEロールを付与します。
    GRANT CONNECT, HR_ROLE TO SMAVRIS IDENTIFIED BY password;
    GRANT CONNECT, HR_ROLE TO INEAU IDENTIFIED BY password;

8.3 ステップ2: Oracle Label Securityポリシー・コンテナの作成

Oracle Label Security管理者として、ポリシー・コンテナを作成して有効にする必要があります。

  1. Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. ポリシーを作成します。
    BEGIN
     SA_SYSDBA.CREATE_POLICY (
      policy_name      => 'HR_OLS_POL',
      column_name      => 'OLS_COL');
    END;
    /

    この指定では、default_optionsパラメータは、後で別のプロシージャで追加できるため省略されます。

  3. ポリシーを有効にします。
    EXEC SA_SYSDBA.ENABLE_POLICY ('HR_OLS_POL');

8.4 ステップ3: Oracle Label Securityポリシーの2つのレベル・コンポーネントの作成

Oracle Label Securityポリシー・コンテナを作成した後は、2つの異なるレベルの機密性を表す2つのレベルを作成できます。

  1. 必要に応じて、Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. 次のようにレベルを作成します。
    BEGIN
       SA_COMPONENTS.CREATE_LEVEL (
          policy_name => 'HR_OLS_POL',
          level_num   => 3000,
          short_name  => 'HS',
          long_name   => 'HIGHLY_SENSITIVE');
    
       SA_COMPONENTS.CREATE_LEVEL (
          policy_name => 'HR_OLS_POL',
          level_num   => 2000,
          short_name  => 'S',
          long_name   => 'SENSITIVE');
    END;
    /

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

    • policy_nameは、作成したポリシー・コンテナにレベルを関連付けます。
    • level_numは、どれくらいのアクセスをユーザーが持てるかを決定します。レベル番号3000を使用すると、ユーザーはこのレベルおよびそれより下のレベル番号(この場合はレベル番号2000)にアクセスできます。つまり、HIGHLY_SENSITIVEレベルで認可されているユーザーは、SENSITIVEレベルに割り当てられたデータにもアクセスできます。
    • short_nameは、レベルのlong_nameの短縮名であり、他のプロシージャでレベルのlong_nameバージョンを参照するために使用されます。

8.5 ステップ4: レベル用のデータ・ラベルの作成

データ・ラベルにより、Oracle Label Securityポリシーで使用するためにデータ・レコードにタグが付けられます。

この手順では、データ・ラベルによって、ユーザーSusan MavrisおよびIda Neauに表示されるHR.EMPLOYEES表の行が指定されます。HSというラベルの行は、Susan Mavrisに割り当てられるHS (HIGHLY_SENSITIVE)レベルに対応し、Sというラベルの行はIda Neauに割り当てられるS (SENSITIVE)レベルに対応します。
  1. 必要に応じて、Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. 次のように、データ・レベルを作成します。
    BEGIN
       SA_LABEL_ADMIN.CREATE_LABEL (
          policy_name  => 'HR_OLS_POL',
          label_tag    => 3100,
          label_value  => 'HS',
          data_label   => TRUE);
    
       SA_LABEL_ADMIN.CREATE_LABEL (
          policy_name  => 'HR_OLS_POL',
          label_tag    => 2100,
          label_value  => 'S',
          data_label   => TRUE);
    END;
    /

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

    • label_tagは、レベルを識別するためにOracle Label Securityによって内部的に使用されます。レベルとは異なり、ラベルを持つ階層のソートは制御されません。
    • data_labelは、ラベルを行データに適用できるようにTRUEに設定されています。

8.6 ステップ5: Oracle Label Securityポリシーに対するユーザー認可の設定

ユーザー認可の設定では、Oracle Label Securityポリシーに関連付けられている最小レベルと最大レベルをユーザーに関連付ける必要があります。

  1. 必要に応じて、Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. 次のようにユーザーを認可します。
    BEGIN
       SA_USER_ADMIN.SET_LEVELS (
          policy_name  => 'HR_OLS_POL',
          user_name    => 'SMAVRIS', 
          max_level    => 'HS',
          min_level    => 'S');
    
       SA_USER_ADMIN.SET_LEVELS (
          policy_name  => 'HR_OLS_POL',
          user_name    => 'INEAU', 
          max_level    => 'S',
          min_level    => 'S');
    END;
    /

    この指定では、def_level(デフォルト・レベル)およびrow_levelパラメータは、その値がmax_levelパラメータの設定にデフォルト設定されるように省略されています。

8.7 ステップ6: HRスキーマへのOracle Label Securityポリシーの適用

ポリシーをHRスキーマに適用した後、HRとポリシーの関連付けを有効にする必要があります。

  1. 必要に応じて、Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. ポリシーをHRスキーマに適用します。
    BEGIN
      SA_POLICY_ADMIN.APPLY_TABLE_POLICY (
        policy_name    => 'HR_OLS_POL',
        schema_name    => 'HR', 
        table_name     => 'EMPLOYEES',
        table_options  => 'READ_CONTROL');
    END;
    /

    以前は、SA_SYSDBA.CREATE_POLICYプロシージャを使用してポリシーを作成した場合、ポリシー強制オプションを定義するdefault_optionsパラメータを設定しませんでした。したがって、ここでポリシー強制をSA_POLICY_ADMIN.APPLY_TABLE_POLICYtable_optionsパラメータを使用して設定する必要があります。READ_CONTROLは、ユーザーが後で実行するSELECT文の処理中にOLSポリシーを強制します。(UPDATE文とDELETE文の処理にも適用されます。)

  3. ポリシーとHRスキーマとの関連付けを有効にします。
    BEGIN
       SA_POLICY_ADMIN.ENABLE_TABLE_POLICY (
          policy_name => 'HR_OLS_POL',
          schema_name => 'HR',
          table_name  => 'EMPLOYEES');
    END;
    /

8.8 ステップ7: HR.EMPLOYEES表データへのポリシー・ラベルの追加

Oracle Label Security管理者とHRユーザーはどちらも、EMPLOYEE_ID列のHR.EMPLOYEES表データにポリシー・ラベルを追加します。

  1. 必要に応じて、Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. HRユーザーのHR_OLS_POLポリシーにREAD権限を付与します。
    BEGIN
       SA_USER_ADMIN.SET_USER_PRIVS (
          policy_name => 'HR_OLS_POL',
          user_name   => 'HR',
          privileges  => 'READ');
    END;
    /
  3. HRユーザーとして接続します。
    connect hr
    Enter password: password
  4. 次のUPDATE文を実行して、会社を退職したユーザーの従業員IDにHIGHLY_SENSITIVEレベルを適用します。
    このUPDATE文は、Susan MavrisがHIGHLY_SENSITIVEレベルに対して認可されているため、HR.EMPLOYEES表へのSusan Mavrisのアクセスを制御します。
    UPDATE employees
    SET    ols_col = CHAR_TO_LABEL('HR_OLS_POL','HS')
    WHERE  UPPER(employee_id) IN (200, 101, 102, 176, 201, 122, 114);
  5. 次のUPDATE文を実行して、SENSITIVEレベルを会社の現在の従業員の従業員IDに適用します。
    このUPDATE文は、Ida NeauがSENSITIVEレベルに対して認可されているため、HR.EMPLOYEES表へのIda Neauのアクセスを制御します。
    UPDATE employees
    SET    ols_col = CHAR_TO_LABEL('HR_OLS_POL','S')
    WHERE  UPPER(employee_id) NOT IN (200, 101, 102, 176, 201, 122, 114);

    このUPDATE文は、「以前の従業員ではない従業員にSENSITIVEラベルを適用する」に変換されます。

8.9 ステップ8: Oracle Label Securityポリシーのテスト

ポリシーをテストするには、各ユーザーがHR.EMPLOYEES表の問合せを試行します。

  1. ユーザーIda Neauとして接続します。
    connect ineau
    Enter password: password
  2. 表出力の列幅を設定します。
    column first_name format a25
    column last_name format a25
    column ols_label format a10
  3. 次の問合せを実行します。
    SELECT FIRST_NAME, LAST_NAME, EMPLOYEE_ID, 
    LABEL_TO_CHAR(OLS_COL) OLS_LABEL 
    FROM HR.EMPLOYEES 
    ORDER BY OLS_COL;

    出力は次のようになります。

    FIRST_NAME                LAST_NAME                 EMPLOYEE_ID OLS_LABEL
    ------------------------- ------------------------- ----------- ----------
    Steven                    King                              100 S
    Alexander                 Hunold                            103 S
    Bruce                     Ernst                             104 S
    David                     Austin                            105 S
    Valli                     Pataballa                         106 S
    Diana                     Lorentz                           107 S
    Nancy                     Greenberg                         108 S
    Daniel                    Faviet                            109 S
    ...
    100 rows selected
    

    Ida NeauにはSENSITIVEラベルが割り当てられたため、列OLS_LABELの出力はS (SENSITIVE)のみになります。100行が戻されます。

    Oracle Label Securityの制限は、ユーザーが作成するSELECT問合せに適用されます。たとえば、Ida NeauがSELECT COUNT(*) FROM HR.EMPLOYEES;問合せを実行すると、107行すべてではなく100行が戻されます。

  4. ユーザーSusan Mavrisとして接続します。
    connect smavris
    Enter password: password
  5. Ida Neauが実行したのと同じ問合せを実行します。
    SELECT FIRST_NAME, LAST_NAME, EMPLOYEE_ID, 
    LABEL_TO_CHAR(OLS_COL) OLS_LABEL 
    FROM HR.EMPLOYEES 
    ORDER BY OLS_COL;

    出力は次のようになります。

    FIRST_NAME                LAST_NAME                 EMPLOYEE_ID OLS_LABEL
    ------------------------- ------------------------- ----------- ----------
    Steven                    King                              100 S
    Alexander                 Hunold                            103 S
    ...
    William                   Gietz                             206 S
    Neena                     Kochhar                           101 HS
    Lex                       De Haan                           102 HS
    Den                       Raphaely                          114 HS
    Michael                   Hartstein                         201 HS
    Jonathon                  Taylor                            176 HS
    Jennifer                  Whalen                            200 HS
    Payam                     Kaufling                          122 HS
    
    107 rows selected

    Susan MavrisにはHIGHLY_SENSITIVEラベルが割り当てられたため、列OLS_LABELの出力はHS (HIGHLY_SENSITIVE)およびS (SENSITIVE)になります。107行が戻されます。

8.10 ステップ9: (オプション) Oracle Label Securityポリシー・コンポーネントの削除

Oracle Label Securityポリシー、HR_ROLEロール、ユーザーIda NeauおよびSusan Mavrisを削除できます。

ただし、Oracle Label Security区分の作成方法に関するチュートリアルを試行する場合は、これらのコンポーネントを削除しないでください。区分に関するチュートリアルは、レベルに関するこのチュートリアルを基に作成されています。

  1. Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. Oracle Label Securityポリシーを削除します。
    このプロシージャは、HR.EMPLOYEES表からレベルおよびOLS_COL列も削除します。
    BEGIN
      SA_SYSDBA.DROP_POLICY ( 
        policy_name  => 'HR_OLS_POL',
        drop_column  => TRUE);
    END;
    /
  3. ロールおよびユーザー・アカウントを削除する権限を持つユーザーとして接続します。
    たとえば:
    connect sec_admin
    Enter password: password
  4. HR_ROLEロールを削除します。
    DROP ROLE HR_ROLE;
  5. ineauアカウントとsmavrisアカウントを削除します。
    DROP USER INEAU;
    DROP USER SMAVRIS;