4 Oracle Database Vaultレルム

Oracle Database Vaultレルムでは、ユーザーがデータベースに対して実行できるアクションが制限されます。

Oracle Database Vaultは、機密データの保護、ヒューマン・エラーの削減、内部脅威の制限というOracle Database Vaultの目標に加え、Oracle Databaseディクショナリのコンポーネントと独自のディクショナリ・オブジェクトを保護します。

特定のオブジェクトにアクセスしたり、特定の管理タスクを実行したり、特定のOracle Databaseロールを付与したりするために、Database Vaultによって認可されることが必要になる場合があります。

Oracle Database Vaultには、従来型と必須という2つのタイプのレルムがあります:どちらのタイプのレルムでも、スキーマ全体、個々のデータベース・ロール、またはスキーマ内の重要なオブジェクト(表や索引)を選択的に保護できます。

従来のレルムでは、直接のオブジェクト権限を使用したデータベース・ユーザーが尊重されます。

必須レルムには、直接付与された権限とロールを介して付与された権限のいずれかと、Database Vaultレルム認可が必要です。

この例では、C##JSMITHに、付与されているリソース・ロールを転送して付与します。これを実行するには、C##JSMITHをDatabase Vaultのデフォルト・レルムに追加する必要があります。

4.1 従来のレルム

従来のレルムの場合、オブジェクト権限を付与されているオブジェクトの所有者またはユーザーはレルム認可なしで問合せやDML操作を実行できますが、DDL操作の実行にはレルム認可が必要です。

4.1.1 レルム違反のデモンストレーション

Oracle Database Vaultレルムではユーザーがデータベースに対して実行できるアクションが制限されるため、一部のアクションは適切な認可がなければ失敗します。この例では、C##JSMITHユーザーがOracleシステム権限およびロール管理レルムに存在しないため、RESOURCEロールを付与できないことを示しています。

  1. C##CMACKユーザーを作成し、RESOURCEロールを付与します:
    1. C##JSMITHとして接続します:
      connect c##jsmith
    2. C##CMACKロールを作成し、RESOURCEロールを付与します:
      CREATE USER C##CMACK IDENTIFIED BY <password> CONTAINER=ALL;
      GRANT RESOURCE TO C##CMACK WITH ADMIN OPTION CONTAINER=ALL;
      C##JSMITHとして次のエラーが表示されます:
      ORA-47410: Insufficient realm privileges to GRANT on RESOURCE
  2. RESOURCEロールを保護しているレルムを特定します:
    1. C##JSMITHとして接続します:
      connect c##jsmith
    2. 次を実行します:
      SELECT REALM_NAME, OBJECT_NAME
          FROM DBA_DV_REALM_OBJECT
          WHERE OBJECT_TYPE = 'ROLE'
              AND OBJECT_NAME = 'RESOURCE'
          ORDER BY 1,2;
      次の出力が表示されます:
      REALM_NAME                                           OBJECT_NAME
      ____________________________________________________ ______________
      Oracle System Privilege and Role Management Realm    RESOURCE 
  3. レルムで保護されたオブジェクトにアクセスすることを認可されているデータベース・ユーザー、具体的には、OWNERレルム認可を持つユーザーを特定します。これにより、WITH ADMIN OPTION権限を保持するオブジェクトに対する権限を転送して付与できるようになります:
    SELECT GRANTEE, AUTH_OPTIONS
        FROM DBA_DV_REALM_AUTH
        WHERE REALM_NAME = 'Oracle System Privilege and Role Management Realm'
        ORDER BY 1;
    次の出力が表示されます:
    GRANTEE       AUTH_OPTIONS
    _____________ _______________
    SYS           Owner

SYSは、必要でないかぎり使用しないでください。かわりに、C##JSMITHを所有者としてOracleシステム権限およびロール管理レルムに認可して、C##JSMITHがリソース・ロールを他のデータベース・ユーザーに付与できるようにする必要があります。

C##JSMITHをOracleシステム権限およびロール管理レルムに所有者として認可するステップを完了し、C##JSMITHがリソース・ロールを他のデータベース・ユーザーに付与できるようにします。

4.1.2 レルム認可の付与

名前付きユーザーをOracleシステム権限およびロール管理レルムに所有者として認可し、ユーザーがそのリソース・ロールを他のデータベース・ユーザーに付与できるようにします。すべてのデータベース・コンテナ内のデータベース・ユーザーに権限を付与する場合は、Oracle Database Vaultが有効になっている各プラガブル・データベース(PDB)で名前付きユーザーを認可します。

