Oracle数据库安全审计管理一、审计功能介绍二、审计相关的参数与视图1. audit_sys_operations2. audit_trail3. 审计相关的视图三、审计级别与权限1.审计级别1.1 statement(语句)1.2 privilege(权限) 1.3 object(对象)2.审计选项:by access(访问) / by session(会话)3. whenever [not] successful4.审计的细粒度四、审计功能的安装
一、审计功能介绍
审计(audit)用于监视用户所执行的数据库操作,审计记录可存在数据字典表(称为审计记录:
01.存储在system表空间中的 sys.aud$表中,可通过视图dba_audit_trail查看)或操作系统审计记录中( 02.默认位置为$oracle_base/admin/$oracle_sid/adump/)。
默认情况下审计是没有开启的。10g
默认情况下审计是开启的。11gR2+
例如:数据被非授权用户所删除,此时安全管理员可决定对该数据库的所有连接进行审计,以及对数据库的所有表的成功地或不成功地删除进行审计。
审计语句的成功执行、不成功执行,或者其两者。
对每一用户会话审计语句执行一次或者对语句每次执行审计一次。
对全部用户或指定用户的活动的审计。
但有些功能不管开不开审计,都是会被记录的:
用管理员权限连接instance;启动数据库;关闭数据库。
二、审计相关的参数与视图
1. audit_sys_operations
1) audit_sys_operations
默认为false,当设置为true时,所有sys用户(包括以sysdba, sysoper身份登录的用户)的操作都会被记录.
audit trail不会写在aud$表中,这个很好理解,如果数据库还未启动aud$不可用,那么像conn /as sysdba这样的连接信息,只能记录在其它地方。
如果是windows平台,audti trail会记录在windows的事件管理中,
如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中。
show parameter audit_sys_operations show parameter audit_file_dest
SQL> show parameter audit NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ audit_file_dest string /data/app/oracle/admin/orcl/ad ump audit_sys_operations boolean FALSE audit_syslog_level string audit_trail string DB SQL> // 默认是 DB 意思是:将审计日志记录到数据库的审计相关表中
audit_trail 的value值为NONE表示不开启;
audit_trail 的value值为FALSE表示不开启;
audit_trail 的value值为DB表示开启;
audit_trail 的value值为TURE表示开启
audit_trail 的value值为OS表示审计记录写入一个操作系统文件
SQL> desc aud$ //默认的是记录到这个上面,默认的审计结果只有连接信息 Name Null? Type ----------------------------------------- -------- ---------------------------- SESSIONID NOT NULL NUMBER ENTRYID NOT NULL NUMBER STATEMENT NOT NULL NUMBER TIMESTAMP# DATE USERID VARCHAR2(30) USERHOST VARCHAR2(128) TERMINAL VARCHAR2(255) ACTION# NOT NULL NUMBER RETURNCODE NOT NULL NUMBER OBJ$CREATOR VARCHAR2(30) OBJ$NAME VARCHAR2(128) AUTH$PRIVILEGES VARCHAR2(16) AUTH$GRANTEE VARCHAR2(30) NEW$OWNER VARCHAR2(30) NEW$NAME VARCHAR2(128) SES$ACTIONS VARCHAR2(19) SES$TID NUMBER LOGOFF$LREAD NUMBER LOGOFF$PREAD NUMBER LOGOFF$LWRITE NUMBER LOGOFF$DEAD NUMBER LOGOFF$TIME DATE COMMENT$TEXT VARCHAR2(4000) CLIENTID VARCHAR2(64) SPARE1 VARCHAR2(255) SPARE2 NUMBER OBJ$LABEL RAW(255) SES$LABEL RAW(255) PRIV$USED NUMBER SESSIONCPU NUMBER NTIMESTAMP# TIMESTAMP(6) PROXY$SID NUMBER USER$GUID VARCHAR2(32) INSTANCE# NUMBER PROCESS# VARCHAR2(16) XID RAW(8) AUDITID VARCHAR2(64) SCN NUMBER DBID NUMBER SQLBIND CLOB SQLTEXT CLOB OBJ$EDITION VARCHAR2(30) SQL>
2. audit_trail
none:是默认值,不做审计;
db:将audit trail 记录在数据库的审计相关表中,如aud$,审计的结果只有连接信
息;
db,extended:这样审计结果里面除了连接信息还包含了当时执行的具体语句;
os:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;
xml:10g里新增的。
show parameter audit_trail NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ audit_trail string DB SQL> 注:这两个参数是static参数,需要重新启动数据库才能生效。
3. 审计相关的视图
dba_audit_trail:
保存所有的audit trail,实际上它只是一个基于aud$的视图。其它的视图dba_audit_session,dba_audit_object,dba_audit_statement 都只是dba_audit_trail的一个子集。
dba_stmt_audit_opts:
可以用来查看statement审计级别的audit options,即数据库设置过哪些statement级别的审计。dba_obj_audit_opts,dba_priv_audit_opts视图功能与之类似
all_def_audit_opts:
用来查看数据库用on default子句设置了哪些默认对象审计。
三、审计级别与权限
1.审计级别
当开启审计功能后,可在三个级别对数据库进行审计:statement(语句)、privilege
(权限)、object(对象)。
1.1 statement(语句)
statement
语句审计,对某种类型的sql语句审计,不指定结构或对象。比如audit table 会审计
数据库中所有的create table,drop table,truncate table语句,alter session by cmy
会审计cmy用户所有的数据库连接。
1.2 privilege(权限)
privilege
权限审计,当用户使用了该权限则被审计,如执行grant selectany table to a,当执
行了audit select any table语句后,当用户a 访问了用户b的表时(如select * from
b.t)会用到select any table权限,故会被审计。注意用户是自己表的所有者,所以用
户访问自己的表不会被审计。
1.3 object(对象)
object
对象审计,对一特殊模式对象上的指定语句的审计. 如审计on关键字指定对象的相关
操作,如aduit alter,delete,drop,insert on cmy.t by itpux; 这里会对cmy用户的t表
进行审计,但同时使用了by子句,所以只会对scott用户发起的操作进行审计。
注意:
oracle没有提供对schema中所有对象的审计功能,只能一个一个对象审计,对于后面
创建的对象,oracle则提供on default子句来实现自动审计,比如执行audit drop on
defaultby access;后,对于随后创建的对象的drop操作都会审计。但这个default会
对之后创建的所有数据库对象有效,似乎没办法指定只对某个用户创建的对象有效,
想比 trigger可以对schema的ddl进行“审计”,这个功能稍显不足。
2.审计选项:by access(访问) / by session(会话)
by access 每一个被审计的操作都会生成一条audit trail。
by session 一个会话里面同类型的操作只会生成一条audit trail,默认为by session。
3. whenever [not] successful
whenever successful 操作成功(dba_audit_trail中returncode字段为0) 才审计,
whenever not successful 反之。省略该子句的话,不管操作成功与否都会审计
fine-grainedauditing(fga) 细粒度审计
细粒度审计(fga):精细审计 ,是在 oracle 9i 中引入的,能够记录 scn 号和行级的更
改以重建旧的数据,但是它们只能用于 select 语句,而不能用于 dml ,如 update 、
insert 和delete 语句。
因此,对于 oracle 数据库 10g 之前的版本,使用触发器虽然对于以行级跟踪用户
初始的更改是没有吸引力的选择,但它也是唯一可靠的方法。
10g 之后版本可以audit 所有dml。fga的实现基于dbms_fga包。它属于sys用户。
fga 策略的定义位于数据字典视图 dba_audit_policies 中。
审计线索收集在 sys 拥有的表 fga_log$ 中
对于 sys 拥有的任何原始表,此表上的某些视图以对用户友好的方式显示信息。
dba_fga_audit_trail是该表上的一个视图。
四、审计功能的安装
sqlplus> connect / as sysdba sqlplus> select count(*) from sys.aud$; --没有记录返回 (11g默认就开了 审计了) sqlplus> select count(*) from dba_audit_trail; - 没有记录返回 如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。 sqlplus> connect / as sysdba sqlplus> @$oracle_home/rdbms/admin/cataudit.sql 注意:审计表安装在system表空间。所以要确保system表空间又足够的空间存放审计信息。 安装后要重启数据库。
create tablespace audit_data logging datafile '/oracle/oradata/itpuxdb/audit01.dbf' size 20m autoextend off extent management local segment space management auto;
[oracle@rac01 ~]$ sqlplus / as sysdba
alter table aud$ move tablespace audit_data;
alter table audit$ move tablespace audit_data;
alter index i_audit rebuild online tablespace audit_data;
alter table audit_actions move tablespace audit_data;
alter index i_audit_actions rebuild online tablespace audit_data;
查询结果
select table_name,tablespace_name from dba_tables where table_name like
2 '%AUD%';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
AUDIT_ACTIONS AUDIT_DATA
AUDIT$ AUDIT_DATA
AUD$ AUDIT_DATA
WWV_FLOW_BUILDER_AUDIT_TRAIL SYSAUX
MGMT_AUDIT_CUSTOM_ATTRIBS SYSAUX
MGMT_AUDIT_LOGS SYSAUX
MGMT_AUDIT_DESTINATION SYSAUX
MGMT_AUDIT_MASTER SYSAUX
MGMT_BCN_TXN_AUDIT SYSAUX
REPCAT$_AUDIT_COLUMN SYSTEM
REPCAT$_AUDIT_ATTRIBUTE SYSTEM
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
AUDTAB$TBS$FOR_EXPORT_TBL SYSTEM
STMT_AUDIT_OPTION_MAP SYSTEM
13 rows selected.
SQL>
select index_name,tablespace_name from dba_indexes where index_name
2 like '%AUDIT%';
INDEX_NAME TABLESPACE_NAME
------------------------------ ------------------------------
WWV_FLOW_BLD_AUDIT_PK SYSAUX
WWV_FLOW_BUILD_AUDIT_TRAIL_I3 SYSAUX
WWV_FLOW_BUILD_AUDIT_TRAIL_I5 SYSAUX
MGMT_AUDIT_CUSTOM_ATTRIBS_PK SYSAUX
MGMT_AUDIT_LOGS_IDX01 SYSAUX
BCN_TXN_AUDIT_PRIMARY_KEY SYSAUX
REPCAT$_AUDIT_COLUMN_PK SYSTEM
REPCAT$_AUDIT_COLUMN_F1_IDX SYSTEM
REPCAT$_AUDIT_COLUMN_F2_IDX SYSTEM
REPCAT$_AUDIT_ATTRIBUTE_PK SYSTEM
I_AUDIT_ACTIONS AUDIT_DATA
INDEX_NAME TABLESPACE_NAME
------------------------------ ------------------------------
I_STMT_AUDIT_OPTION_MAP SYSTEM
I_AUDIT AUDIT_DATA
13 rows selected.
SQL>
审计功能的删除,主要是删除它的表: truncate 或者 delete sys.aud$ 表 在delete 之前,可以先把aud$表exp备份一下,注意,不要直接exp,先创建一张临时表,然后将临时表exp。 sql>create table audit202005 tablespace users as select * from sys.aud$; 然后exp: [oracle@rac01 ~]$exp system/oracle file=audit20200520.dmp tables=sys.audit202005 最后delete 数据: sql>delete from sys.aud$; 或者删除指定表的审计: sql>delete from sys.aud$ where obj$name='&table_nmae'; 注意,delete 不会释放system表空间。 可以使用truncate table:(所以不建议用 delete) sql>truncate table sys.aud$
查看清空的结果
SQL> select count(*) from sys.aud$;
COUNT(*)
----------
0
SQL> select count(*) from dba_audit_trail;
COUNT(*)
----------
0
SQL>
1.审计功能的参数:
audit_trail 参数的值可以设置为以下几种
1. none:不开启
2. db:开启审计功能
3. os:审计记录写入一个操作系统文件。
4. true:与参数db一样
5. false:不开启审计功能。
这个参数是写道spfile里面的,需要重启数据库
2.审计的取消
将对应审计语句的audit改为noaudit即可,
如audit session whenever successful
对应的取消审计语句为noaudit session whenever successful;
3.审计的关闭:
但这个功能会针对很多操作都产生审计文件.aud,日积月累下来这些文件也很多,考
虑到实际情况,
su - oracle sqlplus “/as sysdba” sql>alter system set audit_trail='none' scope=spfile; sql>shutdown immediate; sql>startup; 从spfile可以看出,是需要重启数据库才生效的。 删除审计数据,oracle用户登录到数据库服务器: sqlplus / as sysdba truncate table sys.aud$;
conn /as sysdba; @$ORACLE_HOME/rdbms/admin/cataudit.sql
2.创建审计表空间,迁移审计表空间
2.1 创建审计用的表空间
create tablespace audit_data logging datafile '+data/orcl/datafile/audit01.dbf' size 20m autoextend off extent management local segment space management auto;
--connect / as sysdba; alter table aud$ move tablespace audit_data; alter table audit$ move tablespace audit_data; alter index i_audit rebuild online tablespace audit_data; alter table audit_actions move tablespace audit_data; alter index i_audit_actions rebuild online tablespace audit_data;
select table_name,tablespace_name from dba_tables where table_name like '%AUD%'; select index_name,tablespace_name from dba_indexes where index_name like '%AUDIT%';
alter system set audit_sys_operations=true scope=spfile; alter system set audit_trail=db,extended scope=spfile; shutdown immediate; startup; show parameter audit;
## 创建表空间 和用户 create tablespace hr logging datafile '+data/orcl/datafile/hr.dbf' size 50m autoextend off extent management local segment space management auto; CREATE USER hr IDENTIFIED by hr DEFAULT TABLESPACE hr; grant connect,resource,dba to hr; ## 创建表,并插入数据 create table employees (id int,name varchar2(10)); insert into employees values (1,'itpx01'); insert into employees values (2,'itpx02'); insert into employees values (3,'itpx03'); insert into employees values (4,'itpx04'); insert into employees values (5,'itpx05'); insert into employees values (6,'itpx06'); --审计hr.employees表select操作---- audit select on hr.employees --audit select on hr.employees by session; --audit select on hr.employees by access; ## 进行几次查询做测试 conn hr/hr ---在hr 用户下执行 select * from hr.employees where id=1; select * from hr.employees where id=2; select * from hr.employees where id=3; ## 查看结果 通过plsql 查看 conn /as sysdba; select * from aud$ where userid='HR'、、 select SESSIONID,USERID,SQLTEXT from aud$ where userid='HR';
## 关闭审计功能(建议使用第一种) alter system set audit_trail=none scope=spfile; 或者 //alter system reset audit_trail scope=spfile; 意思重新设置,设置成了默认值,建议使用第一种的即可 shutdown immediate; startup; show parameter audit ##额取消审计的语句 --noaudit all on hr.employees ## 清空记录 truncate table sys.aud$ (建议使用 truncate) --delete from sys.aud$ where obj$name='EMPLOYEES';
对表hr.employees进行高精度审计,审计字段id,name,审计条件
id=1,对select及update操作进行审计。
(前提是已经开启了审计功能)
[oracle@rac01 ~]$ sqlplus / as sysdba SQL> exec dbms_fga.add_policy('hr','employees','mypolicy','id=1','name',statement_types=>'select'); PL/SQL procedure successfully completed. dbms_fga--审计的函数 hr--用户 employees--表 mypolicy--策略名字 id=1--审核条件 name--审计字段 statement_types--审计选项
conn hr/hr SQL> select * from employees; ID NAME ---------- ---------- 1 itpx01 2 itpx02 3 itpx03 4 itpx04 5 itpx05 6 itpx06 6 rows selected. select * from hr.employees where id=1 SQL> select * from hr.employees where id=6; ID NAME ---------- ---------- 6 itpx06
SQL> conn /as sysdba Connected. SQL> col sqltext format a30 SQL> select sql_text from dba_fga_audit_trail; SQL_TEXT -------------------------------------------------------------------------------- select * from employees select * from hr.employees where id=1 SQL> ----根据审计结果可知:---- 第一个和 第二 个语句满足字段和条件要求,所以进行审计;而第三个语句虽然满足了 department_id=6,但是不满足要求的字段,所以不进行审计。
begin dbms_fga.disable_policy ( object_schema => 'hr', object_name => 'employees', policy_name => 'mypolicy'); end; / 禁用后,在执行 第三步 的sql 是不会再进行审计的
begin dbms_fga.enable_policy ( object_schema => 'hr', object_name => 'employees', policy_name => 'mypolicy', enable => true); end; / 开启后,在执行第三步的 sql 就会进行审计的
begin dbms_fga.drop_policy ( object_schema => 'hr', object_name => 'employees', policy_name => 'mypolicy'); end; /
audit session by itpux; -- 审计指定用户的连接或断开连接操作 noaudit session by itpux; --取消审计前面加 no audit session; --审计用户连接或断开连接操作 noaudit session; --取消审计前面加 no
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
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;
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
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