审计(Audit)用于监视用户所执行的数据库操作,并且Oracle 会将审计跟踪结果存放到OS 文件(默认位置为$ORACLE_BASE/admin /$ORACLE_SID/adump/),或数据库(存储在system 表空间中的SYS.AUD$表中,可通过视图dba_audit_trail 查看)中。审计可以提供有用的信息,用于揭示权限的滥用和误用。当需要一定的粒度时,DBA 可以使用细粒度的审计来监控对表中某些行或列的访问,而不仅仅是是否访问表。
员工经过长期磨合与沉淀,具备了协作精神,得以通过团队的力量开发出优质的产品。创新互联建站坚持“专注、创新、易用”的产品理念,因为“专注所以专业、创新互联网站所以易用所以简单”。公司专注于为企业提供成都网站设计、成都做网站、微信公众号开发、电商网站开发,小程序定制开发,软件按需策划等一站式互联网企业服务。
在oracle 11g 中,审计功能(AUDIT_TRAIL)是默认开启的。审计数据默认存放SYSTEM 表空间下的AUD$审计字典基表上。开启审计数据库会增加消耗,降低业务性能,因此,如果不是很必要,在安装好数据库后,可适当选择关闭数据库审计功能。
Oracle 公司还推荐使用基于OS 文件的审计日志记录方式(OSaudit trail files),当AUDIT_TRAIL 设置为OS 时,审计记录文件将在AUDIT_FILE_DEST 参数所指定的目录中生成。
一、审计类型
语句审计 |
按照语句类型审计SQL语句,而不论访问何种特定的模式对象。也可以在数据库中指定一个或多个用户,针对特定的语句审计这些用户 |
权限审计 |
审计系统权限,例如CREATE TABLE或ALTER INDEX。和语句审计一样,权限审计可以指定一个或多个特定的用户作为审计的目标 |
模式对象审计 |
审计特定模式对象上运行的特定语句(例如,DEPARTMENTS表上的UPDATE语句)。模式对象审计总是应用于数据库中的所有用户 |
细粒度的审计 |
根据访问对象的内容来审计表访问和权限。使用程序包DBMS_FGA来建立特定表上的策略 |
二、审计位置
审计记录可以发送到SYS.AUD$数据库表或操作系统文件。为了启用审计并指定记录审计记录的位置,将初始参数AUDIT_TRAIL 设置为如下几个值之一:
NONE, FALSE |
禁用审计 |
OS |
启用审计,将审计记录发送到操作系统文件 |
DB, TRUE |
启用审计,将审计记录发送到SYS.AUD$表 |
DB_EXTENDED |
启用审计,将审计记录发送到SYS.AUD$表,并在CLOB列SQLBIND和SQLTEXT中记录额外的信息 |
XML |
启用审计,以XML格式写所有审计记录 |
EXTENDED |
启用审计,在审计跟踪中记录所有列,包括SqlText和SqlBind的值 |
参数AUDIT_TRAIL 不是动态的,为了使AUDIT_TRAIL 参数中的改动生效,必须关闭数据库并重新启动。在对SYS.AUD$表进行审计时,应该注意监控该表的大小,以避免影响SYS 表空间中其他对象的空间需求。推荐周期性归档SYS.AUD$中的行,并且截取该表。
在Oracle11g 中CREATE SESSION 作为受审计的权限来被记录,因此当SYSTEM 表空间因磁盘空间而无法扩展时将导致这部分审计记录无法生成,这将最终导致普通用户的新会话将无法正常创建,普通用户将无法登陆数据库。在这种场景中仍可以使用SYSDBA 身份的用户创建会话,在将审计数据合适备份后删除一部分记录,或者TRUNCATE AUD$都可以解决上述问题。在默认情况下会以AUTOEXTEND ON 自动扩展选项创建SYSTEM 表空间,因此系统表空间在必要时会自动增长,我们所需注意的是磁盘上的剩余空间是否能够满足其增长需求,以及数据文件扩展的上限,对于普通的8k smallfile 表空间而言单个数据文件的最大尺寸是32G。
三、开户审计功能
SQL> alter system set audit_trail=db_extended scope=spfile;
重启数据库生效:
SQL> startup force
四、语句审计:
对于语句审计,audit 命令的格式看起来如下所示:
AUDIT sql_statement_clause BY {SESSION |ACCESS}WHENEVER [NOT] SUCCESSFUL;
参数如下:
sql_statement_clause 包含很多条不同的信息,例如希望审计的SQL 语句类型以及审计什么人。
by access 在每次动作发生时都对其进行审计,by session 只审计一次。默认是by session。
whenever successful 审计成功的动作:没有生成错误消息的语句。
whenever not successful 审计语句的命令是否失败
对于大多数类别的审计方法,如果确实希望审计所有类型的表访问或某个用户的任何权限,则可以指定all 而不是单个的语句类型或对象。
表1-1 列出了可以审计的语句类型,并且在每个类别中包含了相关语句的简要描述。如果指定all,则审计该列表中的任何语句。然而,表1-2 中的语句类型在启用审计时不属于all 类别;必须在audit 命令中显式地指定它们。
表1-1 包括在ALL 类别中的可审计语句
语句 选 项 |
SQL操作 |
ALTER SYSTEM |
所有ALTER SYSTEM选项,例如,动态改变实例参 数,切换到下一个日志文件组,以及终止用户会话 |
CLUSTER |
CREATE、ALTER、DROP或TRUNCATE集群 |
CONTEXT |
CREATE CONTEXT或DROP CONTEXT |
DATABASE LINK |
CREATE或DROP数据库链接 |
DIMENSION |
CREATE、ALTER或DROP维数 |
DIRECTORY |
CREATE或DROP目录 |
INDEX |
CREATE、ALTER或DROP索引 |
MATERIALIZED VIEW |
CREATE、ALTER或DROP物化视图 |
NOT EXISTS |
由于不存在的引用对象而造成的SQL语句的失败 |
PROCEDURE |
CREATE或DROP FUNCTION、LIBRARY、PACKAGE、 PACKAGE BODY或PROCEDURE |
PROFILE |
CREATE、ALTER或DROP配置文件 |
PUBLIC DATABASE LINK |
CREATE或DROP公有数据库链接 |
PUBLIC SYNONYM |
CREATE或DROP公有同义词 |
ROLE |
CREATE、ALTER、DROP或SET角色 |
ROLLBACK |
SEGMENT CREATE、ALTER或DROP回滚段 |
SEQUENCE |
CREATE或DROP序列 |
SESSION |
登录和退出 |
SYNONYM |
CREATE或DROP同义词 |
SYSTEM |
AUDIT系统权限的AUDIT或NOAUDIT |
SYSTEM GRANT |
GRANT或REVOKE系统权限和角色 |
TABLE |
CREATE、DROP或TRUNCATE表 |
TABLESPACE |
CREATE、ALTER或DROP表空间 |
TRIGGER |
CREATE、ALTER(启用/禁用)、DROP触发器;具有 ENABLE ALL TRIGGERS或DISABLE ALL TRIGGERS的ALTER TABLE |
TYPE |
CREATE、ALTER和DROP类型以及类型主体 |
USER |
CREATE、ALTER或DROP用户 |
VIEW |
CREATE或DROP视图 |
表1-2 显式指定的语句类型
语句 选 项 |
SQL操 作 |
ALTER SEQUENCE |
任何ALTER SEQUENCE命令 |
ALTER TABLE |
任何ALTER TABLE命令 |
COMMENT TABLE |
添加注释到表、视图、物化视图或它们中的任何列 |
DELETE TABLE |
删除表或视图中的行 |
EXECUTE PROCEDURE |
执行程序包中的过程、函数或任何变量或游标 |
GRANT DIRECTORY |
GRANT或REVOKE DIRECTORY对象上的权限 |
GRANT PROCEDURE |
GRANT或REVOKE过程、函数或程序包上的权限 |
GRANT SEQUENCE |
GRANT或REVOKE序列上的权限 |
GRANT TABLE |
GRANT或REVOKE表、视图或物化视图上的权限 |
GRANT TYPE |
GRANT或REVOKE TYPE上的权限 |
INSERT TABLE |
INSERT INTO表或视图 |
LOCK TABLE |
表或视图上的LOCK TABLE命令 |
SELECT SEQUENCE |
引用序列的CURRVAL或NEXTVAL的任何命令 |
SELECT TABLE |
SELECT FROM表、视图或物化视图 |
UPDATE TABLE |
在表或视图上执行UPDATE |
注意:
从Oracle Database 11g 开始,只有在初始参数AUDIT_TRAIL 被设置为DB_EXTENDED 时,才填充DBA_AUDIT_TRAIL 中的列SQL_TEXT 和SQL_BIND。默认情况下,AUDIT_TRAIL 的值是DB。
示例:
[oracle@ocp Desktop]$ rlwrap sqlplus / as sysdba
SYS@orcl>show parameter audit_trail
SYS@orcl> alter system set audit_trail=db_extended
scope=spfile;
SYS@orcl> startup force
SYS@orcl>show parameter audit_trail
SYS@orcl> alter user scott account unlock identified by
scott;
SYS@orcl> audit create table by scott by access;
SYS@orcl>select user_name,audit_option,success,failure from
dba_stmt_audit_opts where user_name='SCOTT';
SYS@orcl> conn scott/scott
SCOTT@orcl> create table tt(id int);
SCOTT@orcl> conn / as sysdba
SYS@orcl>select username,to_char(timestamp,'MM/DD/YY
HH24:MI') Timestamp,obj_name, action_name, sql_text from
dba_audit_trail where username= 'SCOTT';
使用noaudit 命令关闭审计,如下所示:
SYS@orcl> noaudit create table by scott;
SYS@orcl> conn scott/scott
SCOTT@orcl> create table ee(id int);
SCOTT@orcl> conn / as sysdba
SYS@orcl>select username,to_char(timestamp,'MM/DD/YY
HH24:MI') Timestamp,obj_name, action_name, sql_text from
dba_audit_trail where username= 'SCOTT';
五、权限统计
审计系统权限具有与语句审计相同的基本语法,但审计系统权限是在sql_statement_clause 中,而不是在语句中,指定系统权限。
例如,将ALTER TABLESPACE 权限授予所有的DBA,生成审计记录。启用对这种权限的审计的命令:
audit alter tablespace by access whenever successful;
每次成功使用ALTER TABLESPACE 权限时,都会将一行内容添加到SYS.AUD$。
使用SYSDBA 和SYSOPER 权限或者以SYS 用户连接到数据库的系统管理员可以利用特殊的审计。为了启用这种额外的审计级别,可以设置初始参数AUDIT_SYS_OPERATIONS 为TRUE。这种审计记录发送到与操作系统审计记录相同的位置。当使用其中一种权限时执行的所有SQL 语句,以及作为用户SYS 执行的任何SQL 语句,都会发送到操作系统审计位置。
SYS@orcl> alter system set AUDIT_SYS_OPERATIONS=true
scope=spfile;
SYS@orcl> startup force
[oracle@ocp Desktop]$ cd /u01/app/oracle/admin/orcl/adump/
Vi 查看审计内容
权限审计示例:
SYS@orcl> audit create table by scott by access;
SYS@orcl> audit session by scott;
SYS@orcl> select user_name,privilege,success,failure from
dba_priv_audit_opts where user_name='SCOTT' order by
user_name;
SYS@orcl> conn scott/scott
SCOTT@orcl> create table tt(id int);
SCOTT@orcl> conn / as sysdba
SYS@orcl>select username,to_char(timestamp,'MM/DD/YY
HH24:MI') Timestamp,obj_name, action_name, sql_text from
dba_audit_trail where username= 'SCOTT';
SYS@orcl> noaudit create table by scott;
六、对象审计
AUDIT schema_object_clause BY {SESSION | ACCESS}WHENEVER [NOT] SUCCESSFUL;
schema_object_clause 指定对象访问的类型以及访问的对象。
可以审计特定对象上14 种不同的操作类型。对象审计选项如下:
对象 选 项 |
说 明 |
ALTER |
改变表、序列或物化视图 |
AUDIT |
审计任何对象上的命令 |
COMMENT |
添加注释到表、视图或物化视图 |
DELETE |
从表、视图或物化视图中删除行 |
EXECUTE |
执行过程、函数或程序包 |
FLASHBACK |
执行表或视图上的闪回操作 |
GRANT |
授予任何类型对象上的权限 |
INDEX |
创建表或物化视图上的索引 |
INSERT |
将行插入表、视图或物化视图中 |
LOCK |
锁定表、视图或物化视图 |
READ |
对DIRECTORY对象的内容执行读操作 |
RENAME |
重命名表、视图或过程 |
SELECT |
从表、视图、序列或物化视图中选择行 |
UPDATE |
更新表、视图或物化视图 |
对象审计示例:
SYS@orcl>show parameter audit_trail
SYS@orcl> alter system set audit_trail=db_extended
scope=spfile;
SYS@orcl>show parameter audit_trail
SYS@orcl> startup force
SYS@orcl> alter user scott account unlock identified by
scott;
SYS@orcl> audit select,insert,delete on scott.dept by
access;
SYS@orcl> select
object_name,object_type,alt,del,ins,upd,sel from
dba_obj_audit_opts;
SYS@orcl> conn scott/scott
SCOTT @orcl> insert into dept values(11,'aa','aa');
SCOTT @orcl> insert into dept values(12,'bb','bb');
SCOTT @orcl> commit;
SCOTT@orcl> conn / as sysdba
SYS@orcl> select timestamp,action_name,sql_text from
dba_audit_trail where owner='SCOTT';
SYS@orcl> noaudit select,insert,delete on scott.dept;
审计查询
SYS@orcl>show parameter audit_trail
SYS@orcl> alter system set audit_trail=db_extended
scope=spfile;
SYS@orcl> startup force
SYS@orcl>show parameter audit_trail
SYS@orcl> alter user scott account unlock identified by
scott;
SYS@orcl> audit select,insert,delete on scott.dept by
access;
SYS@orcl>delete sys.aud$;
SYS@orcl> conn scott/scott
SCOTT @orcl> insert into dept values(13,'cc','cc');
SCOTT @orcl>select * from dept;
SCOTT @orcl>delete from dept where deptno=11;
SCOTT @orcl>update dept set loc='abc' where deptno=12;
SCOTT@orcl> conn / as sysdba
SYS@orcl>select
username,timestamp,owner,action_name,obj_name from
dba_audit_object;
七、细粒度的审计
细粒度的对象审计,或称为FGA,审计变得更为关注某个方面,并且更为精确。由称为DBMS_FGA 的PL/SQL 程序包实现FGA。
使用标准的审计,可以轻松发现访问了哪些对象以及由谁访问,但无法知道访问了哪些行或列。细粒度的审计可解决这个问题,它不仅为需要访问的行指定谓词(或where 子句),还指定了表中访问的列。通过只在访问某些行和列时审计对表的访问,可以极大地减少审计表条目的数量。
程序包DBMS_FGA 具有4 个过程:
ADD_POLICY 添加使用谓词和审计列的审计策略
DROP_POLICY 删除审计策略
DISABLE_POLICY 禁用审计策略,但保留与表或视图关联的策略
ENABLE_POLICY 启用策略
用户wl 通常每天访问HR.EMPLOYEES 表,查找雇员的电子邮件地址。系统管理员怀疑wl 正在查看经理们的薪水信息,因此他们建立一个FGA 策略,用于审计任何经理对SALARY 列的任何访问。
可以使用数据字典视图DBA_FGA_AUDIT_TRAIL 访问细粒度审计的审计记录。如果一般需要查看标准的审计行和细粒度的审计行,则数据字典视图DBA_COMMON_AUDIT_TRAIL 结合了这两种审计类型中的行。
示例如下:
[oracle@ocp Desktop]$ rlwrap sqlplus / as sysdba
SYS@orcl>show parameter audit_trail
SYS@orcl> alter system set audit_trail=db_extended
scope=spfile;
SYS@orcl> startup force
SYS@orcl>show parameter audit_trail
SYS@orcl> create user wl identified by wl;
SYS@orcl> grant create session to wl;
SYS@orcl> grant select on hr.employees to wl;
SYS@orcl> alter user hr account unlock identified by hr;
SYS@orcl> begin
dbms_fga.add_policy(object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'SAL_SELECT_AUDIT',
audit_condition => 'instr(job_id,''_MAN'') > 0',
audit_column => 'SALARY');
end;
/
SYS@orcl> conn wl/wl
WL@orcl> select employee_id, first_name, last_name, email
from hr.employees where employee_id = 114;
WL@orcl> conn / as sysdba
SYS@orcl> select to_char(timestamp,'mm/dd/yy hh34:mi')
timestamp,object_schema, object_name, policy_name,
statement_type from dba_fga_audit_trail where db_user =
'WL';
SYS@orcl> conn wl/wl
WL@orcl> select employee_id, first_name, last_name, salary
from hr.employees where employee_id = 114;
WL@orcl> conn / as sysdba
SYS@orcl> select to_char(timestamp,'mm/dd/yy hh34:mi')
timestamp,object_schema, object_name, policy_name,
statement_type from dba_fga_audit_trail where db_user =
'WL';
第一个查询访问经理信息,但没有访问SALARY 列。第二个查询与第一个查询相同,但是访问了SALARY 列,因此触发了FGA 策略,从而在审计跟踪中生成了一行
八、与审计相关的数据字典视图
数据字典视图 |
说 明 |
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_TRAIL只包含已连接用户的审计行 |
DBA_FGA_AUDIT_TRAIL |
细粒度审计策略的审计跟踪条目 |
DBA_COMMON_AUDIT_TRAIL |
将标准的审计行和细粒度的审计行结合在一个视图中 |
DBA_OBJ_AUDIT_OPTS |
对数据库对象生效的审计选项 |
DBA_PRIV_AUDIT_OPTS |
对系统权限生效的审计选项 |
DBA_STMT_AUDIT_OPTS |
对语句生效的审计选项 |