9 チュートリアル: Oracle Label Securityでの区分の構成

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

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

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

このチュートリアルは、前のチュートリアルを基に作成されており、Susan MavrisおよびIda Neauという2人のユーザーのHR.EMPLOYEESスキーマ内のレコードに対するアクセスを制御するOracle Label Securityレベルの作成方法を説明しています。このチュートリアルで、3番目のユーザーLily Leagullは、会社の法務部門の弁護士です。2人の以前の従業員が会社に対して訴訟を起こしており、彼女はこの2人のレコードへのアクセス権が必要です。他のレコードにはアクセスできません。以前のユーザーに対するアクセスは、前のチュートリアルで作成したHIGHLY_SENSITIVEレベルによって設定されます。LEGALと呼ばれるHIGHLY_SENSITIVEデータ・セット内の区分を使用することで、訴訟を起こしている2人の以前の従業員のレコードへのアクセスが可能になります。

9.2 ステップ2: HIGHLY_SENSITIVEレベルに対するLily Leagullの認可

lleagullアカウントの作成後に、HIGHLY_SENSITIVEレベルを使用するようにこのアカウントを認可できます。

  1. Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. HIGHLY_SENSITIVEレベルを使用するようにlleagullを認可します。
    HIGHLY_SENSITIVEの短縮名はHSです。
    BEGIN
       SA_USER_ADMIN.SET_LEVELS (
          policy_name  => 'HR_OLS_POL',
          user_name    => 'LLEAGULL', 
          max_level    => 'HS',
          min_level    => 'S');
    END;
    /

9.3 ステップ3: Oracle Label Securityポリシーの2つの区分の作成

3人のユーザー(Susan Mavris、Ida NeauおよびLily Leagull)の全員が、区分を使用して各自のデータにアクセスします。

2人のHR従業員であるSusan MavrisおよびIda Neauは、HR区分を使用します。法務部門の従業員であるLily Leagullは、LEGAL (LEG)区分を使用します。
  1. 必要に応じて、Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. 次のように区分を作成します。
    BEGIN
      SA_COMPONENTS.CREATE_COMPARTMENT (
        policy_name      => 'HR_OLS_POL',
        long_name        => 'HR',
        short_name       => 'HR',
        comp_num         =>  1000);
    
      SA_COMPONENTS.CREATE_COMPARTMENT (
        policy_name      => 'HR_OLS_POL',
        long_name        => 'LEGAL',
        short_name       => 'LEG',
        comp_num         =>  2000);
    END;
    /
    

    この指定で、comp_numは、レベルでのlevel_numのように階層を示すものではありません。これは、区分の識別にのみ使用されます。

9.4 ステップ4: 区分用のデータ・ラベルの作成

区分用の3つのデータ・ラベルを作成します。

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

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

    • label_value S:HRは、現在のすべての従業員のレコードに割り当てられます。
    • label_value HS:HRは、現在と以前のすべての従業員のレコードに割り当てられます。
    • label_value HS:LEGは、会社に対して訴訟を起こしている以前の従業員のレコードに割り当てられます。

9.5 ステップ5: ユーザーへのラベルの割当て

ユーザーにラベルを割り当てると、これらのユーザーがアクセス権を持つ行が指定されます。

  1. 必要に応じて、Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. 次のように、ラベルをユーザーに割り当てます。
    BEGIN
       SA_USER_ADMIN.SET_USER_LABELS (
          policy_name    => 'HR_OLS_POL',
          user_name      => 'ineau', 
          max_read_label => 'S:HR:');
    
       SA_USER_ADMIN.SET_USER_LABELS (
          policy_name    => 'HR_OLS_POL',
          user_name      => 'smavris', 
          max_read_label => 'HS:HR,LEG:');
    
       SA_USER_ADMIN.SET_USER_LABELS (
          policy_name    => 'HR_OLS_POL',
          user_name      => 'lleagull', 
          max_read_label => 'HS:LEG:');
    END;
    /

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

    • HR区分に対して認可されているユーザーineau (Ida Neau)は、引き続き、現在のすべての従業員へのアクセス権がありますが、以前の従業員または訴訟を起こしている以前の従業員へのアクセス権はありません。
    • HRLEGの両方の区分に対して認可されているユーザーsmavris (Susan Mavris)は、引き続き、現在および以前のすべての従業員、および会社に対して訴訟を起こしている以前の従業員へのアクセス権があります。
    • LEG区分に対して認可されているユーザーlleagul (Lily Leagul)は、会社に対して訴訟を起こしている以前の従業員へのアクセス権のみがあります。

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