たとえば、Database VaultレルムにC##JSMITHを追加します:

  1. C##JSMITHとして接続します:
    connect c##jsmith
  2. レルムにC##JSMITHを追加します:
    BEGIN DVSYS.DBMS_MACADM.ADD_AUTH_TO_REALM (
        realm_name     => 'Oracle System Privilege and Role Management Realm' 
        ,grantee        => 'C##JSMITH' 
        ,rule_set_name  => null 
        ,auth_options   => DBMS_MACUTL.G_REALM_AUTH_OWNER);
    END;
    /
  3. C##JSMITHがレルムに追加されたことを確認します:
    SELECT GRANTEE, AUTH_OPTIONS
        FROM DBA_DV_REALM_AUTH
        WHERE REALM_NAME = 'Oracle System Privilege and Role Management Realm'
        ORDER BY 1;
    次の出力が表示されます:
    GRANTEE       AUTH_OPTIONS
    _____________ _______________
    C##JSMITH     Owner
    SYS           Owner
  1. PDBでC##JSMITHとして接続します:
    connect c##jsmith@pdb_name
  2. レルムにC##JSMITHを追加します:
    BEGIN DVSYS.DBMS_MACADM.ADD_AUTH_TO_REALM (
        realm_name     => 'Oracle System Privilege and Role Management Realm' 
        ,grantee        => 'C##JSMITH' 
        ,rule_set_name  => null 
        ,auth_options   => DBMS_MACUTL.G_REALM_AUTH_OWNER 
        ,auth_scope     => DBMS_MACUTL.G_SCOPE_LOCAL);
    END;
    /
  3. C##JSMITHがレルムに追加されたことを確認します:
    SELECT GRANTEE, AUTH_OPTIONS
        FROM DBA_DV_REALM_AUTH
        WHERE REALM_NAME = 'Oracle System Privilege and Role Management Realm'
        ORDER BY 1;
    次の出力が表示されます:
    GRANTEE       AUTH_OPTIONS
    _____________ _______________
    C##JSMITH     Owner
    SYS           Owner

ヒント:

拡張構成では、共通ロールを作成し、そのロールを個々のデータベース・ユーザー名ではなく、レルム認可所有者リストに追加します。

たとえば、C##ACME_DBAロールを作成し、認可された所有者としてOracleシステム権限およびロール管理レルムに追加します。次に、Database Vaultレルムを作成して、C##ACME_DBAロールを付与できるユーザーを保護します。

4.1.3 他のユーザーへのRESOURCEロールの付与

名前付きユーザーが権限およびレルム認可を取得すると、そのユーザーはRESOURCEを他のユーザーに付与できます。

たとえば、C##JSMITHとして、RESOURCEロールをC##CMACKに付与します:

  1. C##JSMITHとして接続します:
    connect c##jsmith
  2. C##CMACKロールを作成し、RESOURCEロールを付与します:
    CREATE USER C##CMACK IDENTIFIED BY <password> CONTAINER=ALL;
    GRANT RESOURCE TO C##CMACK WITH ADMIN OPTION CONTAINER=ALL;
  3. C##JSMITHとして、プラガブル・データベースにGRKAMERアカウントを作成します:
    ALTER SESSION SET CONTAINER=pdb_name;
    CREATE USER GKRAMER IDENTIFIED BY <password>;
    GRANT CREATE SESSION TO GKRAMER;
  4. C##JSMITHデータベース・ユーザーを使用して、GRKAMERに複数のシステム権限を付与します:
    GRANT SELECT ANY TABLE, UPDATE ANY TABLE, CREATE ANY TABLE, DROP ANY TABLE TO GKRAMER;
    GRANT CREATE ANY INDEX, DROP ANY INDEX TO GKRAMER;
    GRANT RESOURCE TO GKRAMER;

デフォルトのレルムおよびコマンド・ルールの詳細は、『Oracle Database Vault管理者ガイド』を参照してください。

4.2 必須レルム

必須レルムの場合、レルム内のオブジェクトに対して、従来のレルムよりも強力な保護が提供されます。必須レルムの場合、オブジェクト権限とシステム権限の両方へのアクセスがブロックされ、オブジェクト権限を持つユーザーが、レルム認可なしで問合せ、DMLまたはDDL操作を実行することは許可されません。つまり、オブジェクトが必須レルムで保護されている場合、オブジェクト所有者であっても、適切なレルム認可を受けないとそのオブジェクトにアクセスできません。

4.2.1 レルムおよびコマンド・ルールを適用する前のアプリケーション・データの問合せ

