11 レルムおよびコマンド・ルール・アクティビティのログ記録のためのシミュレーション・モードの使用

シミュレーション・モードでは、レルムおよびコマンド・ルールについて実行されるアクティビティがログ・ファイルに書き込まれ、これにはデータ・ディクショナリ・ビューを介してアクセスできます。

11.1 シミュレーション・モードについて

シミュレーション・モードでは、レルムまたはコマンド・ルールの開発フェーズの間にエラーのレコードを取得できます。

シミュレーション・モードでは、簡単に分析できるよう、1つの場所で取得されたエラーが格納されます。シミュレーション・モードを使用するには、レルムまたはコマンド・ルールの作成または更新時に、レルムまたはコマンド・ルールを有効または無効にするのではなく、それをシミュレーション・モードに設定します。レルムまたはコマンド・ルールはまだ有効になっていますが、違反はブロックされず、かわりにシミュレーション・ログ・ファイルに記録されるため、本番環境に対して有効にする前に、潜在的なエラーを見つけるためにテストできます。

たとえば、次のレルム作成文では、シミュレーション・モードが有効になります。

BEGIN
 DBMS_MACADM.CREATE_REALM(
 realm_name    => 'HR Apps',
 description   => 'Realm to protect the HR realm', 
 enabled       => DBMS_MACUTL.G_SIMULATION,
 audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL,
 realm_type    => 1,
 realm_scope   => DBMS_MACUTL.G_SCOPE_LOCAL);
END; 
/

この時点では、レルムまたはコマンド・ルールに違反するSQL文はまだ実行可能ですが、これらのアクティビティはDBA_DV_SIMULATION_LOGデータ・ディクショナリ・ビューに記録されます。たとえば、次の問合せでは、HR Appsレルムに対する違反が検出されます。

SELECT USERNAME, COMMAND, SQLTEXT, VIOLATION_TYPE FROM DBA_DV_SIMULATION_LOG WHERE REALM_NAME = "HR APPS";

USERNAME  COMMAND    SQLTEXT                          VIOLATION_TYPE            
    
--------  ---------- -------------------------------  --------------
DGRANT    SELECT     SELECT SALARY FROM HR.EMPLOYEES; Realm Violation

レルムまたはコマンド・ルールのテストの完了後、DV_ADMINまたはDV_OWNERロールを付与されているユーザーは、このビューDVSYS.SIMULATION_LOG$の基礎となる表の内容を削除することで、.DBA_DV_SIMULATION_LOGデータ・ディクショナリ・ビューをクリアできます。

たとえば:

DELETE FROM DVSYS.SIMULATION_LOG$;

または

DELETE FROM DVSYS.SIMULATION_LOG$ WHERE COMMAND = 'SELECT';

11.2 シミュレーション・モードの使用例

シミュレーション・モードは、新しいレルムおよびコマンド・ルールの開発構成をテストするために役立ちます。

使用例を次に示します。

  • アプリケーション認証

    アプリケーションを認証している場合、アプリケーション・テスト環境で、次のようにシミュレーション・モードを使用できます。

    1. アプリケーションのすべてのスキーマを、シミュレーション・モードが有効になっている必須レルムに配置します。

    2. フル・リグレッション・テストを実行します。

    3. DBA_DV_SIMULATION_LOGデータ・ディクショナリ・ビューを問い合せてこれらのスキーマにアクセスできるユーザーを確認することで、シミュレーション・モード・ログを分析します。

    4. レルムを新しい認可で更新し、レルムを有効にします(つまり、シミュレーション・モードは使用しない)。

    5. リグレッション・テストを再実行します。

  • 新しいコマンド・ルールの導入

    Oracle Database Vaultが有効になっている本番データベースでシミュレーション・モードを使用できます。

    1. 新しいコマンド・ルールを、必要な数週間の間、シミュレーション・モードで本番に配置します。

    2. DBA_DV_SIMULATION_LOGを問い合せて、コマンド・ルールが正しく動作しているかどうかを判断することで、シミュレーション・モード・ログを分析します。

    3. 必要に応じて、コマンド・ルールに変更を加えます。

    4. コマンド・ルールを有効にします。

  • シミュレーション・モードでの本番データベースへの新しいレルムの配置。

    この方法は、ルール・セット内の信頼できるパスのルールを設定し、レルムの認可ユーザーを見つけるために必要な、システム・コンテキスト情報を確認するために役立ちます。

    1. レルムを必須モードで作成し、保護されたオブジェクトを追加します。

    2. 認可ユーザーは追加しないでください。

    3. 使用される通常のIPアドレスからアプリケーションおよび開発操作を実行します。

    4. 両方の認可ユーザーのシミュレーション・ログ・ファイル、および信頼できるパスの作成に使用できるシステム・コンテキスト情報を確認します。

    5. 信頼できるパスを作成してから、認可ユーザーを追加します。

    6. シミュレーション・ログをクリアし、アプリケーションおよび開発操作タスクを再度実行します。

    7. 一定期間の経過後、シミュレーション・ログを確認します。すべての制御が正しく更新された場合、シミュレーション・ログは空になっています。シミュレーション・モードでのログ・エントリには、レルムおよびルール・セットに加える必要がある追加変更が示されます。または、ログ・エントリに、悪意ある使用が示される場合があります。

