10 チュートリアル: Oracle Label Securityでのグループの構成

このチュートリアルでは、4つの子グループを持つOracle Label Securityの親グループを作成する方法について説明します。

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

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

各営業マネージャは、OE.CUSTOMERS表の自分の顧客のレコードにアクセスする必要があります。各営業マネージャが報告する、広告会社の社長(Steven King)は、すべての顧客レコードにアクセスできる必要があります。顧客レコードは、営業マネージャの担当地域に基づいてグループに分けられます。

作成したOracle Label Securityポリシーによって各営業マネージャにグループが割り当てられ、このグループを使用して、OE.CUSTOMERS表の適切な行にラベルが付けられます。グループには親グループGLOBAL_SALESがあります。この親グループは、広告会社の社長(Steven King)に関連付けられます。GLOBAL_SALESの子グループを次に示します。

  • EUROPE。営業マネージャAlberto Errazurizがアクセス
  • ASIA。営業マネージャGerald Cambraultがアクセス
  • UNITED_STATES_1。営業マネージャJohn Russellがアクセス
  • UNITED_STATES_2。営業マネージャEleni Zlotkeyがアクセス

デフォルトでは、OEスキーマはインストールされていません。『Oracle Databaseサンプル・スキーマ』で説明されているように、このスキーマはGitHubからダウンロードできます。

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

作成するロールが付与されたユーザーは、OE.CUSTOMERS表に対するSELECT権限を持つことができます。ユーザー・アカウントは、4人の営業担当者用です

  1. ロールの作成、権限の付与およびユーザー・アカウントの作成を行う権限を持つユーザーとしてSQL*Plusにログインします。
    たとえば:
    sqlplus sec_admin
    Enter password: password
  2. OEスキーマがGitHubからダウンロードされ、インストールされていることを確認します。
    このスキーマをダウンロードおよびインストールする方法は、『Oracle Databaseサンプル・スキーマ』で説明されています。
  3. 次のようにロールを作成します。
    CREATE ROLE OE_CUST;
  4. OE.CUSTOMERSに対するSELECT権限をOE_CUSTに付与します。
    GRANT SELECT ON OE.CUSTOMERS TO OE_CUST;
  5. ユーザー・アカウントを作成し、OE_CUSTロールを付与します。
    GRANT CONNECT, OE_CUST TO SKING IDENTIFIED BY password; --For Steven King, president
    GRANT CONNECT, OE_CUST TO AERRAZURIZ IDENTIFIED BY password; --For Alberto Errazuriz, sales manager
    GRANT CONNECT, OE_CUST TO GCAMBRAULT IDENTIFIED BY password; --For Gerald Cambrault, sales manager
    GRANT CONNECT, OE_CUST TO JRUSSELL IDENTIFIED BY password; --For John Russell, sales manager
    GRANT CONNECT, OE_CUST TO EZLOTKEY IDENTIFIED BY password; --For Eleni Zlotkey, sales manager

10.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      => 'OE_OLS_POL',
      column_name      => 'OLS_COL');
    END;
    /

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

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

10.4 ステップ3: Oracle Label Securityポリシーのレベル・コンポーネントの作成と認可

Oracle Label Securityポリシー・コンテナを作成すると、レベル・コンポーネントを作成および認可する準備が整います。

