5 コマンド・ルール

コマンド・ルールは、1つ以上のデータベース・オブジェクトに影響するOracle Database SQL文を保護します。これらの文は、SELECTALTER SYSTEM、データベース定義言語(DDL)およびデータ操作言語(DML)文を含められます。コマンド・ルールをカスタマイズして実行するには、1つ以上のルールの集合であるルール・セットにコマンド・ルールを関連付けます。コマンド・ルールは実行時に実施されます。コマンド・ルールは、オブジェクトが存在するレルムに関係なく、コマンド・ルールによって保護されるSQL文の使用を試みる全員に影響します。

5.1 破壊的なアクションを防止するコマンド・ルールの作成

コマンド・ルールの作成はオプションですが、悪意のあるアクティビティや特権ユーザーによるミスからデータベース・オブジェクトやデータを保護するのに役立ちます。コマンド・ルールによって、TRUNCATETABLEDROP INDEXDROP PROCEDUREなどの破壊的なコマンドを防止できます。

たとえば、HRスキーマが表を削除しないようにします:

  1. C##JSMITHとして接続します:
    connect c##jsmith
  2. HRDROP TABLE機能を無効にします:
    BEGIN
        DVSYS.DBMS_MACADM.CREATE_COMMAND_RULE(  
            command        => 'DROP TABLE' 
            ,object_owner  => 'HR' 
            ,object_name   => '%' 
            ,rule_set_name => 'Disabled' 
            ,enabled       => dbms_macutl.g_yes);
    END;
    /

    このコマンド・ルールの結果、HRスキーマ・オブジェクトに対してDROP TABLEコマンドを実行するすべてのユーザーは、Database Vaultコマンド・ルールに違反しているとみなされます。これは、ルール・セットでコマンドがDisabledに指定されているためです。

    Disabledルール・セットの結果は常にfalseを返すため、コマンド・ルールでは、HRデータベース・スキーマ自体を含むすべてのデータベース・ユーザーのHRスキーマに対するDROP TABLEコマンドが無効になります。

    Database Vaultコマンド・ルールもルール・セットも無効ではないため、Disabledというrule_set_nameはわかりにくいように見える場合があります。かわりに、Disabledルール・セットには、常にfalseを返すルール式を含むルールが含まれ、そのルール・セットに関連付けられたコマンドの実行は許可されません。

    ルール式のSQLは、次のものを使用して表示できます:
    select rule_name, rule_expr from dba_dv_rule_set_rule where rule_set_name = 'Disabled';
    次の出力が表示されます。
    RULE_NAME            RULE_EXPR
    -------------------- --------------------
    False                1=0

    すべての状況でHRスキーマのDROP TABLEコマンドを無効にしない場合は、カスタムDatabase Vaultルール・セットを使用して、コマンドを使用できるタイミングを識別できます。

  3. コマンド・ルールをシミュレーション・モードに切り替える場合は、強制ではなく、ENABLEDパラメータをDBMS_MACUTL.G_YESではなくDBMS_MACUTL.G_SIMULATIONに設定します:
    BEGIN
        DVSYS.DBMS_MACADM.UPDATE_COMMAND_RULE(  
            command        => 'DROP TABLE' 
            ,object_owner  => 'HR' 
            ,object_name   => '%' 
            ,rule_set_name => 'Disabled' 
            ,enabled       => dbms_macutl.g_simulation);
    END;
    /

    シミュレーション(非強制)モード: Oracle Database Vaultシミュレーション・モードでは、Oracle Database Vaultレルムで保護するデータにアクセスしているユーザーを特定できます。Database Vaultレルム認可リストの違反のみが記録されます。

  4. コマンド・ルールに違反したユーザーを特定するには、DVSYS.DBA_DV_SIMULATION_LOGビューを問い合せます。
    select username, command, violation_type, sqltext from DVSYS.DBA_DV_SIMULATION_LOG;

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

5.2 指定したIPアドレスからのみアクションを許可するコマンド・ルールの作成