レルムおよびコマンド・ルールを適用する前に、HR.EMPLOYEES表を問い合せて、ユーザーが実行できるアクションを確認できます。レルムとコマンド・ルールを適用すると、結果は異なるものになります。

次の各ユーザーとしてHR.EMPLOYEES表を問い合せ、結果を次の表と比較します:

  • SYS
  • SYSTEM
  • C##DVOWNER
  • C##DVACCTMGR
  • C##JSMITH
  • C##CMACK
  • GKRAMER
  • HR
  1. <user>として接続します:
    connect <user>
  2. 次のコマンドを実行します。
    SELECT COUNT(*) FROM HR.EMPLOYEES;
    CREATE TABLE HR.EMP2 AS SELECT * FROM HR.EMPLOYEES;
    CREATE INDEX HR.TEST_IDX ON HR.EMP2(HIRE_DATE,LAST_NAME);
    DROP INDEX HR.TEST_IDX;
    DROP TABLE HR.EMP2;
コマンド SYS SYSTEM C##DVOWNER C##DVACCTMGR C##JSMITH C##CMACK GKRAMER HR
SELECT COUNT(*) FROM HR.EMPLOYEES; Success Success ORA-00942: table or view does not exist ORA-00942: table or view does not exist Success ORA-00942: table or view does not exist Success Success
CREATE TABLE HR.EMP2 AS SELECT * FROM HR.EMPLOYEES; Success Success ORA-00942: table or view does not exist ORA-00942: table or view does not exist Success ORA-00942: table or view does not exist Success Success
CREATE INDEX HR.TEST_IDX ON HR.EMP2(HIRE_DATE,LAST_NAME); Success Success ORA-00942: table or view does not exist ORA-00942: table or view does not exist Success ORA-00942: table or view does not exist Success Success
DROP INDEX HR.TEST_IDX; Success Success ORA-01418: specified index does not exist ORA-01418: specified index does not exist Success ORA-01418: specified index does not exist Success Success
DROP TABLE HR.EMP2; Success Success ORA-00942: table or view does not exist ORA-00942: table or view does not exist Success ORA-00942: table or view does not exist Success Success

結果が表と異なる場合は、コンテナ・データベースでOracle Database Vaultを構成および有効化し、ユーザーを作成して適切な権限を付与したことを確認します。

Database Vault関連のアカウントC##DVOWNERおよびC##DVACCTMGRには、HR.EMPLOYEES表へのアクセスに必要なシステム権限またはオブジェクト権限がありません。これらのアカウントは、データへのアクセスを意図したものではなく、Database Vault管理アクティビティのみを実行します

4.2.2 表およびビューを保護するための必須レルムの作成

必須レルムには、直接付与された権限とロールを介して付与された権限のいずれかと、Database Vaultレルム認可が必要です。必須レルムを作成すると、適切なシステム権限またはオブジェクト権限およびレルム認可を持つユーザーのみが、指定された表およびビューにアクセスできます。

前提条件