このポリシーにはレベルが使用されますが、後で作成するデータ・ラベルを機能させるには、デフォルト・レベルが必要になります。
  1. 必要に応じて、Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. 次のようにレベルを作成します。
    BEGIN
       SA_COMPONENTS.CREATE_LEVEL (
          policy_name => 'OE_OLS_POL',
          level_num   => 50,
          short_name  => 'D',
          long_name   => 'DEFAULT');
    END;
    /

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

    • policy_nameは、作成したポリシー・コンテナにレベルを関連付けます。
    • level_numは、どれくらいのアクセスをユーザーが持てるかを決定します。レベル番号50を使用すると、ユーザーはこのレベルと、その下の任意のレベル番号にアクセスできます。ただし、このチュートリアルでは1つのレベルのみを使用します。
    • short_nameは、レベルのlong_nameの短縮名であり、他のプロシージャでレベルのlong_nameバージョンを参照するために使用されます。
  3. OE.EMPLOYEES表にアクセスする5人のユーザーのレベルを許可します。
    BEGIN
       SA_USER_ADMIN.SET_LEVELS (
          policy_name  => 'OE_OLS_POL',
          user_name    => 'SKING', 
          max_level    => 'D');
    
       SA_USER_ADMIN.SET_LEVELS (
          policy_name  => 'OE_OLS_POL',
          user_name    => 'AERRAZURIZ', 
          max_level    => 'D');
    
       SA_USER_ADMIN.SET_LEVELS (
          policy_name  => 'OE_OLS_POL',
          user_name    => 'GCAMBRAULT', 
          max_level    => 'D');
    
       SA_USER_ADMIN.SET_LEVELS (
          policy_name  => 'OE_OLS_POL',
          user_name    => 'JRUSSELL', 
          max_level    => 'D');
    
       SA_USER_ADMIN.SET_LEVELS (
          policy_name  => 'OE_OLS_POL',
          user_name    => 'EZLOTKEY', 
          max_level    => 'D');
    END;
    /

10.5 ステップ4: Oracle Label Securityポリシーのグループの作成と認可

この親グループに、1つの親グループと4つの子グループを作成して許可します。各ユーザーは、グループに対して認可されます。

  1. 必要に応じて、Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. GLOBAL_SALES親グループを作成します。
    BEGIN
      SA_COMPONENTS.CREATE_GROUP (
       policy_name     => 'OE_OLS_POL',
       group_num       => 2000,
       short_name      => 'GS',
       long_name       => 'GLOBAL_SALES');
    END;
    /

    この指定では、group_numは識別目的でのみ使用されます。このグループのセット内の階層は制御されません。

  3. 子グループを作成します。
    親グループGLOBAL_SALES (GS)に対して認可されているユーザーは、これらの子グループに対する認可も付与されます。
    BEGIN
      SA_COMPONENTS.CREATE_GROUP (
       policy_name     => 'OE_OLS_POL',
       group_num       => 2100,
       short_name      => 'EU',
       long_name       => 'EUROPE',
       parent_name     => 'GS');
    
      SA_COMPONENTS.CREATE_GROUP (
       policy_name     => 'OE_OLS_POL',
       group_num       => 2200,
       short_name      => 'AS',
       long_name       => 'ASIA',
       parent_name     => 'GS');
    
      SA_COMPONENTS.CREATE_GROUP (
       policy_name     => 'OE_OLS_POL',
       group_num       => 2300,
       short_name      => 'US1',
       long_name       => 'UNITED_STATES_1',
       parent_name     => 'GS');
    
      SA_COMPONENTS.CREATE_GROUP (
       policy_name     => 'OE_OLS_POL',
       group_num       => 2400,
       short_name      => 'US2',
       long_name       => 'UNITED_STATES_2',
       parent_name     => 'GS');
    END;
    /

    この指定では、parent_nameパラメータは親グループGSを指定します。

  4. これらのグループに対して、以前に作成したユーザーを許可します。
    BEGIN 
     SA_USER_ADMIN.SET_GROUPS (
      policy_name    => 'OE_OLS_POL',
      user_name      => 'SKING', 
      read_groups    => 'GS');
    
     SA_USER_ADMIN.SET_GROUPS (
      policy_name    => 'OE_OLS_POL',
      user_name      => 'AERRAZURIZ', 
      read_groups    => 'EU');
    
     SA_USER_ADMIN.SET_GROUPS (
      policy_name    => 'OE_OLS_POL',
      user_name      => 'GCAMBRAULT', 
      read_groups    => 'AS');
    
     SA_USER_ADMIN.SET_GROUPS (
      policy_name    => 'OE_OLS_POL',
      user_name      => 'JRUSSELL', 
      read_groups    => 'US1');
    
     SA_USER_ADMIN.SET_GROUPS (
      policy_name    => 'OE_OLS_POL',
      user_name      => 'EZLOTKEY', 
      read_groups    => 'US2');
    END;
    /

    この指定では、ユーザーSKINGは親グループGSに対して許可され、残りのユーザー(すべての営業マネージャ)は自分の販売地域を表すグループに対して許可されます。

