Oracle LiveLabs实验:DB Security - Database Vault

2024-01-04 18:59

本文主要是介绍Oracle LiveLabs实验:DB Security - Database Vault,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

此实验申请地址在这里,时间为45分钟。

本实验也是DB Security Advanced研讨会的的第6个实验,即Lab 8。

实验帮助在这里。

本实验使用的数据库为19.13。

也推荐看一下这个实验Oracle Database Vault on an Autonomous Database,有简明的过程,特别是有创建用户的过程。

Introduction

本研讨会介绍了 Oracle Database Vault (DV) 的各种特性和功能。 它使用户有机会学习如何配置这些功能,以防止未经授权的特权用户访问敏感数据。

Task 1: Enable Database Vault

进入实验目录:

sudo su - oracle
cd $DBSEC_LABS/database-vault

首先在容器数据库 cdb1 中启用 Database Vault:

./dv_enable_on_cdb.sh

实际执行的命令和输出为:

==============================================================================Configure and Enable Database Vault for the container database CDB...
==============================================================================CON_NAME
------------------------------
CDB$ROOT-- . Show the DB Vault status
SQL> select * from dba_dv_status;NAME                      STATUS
------------------------- --------------------
DV_APP_PROTECTION         NOT CONFIGURED
DV_CONFIGURE_STATUS       FALSE
DV_ENABLE_STATUS          FALSESQL> select a.name pdb_name, a.open_mode, b.name, b.statusfrom v$pdbs a, cdb_dv_status bwhere a.con_id = b.con_idorder by 1,2;PDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB1                 READ WRITE           DV_APP_PROTECTION         NOT CONFIGUREDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB2                 READ WRITE           DV_APP_PROTECTION         NOT CONFIGUREDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSE6 rows selected.-- . Configure DB Vault
SQL> 
BEGINDVSYS.CONFIGURE_DV (dvowner_uname         => 'C##DVOWNER',dvacctmgr_uname       => 'c##DVACCTMGR');END;
/PL/SQL procedure successfully completed.-- . Enable DB VaultCON_NAME
------------------------------
CDB$ROOT
USER is "C##DVOWNER"SQL> exec dvsys.dbms_macadm.enable_dv;
PL/SQL procedure successfully completed.. Reboot the DatabaseCON_NAME
------------------------------
CDB$ROOT
Database closed.
Database dismounted.
ORACLE instance shut down.
ORACLE instance started.Total System Global Area 3674209872 bytes
Fixed Size                  9141840 bytes
Variable Size            1996488704 bytes
Database Buffers         1660944384 bytes
Redo Buffers                7634944 bytes
Database mounted.
Database opened.-- . Show the DB Vault status
SQL> select * from dba_dv_status;NAME                      STATUS
------------------------- --------------------
DV_APP_PROTECTION         NOT CONFIGURED
DV_CONFIGURE_STATUS       TRUE
DV_ENABLE_STATUS          TRUESQL> select a.name pdb_name, a.open_mode, b.name, b.statusfrom v$pdbs a, cdb_dv_status bwhere a.con_id = b.con_idorder by 1,2;PDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB1                 READ WRITE           DV_APP_PROTECTION         NOT CONFIGUREDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB2                 READ WRITE           DV_APP_PROTECTION         NOT CONFIGUREDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSE6 rows selected.

接下来,在可插拔数据库上启用它。 目前,仅在 pdb1 上启用它:

./dv_enable_on_pdb.sh pdb1

此命令和上一个类似,只是连接到PDB中执行而已。输出为:

==============================================================================Configure and Enable Database Vault for the pluggable database ...
==============================================================================CON_NAME
------------------------------
CDB$ROOT. Show the DB Vault statusNAME                      STATUS
------------------------- --------------------
DV_APP_PROTECTION         NOT CONFIGURED
DV_CONFIGURE_STATUS       TRUE
DV_ENABLE_STATUS          TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB1                 READ WRITE           DV_APP_PROTECTION         NOT CONFIGUREDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB2                 READ WRITE           DV_APP_PROTECTION         NOT CONFIGUREDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSE6 rows selected.. Connect to the pluggable database pdb1Session altered.CON_NAME
------------------------------
PDB1. Configure DB VaultPL/SQL procedure successfully completed.. Enable DB Vault
USER is "C##DVOWNER"PL/SQL procedure successfully completed.. Reboot the pluggable databaseCON_NAME
------------------------------
CDB$ROOTPluggable database altered.Pluggable database altered.. Show the DB Vault statusNAME                      STATUS
------------------------- --------------------
DV_APP_PROTECTION         NOT CONFIGURED
DV_CONFIGURE_STATUS       TRUE
DV_ENABLE_STATUS          TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB1                 READ WRITE           DV_APP_PROTECTION         NOT CONFIGUREDREAD WRITE           DV_ENABLE_STATUS          TRUEREAD WRITE           DV_CONFIGURE_STATUS       TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB2                 READ WRITE           DV_APP_PROTECTION         NOT CONFIGUREDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSE6 rows selected.

现在,在容器数据库和 pdb1 中启用了 Database Vault!

Task 2: Create a Simple Realm

在浏览器中启动Web应用:

  • URL:http://<YOUR_DBSEC-LAB_VM_PUBLIC_IP>:8080/hr_prod_pdb1
  • 用户名和口令:hradmin/Oracle123
  • 单击Search Employee,然后单击Search

返回您的终端会话并运行命令以查看Schema中的数据:

./dv_query_employee_data.sh

执行的命令和输出如下:

==============================================================================Query on EMPLOYEESEARCH_PROD data...
==============================================================================
USER is "SYS"-- . Describe EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES from SYS user
SQL> desc employeesearch_prod.demo_hr_employees;Name                                                                                Null?    Type----------------------------------------------------------------------------------- -------- --------------------------------------------------------USERID                                                                              NOT NULL NUMBER(4)FIRSTNAME                                                                           NOT NULL VARCHAR2(25)LASTNAME                                                                            NOT NULL VARCHAR2(35)EMAIL                                                                               NOT NULL VARCHAR2(35)PHONEMOBILE                                                                                  VARCHAR2(15)PHONEFIX                                                                                     VARCHAR2(15)PHONEFAX                                                                                     VARCHAR2(15)EMPTYPE                                                                             NOT NULL VARCHAR2(15)POSITION                                                                            NOT NULL VARCHAR2(25)ISMANAGER                                                                           NOT NULL NUMBER(1)MANAGERID                                                                                    NUMBER(4)DEPARTMENT                                                                          NOT NULL VARCHAR2(15)CITY                                                                                NOT NULL VARCHAR2(35)STARTDATE                                                                           NOT NULL DATEENDDATE                                                                                      DATEACTIVE                                                                                       VARCHAR2(1)ORGANIZATION                                                                        NOT NULL VARCHAR2(15)CREATIONDATE                                                                        NOT NULL DATEMODIFICATIONDATE                                                                             DATECOSTCENTER                                                                                   NUMBER(5)ISHEADOFDEPARTMENT                                                                           NUMBER(1)DOB                                                                                 NOT NULL DATESSN                                                                                          VARCHAR2(15)SIN                                                                                          VARCHAR2(15)NINO                                                                                         VARCHAR2(15)ADDRESS_1                                                                           NOT NULL VARCHAR2(50)ADDRESS_2                                                                                    VARCHAR2(35)STATE                                                                                        VARCHAR2(5)COUNTRY                                                                             NOT NULL VARCHAR2(5)POSTAL_CODE                                                                         NOT NULL VARCHAR2(15)CORPORATE_CARD                                                                               VARCHAR2(25)CC_PIN                                                                                       NUMBER(4)CC_EXPIRE                                                                                    DATESALARY                                                                                       NUMBER(8,2)-- . Query EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES from SYS user
SQL> select userid, firstname, lastname, emptype, position, ssn, sin, ninofrom employeesearch_prod.demo_hr_employeeswhere rownum < 10;USERID FIRSTNAME  LASTNAME   EMPTYPE   POSITION         SSN         SIN         NINO
---------- ---------- ---------- --------- ---------------- ----------- ----------- -------------73 Craig      Hunt       Part-Time Administrator    102-20-499774 Fred       Stewart    Part-Time Project Manager                          MN 33 14 95 E75 Julie      Reed       Full-time Clerk            412-62-241776 Ruby       James      Full-time End-User         537-78-890277 Alice      Harper     Part-Time District Manager             170-042-12678 Marilyn    Lee        Part-Time District Manager 553-51-103179 Laura      Ryan       Full-time Project Manager  568-10-870980 William    Elliott    Full-time District Manager 787-89-228281 Martha     Carpenter  Full-time Administrator                            FZ 84 80 43 S9 rows selected.

现在,创建领域 PROTECT_EMPLOYEESEARCH_PROD 以保护 EMPLOYEESEARCH_PROD 模式中的对象免受恶意活动:

./dv_create_realm.sh

执行的命令和输出为:

==============================================================================Create the realm...
==============================================================================
USER is "C##DVOWNER"CON_NAME
------------------------------
PDB1-- . Show the current DV realm
SQL> select name, description, enabled from dba_dv_realm where id# >= 5000 order by 1;no rows selected-- . Create the "PROTECT_EMPLOYEESEARCH_PROD" DV realm
SQL>
beginDVSYS.DBMS_MACADM.CREATE_REALM(realm_name => 'PROTECT_EMPLOYEESEARCH_PROD',description => 'A mandatory realm to protect the EMPLOYEESEARCH_PROD schema.',enabled => DBMS_MACUTL.G_YES,audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL,realm_type => 1);
END;
/PL/SQL procedure successfully completed.-- . Show the current DV realm
SQL> select name, description, enabled from dba_dv_realm where id# >= 5000 order by 1;NAME                            DESCRIPTION                                                       ENABLED
------------------------------- ----------------------------------------------------------------- --------
PROTECT_EMPLOYEESEARCH_PROD     A mandatory realm to protect the EMPLOYEESEARCH_PROD schema.      Y

将对象添加到要保护的领域(在这里添加模式中所有的对象):

./dv_add_obj_to_realm.sh

执行的命令和输出为:

==============================================================================Add an object to protect to the realm...
==============================================================================
USER is "C##DVOWNER"CON_NAME
------------------------------
PDB1-- . Show the objects protected by the DV realm
SQL> 
select realm_name, owner, object_name, object_typefrom dvsys.dba_dv_realm_objectwhere realm_name in (select name from dvsys.dv$realm where id# >= 5000);no rows selected-- . Set all EMPLOYEESEARCH_PROD objects as protected by the DV realm "PROTECT_EMPLOYEESEARCH_PROD"
SQL> 
beginDVSYS.DBMS_MACADM.ADD_OBJECT_TO_REALM(realm_name => 'PROTECT_EMPLOYEESEARCH_PROD',object_owner => 'EMPLOYEESEARCH_PROD',object_name => '%',object_type => '%');
end;
/PL/SQL procedure successfully completed.-- . Show the objects protected by the DV realm
SQL> 
select realm_name, owner, object_name, object_typefrom dvsys.dba_dv_realm_objectwhere realm_name in (select name from dvsys.dv$realm where id# >= 5000);REALM_NAME                   OWNER                        OBJECT_NAME        OBJECT_TYPE
---------------------------- ---------------------------- ------------------ ------------------
PROTECT_EMPLOYEESEARCH_PROD  EMPLOYEESEARCH_PROD          %                  %

确保您在领域中有授权用户。 在这一步中,我们将添加 EMPLOYEESEARCH_PROD(这是一个用户) 作为领域授权所有者:

./dv_add_auth_to_realm.sh

执行的命令和输出为:

==============================================================================Add EMPLOYEESEARCH_PROD as a real authorized owner...
==============================================================================
USER is "C##DVOWNER"CON_NAME
------------------------------
PDB1-- . Show the owner of the DV realms
SQL>
select realm_name, grantee, auth_optionsfrom dvsys.dba_dv_realm_authwhere realm_name in (select name from dvsys.dv$realm where id# >= 5000);no rows selected-- . Add EMPLOYEESEARCH_PROD as authorized owner of the DV realm "PROTECT_EMPLOYEESEARCH_PROD"
SQL>
beginDVSYS.DBMS_MACADM.ADD_AUTH_TO_REALM(realm_name => 'PROTECT_EMPLOYEESEARCH_PROD',grantee => 'EMPLOYEESEARCH_PROD',rule_set_name => '',auth_options => '1' );
end;
/PL/SQL procedure successfully completed.-- . Show the owner of the DV realms
SQL>
select realm_name, grantee, auth_optionsfrom dvsys.dba_dv_realm_authwhere realm_name in (select name from dvsys.dv$realm where id# >= 5000);REALM_NAME                   GRANTEE                AUTH_OPTIONS
---------------------------- ---------------------- ----------------------------
PROTECT_EMPLOYEESEARCH_PROD  EMPLOYEESEARCH_PROD    Owner

重新执行 SQL 查询, SYS 现在收到了权限不足的错误信息:

$ ./dv_query_employee_data.sh
...
. Query EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES from SYS userfrom employeesearch_prod.demo_hr_employees*
ERROR at line 2:
ORA-01031: insufficient privileges

最后,删除领域:

./dv_drop_realm.sh

执行的命令与输出为:

==============================================================================Drop the realm...
==============================================================================
USER is "C##DVOWNER"CON_NAME
------------------------------
PDB1-- . Show the current DV realm
SQL> select name, description, enabled from dba_dv_realm where id# >= 5000 order by 1;NAME                            DESCRIPTION                                                       ENABLED
------------------------------- ----------------------------------------------------------------- --------
PROTECT_EMPLOYEESEARCH_PROD     A mandatory realm to protect the EMPLOYEESEARCH_PROD schema.      Y-- . Drop the "PROTECT_EMPLOYEESEARCH_PROD" DV realm
SQL>
beginDVSYS.DBMS_MACADM.DELETE_REALM_CASCADE(realm_name => 'PROTECT_EMPLOYEESEARCH_PROD');
END;
/PL/SQL procedure successfully completed.-- . Show the current DV realm
SQL> select name, description, enabled from dba_dv_realm where id# >= 5000 order by 1;no rows selected

Task 3: Create a Trusted Path / Multi-factor Authorization

重新在浏览器中启动Web应用:

  • URL:http://<YOUR_DBSEC-LAB_VM_PUBLIC_IP>:8080/hr_prod_pdb1
  • 用户名和口令:hradmin/Oracle123
  • 单击Search Employee,然后单击Search

返回您的终端会话并运行此查询以查看与 Glassfish 应用程序关联的会话信息:

./dv_query_employeesearch_usage.sh

执行的命令和输出为:

==============================================================================Display the session associated to your Glassfish Appavailable here http://129.153.203.174:8080/hr_prod_pdb1 ...
==============================================================================
USER is "SYS"-- . Session information associated with your Glassfish App
SQL>
SELECT osuser, machine, module FROM v$session WHERE username = 'EMPLOYEESEARCH_PROD';OSUSER             MACHINE                                                 MODULE
------------------ ------------------------------------------------------- -----------------------------------
oracle             dbsec-lab                                               JDBC Thin Client
oracle             dbsec-lab                                               JDBC Thin Client
oracle             dbsec-lab                                               JDBC Thin Client3 rows selected.

现在,使用所有者 EMPLOYEESEARCH_PROD 查询 EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES 表以证明它是可访问的:

./dv_query_employee_search.sh

执行的命令和输出为(原文中的提示有错,因为from EMPLOYEESEARCH_PROD user):

==============================================================================Query on EMPLOYEESEARCH_PROD data...
==============================================================================
USER is "EMPLOYEESEARCH_PROD"-- . Describe EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES from EMPLOYEESEARCH_PROD user
SQL> desc employeesearch_prod.demo_hr_employees;Name                                                                                Null?    Type----------------------------------------------------------------------------------- -------- --------------------------------------------------------USERID                                                                              NOT NULL NUMBER(4)FIRSTNAME                                                                           NOT NULL VARCHAR2(25)LASTNAME                                                                            NOT NULL VARCHAR2(35)EMAIL                                                                               NOT NULL VARCHAR2(35)PHONEMOBILE                                                                                  VARCHAR2(15)PHONEFIX                                                                                     VARCHAR2(15)PHONEFAX                                                                                     VARCHAR2(15)EMPTYPE                                                                             NOT NULL VARCHAR2(15)POSITION                                                                            NOT NULL VARCHAR2(25)ISMANAGER                                                                           NOT NULL NUMBER(1)MANAGERID                                                                                    NUMBER(4)DEPARTMENT                                                                          NOT NULL VARCHAR2(15)CITY                                                                                NOT NULL VARCHAR2(35)STARTDATE                                                                           NOT NULL DATEENDDATE                                                                                      DATEACTIVE                                                                                       VARCHAR2(1)ORGANIZATION                                                                        NOT NULL VARCHAR2(15)CREATIONDATE                                                                        NOT NULL DATEMODIFICATIONDATE                                                                             DATECOSTCENTER                                                                                   NUMBER(5)ISHEADOFDEPARTMENT                                                                           NUMBER(1)DOB                                                                                 NOT NULL DATESSN                                                                                          VARCHAR2(15)SIN                                                                                          VARCHAR2(15)NINO                                                                                         VARCHAR2(15)ADDRESS_1                                                                           NOT NULL VARCHAR2(50)ADDRESS_2                                                                                    VARCHAR2(35)STATE                                                                                        VARCHAR2(5)COUNTRY                                                                             NOT NULL VARCHAR2(5)POSTAL_CODE                                                                         NOT NULL VARCHAR2(15)CORPORATE_CARD                                                                               VARCHAR2(25)CC_PIN                                                                                       NUMBER(4)CC_EXPIRE                                                                                    DATESALARY                                                                                       NUMBER(8,2)-- . Query EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES from EMPLOYEESEARCH_PROD user
SQL> select userid, firstname, lastname, emptype, position, ssn, sin, ninofrom employeesearch_prod.demo_hr_employeeswhere rownum < 10;USERID FIRSTNAME  LASTNAME   EMPTYPE   POSITION         SSN         SIN         NINO
---------- ---------- ---------- --------- ---------------- ----------- ----------- -------------73 Craig      Hunt       Part-Time Administrator    102-20-499774 Fred       Stewart    Part-Time Project Manager                          MN 33 14 95 E75 Julie      Reed       Full-time Clerk            412-62-241776 Ruby       James      Full-time End-User         537-78-890277 Alice      Harper     Part-Time District Manager             170-042-12678 Marilyn    Lee        Part-Time District Manager 553-51-103179 Laura      Ryan       Full-time Project Manager  568-10-870980 William    Elliott    Full-time District Manager 787-89-228281 Martha     Carpenter  Full-time Administrator                            FZ 84 80 43 S9 rows selected.

通过创建 Database Vault 规则开始保护应用程序凭据:

./dv_create_rule.sh

执行的命令和输出为:

==============================================================================Create a Database Vault Rule...
==============================================================================. We must update the script to have the fully-qualified hostname for your VMYour machine is: dbsec-lab. The default rule looks like this:
SYS_CONTEXT('USERENV','SESSION_USER') = 'EMPLOYEESEARCH_PROD'
AND SYS_CONTEXT('USERENV','OS_USER') = 'oracle'
AND SYS_CONTEXT('USERENV','MODULE') = 'JDBC Thin Client'
AND SYS_CONTEXT('USERENV','HOST') = 'dbsec-lab.dbsecvcn.oraclevcn.com'-- . Create the rule "Application Connection"
SQL>
beginDVSYS.DBMS_MACADM.CREATE_RULE(rule_name => 'Application Connection'
, rule_expr => ${RULE_EXPR});
end;
/PL/SQL procedure successfully completed.-- . Show the DV rule "Application Connection"
SQL>
SELECT name, rule_expr FROM DBA_DV_RULE where name = 'Application Connection';NAME                           RULE_EXPR
------------------------------ ------------------------------------------------------------------------------------------
Application Connection         SYS_CONTEXT('USERENV','SESSION_USER') = 'EMPLOYEESEARCH_PROD' AND SYS_CONTEXT('USERENV','OS_USER') = 'oracle' AND SYS_CONTEXT('USERENV','MODULE') = 'JDBC Thin Client' AND SYS_CONTEXT('USERENV','HOST') = 'dbsec-lab'

我们仅授权作为可信路径应用程序从 Glassfish Web 应用程序(JDBC Thin Client)通过模式所有者 EMPLOYEESEARCH_PROD 进行访问!

我们通过将 Database Vault Rule 添加到 DV Rule Set 来使用它

  • 您可以在规则集中拥有一个或多个规则
  • 如果您有多个,您可以在评估所有规则必须为真或任何规则必须为真的规则集之间进行选择
  • 把它想象成 IN 和 EXISTS 之间的区别 - IN 包括所有,而 EXISTS 一旦识别出一个结果匹配就停止
./dv_create_rule_set.sh

执行的代码和输出为:

==============================================================================Create a Rule Set from the Rule we created...
==============================================================================-- . Create the rule set "Trusted Application Path"
SQL>
beginDVSYS.DBMS_MACADM.CREATE_RULE_SET(rule_set_name => 'Trusted Application Path',description   => 'Protecting the App User',enabled       => DBMS_MACUTL.G_YES,eval_options  => DBMS_MACUTL.G_RULESET_EVAL_ALL,audit_options => DBMS_MACUTL.G_RULESET_AUDIT_FAIL,fail_options  => DBMS_MACUTL.G_RULESET_FAIL_SHOW,fail_message  => 'You cannot use the app account this way.',fail_code     => -20000,handler_options => null,handler         => null,is_static     => TRUE);
end;
/PL/SQL procedure successfully completed.-- . Associate the rule set "Trusted Application Path" to the rule "Application Connection"
SQL>
beginDVSYS.DBMS_MACADM.ADD_RULE_TO_RULE_SET(rule_set_name  => 'Trusted Application Path',rule_name      => 'Application Connection',rule_order     => 1,enabled        => DBMS_MACUTL.G_YES);
end;
/PL/SQL procedure successfully completed.-- . Show the rule set "Trusted Application Path"
SQL>
SELECT rule_set_name, enabled, eval_options_meaning, audit_options, fail_message, fail_code, is_staticFROM DBA_DV_RULE_SETwhere rule_set_name = 'Trusted Application Path';RULE_SET_NAME                  E EVAL_OPTIONS_MEANING AUDIT_OPTIONS FAIL_MESSAGE                                  FAIL_CODE  IS_ST
------------------------------ - -------------------- ------------- --------------------------------------------- ---------- -----
Trusted Application Path       Y All True                         1 You cannot use the app account this way.      -20000     TRUE

在“CONNECT”上创建命令规则以保护 EMPLOYEESEARCH_PROD 用户:

./dv_create_command_rule.sh

执行的命令和输出为:

==============================================================================Create a Command Rule on Connect to protect the EMPLOYEESEARCH_PROD user...
==============================================================================-- . Create the Command Rule on Connect for "Application Connection"
SQL> 
beginDVSYS.DBMS_MACADM.CREATE_CONNECT_COMMAND_RULE(user_name    => 'EMPLOYEESEARCH_PROD',rule_set_name => 'Trusted Application Path',enabled => DBMS_MACUTL.G_YES);
end;
/PL/SQL procedure successfully completed.. Show the Command Rule on Connect for "Application Connection"
SQL> select command, object_owner, object_name, rule_set_name from dba_dv_command_rule where command = 'CONNECT';COMMAND              OBJECT_OWNER             OBJECT_NAME              RULE_SET_NAME
-------------------- ------------------------ ------------------------ ----------------------------------------
CONNECT              EMPLOYEESEARCH_PROD      %                        Trusted Application Path

现在,只有当匹配我们创建的规则集时,才能通过用户 EMPLOYEESEARCH_PROD连接(connect)!

返回您的 Glassfish Web应用程序并刷新几次并通过单击 [搜索] 运行一些查询并浏览员工数据

注意:因为您将 Glassfish Web应用程序用作可信路径应用程序,所以您可以访问数据!

返回您的终端会话并重新运行我们对应用程序使用情况的查询,以验证它是否仍然有效:

./dv_query_employeesearch_usage.sh

执行的命令和输出为:

==============================================================================Display the session associated to your Glassfish Appavailable here http://129.153.203.174:8080/hr_prod_pdb1 ...
==============================================================================
USER is "SYS"-- . Session information associated with your Glassfish App
SQL> SELECT osuser, machine, module FROM v$session WHERE username = 'EMPLOYEESEARCH_PROD';
OSUSER             MACHINE                                                 MODULE
------------------ ------------------------------------------------------- -----------------------------------
oracle             dbsec-lab                                               JDBC Thin Client
oracle             dbsec-lab                                               JDBC Thin Client2 rows selected.

现在,尝试使用所有者 EMPLOYEESEARCH_PROD 查询 EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES 表……您应该被阻止!

$ ./dv_query_employee_search.sh
==============================================================================Query on EMPLOYEESEARCH_PROD data...
==============================================================================
ERROR:
ORA-47306: 20000: You cannot use the app account this way.ERROR:
ORA-01017: invalid username/password; logon deniedSP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM|SYSBACKUP|SYSDG|SYSKM|SYSRAC}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]<proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus

注意:因为您是通过非“可信路径”应用程序查询,所以您无法访问数据!

成功完成实验后,您可以从 Database Vault 中删除命令规则、规则集和规则:

./dv_del_trusted_path.sh

执行的命令和输出为:

==============================================================================Remove Command Rule, Rule Set, and Rule...
==============================================================================-- . Delete the Command Rule
SQL> 
beginDVSYS.DBMS_MACADM.DELETE_CONNECT_COMMAND_RULE(user_name => 'EMPLOYEESEARCH_PROD');
end;
/PL/SQL procedure successfully completed.-- . Delete the Rule Set
SQL> 
beginDVSYS.DBMS_MACADM.DELETE_RULE_SET(rule_set_name => 'Trusted Application Path');
end;
/PL/SQL procedure successfully completed.-- . Delete the Rule
beginDVSYS.DBMS_MACADM.DELETE_RULE(rule_name => 'Application Connection');
end;
/PL/SQL procedure successfully completed.

Task 4: Simulation Mode

首先,查询模拟日志,显示没有当前值:

./dv_query_simulation_logs.sh

执行的命令和输出为:

==============================================================================Query the simulation logs...
==============================================================================-- . Display the current simulation logs
SQL> 
SELECT VIOLATION_TYPE, USERNAME, MACHINE, COMMAND, DV\$_MODULE, SQLTEXT FROM DBA_DV_SIMULATION_LOG;no rows selected

接下来,创建一个命令规则,该规则将模拟阻止与数据库的所有连接。 这是我们识别谁在连接以及他们从哪里连接的一种简单方法。

./dv_command_rule_sim_mode.sh

执行的命令和输出为:

==============================================================================Create a Command Rule that will simulate blocking all connections to the DB...
==============================================================================-- . Create the Command Rule
SQL>
BEGIN
DBMS_MACADM.CREATE_COMMAND_RULE(command         => 'CONNECT',rule_set_name   => 'Disabled',object_name       => '%',object_owner       => '%',enabled         => DBMS_MACUTL.G_SIMULATION);
END;
/PL/SQL procedure successfully completed.

执行一个脚本来创建一些数据库连接并生成一些日志条目:

./dv_run_queries.sh

输出为:

==============================================================================Execute some db connections and generate some log entries...
==============================================================================CON_NAME
------------------------------
PDB1. Count EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES rows as "SYS"COUNT(*)
----------1000. Count EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES rows as "SYSTEM"COUNT(*)
----------1000. Count EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES rows as "DBA_DEBRA"COUNT(*)
----------1000

现在,我们再次查询模拟日志以查看我们有哪些新条目。 请记住,我们创建了一个命令规则来模拟阻止用户连接!

./dv_query_simulation_logs.sh

输出显示有Command Rule Violation

==============================================================================Query the simulation logs...
==============================================================================. Display the current simulation logsVIOLATION_TYPE           USERNAME             MACHINE                                           COMMAND
------------------------ -------------------- ------------------------------------------------- ------------
DV$_MODULE        SQLTEXT
----------------- ------------------------------------------------------------
Command Rule Violation   SYS                  dbsec-lab                                         CONNECT
sqlplus@dbsec-lab CONNECT(TNS V1-V3)Command Rule Violation   DBA_DEBRA            dbsec-lab                                         CONNECT
sqlplus@dbsec-lab CONNECT(TNS V1-V3)Command Rule Violation   SYSTEM               dbsec-lab                                         CONNECT
sqlplus@dbsec-lab CONNECT(TNS V1-V3)

该日志显示所有已连接并被该规则阻止的用户。 它还显示了他们从哪里连接以及他们用来连接的客户端。

运行此脚本以获取模拟日志中存在的不同用户名列表:

./dv_distinct_users_sim_logs.sh

执行的命令和输出为:

==============================================================================Get a list of distinct usernames present in the DV simulation logs...
==============================================================================-- . Display the current simulation logs
SQL> SELECT distinct USERNAME FROM DBA_DV_SIMULATION_LOG order by 1;USERNAME
--------------------
DBA_DEBRA
SYS
SYSTEM

虽然我们只在 CONNECT 规则上使用了模拟模式,但我们可以在 Realm 上使用它来显示我们会遇到哪些违规行为。

在进入下一个实验之前,我们将清理模拟日志并删除命令规则:

./dv_purge_sim_logs.sh
./dv_drop_command_rule.sh

执行的命令和输出为:

==============================================================================Purge the simulation logs...
==============================================================================-- . Current simulation logs before pruging
SQL>  select count(*) from dba_dv_simulation_log;COUNT(*)
----------3-- . Purge simulation logs
SQL> DELETE FROM DVSYS.SIMULATION_LOG$;3 rows deleted.-- . Current simulation logs after pruging
SQL>  select count(*) from dba_dv_simulation_log;COUNT(*)
----------0==============================================================================Remove the Command Rule...
==============================================================================-- . Delete the Command Rule
SQL> 
BEGINDBMS_MACADM.DELETE_COMMAND_RULE(command        => 'CONNECT',object_owner   => '%',object_name    => '%',scope          => DBMS_MACUTL.G_SCOPE_LOCAL);
END;
/PL/SQL procedure successfully completed.

Task 5: Ops Control

Database Vault Operations Control 自动限制公共用户(common user)在自治、常规云或本地环境中访问可插拔数据库 (PDB) 本地数据。

在Oracle By Example 19c新特性中也有此实验。

检查 Database Vault 和 Operations Control 的状态:

./dv_status.sh

输出为:

==============================================================================Check the status of Database Vault...
==============================================================================CON_NAME
------------------------------
CDB$ROOT. Show the DB Vault statusNAME                      STATUS
------------------------- --------------------
DV_APP_PROTECTION         NOT CONFIGURED
DV_CONFIGURE_STATUS       TRUE
DV_ENABLE_STATUS          TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB1                 READ WRITE           DV_APP_PROTECTION         NOT CONFIGUREDREAD WRITE           DV_ENABLE_STATUS          TRUEREAD WRITE           DV_CONFIGURE_STATUS       TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB2                 READ WRITE           DV_APP_PROTECTION         NOT CONFIGUREDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSE6 rows selected.

注意:目前尚未配置!

接下来,我们将在可插拔数据库 pdb1 和 pdb2中运行相同的查询,以用户DBA_DEBRA:

./dv_query_with_debra.sh

输出为:

==============================================================================Run the same queries as both pluggable database as dba_debra...
==============================================================================. Select "EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES" table on PDB1 as dba_debraCON_NAME
------------------------------
PDB1
USER is "DBA_DEBRA"OWNER                    TABLE_NAME               TABLESPACE_NAME
------------------------ ------------------------ --------------------------
EMPLOYEESEARCH_PROD      DEMO_HR_EMPLOYEES        EMPDATA_PRODCOUNT(*)
----------1000. Select "EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES" table on PDB2 as dba_debraCON_NAME
------------------------------
PDB2
USER is "DBA_DEBRA"OWNER                    TABLE_NAME               TABLESPACE_NAME
------------------------ ------------------------ --------------------------
EMPLOYEESEARCH_PROD      DEMO_HR_EMPLOYEES        EMPDATA_PRODCOUNT(*)
----------1000

然后以用户C##SEC_DBA_SAL运行相同的查询:

./dv_query_with_sal.sh

输出为:

==============================================================================Run the same queries as both pluggable database as c##sec_dba_sal...
==============================================================================. Select "EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES" table on PDB1 as c##sec_dba_salCON_NAME
------------------------------
PDB1
USER is "C##SEC_DBA_SAL"OWNER                    TABLE_NAME               TABLESPACE_NAME
------------------------ ------------------------ --------------------------
EMPLOYEESEARCH_PROD      DEMO_HR_EMPLOYEES        EMPDATA_PRODCOUNT(*)
----------1000. Select "EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES" table on PDB2 as c##sec_dba_salCON_NAME
------------------------------
PDB2
USER is "C##SEC_DBA_SAL"OWNER                    TABLE_NAME               TABLESPACE_NAME
------------------------ ------------------------ --------------------------
EMPLOYEESEARCH_PROD      DEMO_HR_EMPLOYEES        EMPDATA_PRODCOUNT(*)
----------1000

注意:

  • 查询结果相同
  • Common用户 C##SEC_DBA_SAL 可以访问可插拔数据库中的数据,就像 pdb Admin 一样

启用 Database Vault 19c Operations Control 并再次运行查询:

./dv_enable_ops_control.sh

执行的命令和输出为:

==============================================================================Enable Database Vault 19c Operations Control...
==============================================================================-- . Enable DB Vault Ops Control
SQL> exec dbms_macadm.enable_app_protection;PL/SQL procedure successfully completed.

查询DV状态,注意DV_APP_PROTECTION状态变为ENABLED:

$ ./dv_status.sh==============================================================================Check the status of Database Vault...
==============================================================================CON_NAME
------------------------------
CDB$ROOT. Show the DB Vault statusNAME                      STATUS
------------------------- --------------------
DV_APP_PROTECTION         ENABLED
DV_CONFIGURE_STATUS       TRUE
DV_ENABLE_STATUS          TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB1                 READ WRITE           DV_APP_PROTECTION         ENABLEDREAD WRITE           DV_ENABLE_STATUS          TRUEREAD WRITE           DV_CONFIGURE_STATUS       TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB2                 READ WRITE           DV_APP_PROTECTION         ENABLEDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSE6 rows selected.

再次以用户DBA_DEBRA运行查询:

./dv_query_with_debra.sh

输出正常,和之前一样:

==============================================================================Run the same queries as both pluggable database as dba_debra...
==============================================================================. Select "EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES" table on PDB1 as dba_debraCON_NAME
------------------------------
PDB1
USER is "DBA_DEBRA"OWNER                    TABLE_NAME               TABLESPACE_NAME
------------------------ ------------------------ --------------------------
EMPLOYEESEARCH_PROD      DEMO_HR_EMPLOYEES        EMPDATA_PRODCOUNT(*)
----------1000. Select "EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES" table on PDB2 as dba_debraCON_NAME
------------------------------
PDB2
USER is "DBA_DEBRA"OWNER                    TABLE_NAME               TABLESPACE_NAME
------------------------ ------------------------ --------------------------
EMPLOYEESEARCH_PROD      DEMO_HR_EMPLOYEES        EMPDATA_PRODCOUNT(*)
----------1000

再次以 Common用户 C##SEC_DBA_SAL运行查询:

./dv_query_with_sal.sh

输出显示权限不够:

==============================================================================Run the same queries as both pluggable database as c##sec_dba_sal...
==============================================================================. Select "EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES" table on PDB1 as c##sec_dba_salCON_NAME
------------------------------
PDB1
USER is "C##SEC_DBA_SAL"OWNER                    TABLE_NAME               TABLESPACE_NAME
------------------------ ------------------------ --------------------------
EMPLOYEESEARCH_PROD      DEMO_HR_EMPLOYEES        EMPDATA_PRODselect count(*) from employeesearch_prod.demo_hr_employees*
ERROR at line 1:
ORA-01031: insufficient privileges. Select "EMPLOYEESEARCH_PROD.DEMO_HR_EMPLOYEES" table on PDB2 as c##sec_dba_salCON_NAME
------------------------------
PDB2
USER is "C##SEC_DBA_SAL"OWNER                    TABLE_NAME               TABLESPACE_NAME
------------------------ ------------------------ --------------------------
EMPLOYEESEARCH_PROD      DEMO_HR_EMPLOYEES        EMPDATA_PRODselect count(*) from employeesearch_prod.demo_hr_employees*
ERROR at line 1:
ORA-01031: insufficient privileges

完成此实验后,禁用 Ops Control:

./dv_disable_ops_control.sh

执行的命令和输出为:

==============================================================================Disable Database Vault 19c Operations Control...
==============================================================================-- . Disable DB Vault Ops Control
SQL> exec dbms_macadm.disable_app_protection;PL/SQL procedure successfully completed.

Task 6: Disabling Database Vault

禁用可插拔数据库 pdb1:

./dv_disable_on_pdb.sh pdb1

输出为:

==============================================================================Disable Database Vault for the pluggable database ...
==============================================================================CON_NAME
------------------------------
CDB$ROOT. Show the DB Vault statusNAME                      STATUS
------------------------- --------------------
DV_APP_PROTECTION         DISABLED
DV_CONFIGURE_STATUS       TRUE
DV_ENABLE_STATUS          TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB1                 READ WRITE           DV_APP_PROTECTION         DISABLEDREAD WRITE           DV_ENABLE_STATUS          TRUEREAD WRITE           DV_CONFIGURE_STATUS       TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB2                 READ WRITE           DV_APP_PROTECTION         DISABLEDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSE6 rows selected.. Connect to the pluggable database pdb1Session altered.CON_NAME
------------------------------
PDB1. Disable DB Vault
USER is "C##DVOWNER"PL/SQL procedure successfully completed.. Reboot the pluggable databaseCON_NAME
------------------------------
CDB$ROOTPluggable database altered.Pluggable database altered.. Show the DB Vault statusNAME                      STATUS
------------------------- --------------------
DV_APP_PROTECTION         DISABLED
DV_CONFIGURE_STATUS       TRUE
DV_ENABLE_STATUS          TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB1                 READ WRITE           DV_APP_PROTECTION         DISABLEDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB2                 READ WRITE           DV_APP_PROTECTION         DISABLEDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSE6 rows selected.

现在,在容器数据库 cdb1 中禁用 Database Vault:

./dv_disable_on_cdb.sh

输出为:

==============================================================================Disable Database Vault for the container database CDB...
==============================================================================CON_NAME
------------------------------
CDB$ROOT. Show the DB Vault statusNAME                      STATUS
------------------------- --------------------
DV_APP_PROTECTION         DISABLED
DV_CONFIGURE_STATUS       TRUE
DV_ENABLE_STATUS          TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB1                 READ WRITE           DV_APP_PROTECTION         DISABLEDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB2                 READ WRITE           DV_APP_PROTECTION         DISABLEDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSE6 rows selected.. Disable DB VaultCON_NAME
------------------------------
CDB$ROOT
USER is "C##DVOWNER"PL/SQL procedure successfully completed.. Reboot the DatabaseCON_NAME
------------------------------
CDB$ROOT
Database closed.
Database dismounted.
ORACLE instance shut down.
ORACLE instance started.Total System Global Area 3674209872 bytes
Fixed Size                  9141840 bytes
Variable Size            1996488704 bytes
Database Buffers         1660944384 bytes
Redo Buffers                7634944 bytes
Database mounted.
Database opened.. Show the DB Vault statusNAME                      STATUS
------------------------- --------------------
DV_APP_PROTECTION         DISABLED
DV_CONFIGURE_STATUS       TRUE
DV_ENABLE_STATUS          FALSEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB1                 READ WRITE           DV_APP_PROTECTION         DISABLEDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       TRUEPDB_NAME             OPEN_MODE            NAME                      STATUS
-------------------- -------------------- ------------------------- --------------------
PDB2                 READ WRITE           DV_APP_PROTECTION         DISABLEDREAD WRITE           DV_ENABLE_STATUS          FALSEREAD WRITE           DV_CONFIGURE_STATUS       FALSE6 rows selected.

注意:

  • 要禁用 DB Vault,数据库将重新启动!
  • cdb 的 DV_ENABLE_STATUS 必须为 FALSE

Appendix: About the Product

Oracle Database Vault 提供控制以防止未经授权的特权用户访问敏感数据并防止未经授权的数据库更改。

Oracle Database Vault 安全控制保护应用程序数据免遭未经授权的访问,并符合隐私和法规要求。

在这里插入图片描述
您可以部署控制以阻止特权帐户访问应用程序数据并使用可信路径授权控制数据库内的敏感操作。

通过对权限和角色的分析,您可以通过使用最低权限最佳实践来提高现有应用程序的安全性。

Oracle Database Vault 透明地保护现有数据库环境,消除昂贵且耗时的应用程序更改。

Oracle Database Vault 使您能够创建一组组件来管理数据库实例的安全性。

这些组件如下:

  • Realms:领域是数据库内部的一个保护区,可以保护数据库模式、对象和角色。 例如,您可以保护与会计、销售或人力资源相关的一组模式、对象和角色。 将这些保护到领域后,您可以使用领域来控制对特定帐户或角色的系统和对象权限的使用。 这使您能够为想要使用这些模式、对象和角色的任何人提供细粒度的访问控制。
  • Command rules:命令规则是一种特殊的安全策略,您可以创建它来控制用户如何执行几乎任何 SQL 语句,包括 SELECT、ALTER SYSTEM、数据库定义语言 (DDL) 和数据操作语言 (DML) 语句。 命令规则必须与规则集一起使用以确定是否允许该语句。
  • Factors:因子是一个命名变量或属性,例如用户位置、数据库 IP 地址或会话用户,Oracle Database Vault 可以识别并用作可信路径。 您可以使用规则中的因子来控制活动,例如授权数据库帐户连接到数据库或执行特定的数据库命令来限制数据的可见性和可管理性。 每个因素可以有一个或多个身份。 标识是因子的实际值。 一个因子可以有多个标识,具体取决于因子检索方法或其标识映射逻辑。
  • Rule sets:规则集是一个或多个规则的集合,您可以将这些规则与领域授权、命令规则、因子分配或安全应用程序角色相关联。 规则集根据其包含的每个规则的评估和评估类型(全部为真或任何为真)评估为真或假。 规则集中的规则是一个计算结果为真或假的 PL/SQL 表达式。 您可以在多个规则集中拥有相同的规则。
  • Secure application roles:安全应用程序角色是一种特殊的 Oracle 数据库角色,可以根据对 Oracle Database Vault 规则集的评估来启用它。

为了增强这些组件,Oracle Database Vault 提供了一组 PL/SQL 接口和包。 通常,您采取的第一步是创建一个由您想要保护的数据库模式或数据库对象组成的领域。 您可以通过创建规则、命令规则、因子、标识、规则集和安全应用程序角色来进一步保护领域。 此外,您可以运行有关这些组件监控和保护的活动的报告。

使用 Database Vault 的好处:

  • 解决合规性法规以提高安全意识
  • 保护特权用户帐户,免受外部和内部的许多安全漏洞和数据窃取
  • 帮助您为数据库设计灵活的安全策略
  • 解决数据库整合和云环境问题,以降低成本并减少将敏感应用程序数据暴露给无需知道的人
  • 在多租户环境中工作,提高了整合的安全性

Want to Learn More?

参考文档:Oracle Database Vault 19c

视频:

  • Oracle Database Vault - Use Cases (Part1) (October 2019)
  • Oracle Database Vault - Use Cases (Part2) (October 2019)

Acknowledgements

本实验作者为Hakim Loumi,数据库安全的PM;贡献者为Alan Williams和Rene Fontcha

这篇关于Oracle LiveLabs实验:DB Security - Database Vault的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/570278

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

PLsql Oracle 下载安装图文过程详解

《PLsqlOracle下载安装图文过程详解》PL/SQLDeveloper是一款用于开发Oracle数据库的集成开发环境,可以通过官网下载安装配置,并通过配置tnsnames.ora文件及环境变... 目录一、PL/SQL Developer 简介二、PL/SQL Developer 安装及配置详解1.下

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u