保证数据库的安全有两种方式,一种是通过权限的存取控制机制,即通过预先控制来防止安全事件的发生;另一种是数据库审计,即对数据库活动做跟踪记录,当发生安全事件时,通过对数据库活动记录进行审计来发现并修复安全问题。
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‘;