Oracle使用大量不同的审计方法来监控使用何种权限,以及访问哪些对象。审计不会防止使用这些权限,但可以提供有用的信息,用于揭示权限的滥用和误用。
下表中总结了Oracle数据库中不同类型的审计。
审 计 类 型 |
说 明 |
语句审计 |
按照语句类型审计SQL语句,而不论访问何种特定的模式对象。也可以在数据库中指定一个或多个用户,针对特定的语句审计这些用户 |
权限审计 |
审计系统权限,例如CREATE TABLE或ALTER INDEX。和语句审计一样,权限审计可以指定一个或多个特定的用户作为审计的目标 |
模式对象审计 |
审计特定模式对象上运行的特定语句(例如,DEPARTMENTS表上的UPDATE语句)。模式对象审计总是应用于数据库中的所有用户 |
细粒度的审计 |
根据访问对象的内容来审计表访问和权限。使用程序包DBMS_FGA来建立特定表上的策略 |
DBA如何管理系统和对象权限使用的审计。当需要一定的粒度时,DBA可以使用细粒度的审计来监控对表中某些行或列的访问,而不仅仅是是否访问表。
和审计相关的主要参数
SQL>show parameter audit
audit_file_dest
audit_sys_operations
audit_trail
audit_sys_operations:
默认为false,当设置为true时,所有sys用户(包括以sysdba,sysoper身份登录的用户)的操作都会被记录,audit trail不会写在aud$表中,这个很好理解,如果数据库还未启动aud$不可用,那么像conn /as sysdba这样的连接信息,只能记录在其它地方。如果是windows平台,audti trail会记录在windows的事件管理中,如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中。
audit_trail:
None:是默认值,不做审计;
DB:将audit trail 记录在数据库的审计相关表中,如aud$,审计的结果只有连接信息;
DB,Extended:这样审计结果里面除了连接信息还包含了当时执行的具体语句;
OS:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;
XML:10g里新增的。
注:参数AUDIT_TRAIL不是动态的,为了使AUDIT_TRAIL参数中的改动生效,必须关闭数据库并重新启动。在对SYS.AUD$表进行审计时,应该注意监控该表的大小,以避免影响SYS表空间中其他对象的空间需求。推荐周期性归档SYS.AUD$中的行,并且截取该表。Oracle提供了角色 DELETE_CATALOG_ROLE,和批处理作业中的特殊账户一起使用,用于归档和截取审计表。
audit_file_dest:Audit_trail=OS时文件位置
1.查看数据库审计是否打开
SQL> show parameter audit;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /oracle/app/oracle/admin/PTBCS/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
audit_trail string DB_EXTENDED
audit_sys_operations:审计系统的操作 默认为 false,当设置为 true 时,所有 sys(包括以 sysdba,sysopr 身份登录的用户)操作都会被记录,但记录不会被写在 aud$表中。如果为 windows 平台,会记录在windows事件管理当中。
audit_trail:审计追踪 none 为默认值,11G 之后默认值为‘db’,如果默认值为 none,那么不做审计,说明如下:
DB:将audit trail记录在数据库审计相关的表中,审计只有连接信息
DB_EXTENDED:这样审计还包含当时的执行的具体语句
OS:将 audit trail 记录在系统文件中,文件名有audit_file_dest参数指定
修改语句为:SQL> alter system set audit_trail='db_extended' scope=spfile;
注:参数audit_trail不是动态,为了使此参数中的改动生效,必须关闭数据库并重新启动。在对
sys.aud$进行审计时,还需要监控该表的大小,以免影响system表空间中其他对象的空间需求。
推荐周期性归档sys.aud$中的行,并截取该表。
目前采用计划任务,每日删除上月数据,只保留当月数据。
Audit_file_dest:audit_trail=os时,文件位置。
2.语句审计
每次动作发生时都对其进行审计
SQL> audit on table by access;
SQL> audit on table by session;
只审计一次,默认为 by session ,有时希望审计成功的动作:没有生成错误消息的语句。对于这些语句,添加whenever successful。而有时只关心使用审计语句的命令是否失败,失败原因是权限违犯、用完表空
间中的空间还是语法错误。对于这些情况,使用whenever not successful。
对于大多数类别的审计方法,如果确实希望审计所有类型的表访问或某个用户的任何权限,
则可以指定all而不是单个的语句类型或对象。
所有ALTER SYSTEM选项,例如,动态改变实例参数,切换到下一个日志文件组,以及终
止用户会话
SQL> audit alter system ;
CREATE、ALTER、DROP 或 TRUNCATE 集群
SQL> audit cluster;
CREATE CONTEXT 或 DROP CONTEXT;
SQL> audit context;
CREATE 或 DROP 数据库链接;
SQL> audit database link;
CREATE、ALTER 或 DROP 维数
SQL> audit dimension;
CREATE 或 DROP 目录;
SQL> audit directory;
CREATE、ALTER 或 DROP 索引
SQL> audit index;
CREATE、ALTER 或 DROP 物化视图
SQL> audit materialized view;
由于不存在的引用对象而造成的SQL语句的失败;
SQL> audit not exists;
CREATE 或 DROP FUNCTION、LIBRARY、PACKAGE、PACKAGE BODY 或 PROCEDURE
SQL> audit procedure;
CREATE、ALTER 或 DROP 配置文件
SQL> audit profile;
SQL> audit public database link;
CREATE 或 DROP 公有数据库链接
CREATE 或 DROP 公有同义词
SQL> audit public synonym;
CREATE、ALTER、DROP 或 SET 角色
SQL> audit role;
CREATE、ALTER 或 DROP 回滚段
SQL> audit rollback segment;
CREATE 或 DROP 序列
SQL> audit sequence;
登录和退出
SQL> audit session;
系统权限的 AUDIT 或 NOAUDIT
SQL> audit system audit;
GRANT 或 REVOKE 系统权限和角色
SQL> audit system grant;
CREATE、DROP 或 TRUNCATE 表
SQL> audit table;
CREATE、ALTER 或 DROP 表空间
SQL> audit tablespace;
CREATE、ALTER(启用/禁用)、DROP触发器;具有ENABLE ALL TRIGGERS或DISABLE
ALL TRIGGERS的ALTER TABLE
SQL> audit trigger;
CREATE、ALTER 和 DROP 类型以及类型主体
SQL> audit type;
CREATE、ALTER 或 DROP 用户
SQL> audit user;
CREATE 或 DROP 视图
SQL> audit view;
3.显式指定的语句类型
任何 ALTER SEQUENCE 命令
SQL> audit alter sequence;
任何 ALTER TABLE 命令
SQL> audit alter table;
添加注释到表、视图、物化视图或它们中的任何列
SQL> audit comment table;
删除表或视图中的行
SQL> audit delete table;
执行程序包中的过程、函数或任何变量或游标
SQL> audit execute procedure;
GRANT 或 REVOKE DIRECTORY 对象上的权限
SQL> audit grant directory;
GRANT 或 REVOKE 过程、函数或程序包上的权限
SQL> audit grant procedure;
GRANT 或 REVOKE 序列上的权限
SQL> audit grant sequence;
GRANT或REVOKE表、视图或物化视图上的权限
SQL> audit grant table;
GRANT 或 REVOKE TYPE 上的权限
SQL> audit grant type;
INSERT INTO 表或视图
SQL> audit insert table;
表或视图上的 LOCK TABLE 命令
SQL> audit lock table;
引用序列的CURRVAL或NEXTVAL的任何命令
SQL> audit select sequence;
SELECT FROM 表、视图或物化视图
SQL> audit select table;
在表或视图上执行UPDATE
SQL> audit update table;
SQL> select username,to_char(timestamp,'MM/DD/YY HH24:MI') timestamp
obj_name,action_name,sql_text
from dba_audit_trail
where username = 'SCOTT';
我用的基本查询审计信息,显示结果如下
scott 08/12/21 17:15 JOB_TITLE_IDX CREATE INDEX create index hr. job_title_idx on hr.jobs(job_title)
1 row selected.
4.权限审计
审计系统权限具有与语句审计相同的基本语法,但审计系统权限是在sql_statement_clause中,而不是在语句中,指定系统权限。
SQL> audit alter tablespace by access whenever successful;
使用SYSDBA和SYSOPER权限或者以SYS用户连接到数据库的系统管理员可以利用特殊
的审计,为了启用这种额外的审计级别,可以设置初始参数AUDIT_SYS_OPERATIONS为
TRUE。这种审计记录发送到与操作系统审计记录相同的位置。因此,这个位置是和操作系
统相关的。当使用其中一种权限时执行的所有SQL语句,以及作为用户SYS执行的任何
SQL语句,都会发送到操作系统审计位置。
5.模式对象审计
改变表、序列或物化视图
SQL> audit alter on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
审计任何对象上的命令
SQL> audit AUDIT on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
添加注释到表、视图或物化视图
SQL> audit COMMENT on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
从表、视图或物化视图中删除行
SQL> audit DELETE on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
执行过程、函数或程序包
SQL> audit EXECUTE on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
执行表或视图上的闪操作
SQL> audit FLASHBACK on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
授予任何类型对象上的权限
SQL> audit GRANT on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
创建表或物化视图上的索引
SQL> audit INDEX on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
将行插入表、视图或物化视图中
SQL> audit INSERT on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
锁定表、视图或物化视图
SQL> audit LOCK on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
对 DIRECTORY 对象的内容执行读操作
SQL> audit READ on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
重命名表、视图或过程
SQL> audit RENAME on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
从表、视图、序列或物化视图中选择行
SQL> audit SELECT on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
更新表、视图或物化视图
SQL> audit UPDATE on TEST_DR.TEST BY ACCESS WHENEVER SUCCESSFUL;
6.细粒度审计
称为FGA,审计变得更为关注某个方面,并且更为精确。由称为DBMS_FGA的PL/SQL 程
序包实现FGA。
使用标准的审计,可以轻松发现访问了哪些对象以及由谁访问,但无法知道访问了哪些行
或列。细粒度的审计可解决这个问题,它不仅为需要访问的行指定谓词(或 where 子句),
还指定了表中访问的列。通过只在访问某些行和列时审计对表的访问,可以极大地减少审
计表条目的数量。
例如:用户TAMARA通常每天访问 HR.EMPLOYEES 表,查找雇员的电子邮件地址。系统
管理员怀疑TAMARA正在查看经理们的薪水信息,因此他们建立一个FGA策略,用于审计
任何经理对SALARY列的任何访问:(脱敏策略的使用)
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;
/
ADD_POLICY 添加使用谓词和审计列的审计策略
DROP_POLICY 删除审计策略
DISABLE_POLICY 禁用审计策略,但保留与表或视图关联的策略
ENABLE_POLICY 启用策略
7.与审计相关的数据字典视图
数据字典视图 |
说明 |
|
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 |
|
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 |
对语句生效的审计选项 |
8.保护审计跟踪
审计跟踪自身需要受到保护,特别是在非系统用户必须访问表SYS.AUD$时,内置的角色
DELETE_ANY_CATALOG是非SYS用户可以访问审计跟踪的一种方法(例如,归档和截取审
计跟踪,以确保它不会影响到SYS表空间中其他对象的空间需求)。
为了建立对审计跟踪自身的审计,以 SYSDBA身份连接到数据库,并运行下面的命令:
SQL> audit all on sys.aud$ by access;
现在,所有针对表 SYS.AUD$的动作,包括select、insert、update 和 delete,都记录在
SYS.AUD$自身中。但如果某个人删除了标识对表SYS.AUD$访问的审计记录,这时会发生什么?此时将删除表中的行,但接着插入另一行,记录行的删除。因此,总是存在一些针对SYS.AUD$表的(有意的或偶然的)活动的证据。此外,如果将AUDIT_SYS _OPERATIONS设置为True,使用as sysdba、as sysoper 或以SYS自身连接的任何会话将记录到操作系统审计位置中,甚至Oracle DBA可能都无法访问该位置。因此,有许多合适的安全措施,用于确保记录数据库中所有权限的活动,以及隐藏该活动的任何尝试。
9.将审计相关的表更换表空间
需求:由于AUD$表等审计相关的表存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,最好把AUD$移动到其他的表空间上。可以使用下面的语句来进行移动:
sql>connect / as sysdba;
sql>alter table aud$ move tablespace
sql>alter index I_aud1 rebuild online tablespace
sql> alter table audit$ move tablespace
sql> alter index i_audit rebuild online tablespace
sql> alter table audit_actions move tablespace
sql> alter index i_audit_actions rebuild online tablespace
sql> conn /as sysdba
sql> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/app/oracle/admin/ORCL/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
SQL> alter system set audit_sys_operations=TRUE scope=spfile;
--审计管理用户(以sysdba/sysoper 角色登陆)
SQL> alter system set audit_trail=db,extended scope=spfile;
SQL> startup force;
SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/app/oracle/admin/ORCL/adump
audit_sys_operations boolean TRUE
audit_syslog_level string
audit_trail string DB, EXTENDED
如果在命令后面添加by user则只对user的操作进行审计,如果省去by用户,则对系统中所有的用户进行审计(不包含sys用户).
例:
AUDIT DELETE ANY TABLE; --审计删除表的操作
AUDIT DELETE ANY TABLE WHENEVER NOT SUCCESSFUL; --只审计删除失败的情况
AUDIT DELETE ANY TABLE WHENEVER SUCCESSFUL; --只审计删除成功的情况
AUDIT DELETE,UPDATE,INSERT ON user.table by test; --审计 test 用户对表 user.table
的 delete,update,insert 操作
10.撤销审计
SQL> noaudit all on t_test;
11.将审计结果表从system表空间里移动到别的表空间上
实际上sys.aud$表上包含了两个lob段,并不是简单的move table就可以。
下面是具体的过程:
alter table sys.aud$ move tablespace users;
alter table sys.aud$ move lob(sqlbind) store as( tablespace USERS);
alter table sys.aud$ move lob(SQLTEXT) store as( tablespace USERS);
alter index sys.I_AUD1 rebuild tablespace users;应用
12.语句审计
多层环境下的审计:appserve-应用服务器,jackson-client
AUDIT SELECT TABLE BY appserve ON BEHALF OF jackson;
审计连接或断开连接:
AUDIT SESSION;
AUDIT SESSION BY jeff, lori; -- 指定用户
审计权限(使用该权限才能执行的操作):
AUDIT DELETE ANY TABLE BY ACCESS WHENEVER NOT SUCCESSFUL;
AUDIT DELETE ANY TABLE;
AUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE, EXECUTE PROCEDURE BY
ACCESS WHENEVER NOT SUCCESSFUL;
对象审计:
AUDIT DELETE ON jeff.emp;
AUDIT SELECT, INSERT, DELETE ON jward.dept BY ACCESS WHENEVER SUCCESSFUL;
取消审计:
NOAUDIT session;
NOAUDIT session BY jeff, lori;
NOAUDIT DELETE ANY TABLE;
NOAUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE,EXECUTE PROCEDURE;
NOAUDIT ALL; -- 取消所有statement审计
NOAUDIT ALL PRIVILEGES; --取消所有权限审计
NOAUDIT ALL ON DEFAULT; --取消所有对象审计
13.清除审计信息
DELETE FROM SYS.AUD$;
DELETE FROM SYS.AUD$ WHERE obj$name='EMP';审计相关视图
14.审计相关视图
STMT_AUDIT_OPTION_MAP -- 审计选项类型代码
AUDIT_ACTIONS -- action代码
ALL_DEF_AUDIT_OPTS -- 对象创建时默认的对象审计选项
DBA_STMT_AUDIT_OPTS -- 当前数据库系统审计选项
DBA_PRIV_AUDIT_OPTS -- 权限审计选项
DBA_OBJ_AUDIT_OPTS
USER_OBJ_AUDIT_OPTS -- 对象审计选项
DBA_AUDIT_TRAIL
USER_AUDIT_TRAIL -- 审计记录
DBA_AUDIT_OBJECT
USER_AUDIT_OBJECT -- 审计对象列表
DBA_AUDIT_SESSION
USER_AUDIT_SESSION -- session审计
DBA_AUDIT_STATEMENT
USER_AUDIT_STATEMENT -- 语句审计
DBA_AUDIT_EXISTS -- 使用BY AUDIT NOT EXISTS(排除)选项的审计
DBA_AUDIT_POLICIES -- 审计POLICIES
DBA_COMMON_AUDIT_TRAIL--标准审计+精细审计