一、 简介
1. 什么是标准审计
标准审计审计SQL语句、权限、对象和网络活动。 可以使用AUDIT语句配置标准审计,使用NOAUDIT语句删除此配置。可以将审计记录写入数据库审计跟踪或操作系统审计文件。
11g默认审计选项
-- 以下权限将对所有用户审计
select privilege,success,failure from dba_priv_audit_opts;
PRIVILEGE SUCCESS FAILURE
---------------------------------------- ---------- ----------
CREATE EXTERNAL JOB BY ACCESS BY ACCESS
CREATE ANY JOB BY ACCESS BY ACCESS
GRANT ANY OBJECT PRIVILEGE BY ACCESS BY ACCESS
EXEMPT ACCESS POLICY BY ACCESS BY ACCESS
CREATE ANY LIBRARY BY ACCESS BY ACCESS
GRANT ANY PRIVILEGE BY ACCESS BY ACCESS
DROP PROFILE BY ACCESS BY ACCESS
ALTER PROFILE BY ACCESS BY ACCESS
DROP ANY PROCEDURE BY ACCESS BY ACCESS
ALTER ANY PROCEDURE BY ACCESS BY ACCESS
CREATE ANY PROCEDURE BY ACCESS BY ACCESS
ALTER DATABASE BY ACCESS BY ACCESS
GRANT ANY ROLE BY ACCESS BY ACCESS
CREATE PUBLIC DATABASE LINK BY ACCESS BY ACCESS
DROP ANY TABLE BY ACCESS BY ACCESS
ALTER ANY TABLE BY ACCESS BY ACCESS
CREATE ANY TABLE BY ACCESS BY ACCESS
DROP USER BY ACCESS BY ACCESS
ALTER USER BY ACCESS BY ACCESS
CREATE USER BY ACCESS BY ACCESS
CREATE SESSION BY ACCESS BY ACCESS
AUDIT SYSTEM BY ACCESS BY ACCESS
ALTER SYSTEM BY ACCESS BY ACCESS
23 rows selected.
-- 以下语句也将对所有用户审计:
select audit_option,success,failure from dba_stmt_audit_opts;
AUDIT_OPTION SUCCESS FAILURE
---------------------------------------- ---------- ----------
ALTER SYSTEM BY ACCESS BY ACCESS
SYSTEM AUDIT BY ACCESS BY ACCESS
CREATE SESSION BY ACCESS BY ACCESS
CREATE USER BY ACCESS BY ACCESS
ALTER USER BY ACCESS BY ACCESS
DROP USER BY ACCESS BY ACCESS
PUBLIC SYNONYM BY ACCESS BY ACCESS
DATABASE LINK BY ACCESS BY ACCESS
ROLE BY ACCESS BY ACCESS
PROFILE BY ACCESS BY ACCESS
CREATE ANY TABLE BY ACCESS BY ACCESS
ALTER ANY TABLE BY ACCESS BY ACCESS
DROP ANY TABLE BY ACCESS BY ACCESS
CREATE PUBLIC DATABASE LINK BY ACCESS BY ACCESS
GRANT ANY ROLE BY ACCESS BY ACCESS
SYSTEM GRANT BY ACCESS BY ACCESS
ALTER DATABASE BY ACCESS BY ACCESS
CREATE ANY PROCEDURE BY ACCESS BY ACCESS
ALTER ANY PROCEDURE BY ACCESS BY ACCESS
DROP ANY PROCEDURE BY ACCESS BY ACCESS
ALTER PROFILE BY ACCESS BY ACCESS
DROP PROFILE BY ACCESS BY ACCESS
GRANT ANY PRIVILEGE BY ACCESS BY ACCESS
CREATE ANY LIBRARY BY ACCESS BY ACCESS
EXEMPT ACCESS POLICY BY ACCESS BY ACCESS
GRANT ANY OBJECT PRIVILEGE BY ACCESS BY ACCESS
CREATE ANY JOB BY ACCESS BY ACCESS
CREATE EXTERNAL JOB BY ACCESS BY ACCESS
28 rows selected.
2. 谁可以执行标准审计
任何用户都可以使用AUDIT语句为其自己拥有的对象配置审计,使用NOAUDIT语句删除此配置,执行此任务不需要其他权限。无论AUDIT_TRAIL参数设置如何,用户都可以运行语句来设置审计选项。如果已禁用审计,则下次启用时,Oracle数据库将记录由AUDIT语句设置的审计活动。
- 要审计另一个schema中的对象,用户必须具有AUDIT ANY系统特权。
- 要审计系统权限,用户必须具有该AUDIT SYSTEM权限。
- 如果O7_DICTIONARY_ACCESSIBILITY初始化参数已设置为FALSE(缺省值),则只有拥有该SYSDBA特权的用户才能对SYS.AUD$和SYS.FGA_LOG$表中的数据执行DML操作。
- 无需设置AUDIT_TRAIL即可启用细粒度审计或SYS审计。对于细粒度审计,可以根据需要添加和删除细粒度审计策略,将它们应用于要监视的特定操作或对象。要启用SYS审计,将AUDIT_SYS_OPERATIONS参数设置为TRUE。
二、 审计参数设置
AUDIT_TRAIL参数值(重启生效):
- none:不启用审计功能;
- db:启用审计功能,审计信息写入sys.aud$数据字典中,审计结果只有连接信息,没有sql语句(sys用户的记录以及强制性要求的记录都写入os文件);
- db, extended:与db相比,审计结果增加了执行的sql和绑定变量
- os:启用审计功能,审计信息以文本格式写入os文件;
- xml:启用审计功能,审计信息以xml格式写入os文件,没有sql语句;
- xml, extended:与xml相比,审计结果增加了执行的sql和绑定变量
三、 标准审计类型
1. 根据审计内容分类
- 语句审计(Statement Auditing):对特定的SQL语句进行审计,不指定具体对象;
- 权限审计(Privilege Auditing):对特定的系统权限使用情况进行审计;
- 对象审计(Object Auditing):对特定的对象上执行的特定语句进行审计;
- 网络审计(Network Auditing):对网络协议错误与网络层内部错误进行审计。
2. 根据用户是否执行成功分类
- 对执行成功的语句进行审计
- 对失败的语句进行审计
- 无论成功与否都进行审计
3. 根据对同一语句审计次数分类
- 会话审计(by session,默认):用户在同一会话执行的相同语句只审计一次,记一条审计记录
- 访问审计(by access):用户执行多少次语句就审计多少次,形成多少条审计记录
四、 审计配置
1. 语句审计
- 语句审计是对特定的SQL语句进行审计,与具体的对象没有关系。
AUDIT sql_statement_shortcut | ALL | ALL STATEMENTS
[BY user_lists] | [IN SESSION CURRENT] [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]
解释:
- sql_statement_shortcut:被审计的SQL语句shortcut;
- ALL:审计大部分SQL语句,这里不在列出;
- ALL STATEMENT:对最高级别的SQL语句进行审计,即对直接执行的SQL语句进行审计,而不对包含在PL/SQL程序中的SQL语句进行审计(ALL STATEMENT级别才能审计commit和rollback操作);
- BY user_lists:指定审计的用户,如果不指定,则审计全部用户;
- IN SESSION CURRENT:只对当前会话进行审计;
- BY SESSION:会话审计,同一个SQL语句只审计一次;
- BY ACCESS:存取审计,同一个SQL语句执行几次就审计几次;
- WHENEVER SUCCESSFUL:只审计执行成功的SQL语句;
- WHENEVER NOT SUCCESS:只审计执行不成功的SQL语句;
例如
-- all statement 级别
audit all statements by aud_user by access;
-- DML
audit update table, insert table, delete table by aud_user by access;
-- Select
audit Select table by aud_user by access;
-- 执行权限
AUDIT EXECUTE PROCEDURE by aud_user BY ACCESS WHENEVER NOT SUCCESSFUL;
-- 审计对表所有操作
audit table by aud_user by access;
-- 审计指定用户连接/断开操作
audit connect by aud_user;
-- 审计所有用户连接/断开操作
audit connect;
-- 审计用户授权操作
audit grant any role by access;
audit grant any object privilege by access;
audit grant any privilege by access;
- 要取消对某个语句的审计,只需将AUDIT命令改为NOAUDIT命令即可,其语法与AUDIT相同。NOAUDIT 取消审计的操作对已经连接的session无用,但新开的session将不再审计。
- 通过数据字典DBA_STMT_AUDIT_OPTS可以了解当前数据库哪些用户进行了语句审计及审计设置信息。例如,查看与scott用户相关的语句审计:
SQL> select * from dba_stmt_audit_opts where user_name='SCOTT';
USER_NAME PROXY_NAME AUDIT_OPTION SUCCESS FAILURE
--------- ----------- --------------- ---------- ----------
SCOTT TABLE BY ACCESS BY ACCESS
SCOTT INSERT TABLE BY ACCESS BY ACCESS
2. 权限审计
- 权限审计是对特定的系统权限进行审计
AUDIT system_privilege | [ALL PRIVILEGES] [BY user_lists] | [IN SESSION CURRENT] [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]
例子
-- 每次成功使用ALTER TABLESPACE权限时,都会将一行内容添加到SYS.AUD$
audit alter tablespace by access whenever successful;
-- 审计 select any table权限
audit select any table by aud_user by access;
- 通过数据字典DBA_PRIV_AUDIT_OPTS查看当前数据库中对哪些用户使用了什么权限审计。
3. 对象审计
- 对象审计是指对特定模式对象的操作进行审计,与用户无关
-- sql_operation指定特定对象上要审计的SQL语句
AUDIT sql_operation | ALL ON [schema.]object] [BY user_lists] | [IN SESSION CURRENT][BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]
例子
-- 审计对scott.dept表所有操作
audit all on scott.dept by access;
-- 审计对hr.employees表DML操作
audit update,insert,delete on hr.employees by access;
- 查询DBA_OBJ_AUDIT_OPTS查看当前数据库对哪些对象进行了对象审计
4. 网络审计
对协议错误与网络层内部错误进行审计,捕获客户端与服务器通信过程中发生的错误,这些错误由SQL*NET网络服务抛出。
AUDIT NETWORK [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]
例子
-- Configuring Network Auditing
AUDIT NETWORK BY ACCESS;
--Removing Network Auditing
NOAUDIT NETWORK;
五、 DDL操作审计
生产环境经常遇到DROP、TRUNCATE、DELETE等误操作,其中大部分影响较大的是DDL
1. 启|禁用
alter system set enable_ddl_logging = TRUE|FALSE; -- 不需重启
2. 审计记录位置
审计内容只有时间、语句,不记录执行者
- 12c之前版本
alert日志
- 12c开始
$ORACLE_BASE/diag/rdbms/dbname/dbname/log ddl
http://www.orasql.com/blog/archives/2014/09/05/tracking_drop_op.htm
六、 强制审计
Oracle始终进行审计某些与数据库相关的操作,并将它们写入操作系统审计文件。即使已启用数据库审计(AUDIT_TRAIL参数设置为DB),Oracle仍会将强制审计内容写入操作系统文件。
默认情况下,操作系统文件位于$ORACLE_BASE/admin/$ORACLE_SID/adump目录中。在Windows系统上,Oracle数据库还会将此信息写入Windows事件查看器。可以通过设置AUDIT_FILE_DEST初始化参数来更改此目录的位置(重启生效)
强制审计包括以下操作:
- 数据库启动:审计记录内容包括启动实例的操作系统用户,用户终端标识符以及日期和时间戳。此数据存储在操作系统审计跟踪中,因为数据库审计跟踪在成功完成启动之后才可用。
- SYSDBA和SYSOPER登录:Oracle数据库记录所有SYSDBA和SYSOPER连接。
- 数据库关闭:审计记录内容包括关闭实例的操作系统用户,用户终端标识符以及日期和时间戳。
七、 审计相关视图
视图名 | 含义 |
---|---|
SYS.AUD$ | 审计功能基表,其他视图里的数据都是由aud$所得。如果需要删除审计数据,只需要删除aud$中数据既可。 |
DBA_AUDIT_TRAIL | 查询所有审计记录的信息 |
DBA_AUDIT_STATEMENT | DB配置了哪些语句级审计 |
DBA_PRIV_AUDIT_OPTS | DB配置了哪些权限级审计 |
DBA_OBJ_AUDIT_OPTS | DB配置了哪些对象级审计 |
DBA_AUDIT_OBJECT | 查询所有对象跟踪信息,信息完全包含在dba_audit_trail中 |
DBA_AUDIT_SESSION | 查询logon或logoff的信息 |
DBA_AUDIT_EXISTS | 列出audit not exists和audit exists(默认)产生的审计跟踪 |
AUDIT_ACTIONS | 可以查询出aud$等视图中actions列的含义 |
SYSTEM_PRIVILEGE_MAP | 可以查询出aud$等视图中priv$used列的含义(注意前面加'-') |
参考