特定のコマンドを限定されたIPアドレスから実行できるようにするコマンド・ルールを作成できます。

たとえば、承認されたIPアドレスからコマンドを実行する場合にのみ表を削除するHRスキーマは、次のとおりです:

  1. C##JSMITHとして接続します:
    connect c##jsmith
  2. 受入れ基準を満たすルールを作成します:
    BEGIN
        DBMS_MACADM.CREATE_RULE( 
            rule_name  => 'Trusted IP Address'
            ,rule_expr => 'sys_context(''userenv'',''ip_address'') = ''<IP Address>'' ');
    END;
    /

    ルールは、接続ユーザーのセッションのIPアドレスがルール式のIPアドレスと等しい場合にのみ、TRUEを返します。これは、INリストまたは「等しくない」リストです。ホスト名またはホスト名の一部を比較できます。

  3. ルール・セットの作成:
    BEGIN
        DVSYS.DBMS_MACADM.CREATE_RULE_SET( 
            rule_set_name    => 'Trusted Rule Set' 
            ,description     => 'A rule set for controlling access by IP address' 
            ,enabled         => 'Y' 
            ,eval_options    => dbms_macutl.g_ruleset_eval_any 
            ,audit_options   => null 
            ,fail_options    => dbms_macutl.g_ruleset_fail_show 
            ,fail_message    => 'Access is blocked. Contact the IT helpdesk.' 
            ,fail_code       => '-20000' 
            ,handler_options => dbms_macutl.g_ruleset_handler_off 
            ,handler         => null 
            ,is_static       => true);
    END;
    /

    ルール・セットには、一般的なエラー・メッセージまたはカスタム・エラー・メッセージを返すオプションがあります。次の例では、エンド・ユーザーに、セキュリティ・チームに確認するように指示する詳細なエラー・メッセージを提供します。

  4. ルール・セットにステップ2のルールを追加します:
    BEGIN
        DVSYS.DBMS_MACADM.ADD_RULE_TO_RULE_SET(  
            rule_set_name  => 'Trusted Rule Set' 
            ,rule_name     => 'Trusted IP Address');
    END;
    /

    ルール・セットは、すべてを満たす(true)か、少なくとも1つのルールがtrueである必要がある複数のルールで構成できます。ルールは複数のルール・セットで使用できます。ただし、ルールを変更すると、そのルールが使用されているすべてのルール・セットに変更が適用されます。

  5. 既存のコマンド・ルールを更新して、新しいルール・セットを使用します:
    BEGIN
        DVSYS.DBMS_MACADM.UPDATE_COMMAND_RULE(  
            command        => 'DROP TABLE' 
            ,object_owner  => 'HR' 
            ,object_name   => '%' 
            ,rule_set_name => 'Trusted Rule Set' 
            ,enabled       => dbms_macutl.g_yes);
    END;
    /

5.3 アプリケーション認証を制御するコマンド・ルールの作成

アプリケーション資格証明の使用方法を制御するDatabase Vaultコマンド・ルールを作成して、データベース・アプリケーション資格証明の盗難または誤用によるリスクを最小限に抑えます。

アプリケーション資格証明の盗難は、組織のデータに対する最大のリスクの1つです。アプリケーション資格証明は、構成ファイルまたはスクリプトに格納されることが多く、開発者や管理者によって頻繁に認識されるため、これらの資格証明を使用して個人を特定することは困難です。

