ORACLE AUDIT
审计(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 只审计一次。默认是bysession。
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
注意:
从OracleDatabase 11g 开始,只有在初始参数AUDIT_TRAIL 被设置为DB_EXTENDED 时,才填充DBA_AUDIT_TRAIL 中的列SQL_TEXT 和SQL_BIND。默认情况下,AUDIT_TRAIL的值是DB。
示例:
[oracle@ocpDesktop]$ rlwrap sqlplus / as sysdba
SYS@orcl>showparameter audit_trail
SYS@orcl>alter system set audit_trail=db_extended
scope=spfile;
SYS@orcl>startup force
SYS@orcl>showparameter audit_trail
SYS@orcl>alter user scott account unlock identified by
scott;
SYS@orcl>audit create table by scott by access;
SYS@orcl>selectuser_name,audit_option,success,failure from
dba_stmt_audit_optswhere user_name='SCOTT';
SYS@orcl>conn scott/scott
SCOTT@orcl>create table tt(id int);
SCOTT@orcl>conn / as sysdba
SYS@orcl>selectusername,to_char(timestamp,'MM/DD/YY
HH24:MI')Timestamp,obj_name, action_name, sql_text from
dba_audit_trailwhere 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>selectusername,to_char(timestamp,'MM/DD/YY
HH24:MI')Timestamp,obj_name, action_name, sql_text from
dba_audit_trailwhere username= 'SCOTT';
五、权限统计
审计系统权限具有与语句审计相同的基本语法,但审计系统权限是在sql_statement_clause中,而不是在语句中,指定系统权限。
例如,将ALTERTABLESPACE 权限授予所有的DBA,生成审计记录。启用对这种权限的审计的命令:
auditalter tablespace by access whenever successful;
每次成功使用ALTERTABLESPACE 权限时,都会将一行内容添加到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@ocpDesktop]$ 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_optswhere 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>selectusername,to_char(timestamp,'MM/DD/YY
HH24:MI')Timestamp,obj_name, action_name, sql_text from
dba_audit_trailwhere username= 'SCOTT';
SYS@orcl>noaudit create table by scott;
六、对象审计
AUDITschema_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>showparameter audit_trail
SYS@orcl>alter system set audit_trail=db_extended
scope=spfile;
SYS@orcl>showparameter 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,selfrom
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_trailwhere owner='SCOTT';
SYS@orcl>noaudit select,insert,delete on scott.dept;
审计查询
SYS@orcl>showparameter audit_trail
SYS@orcl>alter system set audit_trail=db_extended
scope=spfile;
SYS@orcl>startup force
SYS@orcl>showparameter 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>deletesys.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_namefrom
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@ocpDesktop]$ rlwrap sqlplus / as sysdba
SYS@orcl>showparameter audit_trail
SYS@orcl>alter system set audit_trail=db_extended
scope=spfile;
SYS@orcl>startup force
SYS@orcl>showparameter 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
fromhr.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_typefrom dba_fga_audit_trail where db_user =
'WL';
SYS@orcl>conn wl/wl
WL@orcl>select employee_id, first_name, last_name, salary
fromhr.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_typefrom 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
对语句生效的审计选项
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。