HRユーザーは、EMPLOYEE_ID列のHR.EMPLOYEES表データにポリシー・ラベルを追加します。

  1. HRユーザーとして接続します。
    connect hr
    Enter password: password
  2. 次のUPDATE文を実行して、まだ会社で雇用されているユーザーの従業員IDにSENSITIVEレベルおよびHR区分を適用します。
    このUPDATE文は、Ida NeauがSENSITIVEレベルおよびHR区分に対して認可されているため、HR.EMPLOYEES表へのIda Neauのアクセスを制御します。
    UPDATE employees
    SET    ols_col = CHAR_TO_LABEL('HR_OLS_POL','S:HR')
    WHERE  UPPER(employee_id) NOT IN (200, 101, 102, 176, 201, 122, 114);
  3. 次のUPDATE文を実行して、現在および以前の従業員の従業員IDにHIGHLY_SENSITIVEレベルおよびHR区分を適用します。
    このUPDATE文は、Susan MavrisがSENSITIVEレベルおよびHRLEGの区分に対して認可されているため、HR.EMPLOYEES表へのSusan Mavrisのアクセスを制御します。
    UPDATE employees
    SET    ols_col = CHAR_TO_LABEL('HR_OLS_POL','HS:HR,LEG')
    WHERE  UPPER(employee_id) IN (200, 101, 102, 176, 201, 122, 114);
  4. 次のUPDATE文を実行して、会社に対して訴訟を起こしている以前の従業員の従業員IDにHIGHLY_SENSITIVEレベルおよびLEG区分を適用します。
    このUPDATE文は、Lily LeagullがHIGHLY_SENSITIVEレベルおよびLEG区分に対して認可されているため、HR.EMPLOYEES表へのLily Leagullのアクセスを制御します。
    UPDATE employees
    SET    ols_col = CHAR_TO_LABEL('HR_OLS_POL','HS:LEG')
    WHERE  UPPER(employee_id) IN (200, 101);

9.7 ステップ7: 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:HR
    Alexander                 Hunold                            103 S:HR
    Bruce                     Ernst                             104 S:HR
    David                     Austin                            105 S:HR
    Valli                     Pataballa                         106 S:HR
    Diana                     Lorentz                           107 S:HR
    Nancy                     Greenberg                         108 S:HR
    Daniel                    Faviet                            109 S:HR
    John                      Chen                              110 S:HR
    Ismael                    Sciarra                           111 S:HR
    ...
    
    100 rows selected
    

    Ida NeauにはSENSITIVE (S)ラベルとHR区分が割り当てられたため、列OLS_LABELの出力はS:HRです。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:HR
    Alexander                 Hunold                            103 S:HR
    Bruce                     Ernst                             104 S:HR
    David                     Austin                            105 S:HR
    Valli                     Pataballa                         106 S:HR
    ...
    Jennifer                  Whalen                            200 HS:LEG
    Neena                     Kochhar                           101 HS:LEG
    Michael                   Hartstein                         201 HS:HR,LEG
    Jonathon                  Taylor                            176 HS:HR,LEG
    Den                       Raphaely                          114 HS:HR,LEG
    Lex                       De Haan                           102 HS:HR,LEG
    Payam                     Kaufling                          122 HS:HR,LEG
    
    107 rows selected

    Susan MavrisにはHRおよびLEG区分でHIGHLY_SENSITIVE (HS)レベルが割り当てられたため、列OLS_LABELの出力は次のようになります。

    • 現在のすべての従業員を取得するS:HR
    • 以前のすべての従業員を取得するHS:HR, LEG
    • 訴訟を起こしている以前の従業員を取得するHS:LEG

    107行が戻されます。

  6. ユーザーLily Leagullとして接続します。
    connect lleagull
    Enter password: password
  7. Susan Mavrisが実行したのと同じ問合せを実行します。
    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
    ------------------------- ------------------------- ----------- ----------
    Jennifer                  Whalen                            200 HS:LEG
    Neena                     Kochhar                           101 HS:LEG
    
    107 rows selected

    Lily LeagullにはLEG区分でHSレベルが割り当てられたため、問合せでは訴訟を起こしている以前のユーザーのみが戻されます。

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

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

  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アカウントおよびlleagullアカウントを削除します。
    DROP USER INEAU;
    DROP USER SMAVRIS;
    DROP USER LLEAGULL;