「名前付きデータベース・アカウントの作成」中に作成したC##JSMITHユーザーなど、DV_ACCTMGRまたはDV_OWNERロールが付与されているアカウントがあること。

  1. プラガブル・データベースでC##JSMITHとして接続します:
    connect c##jsmith@pdb_name
  2. 必須レルムを作成します:
    BEGIN 
        DVSYS.DBMS_MACADM.CREATE_REALM(  
            realm_name     => 'Protect HR tables' 
            ,description    => 'Mandatory realm to protect HR tables' 
            ,enabled        => dbms_macutl.g_yes 
            ,audit_options  => null 
            ,realm_type     => dbms_macadm.mandatory_realm);
    END;
    /

    ノート:

    Oracle Database 19c以前および従来の監査を使用している場合は、NULLではなくaudit_optionsの値を指定できます。詳細は、Oracle Database 19cの『Oracle Database Vault管理者ガイド』を参照してください。
  3. 新しいレルムで保護するオブジェクトを追加します。OBJECT_TYPEパラメータにワイルドカード(%)を指定すると、スキーマ内のすべての既存オブジェクトおよび新規オブジェクトを保護できます。

    この例では、TABLESVIEWSを1つのレルムに、INDEXESを次の例の別のレルムに分けます。

    BEGIN
        DVSYS.DBMS_MACADM.ADD_OBJECT_TO_REALM(  
            realm_name     => 'Protect HR tables' 
            ,object_owner   => 'HR' 
            ,object_name    => '%' 
            ,object_type    => 'TABLE');
    END;
    /
    
    BEGIN
        DVSYS.DBMS_MACADM.ADD_OBJECT_TO_REALM( 
            realm_name     => 'Protect HR tables' 
            ,object_owner   => 'HR' 
            ,object_name    => '%' 
            ,object_type    => 'VIEW');
    END;
    /
  4. レルムで保護された表およびビューへのアクセスをユーザーに認可します。必須レルムでは、オブジェクト所有者も認可します。

    この例では、HRが自身のオブジェクトにアクセスすることを認可します。

    BEGIN
        DVSYS.DBMS_MACADM.ADD_AUTH_TO_REALM(  
            realm_name     => 'Protect HR tables' 
            ,grantee       => 'HR' 
            ,rule_set_name => '' 
            ,auth_options  => dbms_macutl.g_realm_auth_owner);
    END;
    /
  5. レルムを強制するかどうかを決定します:
    • シミュレーション(非強制)モード: Oracle Database Vaultシミュレーション・モードでは、Oracle Database Vaultレルムで保護するデータにアクセスしているユーザーを特定できます。Database Vaultレルム認可リストの違反のみが記録されます。

      ENABLEDパラメータをDBMS_MACUTL.G_SIMULATIONに設定します

      BEGIN
          DVSYS.DBMS_MACADM.UPDATE_REALM(   
              realm_name     => 'Protect HR tables' 
              ,description   => 'Mandatory realm to protect HR tables' 
              ,enabled       => dbms_macutl.g_simulation 
              ,audit_options => null 
              ,realm_type    => dbms_macadm.mandatory_realm);
      END;
      /
    • 強制モード: Oracle Database Vault強制モードは、保護しているオブジェクトに対する制御を必須レルムが強制し、データベース・ユーザーがレルムに対する適切なシステム権限またはオブジェクト権限および認可を維持している場合にそのユーザーがアクセスできるようにすることを意味します。

      ENABLEDパラメータをDBMS_MACUTL.G_YESに設定します

      BEGIN
          DVSYS.DBMS_MACADM.UPDATE_REALM(   
              realm_name     => 'Protect HR tables' 
              ,description   => 'Mandatory realm to protect HR tables' 
              ,enabled       => dbms_macutl.g_yes 
              ,audit_options => null 
              ,realm_type    => dbms_macadm.mandatory_realm);
      END;
      /

Oracle Database Vaultシミュレーション・モードの詳細は、『Oracle Database Vault管理者ガイド』エラーのトラブルシューティングとトレースの項を参照してください。

4.2.3 索引を保護するための必須レルムの作成

表と索引を別々のレルムに分離することで、表データにアクセスすることなく索引メンテナンスを許可できます。データに間接的にアクセスできるため、依然としてリスクがあります。ただし、索引メンテナンスがDBAのタスクであり、これが想定するリスクである場合、この分離は一般的な方法です。

例:

  1. C##JSMITHとして接続します:
    connect c##jsmith
  2. 必須レルムを作成します:
    BEGIN
        DVSYS.DBMS_MACADM.CREATE_REALM(  
            realm_name     => 'Protect HR indexes' 
            ,description    => 'Mandatory realm to protect HR indexes' 
            ,enabled        => dbms_macutl.g_yes 
            ,audit_options  => null 
            ,realm_type     => dbms_macadm.mandatory_realm);
    END;
    /

    ノート:

    Oracle Database 19c以前および従来の監査を使用している場合は、NULLではなくaudit_optionsの値を指定できます。詳細は、『Oracle Database Vault管理者ガイド』を参照してください。
  3. レルムに索引を追加します:
    BEGIN
        DBMS_MACADM.ADD_OBJECT_TO_REALM(  
            realm_name    => 'Protect HR indexes' 
            ,object_owner  => 'HR' 
            ,object_name  => '%' 
            ,object_type  => 'INDEX');
    END;
    /
  4. レルムに認可を追加します:
    BEGIN
        DVSYS.DBMS_MACADM.ADD_AUTH_TO_REALM(  
            realm_name    => 'Protect HR indexes' 
            ,grantee      => 'HR' 
            ,rule_set_name => null 
            ,auth_options  => dbms_macutl.g_realm_auth_owner);
    END;
    /
  5. 索引の作成、削除および更新を実行できるように、レルム認可の所有者としてDBA (この場合はGKRAMER)を追加します:
    BEGIN
        DVSYS.DBMS_MACADM.ADD_AUTH_TO_REALM(  
            realm_name    => 'Protect HR indexes' 
            ,grantee      => 'GKRAMER' 
            ,rule_set_name => null 
            ,auth_options  => dbms_macutl.g_realm_auth_owner);
    END;
    /