演習: ローカル・ユーザーによる共通操作のブロックの防止 - コマンド・ルール

この演習では、共通ユーザーが自分のオブジェクトに対してコマンドを実行したりそのオブジェクトが存在するPDBにログインすることさえ妨げるOracle Database Vaultコントロールを、ローカル・ユーザーが共通ユーザーに対して作成できないようにする方法を示します。

  1. 新しい演習を開始する前に、演習の環境の推奨事項を参照してください。
  2. 演習を開始する前に、/home/oracle/labs/M104781GC10/setup_DV_CR.shシェル・スクリプトを実行します。このシェル・スクリプトでは、CDBルート・レベルおよびPDBレベルでDatabase Vaultを構成して有効にし、共通ユーザーC##TEST1およびC##TEST2を作成します。
    $ cd /home/oracle/labs/M104781GC10
    $ /home/oracle/labs/M104781GC10/setup_DV_CR.sh
    SQL*Plus: Release 20.0.0.0.0 - Production on Wed Feb 19 05:38:54 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2020, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> drop user c##sec_admin cascade;
    drop user c##sec_admin cascade
              *
    ERROR at line 1:
    ORA-01918: user 'C##SEC_ADMIN' does not exist
    
    
    SQL> create user c##sec_admin identified by password container=ALL;
    
    User created.
    
    SQL> grant create session, set container, restricted session, DV_OWNER to c##sec_admin container=ALL;
    
    Grant succeeded.
    
    SQL> drop user c##accts_admin cascade;
    drop user c##accts_admin cascade
              *
    ERROR at line 1:
    ORA-01918: user 'C##ACCTS_ADMIN' does not exist
    
    
    SQL> create user c##accts_admin identified by password container=ALL;
    
    User created.
    
    SQL> grant create session, set container, DV_ACCTMGR to c##accts_admin container=ALL;
    
    Grant succeeded.
    
    SQL> grant select on sys.dba_dv_status to c##accts_admin container=ALL;
    
    Grant succeeded.
    
    SQL> EXIT
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    ...
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL*Plus: Release 20.0.0.0.0 - Production on Wed Feb 19 11:14:29 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2020, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> GRANT dba to c##test1 CONTAINER=ALL;
    
    Grant succeeded.
    
    ...
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> DROP TABLE l_tab;
    
    Table dropped.
    
    SQL> CREATE TABLE l_tab(code NUMBER);
    
    Table created.
    
    SQL> INSERT INTO l_tab values(1);
    
    1 row created.
    
    SQL> INSERT INTO l_tab values(2);
    
    1 row created.
    
    SQL> COMMIT;
    
    Commit complete.
    
    SQL> EXIT
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    $
  3. C##SEC_ADMINとしてCDBルートに接続し、DV_ALLOW_COMMON_OPERATIONのステータスを確認します。これはデフォルトの動作で、ローカル・ユーザーはコマンド・ルールなどのDatabase Vaultコントロールを共通ユーザーに対して作成できます。
    $ sqlplus c##sec_admin
    SQL*Plus: Release 20.0.0.0.0 - Production on Mon Mar 9 12:18:01 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2020, Oracle.  All rights reserved.
    
    Last Successful login time: Mon Mar 09 2020 12:16:12 +00:00
    Enter password: password
    
    SQL> SELECT * FROM DVSYS.DBA_DV_COMMON_OPERATION_STATUS;
    
    NAME                      STATU
    ------------------------- -----
    DV_ALLOW_COMMON_OPERATION FALSE
    
    SQL>

    ステータスがTRUEに設定されている場合は、次のコマンドを使用してFALSEに設定します。

    SQL> EXEC DBMS_MACADM.ALLOW_COMMON_OPERATION (FALSE)
    
    PL/SQL procedure successfully completed.
    
    SQL> SELECT * FROM DVSYS.DBA_DV_COMMON_OPERATION_STATUS;
    
    NAME                      STATU
    ------------------------- -----
    DV_ALLOW_COMMON_OPERATION FALSE
    
    SQL>
  4. 共通ユーザーC##TEST1にコマンド・ルールが適用されていない場合に、共通ユーザーC##TEST1がCDBルートおよびPDB20に接続できるかどうかをテストします。
    1. C##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      Connected.
      SQL>
    2. C##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL>
  5. CDBルートの共通ユーザーC##TEST1にコマンド・ルールが適用されている場合に、共通ユーザーC##TEST1がCDBルートおよびPDB20に接続できるかどうかをテストします。
    1. CDBルートのC##TEST1に対してコマンド・ルールを作成します。
      SQL> CONNECT c##sec_admin
      Enter password: password
      Connected.
      SQL> BEGIN
       DBMS_MACADM.CREATE_CONNECT_COMMAND_RULE(
        rule_set_name   => 'Disabled',
        user_name       => 'C##TEST1',
        enabled         => 'y',
        scope           => DBMS_MACUTL.G_SCOPE_LOCAL);
      END;
      /  2    3    4    5    6    7    8
      
      PL/SQL procedure successfully completed.
      
      SQL>
    2. C##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      ERROR:
      ORA-47400: Command Rule violation for CONNECT on LOGON
      
      Warning: You are no longer connected to ORACLE.
      SQL> !oerr ora 47400
      47400, 00000, "Command Rule violation for %s on %s"
      // *Cause: An operation that was attempted failed due to a command rule
      //         violation
      // *Action: Ensure you have sufficient privileges for this operation retry
      //          the operation
      
      SQL> 
    3. C##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL>
    4. コマンド・ルールを削除します。
      SQL> CONNECT c##sec_admin
      Enter password: password
      Connected.
      SQL> EXEC DBMS_MACADM.DELETE_CONNECT_COMMAND_RULE('C##TEST1',DBMS_MACUTL.G_SCOPE_LOCAL)
      
      PL/SQL procedure successfully completed.
      
      SQL>
  6. PDB20の共通ユーザーC##TEST1にコマンド・ルールが適用されている場合に、共通ユーザーC##TEST1がCDBルートおよびPDB20に接続できるかどうかをテストします。
    1. PDB20C##TEST1に対してコマンド・ルールを作成します。
      SQL> CONNECT sec_admin@PDB20
      Enter password: password
      Connected.
      SQL> BEGIN
       DBMS_MACADM.CREATE_CONNECT_COMMAND_RULE(
        rule_set_name   => 'Disabled',
        user_name       => 'C##TEST1',
        enabled         => 'y',
        scope           => DBMS_MACUTL.G_SCOPE_LOCAL);
      END;
      /  2    3    4    5    6    7    8
      
      PL/SQL procedure successfully completed.
      
      SQL>
    2. C##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      Connected.
      SQL> 
    3. C##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      ERROR:
      ORA-47400: Command Rule violation for CONNECT on LOGON
      
      Warning: You are no longer connected to ORACLE.
      
      SQL>
    4. コマンド・ルールを削除します。
      SQL> CONNECT sec_admin@PDB20
      Enter password: password
      Connected.
      SQL> EXEC DBMS_MACADM.DELETE_CONNECT_COMMAND_RULE('C##TEST1',DBMS_MACUTL.G_SCOPE_LOCAL)
      
      PL/SQL procedure successfully completed.
      
      SQL>
  7. C##SEC_ADMINとしてCDBルートに接続し、共通ユーザーが自分のオブジェクトが存在するPDBにログインするのを妨げるOracle Database Vaultコントロールを、ローカル・ユーザーが共通ユーザーに対して作成できないようにします。DV_ALLOW_COMMON_OPERATIONTRUEに設定します。
    SQL CONNECT c##sec_admin
    Enter password: password
    
    SQL> SELECT * FROM DVSYS.DBA_DV_COMMON_OPERATION_STATUS;
    
    NAME                      STATU
    ------------------------- -----
    DV_ALLOW_COMMON_OPERATION FALSE
    
    SQL> EXEC DBMS_MACADM.ALLOW_COMMON_OPERATION
    
    PL/SQL procedure successfully completed.
    
    SQL> SELECT * FROM DVSYS.DBA_DV_COMMON_OPERATION_STATUS;
    
    NAME                      STATU
    ------------------------- -----
    DV_ALLOW_COMMON_OPERATION TRUE
    
    SQL>

    パラメータを指定せずにこのプロシージャを実行してTRUEの結果を実現することもできます。

  8. CDBルートの共通ユーザーC##TEST1にコマンド・ルールが適用されている場合に、共通ユーザーC##TEST1がCDBルートおよびPDB20に接続できるかどうかをテストします。
    1. CDBルートのC##TEST1に対してコマンド・ルールを作成します。
      SQL> BEGIN
       DBMS_MACADM.CREATE_CONNECT_COMMAND_RULE(
        rule_set_name   => 'Disabled',
        user_name       => 'C##TEST1',
        enabled         => 'y',
        scope           => DBMS_MACUTL.G_SCOPE_LOCAL);
      END;
      /  2    3    4    5    6    7    8
      
      PL/SQL procedure successfully completed.
      
      SQL>
    2. C##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      ERROR:
      ORA-47400: Command Rule violation for CONNECT on LOGON
      
      Warning: You are no longer connected to ORACLE.
      SQL> !oerr ora 47400
      47400, 00000, "Command Rule violation for %s on %s"
      // *Cause: An operation that was attempted failed due to a command rule
      //         violation
      // *Action: Ensure you have sufficient privileges for this operation retry
      //          the operation
      
      SQL> 
    3. C##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL>
    4. コマンド・ルールを削除します。
      SQL> CONNECT c##sec_admin
      Enter password: password
      Connected.
      SQL> EXEC DBMS_MACADM.DELETE_CONNECT_COMMAND_RULE('C##TEST1',DBMS_MACUTL.G_SCOPE_LOCAL)
      
      PL/SQL procedure successfully completed.
      
      SQL>
  9. PDB20の共通ユーザーC##TEST1にコマンド・ルールが適用されている場合に、共通ユーザーC##TEST1がCDBルートおよびPDB20に接続できるかどうかをテストします。
    1. PDB20C##TEST1に対してコマンド・ルールを作成します。
      SQL> CONNECT sec_admin@PDB20
      Enter password: password
      Connected.
      SQL> BEGIN
       DBMS_MACADM.CREATE_CONNECT_COMMAND_RULE(
        rule_set_name   => 'Disabled',
        user_name       => 'C##TEST1',
        enabled         => 'y',
        scope           => DBMS_MACUTL.G_SCOPE_LOCAL);
      END;
      /  2    3    4    5    6    7    8
      BEGIN
      *
      ERROR at line 1:
      ORA-47110: cannot create command rules for C##TEST1.%
      ORA-06512: at "DVSYS.DBMS_MACADM", line 1872
      ORA-06512: at "DVSYS.DBMS_MACADM", line 2263
      ORA-06512: at line 2
      
      SQL> !oerr ORA 47110
      47110, 00000, "cannot create command rules for %s.%s"
      // *Cause: When ALLOW COMMON OPERATION was set to TRUE, a smaller scope user was not allowed to create command rules on a larger scope user's object.
      // *Action: When ALLOW COMMON OPERATION is TRUE, do not create command rules on a larger scope user's object.
      
      SQL>
    2. C##TEST1としてCDBルートに接続します。
      SQL> CONNECT c##test1
      Enter password: password
      Connected.
      SQL> 
    3. C##TEST1としてPDB20に接続します。
      SQL> CONNECT c##test1@PDB20
      Enter password: password
      Connected.
      SQL> EXIT
      $
  10. PDBとCDBルートの両方でDatabase Vaultを無効にします。
    $ /home/oracle/labs/M104781GC10/disable_DV.sh
    SQL*Plus: Release 20.0.0.0.0 - Production on Mon Apr 6 15:25:59 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle.  All rights reserved.
    
    Last Successful login time: Mon Apr 06 2020 15:23:56 +00:00
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> exec DVSYS.DBMS_MACADM.DISABLE_DV
    
    PL/SQL procedure successfully completed.
    
    SQL> exit
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL*Plus: Release 20.0.0.0.0 - Production on Mon Apr 6 15:26:00 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle.  All rights reserved.
    
    Last Successful login time: Mon Apr 06 2020 15:23:58 +00:00
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> exec DVSYS.DBMS_MACADM.DISABLE_DV
    
    PL/SQL procedure successfully completed.
    
    SQL> exit
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL*Plus: Release 20.0.0.0.0 - Production on Mon Apr 6 15:26:02 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> exit
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL*Plus: Release 20.0.0.0.0 - Production on Mon Apr 6 15:26:23 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle.  All rights reserved.
    
    Connected to an idle instance.
    
    SQL> STARTUP
    ORACLE instance started.
    
    Total System Global Area 6442447392 bytes
    Fixed Size                  9581088 bytes
    Variable Size            1090519040 bytes
    Database Buffers         5318377472 bytes
    Redo Buffers               23969792 bytes
    Database mounted.
    Database opened.
    SQL> ALTER PLUGGABLE DATABASE all OPEN;
    
    Pluggable database altered.
    
    SQL> exit
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    $

DBMS_MACADM.ALLOW_COMMON_OPERATIONTRUEに設定されると、Database Vaultによって不適切なコマンド・ルールの作成がブロックされるだけでなく、DBMS_MACADM.ALLOW_COMMON_OPERATIONFALSEに設定されたときに作成された既存のローカル・コマンド・ルールが制御下に入ります。既存のローカル・コマンド・ルールは引き続き存在しますが、強制は無視されます。