11.3 チュートリアル: シミュレーション・モードの使用によるレルムに対する違反の追跡

このチュートリアルでは、シミュレーション・モードを使用するレルムを作成してから、レルムに対する違反をテストする方法を示します。

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

このチュートリアルでは、HR.EMPLOYEESスキーマ周りのレルムを作成し、それに対する違反をテストします。

HR.EMPLOYEESスキーマには、従業員の給与などの機密データが含まれています。レルムをテストするために、管理者tjones_dbaは、別の従業員smavrisの給与を参照して変更します。Database Vault管理者leo_dvownerは、シミュレーション・モードを使用して、HR.EMPLOYEESスキーマに対する違反を追跡します。これを達成するために、ユーザーleo_dvownerは、委任された管理者であるユーザーpsmithが所有することになる、Database Vaultポリシーを作成します。ユーザーpsmithは、その後、DV_OWNERロールやDV_ADMINロールを必要とせずに、制限された変更をポリシーに加えることができるようになります。

11.3.2 ステップ1: このチュートリアル用のユーザーの作成

このチュートリアル用に3つのユーザーを作成する必要があります。

各ユーザーは、Database Vaultポリシー所有者であるpsmithHR.EMPLOYEES表での違反をコミットするtjones_dba、給与がtjones_dbaの違反を受けるsmavrisとなります。
  1. DV_ACCTMGRロールを付与されているユーザーとして、データベース・インスタンスにログインします。

    たとえば:

    sqlplus bea_dvacctmgr
    Enter password: password
    

    マルチテナント環境で、適切なプラガブル・データベース(PDB)にログインする必要があります。たとえば:

    CONNECT bea_dvacctmgr@hrpdb
    Enter password: password
    

    利用可能なPDBを検索するには、DBA_PDBSデータ・ディクショナリ・ビューを問い合せます。現在のPDBを確認するには、show con_nameコマンドを実行します。

  2. 次のユーザーを作成し、CREATE SESSION権限を付与します。
    GRANT CREATE SESSION TO psmith IDENTIFIED BY password;
    GRANT CREATE SESSION TO tjones_dba IDENTIFIED BY password;
    GRANT CREATE SESSION TO smavris IDENTIFIED BY password;

    『Oracle Databaseセキュリティ・ガイド』のガイドラインに従って、安全なパスワードでパスワードを置き換えてください。

  3. DV_OWNERロールを付与されたユーザーとして接続します。
    たとえば:
    CONNECT leo_dvowner -- Or, leo_dvowner@hrpdb
    Enter password: password
  4. ユーザーpsmithDV_POLICY_OWNERロールを付与します。これにより、psmithは、Database Vaultポリシーを管理できるようになります。
    GRANT DV_POLICY_OWNER TO psmith;
  5. SYSDBA管理権限を持つユーザーSYSとして接続します。
    CONNECT SYS AS SYSDBA -- Or, CONNECT SYS@hrpdb AS SYSDBA
    Enter password: password
    
  6. DBAロールをユーザーtjones_dbaに付与します。
    GRANT DBA TO tjones_dba;
    
  7. HRスキーマ所有者として接続します。
    CONNECT HR -- Or, HR@hrpdb
    Enter password: password
  8. HR.EMPLOYEES表に対するSELECT権限をユーザーsmavrisに付与します。
    GRANT SELECT ON HR.EMPLOYEES TO smavris;
    
