-
简介
-
特权用户审计
-
数据库审计
-
激活数审计
-
指定审计选项
-
语句审计
-
权限审计
-
对象审计
-
删除审计跟踪
-
使用精细审计
-
使用应用审计
-
附-与审计相关的数据字典视图
-
附-使用AUDIT_TRAIL=db的情况
-
附-审计日常功能与操作命令
-
附-会话登录审计
Oracle 审计(传统审计篇)
写在前面:本文介绍传统审计的语句,它与早于 Oracle Database 12c 的发行版中使用的审计功能相同。AUDIT从 Oracle Database 12c 开始引入了统一审计,它提供了一整套增强的审计功能。为了向后兼容,仍支持传统审核。但是,Oracle 建议您计划将现有审计设置迁移到新的统一审计策略语法。对于新的审计要求,Oracle 建议咱们使用新的统一审计。在将来的主要版本中,可能会不再支持传统审核。
请关注本公众号,后期我也会把统一审计整理出来滴~~
简介
运行 Oracle 数据库时,各类人员经常会以数据库用户身份登录到数据库,并执行各种数据库操作。为了跟踪数据库用户所执行的各种数据库操作,防止用户执行非法操作,可以使用数据库审计 — Audit。审计用于监视用户所执行的数据库操作,并且 Oracle 会将审计跟踪结果存放到 OS 文件或数据库中。
语法:audit::=

审计的分类:

可以多加注意的是:Oracle 会自动审计特权用户所执行的特权操作(如启动和关闭数据库等),并将特权操作的相关信息记载到操作系统的审计跟踪记录中。为了审计特权用户所执行的其他数据库操作,必须设置初始化参数 audit_sys_operations。
另外,对于windows系统,对sys用户的审计信息并不存在AUDIT_FILE_DEST参数指定的目录里,而是在windows的事件管理器中。
metalink解释:Exception: As ‘AUDIT_FILE_DEST’ is invalid on Windows, all Oracle audit trail information on Windows is recorded in the Windows event viewer. Audit SYS User Operations [ID 174340.1]
审计的作用:
-
调查可疑的数据库活动。
-
监视和收集特定活动的数据。 例如,通过审计,可以监视数据库运行高峰期间的总计会话个数。
审计的指导方针:
-
根据审计需求最小化审计选项降低审计跟踪记录个数。假定DBA用户只想监视用户DEVEP在特定时间段的会话个数,那么在设置审计选项时应使用命令AUDIT SESSION BY devep,而不是执行命令 AUDIT SESSION。
-
移动审计表SYS.AUDS到其他表空间上。默认情况下,表SYS,AUDS位于SYSTEM表空间,如果需要经常使用审计跟踪,那么应将该表建立在其他表空间上。
-
监视并定期删除审计跟踪记录。随着时间的推移,审计跟踪记录会越来越多,占用更多空间,所以 DBA 用户应该定期删除不再需要的审计跟踪记录。
-
避免审计跟踪记录被非法用户删除。因为 AUDS表属于 SYS 用户,所以其数据一般情况下只能由DBA用户删除,但如果其他用户具有DELETE-CATALOG-ROLE角色,他们也可以删除审计跟踪记录。为了确保只有DBA用户可以删除审计跟踪记录,不要将DELETE_CATALOG-ROLE角色授予任何其他用户。
特权用户审计
特权用户审计用于审计特权用户所执行的各种数据库操作。当以特权用户连接到数据库.启动和关闭数据库时,Oracle 自动将这些操作的信息记载到 OS 审计跟踪记录中。
默认情况下,Oracle 只会审计特权用户连接、启动数据库和关闭数据库的操作。为了审计特权用户执行的其他操作信息,必须将初始化参数 audit_sys_operations 设置为 TRUE.因为该参数是静态的初始化参数,所以修改了该初始化参数后必须重新自动数据库。
将初始化参数 audit_sys_operations 设置为 TRUE 后,特权用户所执行的任何操作都会被记载到 OS 审计跟踪记录中。
以win为例:
PS C:UsersAdministrator> sqlplus.exe / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on 星期二 12月 5 20:55:24 2023
Copyright (c) 1982, 2016, Oracle. All rights reserved.
连接到:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> create user scott identified by tiger account unlock;
用户已创建。
SQL> grant resource, connect to scott;
授权成功。