これらのグループに対する認可の設定後に、まだデータ・ラベルが作成されていない場合は、Oracle Label Securityによりデータ・ラベルが自動的に作成されます。これまでのチュートリアルではデータ・ラベルを手動で作成する方法について説明しましたが、このチュートリアルではOracle Label Securityによる作成が可能です。ラベルは、DBA_SA_LABELSデータ・ディクショナリ・ビューを問い合せることで確認できます。たとえば:
SELECT POLICY_NAME, LABEL, LABEL_TAG FROM DBA_SA_LABELS ORDER BY LABEL_TAG;

次のような出力が表示されます。

POLICY_NAME     LABEL      LABEL_TAG
------------    ------     -----------
OE_OLS_POL      D          1000000085
OE_OLS_POL      D::GS      1000000086
OE_OLS_POL      D::EU      1000000087
OE_OLS_POL      D::AS      1000000088
OE_OLS_POL      D::US1     1000000089
OE_OLS_POL      D::US2     1000000090

10.6 ステップ5: ポリシーの表への適用および許可

OE_OLS_POLポリシーをOE.CUSTOMERS表に適用し、その後OEスキーマのユーザーにポリシーの読取り権限を付与する必要があります。

  1. 必要に応じて、Oracle Label Securityポリシーを作成および管理できるユーザーとして接続します。
    たとえば:
    sqlplus psmith_ols
    Enter password: password
  2. OE_OLS_POLポリシーをOE.CUSTOMERS表に適用します。
    BEGIN
      SA_POLICY_ADMIN.APPLY_TABLE_POLICY (
        policy_name    => 'OE_OLS_POL',
        schema_name    => 'OE', 
        table_name     => 'CUSTOMERS',
        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. OE_OLS_POLポリシーをOE.CUSTOMERSに対して有効にします。
    BEGIN
       SA_POLICY_ADMIN.ENABLE_TABLE_POLICY (
          policy_name => 'OE_OLS_POL',
          schema_name => 'OE',
          table_name  => 'CUSTOMERS');
    END;
    /
  4. OEのユーザー権限を設定します。これにより、OEOE.CUSTOMERSデータ行にラベルを適用できます。
    BEGIN
       SA_USER_ADMIN.SET_USER_PRIVS (
          policy_name => 'OE_OLS_POL',
          user_name   => 'OE',
          privileges  => 'READ');
    END;
    /

10.7 ステップ6: OE.CUSTOMERS表データへのポリシー・ラベルの追加

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

  1. OEとして接続します。
    connect OE
    Enter password: password
  2. 次のUPDATE文を実行して、GLOBAL_SALES (GS)グループをOE.CUSTOMERSに適用します。
    UPDATE customers
    SET    ols_col = CHAR_TO_LABEL('OE_OLS_POL','D::GS')
    WHERE  UPPER(account_mgr_id) IN (145, 147, 148, 149);

    この指定では、ラベル識別子D::GS (Steven King)を許可されているユーザーは、account_mgr_id IDが145147148および149のユーザーが利用できる行にアクセスできます。

  3. 次のUPDATE文を営業マネージャに対して実行します。
    欧州営業マネージャAlberto Errazuriz (ID: 147)の場合:
    UPDATE customers
    SET    ols_col = CHAR_TO_LABEL('OE_OLS_POL','D::EU')
    WHERE  UPPER(account_mgr_id) = 147;

    アジア営業マネージャGerald Cambrault (ID: 148)の場合:

    UPDATE customers
    SET    ols_col = CHAR_TO_LABEL('OE_OLS_POL','D::AS')
    WHERE  UPPER(account_mgr_id) = 148;

    米国営業マネージャJohn Russell (ID: 145)の場合:

    UPDATE customers
    SET    ols_col = CHAR_TO_LABEL('OE_OLS_POL','D::US1')
    WHERE  UPPER(account_mgr_id) = 145;

    米国営業マネージャElena Zlotkey (ID: 149)の場合:

    UPDATE customers
    SET    ols_col = CHAR_TO_LABEL('OE_OLS_POL','D::US2')
    WHERE  UPPER(account_mgr_id) = 149;

10.8 ステップ7: Oracle Label Securityポリシーのテスト

ポリシーをテストするには、各ユーザーがOE.CUSTOMERS表を問い合せます。

  1. ユーザーAlberto Errazurizとして接続します。
    connect aerrazuriz
    Enter password: password
  2. 表出力の列幅を設定します。
    column cust_first_name format a25
    column cust_last_name format a25
    column ols_label format a10
  3. 次の問合せを実行します。
    SELECT CUST_FIRST_NAME, CUST_LAST_NAME, ACCOUNT_MGR_ID, 
    LABEL_TO_CHAR(OLS_COL) OLS_LABEL 
    FROM OE.CUSTOMERS 
    ORDER BY OLS_COL;

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

    CUST_FIRST_NAME           CUST_LAST_NAME            ACCOUNT_MGR_ID OLS_LABEL
    ------------------------- ------------------------- -------------- ----------
    Hal                       Olin                                 147 D::EU
    Hannah                    Kanth                                147 D::EU
    Hannah                    Field                                147 D::EU
    Margret                   Powell                               147 D::EU
    Harry Mean                Taylor                               147 D::EU
    Margrit                   Garner                               147 D::EU
    Maria                     Warden                               147 D::EU
    Marilou                   Landis                               147 D::EU
    ...
    76 rows selected.

    Alberto ErrazurizにはEUグループのDレベルが割り当てられているため、出力はD:EUになります。

  4. この問合せを他の営業マネージャに繰り返します。
    • アジアの営業マネージャGerald Cambrault (gcambrault)。OLS_LABEL列の出力はD:ASで、58行が返される必要があります。
    • 米国の営業マネージャJohn Russell (jrussell)。OLS_LABEL列の出力はD:US1で、111行が返される必要があります。
    • Elena Zlotkey (ezlotkey)。OLS_LABEL列の出力はD:US2で、74行が返される必要があります。
  5. 社長Steven Kingとして接続します。
    connect sking
    Enter password: password
  6. 問合せを実行します。
    SELECT CUST_FIRST_NAME, CUST_LAST_NAME, ACCOUNT_MGR_ID, 
    LABEL_TO_CHAR(OLS_COL) OLS_LABEL 
    FROM OE.CUSTOMERS 
    ORDER BY OLS_COL;

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

    CUST_FIRST_NAME           CUST_LAST_NAME            ACCOUNT_MGR_ID OLS_LABEL
    ------------------------- ------------------------- -------------- ----------
    Kelly                     Lange                                147 D::EU
    Kenneth                   Redford                              147 D::EU
    Rick                      Lyon                                 147 D::EU
    Mammutti                  Sutherland                           147 D::EU
    Margaret                  Ustinov                              147 D::EU
    Kevin                     Cleveland                            147 D::EU
    Klaus Maria               Russell                              147 D::EU
    Kris                      de Niro                              147 D::EU
    Alain                     Barkin                               147 D::EU
    Albert                    Dutt                                 147 D::EU
    Amanda                    Finney                               147 D::EU
    
    ...
    
    Dom                       McQueen                              149 D::US2
    Dom                       Hoskins                              149 D::US2
    Don                       Siegel                               149 D::US2
    Gvtz                      Bradford                             149 D::US2
    Holly                     Kurosawa                             149 D::US2
    Rob                       MacLaine                             149 D::US2
    Don                       Barkin                               149 D::US2
    Meg                       Sen                                  149 D::US2
    ...
    319 rows selected.

    Steven KingにはGS親グループが割り当てられるため、OLS_LABEL列の出力には、4つの子グループ(D::EUD::ASD::US1D::US2)がすべて含まれます。

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

Oracle Label Securityポリシー、OE_CUSTロールおよびユーザー・アカウントを削除できます。

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