この段階で、ユーザーはすべて、適切な権限を作成および付与されています。

11.3.3 ステップ2: レルムおよびOracle Database Vaultポリシーの作成

次に、HR.EMPLOYEES表周りのレルムを作成し、このレルムをOracle Database Vaultポリシーに追加します。

  1. DV_OWNERロールを付与されたユーザーとして接続します。

    たとえば:

    CONNECT leo_dvowner -- Or, leo_dvowner@hrpdb
    Enter password: password
  2. 次のように、HR.EMPLOYEES表周りのレルムを作成します。

    これらのプロシージャは、HR.EMPLOYEES_realmレルムを作成し、HR.EMPLOYEES表をこのレルムに追加し、HRを所有者として認証し、ユーザーpsmithを参加者として認証します。

    BEGIN
     DBMS_MACADM.CREATE_REALM(
      realm_name    => 'HR.EMPLOYEES_realm', 
      description   => 'Realm to protect HR.EMPLOYEES', 
      enabled       => DBMS_MACUTL.G_SIMULATION, 
      audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL,
      realm_type    => 0);
    END; 
    /
    
    BEGIN
     DBMS_MACADM.ADD_OBJECT_TO_REALM(
      realm_name   => 'HR.EMPLOYEES_realm', 
      object_owner => 'HR', 
      object_name  => 'EMPLOYEES', 
      object_type  => 'TABLE'); 
    END;
    /
    
    
  3. HR.EMPLOYEES_pol Database Vaultポリシーを作成し、シミュレーション・モードになるよう設定します。

    これらのプロシージャは、HR.EMPLOYEES_polポリシーを作成し、たった今作成したレルムをポリシーに追加してから、ユーザーpsmithをポリシーの所有者として追加します。

    BEGIN
     DBMS_MACADM.CREATE_POLICY(
      policy_name  => 'HR.EMPLOYEES_pol',
      description  => 'Policy to protect HR.EMPLOYEES',
      policy_state => DBMS_MACADM.G_SIMULATION);
    END;
    /
    
    BEGIN
     DBMS_MACADM.ADD_REALM_TO_POLICY(
      policy_name  => 'HR.EMPLOYEES_pol',
      realm_name   => 'HR.EMPLOYEES_realm');
    END;
    /
    
    BEGIN
     DBMS_MACADM.ADD_OWNER_TO_POLICY(
      policy_name  => 'HR.EMPLOYEES_pol',
      owner_name   => 'PSMITH');
    END;
    /
    
この時点では、レルムおよびポリシーはテストを受ける準備ができています。

11.3.4 ステップ3: レルムおよびポリシーのテスト

ユーザーtjones_dbaがレルムに対して違反をコミットし、レルムおよびポリシーをテストします。

  1. ユーザーtjones_dbaとして接続します。
    CONNECT tjones_dba -- Or, tjones_dba@hrpdb
    Enter password: password
  2. HR.EMPLOYEES表にsmavrisの給与を問い合せます。
    SELECT SALARY FROM HR.EMPLOYEES WHERE EMAIL = 'SMAVRIS';

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

        SALARY
    ----------
          6500
    
    
  3. smavrisの給与を半分に減らします。
    UPDATE HR.EMPLOYEES
    SET SALARY = SALARY / 2
    WHERE EMAIL = 'SMAVRIS';
    
    1 row updated.
  4. ユーザーsmavrisとして接続します。
    CONNECT smavris -- Or, smavris@hrpdb
  5. smavrisの給与を問い合せます。
    SELECT SALARY FROM HR.EMPLOYEES WHERE EMAIL = 'SMAVRIS';

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

        SALARY
    ----------
          3250
    
この時点では、tjones_dbaの違反は、DBA_DV_SIMULATION_LOGデータ・ディクショナリ・ビューに記録されています。

11.3.5 ステップ4: DBA_DV_SIMULATION_LOGビューでの違反の問合せ

