Oracle数据库审计
保证的安全有两种方式,一种是通过权限的存取控制机制,即通过预先控制来防止安全事件的发生;另一种是数据库审计,即对数据库活动做跟踪记录,当发生安全事件时,通过对数据库活动记录进行审计来发现并修复安全问题。
oracle使用大量不同的审计方法来监控使用何种权限,以及访问哪些对象。审计不会防止使用这些权限,但可以提供有用的信息,用于揭示权限的滥用和误用。数据库审计的主要对象包括数据库链接、sql语句执行、数据库对象访问等方面。审计记录存储的位置有两种选择:一种是存储在操作文件中,一种是存储在system表空间的sys.aud$表中。
1、和审计相关的参数
(1) audit_sys_operations
(2) audit_trail
(3) audit_file_dest:指定审计信息的文件夹
sql>show parameter audit –查询和审计相关的两个参数
2、audit_sys_operations参数
audit_sys_operations参数审计sysdba的活动,默认值false,相关的审计信息记录在操作系统文件中(因为有可能记录时数据库还未启动)。当参数值为false时,以下操作系统会强制记录在audit_file_dest指定的文件夹中:
(1) 用管理员权限连接实例
(2) 启动数据库
(3) 关闭数据库
audit_sys_operations参数设置为true后,作为sysdba和sysoper连接数据库的用户所发布的每条语句都会被写入操作系统的审计中,从而能够给出dba所进行操作的完整记录。设置audit_sys_operations参数的语句如下:
sql>alter system set audit_sys_operations=true scope=spfile;
sql>alter system set audit_sys_operations=false scope=spfile;
3、audit_trail 参数
(1)audit_trail 参数的值可以设置为以下几种:
? none:不审计,默认值。
? db:开启审计功能,将audit记录到sys.aud$表(审计的结果只有连接信息,不记录到sqlbind和sqltext字段)。
? os:审计记录写入一个操作系统文件。
? db,extended:开启审计功能,将audit记录到sys.aud$表(审计信息除了连接信息还包含了当时执行的具体语句,记录到sqlbind和sqltext字段)。
? xml:审计记录写入xml格式的操作系统文件。
? xml,extended:审计记录写入xml格式的操作系统文件,包括sqlbind和sqltext值。
说明:这个参数是写到spfile里面的静态参数,需要重启数据库。
(2)设置参数值
sql> alter system setaudit_trail='db' scope=spfile;
说明:参数audit_trail不是动态的,为了使audit_trail参数中的改动生效,必须关闭数据库并重新启动。在对sys.aud$表进行审计时,应该注意监控该表的大小,以避免影响sys表空间中其他对象的空间需求。
4、开启与关闭审计
(1) 开启审计案例
sql>conn /as sysdba
sql>show parameter audit
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 –对比先后两次的参照值
(2) 关闭审计案例
sql>conn /as sysdba
sql>show parameter audit
sql>alter system set audit_trail=none scope=spfile;
sql>startup force --完成审计的关闭
sql>conn /as sysdba
sql>show parameter audit –对比先后两次的参照值
(3)审计相关的表安装
sqlplus> connect / as sysdba
sqlplus> select * from sys.aud$;
sqlplus> select * from dba_audit_trail;
如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。方法如下:
sqlplus> connect / as sysdba
sqlplus> @$oracle_home/rdbms/admin/cataudit.sql
审计表安装在system表空间。所以要确保system表空间又足够的空间存放审计信息。安装后要重启数据库。
5、审计类型
下表中总结了oracle数据库中不同类型的审计。
审 计 类 型 |
说 明 |
语句审计 |
按照语句类型审计sql语句,而不论访问何种特定的模式对象;也可以在数据库中指定一个或多个用户,针对特定的语句审计这些用户。 |
权限审计 |
审计系统权限,例如create table或alter index。和语句审计一样,权限审计可以指定一个或多个特定的用户作为审计的目标。 |
模式对象审计 |
审计特定模式对象上运行的特定语句(例如,departments表上的update语句);模式对象审计总是应用于数据库中的所有用户。 |
细粒度的审计 |
根据访问对象的内容来审计表访问和权限;使用程序包dbms_fga来建立特定表上的策略。 |
(1) 语句级审计
所有类型的审计都使用audit命令来打开审计,使用noaudit命令来关闭审计。对于语句审计,audit命令的格式如下所示:
audit sql_statement_clause by {session |access}
whenever [not] successful;
其中:
? sql_statement_clause包含很多条不同的信息,例如希望审计的sql语句类型以及审计什 么人。
? 希望在每次动作发生时都对其进行审计(by access);动作重复发生时只审计一次(by session)。默认是by session。
? 审计成功执行的语句,使用wheneversuccessful。审计没有成功执行的语句,使用 whenever not successful。
例如:按常规方式审计成功的和不成功的登录,这需要两个audit命令:
sql>audit session whenever successful;
sql>audit session whenever not successful;
? 对于大多数类别的审计方法,如果确实希望审计所有类型的表访问或某个用户的任何权限,则可以指定all而不是单个的语句类型或对象。
表1列出了可以审计的语句类型,并且在每个类别中包含了相关语句的简要描述。如果指定all,则审计该列表中的任何语句。表2中的语句类型在启用审计时不属于all类别;必须在audit命令中显式地指定它们。
表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视图 |
表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 |
? 案例1:
sql> conn / as sysdba
--可以使用如下命令审计 hr创建的索引
sql> audit index by hr;
sql> conn hr/hr –hr用户登陆
sql> create index job_title_idx onhr.jobs(job_title);
sql> conn / as sysdba
--检查数据字典视图dba_audit_trail中的审计跟踪
sql> select username,to_char(timestamp,'mm/dd/yy hh24:mi') timestamp, obj_name, action_name,sql_text from dba_audit_trail where username = 'hr';
--关闭hr.jobs表上hr的审计
sql> noaudit index by hr;
? 案例2:
sql> conn / as sysdba
--审计数据库中所有的create/drop/alter table语句。
sql> audit table by scott by access;
sql> conn scott/abc123
sql> create table taudit1(a int);
sql> create table taudit1(a int);
sql> insert into taudit1 values(1);
sql> select * from taudit1;
sql> insert into taudit1 values(1);
sql> conn / as sysdba
sql> select username, timestamp, owner,action_name, obj_name, returncode from dba_audit_object where username='scott';
说明:所有scott用户创建表的语句均被审计,returncode表示返回码,0表示正确执行,955表示错误:“名称已由现有对象使用”。
(2) 权限级审计
审计系统权限具有与语句审计相同的基本语法,需要在sql_statement_clause上指定系统权限。例如,可能希望将altertablespace权限授予所有的dba,但希望在发生这种情况时生成审计记录。启用对这种权限的审计的命令如下:
sql> audit alter tablespace by access whenever successful;
此时,每次成功使用alter tablespace权限时,都会将一行内容添加到sys.aud$。
? 案例
sql> conn / as sysdba
sql> audit select table by scott bysession;
sql> conn scott/abc123
sql> select * from taudit1;
sql> select * from taudit1;
sql> conn / as sysdba
sql> select username, timestamp, owner,action_name, obj_name, returncode from dba_audit_object where username='scott';
(3) 对象级审计
审计对各种模式对象的访问的命令格式如下:
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 |
更新表、视图或物化视图 |
? 案例:审计hr.jobs表上所有用户每次成功进行的insert和update命令
sql> conn / as sysdba
sql> audit insert, update on hr.jobs byaccess whenever successful;
sql> conn hr/hr –hr用户登陆
sql> insert into hr.jobs (job_id,job_title, min_salary, max_salary) values ('in_cfo','internet chief funofficer', 7500, 50000);
sql> insert into hr.jobs (job_id,job_title, min_salary, max_salary) values ('oe_vld','order entry ccvalidation', 5500, 20000);
sql> conn / as sysdba
--检查数据字典视图dba_audit_trail中的审计跟踪
sql> select username,to_char(timestamp,'mm/dd/yy hh24:mi') timestamp,
2 obj_name, action_name, sql_text from dba_audit_trail
3 where username = 'hr';