C##JSMITHとして、HRアプリケーション・スキーマがOracle Databaseに接続する方法を制限するDatabase Vaultルール、ルール・セットおよびコマンド・ルールを作成します。

  1. C##JSMITHとして接続します:
    connect c##jsmith@pdb_name
  2. 次の4つのルールを作成します:
    BEGIN
        DBMS_MACADM.CREATE_RULE( 
            rule_name  => 'Trusted Application IP Address'
            ,rule_expr => 'sys_context(''userenv'',''ip_address'') = ''<IP Address>'' ');
    END;
    /
    BEGIN
        DBMS_MACADM.CREATE_RULE( 
            rule_name  => 'Trusted Application Hostname'
            ,rule_expr => 'sys_context(''userenv'',''host'') = ''appserver'' ');
    END;
    /
    BEGIN
        DBMS_MACADM.CREATE_RULE( 
            rule_name  => 'Trusted Application OS USer'
            ,rule_expr => 'sys_context(''userenv'',''os_user'') = ''appuser'' ');
    END;
    /
    BEGIN
        DBMS_MACADM.CREATE_RULE( 
            rule_name  => 'Trusted Application Program'
            ,rule_expr => 'sys_context(''userenv'',''client_program_name'') = ''<client program name>'' ');
    END;
    /
  3. ルール・セットを作成します:
    BEGIN
        DVSYS.DBMS_MACADM.CREATE_RULE_SET( 
            rule_set_name    => 'Trusted Application Path' 
            ,description     => 'Controlling access to the application' 
            ,enabled         => 'Y' 
            ,eval_options    => dbms_macutl.g_ruleset_eval_all 
            ,audit_options   => null 
            ,fail_options    => dbms_macutl.g_ruleset_fail_show 
            ,fail_message    => 'Unauthorized application usage. Contact the IT helpdesk.' 
            ,fail_code       => '-20000' 
            ,handler_options => dbms_macutl.g_ruleset_handler_off 
            ,handler         => null 
            ,is_static       => true);
    END;
    /

    EVAL_OPTIONSパラメータをALLに設定すると、このルール・セットがtrueと評価されるために、すべてのルールがtrueと評価される必要があります。

  4. ステップの各ルールをルール・セットに追加します:
    • BEGIN
          DVSYS.DBMS_MACADM.ADD_RULE_TO_RULE_SET(  
              rule_set_name  => 'Trusted Application Path' 
              ,rule_name     => 'Trusted Application IP Address');
      END;
      /
    • BEGIN
          DVSYS.DBMS_MACADM.ADD_RULE_TO_RULE_SET(  
              rule_set_name  => 'Trusted Application Path' 
              ,rule_name     => 'Trusted Application Hostname');
      END;
      /
    • BEGIN
          DVSYS.DBMS_MACADM.ADD_RULE_TO_RULE_SET(  
              rule_set_name  => 'Trusted Application Path' 
              ,rule_name     => 'Trusted Application OS User');
      END;
      /
    • BEGIN
          DVSYS.DBMS_MACADM.ADD_RULE_TO_RULE_SET(  
              rule_set_name  => 'Trusted Application Path' 
              ,rule_name     => 'Trusted Application Program);
      END;
      /
  5. HRが接続を試行したときに信頼できるアプリケーション・パス・ルール・セットを評価するコマンド・ルールを作成します:
    BEGIN
        DVSYS.DBMS_MACADM.CREATE_CONNECT_COMMAND_RULE(  
            user_name      => 'HR' 
            ,rule_set_name => 'Trusted Application Path' 
            ,enabled       => dbms_macutl.g_yes);
    END;
    /
  6. HRとして接続を試行します:
    connect hr@pdb_name

    次のカスタム・エラー・メッセージが表示されます:

    ORA-47306: 20000: Unauthorized application usage. Contact the IT helpdesk.
  7. 作成したコマンド・ルールを無効にして、このガイドの他の例を続行します:
    1. C##JSMITHとして接続します:
      connect c##jsmith@pdb_name
    2. コマンドを無効にします:
      BEGIN
          DVSYS.DBMS_MACADM.UPDATE_CONNECT_COMMAND_RULE(  
              user_name      => 'HR' 
              ,rule_set_name => 'Trusted Application Path' 
              ,enabled       => dbms_macutl.g_no);
      END;
      /
    3. 接続のコマンド・ルールが無効になっていることを確認します:
      SELECT ENABLED FROM DBA_DV_COMMAND_RULE WHERE COMMAND = 'CONNECT' AND OBJECT_OWNER = 'HR';
      次のように表示されます:
      ENABLED
      __________
      N