Oracle 审计测试与总结

Oracle数据库安全审计管理

 

一、审计功能介绍

审计(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 反之。省略该子句的话,不管操作成功与否都会审计

4.审计的细粒度

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表空间又足够的空间存放审计信息。
安装后要重启数据库。

五、审计功能迁移

由于aud$表等审计相关的表存放在system表空间,因此为了不影响系统的性能,保护system表空间,最好把aud$移动到其他的表空间上。
 

1. 创建审计用的表空间

create tablespace audit_data
 logging 
 datafile '/oracle/oradata/itpuxdb/audit01.dbf' size 20m autoextend
 off extent management local segment space 
management auto;

 

2. 在线迁移

[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,日积月累下来这些文件也很多,考

虑到实际情况,

11g默认是开启的--建议关闭。

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$;

 

八、标准数据库审计的配置

1. 安装数据库的审计功能

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;

2.2 在线迁移

--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;

2.3 查询结果

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%';

2.4 开启数据库审计

alter system set audit_sys_operations=true scope=spfile;
alter system set audit_trail=db,extended scope=spfile;
shutdown immediate;
startup;
show parameter audit;

2.5 审计表 并测试审计功能

## 创建表空间 和用户 
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';

2.6 关闭审计功能

## 关闭审计功能(建议使用第一种)
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';

 

九、高精度数据库审计的配置(fga)

1. 要求:

对表hr.employees进行高精度审计,审计字段id,name,审计条件

id=1,对select及update操作进行审计。

(前提是已经开启了审计功能)

2. 执行策略

[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--审计选项 

3. 执行语句

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

4. 检查审计结果

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,但是不满足要求的字段,所以不进行审计。

5. 禁止fga审计

begin 
dbms_fga.disable_policy (
object_schema => 'hr',
object_name => 'employees',
policy_name => 'mypolicy');
end; 
/

禁用后,在执行 第三步 的sql 是不会再进行审计的

6. 启动fga审计

begin 
dbms_fga.enable_policy (
object_schema => 'hr',
object_name => 'employees',
policy_name => 'mypolicy',
enable => true);
end; 
/

开启后,在执行第三步的 sql  就会进行审计的

7. 删除fga审计

begin 
dbms_fga.drop_policy (
object_schema => 'hr',
object_name => 'employees',
policy_name => 'mypolicy');
end; 
/

 

十、审计日常功能与操作命令(总结)

1.语句审计:跟踪会话的连接和注销

audit session by itpux; -- 审计指定用户的连接或断开连接操作
noaudit session by itpux; --取消审计前面加 no

audit session; --审计用户连接或断开连接操作
noaudit session; --取消审计前面加 no

2.查看审计action对应的编码:

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

3.语句审计(审计create table,drop table,truncate 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;

4.语句审计(审计dml语句):

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相同操作只生成一条审计记录)

5. 查看用户被启用的语句审计的选项:

col audit_option for a20
select audit_option,failure,success,user_name from dba_stmt_audit_opts;

6. 特权审计(使用了特定的系统权限才会触发审计线索):

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;

7. 查看用户被启用的特权审计的选项:

select privilege,user_name from dba_priv_audit_opts order by user_name;

8. 对象审计(跟踪指定对象权限的操作):

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;

9.查看用户被启用的对象审计的选项:

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

10.取消所有statement审计

noaudit all;

11. 取消所有权限审计

noaudit all privileges;

12. 取消所有对象审计

noaudit all on default;

13.将审计线索保存到数据库:

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

 

 

posted @ 2020-05-20 15:54  LWJ303  阅读(765)  评论(1编辑  收藏  举报
levels of contents