原文地址:Oracle 21C Security : diagnostics_control and enable diagnostics
原文作者:Mouhamadou Diaw
一些调试事件和调试操作是不安全的,应该谨慎地暴露给用户。在以前的版本中,使用这些诊断的权限控制是不够的。
使用 Oracle 21c,可以阻止普通用户使用这些诊断,以更好地支持职责分离。
事实上,在 Oracle 21c 中,我们有了一种新机制来通过 ALTER SESSION 和/或 ALTER SYSTEM 来控制调试事件和调试操作。该机制由两个新特性实现
- -ENABLE DIAGNOSTICS 系统权限
- -DIAGNOSTICS_CONTROL 初始化参数
让我们看看这些功能是如何工作
的,因为 DIAGNOSTICS_CONTROL 设置为 IGNORE,默认行为是每个用户都可以在没有错误的情况下执行诊断任务,如果他有 ALTER SESSION PRIVILEGE
SQL> show parameter diagnostics_control NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ diagnostics_control string IGNORE SQL>
复制
让我们考虑具有以下权限的用户 EDGE
SQL> select privilege from dba_sys_privs where GRANTEE='EDGE'; PRIVILEGE ---------------------------------------- CREATE TABLE ALTER SESSION CREATE SESSION SQL>
复制
用户 EDGE 可以执行以下查询
SQL> show con_name CON_NAME ------------------------------ PDB1 SQL> show user USER is "EDGE" SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'; Session altered. SQL>
复制
现在让我们将 DIAGNOSTICS_CONTROL 设置为 WARNING
SQL> alter system set diagnostics_control=WARNING; System altered. SQL> show parameter diagnostics_control NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ diagnostics_control string WARNING SQL>
复制
让我们用用户 EDGE 重试 SET EVENTS 操作
SQL> show con_name CON_NAME ------------------------------ PDB1 SQL> show user USER is "EDGE" SQL> SQL> ALTER SESSION SET EVENTS '1357 trace name context forever, level 2'; Session altered. SQL>
复制
该操作已执行,但我们在数据库警报日志中有一个条目
2022-01-12T12:56:22.136454+01:00 PDB1(3):User 'EDGE' has set the following debug-event(s) on the event-group 'session': PDB1(3):'1357 trace name context forever, level 2' PDB1(3):To disable such messages, refer to documentation about parameter 'diagnostics_control'.
复制
现在让我们将 DIAGNOSTICS_CONTROL 设置为 ERROR
SQL> alter system set diagnostics_control=ERROR; System altered. SQL> show parameter diagnostics_control NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ diagnostics_control string ERROR SQL>
复制
让我们再次尝试用户 EDGE 的 SET EVENTS 操作
SQL> show con_name CON_NAME ------------------------------ PDB1 SQL> show user USER is "EDGE" SQL> ALTER SESSION SET EVENTS '1357 trace name context forever, level 2'; ERROR: ORA-01031: insufficient privileges ORA-49100: Failed to process event statement [1357 trace name context forever, level 2] SQL>
复制
我们可以看到该语句没有执行并且我们得到一个错误。
我们可以得出结论,使用参数 DIAGNOSTICS_CONTROL,我们可以控制哪些用户可以执行诊断事件。可以在Oracle 文档中看到以下内容
错误:如果没有 SYSDBA 或 ENABLE DIAGNOSTICS 权限的用户尝试启用诊断,则尝试将失败并出现 ORA-01031:权限不足错误。
警告:没有 SYSDBA 或 ENABLE DIAGNOSTICS 权限的用户将能够启用诊断,但警告消息会写入警报日志。警告消息类似于以下内容:
IGNORE:用户可以执行诊断任务而不会出现任何错误消息。此设置是默认设置。
但是如果我想将参数设置为 ERROR 并希望允许一些非 DBA 用户执行诊断事件呢?只需授予他们新的系统权限启用诊断。
下面让我们做一个测试。
SQL> select privilege from dba_sys_privs where GRANTEE='EDGE'; PRIVILEGE ---------------------------------------- ENABLE DIAGNOSTICS CREATE TABLE ALTER SESSION CREATE SESSION SQL> show parameter diagnostics_control NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ diagnostics_control string ERROR SQL>
复制
现在让我们做一个诊断事件
SQL> show con_name CON_NAME ------------------------------ PDB1 SQL> show user USER is "EDGE" SQL> ALTER SESSION SET EVENTS '1357 trace name context forever, level 2'; Session altered. SQL>
复制
由于现在 EDGE 具有 ENABLE DIAGNOSTICS 权限,因此即使 DIAGNOSTICS_CONTROL 设置为 ERROR,他也可以执行诊断事件。
结论
这个新功能对于限制可以执行诊断操作的用户非常有用。