数据库审计
数据库审计用于审计数据库用户所执行的数据库操作。为了审计用户所执行的各种数据库操作,必须确认数据库审计已经被激活,然后指定要审计的数据库操作。需要注意,使用数据库审计时,特权用户所执行的数据操作不会被审计。(特权用户记录在audit_file_dest)
激活数审计
查看审计功能是否开启
SQL> show parameter audit_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string D:APPADMINISTRATORVIRTUALA
DMINORCLADUMP
audit_sys_operations boolean TRUE
audit_trail string DB
unified_audit_sga_queue_size integer 1048576
如果没有安装审计,需要执行sql脚本
@$ORACLE_HOME/rdbms/admin/cataudit.sql
audit_sys_operations:
默认为 TURE(12之前为false),当设置为true时,所有sys用户(包括以sysdba,sysoper身份登录的用户)的操作都会被记录,audit trail不会写在aud$表中, 正如前面提到,如果是windows平台,audti trail会记录在windows的事件管理中,如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中。
audit_trail:
// 默认是 DB 意思是:将审计日志记录到数据库的审计相关表中
Others Values:
-- none
Disables standard auditing. This value is the default if the AUDIT_TRAIL parameter was not set in the initialization parameter file or if you created the database using a method other than Database Configuration Assistant. If you created the database using Database Configuration Assistant, then the default is db.
-- os
Directs all audit records to an operating system file. Oracle recommends that you use the os setting, particularly if you are using an ultra-secure database configuration.
-- db
Directs audit records to the database audit trail (the SYS.AUD$ table), except for records that are always written to the operating system audit trail. Use this setting for a general database for manageability.
If the database was started in read-only mode with AUDIT_TRAIL set to db, then Oracle Database internally sets AUDIT_TRAIL to os. Check the alert log for details.
-- db, extended
Performs all actions of AUDIT_TRAIL=db, and also populates the SQL bind and SQL text CLOB-type columns of the SYS.AUD$ table, when available. These two columns are populated only when this parameter is specified. When standard auditing is used with DB, EXTENDED, then virtual private database (VPD) predicates and policy names are also populated in the SYS.AUD$ table.
If the database was started in read-only mode with AUDIT_TRAIL set to db, extended, then Oracle Database internally sets AUDIT_TRAIL to os. Check the alert log for details.
-- xml
Writes to the operating system audit record file in XML format. Records all elements of the AuditRecord node except Sql_Text and Sql_Bind to the operating system XML audit file.
-- xml, extended
Performs all actions of AUDIT_TRAIL=xml, and includes SQL text and SQL bind information in the audit trail.
You can use the SQL AUDIT statement to set auditing options regardless of the setting of this parameter.
In a CDB, the scope of the settings for this initialization parameter is the CDB. Although the audit trail is provided per PDB in a CDB, this initialization parameter cannot be configured for individual PDBs.
——–上面参数的说明————-audit_trail 参数的值可以设置为以下几种:
-
none –不开启 -
os –启用数据库审计,并将数据库审计记录定向到操作系统文件,存储目录为AUDIT_FILE_DEST -
db –开启审计功能 启用数据库审计,并将数据库所有审计记录定向到数据库的SYS.AUD$表 -
db, extended –extened之前的空格必须有,启用数据库审计,并将数据库所有审计记录定向到数据库的SYS.AUD表的SQLBIND列和SQLTEXT列 -
xml –类似os,但是是将审计记录存放于XML格式的文件中 -
xml, extended –将审计记录存放于操作系统的xml文件中并填充sql_text和sql_bind信息 #此参数无法动态修改,因此需要重启数据库才能生效,示例: alter system set AUDIT_TRAIL=db scope=spfile; #对于db和db, extended两种审计模式,如果数据库是read-only模式的,那么数据库默认使用os审计模式,无视已有设置(因为不能向数据库表写入数据)。
当值为OS时,所有的审计记录被写入到操作系统文件,对于高度安全的数据库,Oracle建议采用该设置,理由很简单,高度安全,写入DB的话,整个系统忙得不亦乐乎。
==Oracle12c 以后数据库审计是默认开启的。==
开启审计功能:
SQL> alter system set audit_sys_operations=TRUE scope=spfile;
SQL> alter system set audit_trail=db,extended scope=spfile;
关闭审计功能:
SQL> conn /as sysdba
SQL> show parameter audit
SQL> alter system set audit_trail = none scope=spfile;
/// 关闭审计功能需重启实例
指定审计选项
激活数据库审计后,为了审计特定的数据库操作,必须使用 AUDIT 语句指定要审计的数据库操作。例如,如果要审计建表操作,必须指定审计 CREATE TABLE 语句。设置审计操作时,可以指定以下的审计选项:
BY SESSION: 该选项表示在同一个会话中对完全相同的 SQL 语句只生成一条审计跟踪记录,该选项是默认选项。
BY ACCESS: 该选项表示每执行一次语句生成一条审计跟踪记录。当审计 DDL 语句或 DDL 系统权限时,无论指定 BY ACCESS 还是 BY SESSION 选项,Oracle 总是使用 BY ACCESS 选项。
BY 用户名: 该选项用于指定审计特定的数据库用户。如果不指定该选项,Oracle 会自动审计除特权用户外的所有其他用户。
whenever [not] successful: whenever successful选项用于指定审计执行成功的操作,whenever not successful 选项用于指定审计执行失败的操作。如果忽略这两个选项,则操作无论成功与否都会被审计。
语句审计
语句审计用于审计与特定语句相关的 SOL 操作。例如,当指定审计USER 语句时,Oracle会审计CREATE USER、ALTER USER 和DROP USER 等操作,当指定审计 TABLE 语句时,Oracle 会审计 CREATE TABLE 和 DROP TABLE 等操作。需要注意,当指定了语句审计之后只对将来会话起作用,对当前会话不起作用。
-
设置语的审计
设置语句审计 一般是由特权用户或 DBA 用户完成的,如果要以其他用户身份设置语句审计,那么要求该用户必须具有 AUDIT SYSTEM 系统权限。下面以审计与 TABLE 相关的所有SOL语句为例,说明设置语句审计的方法。示例如下:
PS C:UsersAdministrator> sqlplus / as sysdba
SQL> audit table;
审计已成功。如上所示,因为没有指定要审计的用户,所以会审计除 SYS 外所有其他用户的 CREATE TABLE 和 DROP TABLE 操作。另外,因为设置语句审计时没有指定 WHENEVER [not] SUCCESSFUL 选项,所以不管 CREATE TABLE 和DROP TABLE 等操作执行是否成功,Oracle都会将操作信息记载到审计跟踪记录中。
-
执行语句操作 设置语句审计后,如果用户执行了相关的 SOL 操作,Oracle 会将相应操作信息记载到审计跟踪记录中。示例如下:
create table t20(cola int);
drop table t20;如上所示,当用户 SYSTEM 执行了 CREATE TABLE 和DROP TABLE 等 SOL操作时Oracle 会将该信息记载到审计跟踪记录中。
-
显示审计跟踪结果//dba_audit_trail 激活数据库审计后,审计跟踪会被记载到数据字典表 SYS.AUD$中。通过查询数据字典dba audit trail,可以取得审计跟踪结果,包括 OS 用户名、数据库用户名、操作名、对象名以及操作时间等信息。示例如下:
set lines 200
column username format a20
column obj_name format a20
select username,action_name,obj_name,to_char(timestamp,'YYYY-MM-DD HH24:MI') from dba_audit_trail;
USERNAME ACTION_NAME OBJ_NAME TO_CHAR(TIMESTAM
-------------------- ---------------------------- -------------------- ----------------
OPADMIN CREATE TABLE T20 2023-12-06 10:08
OPADMIN DROP TABLE T20 2023-12-06 10:08 -
查询已经设置的语句审计选项//dba_stmt_audit_opts
-- 查询已经设置的审计选项//dba_stmt_audit_opts;
select user_name, audit_option from dba_stmt_audit_opts;
select * from dba_stmt_audit_opts; -
关闭语句审计
将对应审计语句的audit改为noaudit即可,
noaudit table;
权限审计
权限审计用于审计与系统权限相关的 SQL 操作。例如,指定审计 CREATE TABLE 系统权限时,Oracle 会审计与该权限相关的 CREATE TABLE 操作: 指定审计 CREATE USER 系统权限时,Oracle 会审计与该权限相关的 CREATE USER 操作。需要注意,指定了权限审计后,只对将来会话起作用,对当前会话不起作用。
下面是以审计用户的 CREATE SEQUENCE 系统权限的示例:
-
设置权限审计
-- 创建测试序列
create sequence sep20; -
执行语句操作
create sequence sep20;
-
显示审计跟踪结果//dba_audit_trail
set lines 200
column username format a20
column obj_name format a20
select username,action_name,obj_name,to_char(timestamp,'YYYY-MM-DD HH24:MI') from dba_audit_trail;
USERNAME ACTION_NAME OBJ_NAME TO_CHAR(TIMESTAM
-------------------- ---------------------------- -------------------- ----------------
OPADMIN CREATE SEQUENCE SEP20 2023-12-06 12:09
OPADMIN CREATE TABLE T20 2023-12-06 10:08
OPADMIN DROP TABLE T20 2023-12-06 10:08 -
查询已经设置的权限审计选项 //dba_priv_audit_opts
-- 查询已经设置的权限审计选项 //dba_priv_audit_opts
select user_name, privilege from dba_priv_audit_opts; -
关闭权限审计
NOAUDIT CREATE SEQUENCE;
对象审计
对象审计用于审计特定方案对象上的 SOL 操作。例如,指定审计 SCOTT.EMP 表的 SELECT 选项时,任何用户 (SYS 除外)查询 SCOTT.EMP 表都会被审计;指定审计SCOTT.DEPT 表的ALL 选项时,任何用户(SYS 除外)访SCOTTDEPT 表时都会被审计,需要注意,指定了对象审计后,不仅对将来会话起作用,而且对当前会话也生效。
下面是示例:
-
设置对象审计
-- 审计scott.emp 表的所有sql操作
audit all on scott.emp
// 测试发现 即使是同一条sql,多次执行是会被多次记录的,与 by access 和 by session 无关 -
执行与审计相关的操作
-- 执行相关操作
select ename from scott.emp where deptno=10; -
查询审计跟踪的记录
-- 查询审计记录
set lines 200
column username format a20
column obj_name format a20
select username,action_name,obj_name,to_char(timestamp,'YYYY-MM-DD HH24:MI') from dba_audit_trail;
USERNAME ACTION_NAME OBJ_NAME TO_CHAR(TIMESTAM
-------------------- ---------------------------- -------------------- ----------------
OPADMIN SELECT EMP 2023-12-06 13:53 -
查询已经设置的对象审计选项//dba_obj_audit_opts
select sel, ins, upd, del from dba_obj_audit_opts;
select * from dba_obj_audit_opts; -
关闭对象审计
--
noaudit all on scott.emp
删除审计跟踪
激活数据库审计后,随着时间的推移,审计跟踪会逐渐变大。如果过去的审计信息不再需要,应该删除这些不需要的审计跟踪记录。
示例如下
DELETE FROM sys.aud$
truncate table sys.aud$
使用精细审计
为了审计用户在特定数据行或列上的 SQL 操作,需要使用精细审计(Fine-Grained Audit)。精细审计是使用 Oracle 系统包 DBMS_FGA 实现的。
下面以审计用于更新和查询部门 20 雇员工资的 UPDATE 和 SELECT 操作为例,说明使用精细审计的方法
-
建立FGA策略
建立fga策略是使用过程ADD_POLICY 完成的,要注意的是创建精细审计策略后,无法对其进行修改。如果必须修改策略,请删除并重新创建它。
-- 查看
select * from DBA_AUDIT_POLICIES;
-- 建立FGA策略
exec dbms_fga.add_policy(object_schema=>'scott',object_name=>'emp',policy_name=>'myfga1',audit_condition=>'deptno=20',audit_column=>'sal',statement_types=>'update,select')如上所示,参数 object_schema 用于指定方案名,参 数object_name用于指定数据库对象名,参数 policy_name用于指定 FGA 策略名,参audit_condition 用于指定审计条件,参数 audit_column 用于指定被审计的列,参数 statement_types 用于指定要审计的 SQL 语句。建立FGA 策略 myfga1 后,如果用户在部门 20 的雇员工资上执行了 UPDATE 和SELECT 操作,Oracle 会将该结果存放到数据字典 FGA _LOG$中。
-
执行与FGA策略相关的sql操作
select sal from scott.emp where deptno=20;
select ename, sal from scott.emp where deptno=20;
update scott.emp set sal=sal*1.1 where deptno=20; -
查看精细审计结果
col db_user format a10
col sql_text format a50
select db_user,sql_text from dba_fga_audit_trail;
DB_USER SQL_TEXT
---------- --------------------------------------------------
OPADMIN select sal from scott.emp where deptno=20
OPADMIN select ename, sal from scott.emp where deptno=20
OPADMIN update scott.emp set sal=sal*1.1 where deptno=20
OPADMIN update scott.emp set sal=sal*1.1 where deptno=20 -
禁止精细审计 //dbms_fga.disable_policy
建立FGA策略时,默认情况下Oracle会自动激活精细审计。为了禁止精细审计,可以使用过程DISABLE_POLICY.
-- 禁止精细审计
exec dbms_fga.disable_policy(object_schema=>'scott',object_name=>'emp',policy_name=>'MYFGA1');
-
激活精细审计 //dbms_fga.enable_policy
-- 激活精细审计
exec dbms_fga.enable_policy(object_schema=>'scott',object_name=>'emp',policy_name=>'MYFGA1'); -
删除FGA策略
-- 删除fga策略
exec dbms_fga.drop_policy(object_schema=>'scott',object_name=>'emp',policy_name=>'MYFGA1'); -
删除审计记录
-- 删除审计记录
truncate table sys.fga_log$;
使用应用审计
应用审计用于监视 DML 操作所引起的数据变化。使用数据库审计时,Oracle 会将 OS 用户名、数据库用户名、数据库操作以及操作时间等信息记载到审计跟踪记录中,但不会记载数据库数据的变化。为了审计 DML 操作所引起的数据变化,必须使用应用审计,应用审计可以使用DML触发器实现。下面以审计 EMP 表的数据变化为例,说明使用应用审计的方法。
-
建立审计表
使用应用审计,必须建立专门用户存放数据变化的审计表。
-- 建立用于审计雇员工资变化的审计表 audit_emp_change:
sqlplus scott/tiger
CREATE TABLE audit_emp_change (
name VARCHAR2(10),
oldsal NUMBER(6, 2),
newsal NUMBER(6, 2),
time DATE
);如上所示,执行以上语句后,会建立 audit_emp_change 表,其中 name 列用于存放雇员名,oldsal 用于存放雇员旧工资,newsal 用于存放员新工资,time 用于存放 DML 操作时间。
-
建立DML触发器
为了审计表的数据变化,必须建立DML触发器。
-- 建立用于审计雇员工资变化的触发器 (在scott用户下创建)
CREATE OR REPLACE TRIGGER tr_sal_change
AFTER UPDATE OF sal ON emp
FOR EACH ROW
DECLARE
v_temp INT;
BEGIN
SELECT
COUNT(*)
INTO v_temp
FROM
audit_emp_change
WHERE
name=:old.ename;
IF v_temp=0 THEN
INSERT INTO audit_emp_change VALUES (
:old.ename,
:old.sal,
:new.sal,
sysdate
);
ELSE
UPDATE audit_emp_change
SET
oldsal=:old.sal,
newsal=:new.sal,
time=sysdate
WHERE
name=:old.ename;
END IF;
END;
/ -
建立触发器 tr_sal_change 后,修改雇员工资时,会将每个雇员的工资变化全部写入审计表 audit_emp_change中。
SQL> update emp set sal=sal*1 where deptno=30;
已更新 6 行。 -
查看审计结果
通过查询自定义审计表 audit_emp_change ,可以查看雇员的工作变化以及操作时间等信息。
SQL> select name, oldsal, newsal,to_char(time,'YYYY-MM-DD HH24:MI') from audit_emp_change;
NAME OLDSAL NEWSAL TO_CHAR(TIME,'YY
---------- ---------- ---------- ----------------
ALLEN 1600 1600 2023-12-06 22:50
WARD 1250 1250 2023-12-06 22:50
MARTIN 1250 1250 2023-12-06 22:50
BLAKE 2850 2850 2023-12-06 22:50
TURNER 1500 1500 2023-12-06 22:50
JAMES 950 950 2023-12-06 22:50
已选择 6 行。 -
附-触发器的简单维护
触发器的查询、启停
-- 查看触发器状态的方法
SELECT object_name, status FROM user_objects WHERE object_type = 'TRIGGER';
SELECT trigger_name, status FROM user_triggers;
-- 启用/禁用触发器的方法
-- 启用触发器
ALTER TRIGGER trigger_name ENABLE;
-- 禁用触发器
ALTER TRIGGER trigger_name DISABLE;
SQL>connect / as sysdba;
SQL> alter table aud$ move tablespace new_tablespace;
SQL> alter index I_aud1 rebuild online tablespace new_tablespace;
SQL> alter table audit$ move tablespace new_tablespace;
SQL> alter index i_audit rebuild online tablespace new_tablespace;
SQL> alter table audit_actions move tablespace new_tablespace;
SQL> alter index i_audit_actions rebuild online tablespace new_tablespace;
附-与审计相关的数据字典视图
下表包含了与审计相关的数据字典视图。
数据字典视图 | 说 明 |
---|---|
AUDIT_ACTIONS | 包含审计跟踪动作类型代码的描述,例如INSERT、DROP VIEW、DELETE、LOGON和LOCK |
DBA_AUDIT_OBJECT | 与数据库中对象相关的审计跟踪记录 |
DBA_AUDIT_POLICIES | 数据库中的细粒度审计策略 |
DBA_AUDIT_SESSION | 与CONNECT和DISCONNECT相关的所有审计跟踪记录 |
DBA_AUDIT_STATEMENT | 与GRANT、REVOKE、AUDIT、NOAUDIT和ALTER SYSTEM命令相关的审计跟踪条目 |
DBA_AUDIT_TRAIL | 包含标准审计跟踪条目。USER_AUDIT_TRAILUSER_TRAIL_AUDIT只包含已连接用户的审计行 |
DBA_FGA_AUDIT_TRAIL | 细粒度审计策略的审计跟踪条目 |
DBA_COMMON_AUDIT_TRAIL | 将标准的审计行和细粒度的审计行结合在一个视图中 |
DBA_OBJ_AUDIT_OPTS | 对数据库对象生效的审计选项 |
DBA_PRIV_AUDIT_OPTS | 对系统权限生效的审计选项 |
DBA_STMT_AUDIT_OPTS | 对语句生效的审计选项 |
附-使用AUDIT_TRAIL=db的情况
AUDIT_TRAIL=db 时,审计日志存放在数据库中,查询将变得更加灵活
审计表默认安装在SYSTEM表空间。可以将相关表迁移到其他表空间
SQL>connect / as sysdba;
SQL> alter table aud$ move tablespace new_tablespace;
SQL> alter index I_aud1 rebuild online tablespace new_tablespace;
SQL> alter table audit$ move tablespace new_tablespace;
SQL> alter index i_audit rebuild online tablespace new_tablespace;
SQL> alter table audit_actions move tablespace new_tablespace;
SQL> alter index i_audit_actions rebuild online tablespace new_tablespace;
审计功能的使用:
数据库打开的语句审计功能
select nvl(t.user_name,'EVERY_USER) 审计用户,t.audit_option 操作类型,t.success,t.failure from dba_stmt_audit_opts t;
解析:SYSTEM WIDE AUDITING 对任何用户做了audit_option中的操作时,结果为success或者failure进行审计
数据库打开的权限审计功能
select nvl(t.user_name,'EVERY_USER) 审计用户,t.audit_option 操作类型,t.success,t.failure from dba_priv_audit_opts t;
解析:SYSTEM WIDE AUDITING 对任何用户做了audit_option中的操作时,结果为success或者failure进行审计
数据库审计总体情况
select coung(*) from dba_audit_trail where t.timestamp > date '2021-01-01' and t.timestamp < date '2021-06-30';
解析:数据库审计功能总共审计的条数,包含各个功能审计的内容。
数据库语句审计
select count(*) from dba_audit_statement t where t.timestamp > date '2021-01-01' and t.timestamp < date '2021-06-30';
select t.USERNAME,count(t.USERNAME) from dba_audit_statement t where t.timestamp > date '2021-01-01' and t.timestamp < date '2021-06-30' group by t.USERNAME order by t.USERNAME;
select t.ACTION_NAME,count(t.ACTION_NAME) from dba_audit_statement t where t.timestamp > date '2021-01-01' and t.timestamp < date '2021-06-30' group by t.ACTION_NAME order by t.ACTION_NAME;
解析:可查看某用户被语句审计的次数,具体行为可查看更为详细的审计内容。
数据库对象审计
select count(*) from dba_audit_object t where t.timestamp > date '2021-01-01' and t.timestamp < date '2021-06-30';
select t.USERNAME,count(t.USERNAME) from dba_audit_object t where t.timestamp > date '2021-01-01' and t.timestamp < date '2021-06-30' group by t.USERNAME order by t.USERNAME;
select t.ACTION_NAME,count(t.ACTION_NAME) from dba_audit_statement t where t.timestamp > date '2021-01-01' and t.timestamp < date '2021-06-30' group by t.ACTION_NAME order by t.ACTION_NAME;
解析:可查看某用户被对象审计的次数,具体行为可查看更为详细的审计内容。
数据库会话情况审计
select count(*) from dba_audit_session t where t.timestamp > date '2021-01-01' and t.timestamp < date '2021-06-30';
select t.USERNAME,count(t.USERNAME) from dba_audit_session t where t.timestamp > date '2021-01-01' and t.timestamp < date '2021-06-30' group by t.USERNAME order by t.USERNAME;
select t.ACTION_NAME,count(t.ACTION_NAME) from dba_audit_session t where t.timestamp > date '2021-01-01' and t.timestamp < date '2021-06-30' group by t.ACTION_NAME order by t.ACTION_NAME;
解析:可查看某用户被会话审计的次数,具体行为可查看更为详细的审计内容
附-审计相关的表安装
审计相关的表安装
SQL> connect / AS SYSDBA
SQL> select * from sys.aud$; --没有记录返回
SQL> select * from dba_audit_trail; - 没有记录返回
如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。
SQL> connect / as sysdba
SQL> @$ORACLE_HOME/rdbms/admin/cataudit.sql
审计表安装在SYSTEM表空间。所以要确保SYSTEM表空间又足够的空间存放审计信息。
安装后要重启数据库
基于Oracle的稳定性及性能考虑,可以将审计相关的表移动到其他表空间。
connect / as sysdba;
alter table aud$ move tablespace ;
alter index I_aud1 rebuild online tablespace ;
alter table audit$ move tablespace;
alter index i_audit rebuild online tablespace ;
alter table audit_actions move tablespace ;
alter index i_audit_actions rebuild online tablespace ;
附-审计日常功能与操作命令
语句审计:跟踪会话的连接和注销
audit session by itpux; -- 审计指定用户的连接或断开连接操作
noaudit session by itpux; --取消审计前面加 no
audit session; --审计用户连接或断开连接操作
noaudit session; --取消审计前面加 no
查看审计action对应的编码:
select name from audit_actions where action=100;
select name from audit_actions where action=101;
例子查询结果
SQL> select name from audit_actions where action=1;
NAME
----------------------------
CREATE TABLE
语句审计(审计create table,drop table,truncate table):
audit table by itpux; --成功与否都生成审计线索
audit table by itpux whenever successful; --只有成功生成审计线索
audit table by itpux whenever not successful; --只有失败生成审计线索
noaudit table by itpux;
audit table; --审计所有表
audit table whenever successful;
audit table whenever not successful;
noaudit table;
语句审计(审计dml语句):
audit insert table by itpux; --审计表插入
audit insert table by itpux whenever successful;
audit insert table by itpux whenever not successful;
audit insert table by itpux by access;
audit insert table by itpux by access whenever successful;
audit insert table by itpux by access whenever not successful;
noaudit insert table by itpux;
(by access每次都生成一条审计记录,
by session相同操作只生成一条审计记录)
查看用户被启用的语句审计的选项:
col audit_option for a20
select audit_option,failure,success,user_name from dba_stmt_audit_opts;
特权审计(使用了特定的系统权限才会触发审计线索):
audit create any table; --创建任何表进行审计
audit create any table by itpux; --创建表itpux 进行审计
audit drop any table by itpux;
audit select any table by itpux by session;
查看用户被启用的特权审计的选项:
select privilege,user_name from dba_priv_audit_opts order by user_name;
对象审计(跟踪指定对象权限的操作):
audit delete on scott.e; 跟踪表scott 的delter 权限
audit delete on scott.e by session;
audit delete on scott.e by session whenever successful;
audit delete on scott.e by session whenever not successful;
audit select on scott.emp by access;
audit delete on scott.e by access whenever successful;
audit delete on scott.e by access whenever not successful;
noaudit delete on scott.e;
查看用户被启用的对象审计的选项:
col owner for a10
col object_name for a15
col object_type for a15
select * from dba_obj_audit_opts where owner='scott';
successful /not successful
s --> session
a --> access
取消所有statement审计
noaudit all;
取消所有权限审计
noaudit all privileges;
取消所有对象审计
noaudit all on default;
将审计线索保存到数据库:
alter system set audit_trail=db scope=spfile;
aud$
col obj$creator for a10
col userid for a10
col userhost for a22
col obj$name for a10
col ntimestamp# for a28
col comment$text for a30
附-会话登录审计
audit session by itpux; -- 审计指定用户的连接或断开连接操作
noaudit session by itpux; --取消审计前面加 no
audit session; --审计用户连接或断开连接操作
noaudit session; --取消审计前面加 no
audit session whenever not successful;
测试语句: // 只对登录失败的用户进行审计
audit session by opadmin whenever not successful;
audit session by test1 whenever not successful;
aud$定位错误用户密码登陆数据库的具体信息
-
客户端使用错误的用户密码登陆数据库
PS C:UsersAdministrator> sqlplus test/test333@orcl
ORA-01017: invalid username/password; logon denied -
查询最近1天由于密码错误登陆失败的信息
可以根据查询结果定位到是哪台机器使用错误的用户密码尝试登陆数据库。
select sessionid, userid, userhost, comment$text, spare1, ntimestamp#
from aud$
where returncode = 1017
and ntimestamp# > sysdate - 1; -
查询当前审计中有哪些returncode值
SQL> select distinct returncode from aud$;
RETURNCODE
----------
2002
1017查询这些值对应的相关错误信息:
$ oerr ora 1017
参考:
-
书刊《精通Oracle10G系统管理》 -
Oracle 审计测试与总结 – LWJ303 – 博客园 (cnblogs.com)
原文始发于微信公众号(运维小九九):Oracle 审计(传统审计篇)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/218589.html