これで、ユーザーtjones_dbaが犯した違反のシミュレーション・モード・ログを確認できるようになります。

  1. DV_OWNERロールを付与されたユーザーとして接続します。
    たとえば:
    CONNECT leo_dvowner -- Or, leo_dvowner@hrpdb
    Enter password: password
  2. DBA_DV_SIMULATION_LOGデータ・ディクショナリ・ビューを問い合せます。
    SELECT USERNAME, SQLTEXT, VIOLATION_TYPE FROM (
    SELECT T1.*, T2.COLUMN_VALUE AS REALM
    FROM DVSYS.DBA_DV_SIMULATION_LOG T1, TABLE(T1.REALM_NAME) T2
    ) WHERE REALM = 'HR.EMPLOYEES_realm';
    

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

    USERNAME
    --------------------------------------------------------------------------------
    SQLTEXT
    --------------------------------------------------------------------------------
    VIOLATION_TYPE
    --------------------------------------------------------------------------------
    TJONES_DBA
    SELECT SALARY FROM HR.EMPLOYEES WHERE EMAIL = 'SMAVRIS'
    Realm Violation
    
    TJONES_DBA
    UPDATE HR.EMPLOYEES SET SALARY = SALARY / 2 WHERE EMAIL = 'SMAVRIS'
    Realm Violation
    
出力に、ユーザーtjones_dbaが2つの違反をコミットしたことが示されます。まず、別の従業員の給与を参照し、それのみでなく、半分に減らしました。違反タイプはレルム違反です。自分の給与の参照は正当であるため、smavrisによる問合せは取得されませんでした。

11.3.6 ステップ5: レルムの有効化および再テスト

違反を取得したので、ユーザーpsmithは、HR.EMPLOYEES_polポリシーを更新できます。

これは、HR.EMPLOYEES_realmレルムを有効化できるようにするためです。その後、もう一度違反をテストできます。
  1. ユーザーpsmithとして接続します。
    CONNECT psmith -- Or, psmith@hrpdb
    Enter password: password
  2. ポリシーを有効になるよう更新します。
    BEGIN
     DBMS_MACADM.UPDATE_POLICY_STATE(
      policy_name   => 'HR.EMPLOYEES_pol',
      policy_state  => 1);
    END;
    /
  3. ユーザーtjones_dbaとして接続します。
    CONNECT tjones_dba --Or, tjones_dba@hrpdb
  4. smavrisの給与をさらに低く減らすことを試みます。
    UPDATE HR.EMPLOYEES
    SET SALARY = SALARY / 2
    WHERE EMAIL = 'SMAVRIS';

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

    ERROR at line 1:
    ORA-01031: insufficient privileges
    
    
    ポリシー(現在は有効になっている)により、レルムでHR.EMPLOYEES表を保護できます。smavrisの給与は、これ以上減らせません。

11.3.7 ステップ6: このチュートリアルのコンポーネントの削除

コンポーネントが不要になった場合、このチュートリアルで作成したコンポーネントを削除できます。

  1. DV_OWNERロールを付与されたユーザーとして接続します。
    たとえば:
    CONNECT leo_dvowner -- Or, leo_dvowner@hrpdb
    Enter password: password
  2. HR.EMPLOYEES_pol Database Vaultポリシーを削除します。
    EXEC DBMS_MACADM.DROP_POLICY('HR.EMPLOYEES_pol');
    まずポリシーを削除してからでないと、その内容を削除できません。
  3. HR.EMPLOYEES_realmレルムを削除します。
    EXEC DBMS_MACADM.DELETE_REALM('HR.EMPLOYEES_realm');
  4. 累積されたシミュレーション・モード・ログ・データを削除します。

    シミュレーション・モード・ログではユーザーtjones_dbaに関する情報のみが取得されるため、このユーザーに関連する行のみを削除できます。

    DELETE FROM DVSYS.SIMULATION_LOG$ WHERE USERNAME = 'TJONES_DBA';
  5. ユーザーHRとして接続します。
    CONNECT HR -- Or, CONNECT HR@hrpdb
    Enter password: password
  6. smavrisの給与をその違反前の状態に戻します。
    UPDATE HR.EMPLOYEES
    SET SALARY = 6500
    WHERE EMAIL = 'SMAVRIS';
  7. DV_ACCTMGRロールを付与されているユーザーとして接続します。

    たとえば:

    CONNECT bea_dvacctmgr -- Or, bea_dvacctmgr@hrpdb
    Enter password: password
    
  8. ユーザーpsmithsmavrisおよびtjones_dbaを削除します。
    DROP USER psmith;
    DROP USER smavris;
    DROP USER tjones_dba;