日期:2014-05-16  浏览次数:20673 次

Oracle数据库数据访问安全与审计方案

?

这是一份真实的客户需求实现方案。客户要求监控到某些关键表在什么时间段、什么用户、什么应用程序以及访问哪些具体的记录。

数据库系统是Oracle9.2.0.1,它的审计功能可实现该需求。

基于审计对正常运行的应用的性能压力,需要设置特定时间段的数据访问审计。

从审计日志中获得的监控详细信息,那些表被什么应用访问,什么时候访问。提供详细报告信息。

(miki西游@mikixiyou 的文档,原文链接: http://mikixiyou.iteye.com/blog/1547353)

?

1 ? ? ? 审计功能原理

Oracle数据库的审计功能来分析管理数据库的访问安全。

通常,审计的用途如下:

?可审计特定的用户、表、或具体的行的当前操作,或者影响特定的内容。

例如,什么用户查询了什么表,甚至表中那些记录。

?调查可疑的操作。

例如,如果有用户正在删除某些表的数据,审计人员可使用审计功能审计所有的数据库连接,数据库成功或者不成功的删除操作。

?通报没有被授权的用户正操作或者删除数据的所有者,该非法用户有过多的不被允许的权限,可检查出权限设置问题。

?监控和收集特殊的数据库行为的数据。

?检测授权和访问控制的实施的问题。

例如,可以创建一个希望的审计策略。这个审计策略保证其他情况下绝不会生成审计记录。但是,如果这个策略下生成了审计记录,就可以知道有其他的安全控制没有被正确地实现。

审计一般分为四类,分别为语句审计、权限审计、对象审计、细粒度审计。

其中前三类为标准审计,在ORACLE数据库各个版本中都有,最后一类称为细粒度审计,在ORACLE9i以后的版本中出现,并在10g中功能增强。

?

语句审计 可审计特定类型的操作语句,甚至可以审计某些类型的一系列操作。如,audit table可审计表上的所有的DDL语句。

权限审计 可审计相关操作的系统权限。如,audit create table。

对象审计 可审计精确的对象上的明确的语句,如audit select on temployees。

对象审计更精确,可审计一个对象上唯一一个明确类型的语句,并且作用于数据库中所有的用户。

细粒度审计 可审计基于内容的细粒度的数据访问和操作,如某个字段的值大于某值。

在ORACLE10g中,就这两大类审计,比较两者的异同。

?标准审计必须用参数 AUDIT_TRAIL 在数据库级启用。这个参数不是动态的;必须重启数据库来使其生效。相比而言,细粒度审计不需要任何参数修改。

?一旦被设置在一个对象上,标准审计将保持在那里。要解除它,必须用 NOAUDIT 命令删除审计选项。这可能很不方便,因为在一个表上丢弃审计选项也将丢弃元数据信息。然而,细粒度审计 可以临时禁用和启用,不丢失任何元数据信息。

?细粒度审计 只能够处理四种类型的语句:SELECT、INSERT、UPDATE 和 DELETE。相比而言,常规审计可以处理其它许多语句和权限,甚至会话连接和断开。

?标准审计每次会话只创建一条记录(按会话)或每次访问对象创建一条记录(按访问)这种占用资源很少的方式对于控制审计线索表中的空间非常重要。细粒度审计 并不是同样节省资源;它每次访问运行一次 — 使得线索更大。

?通过记录线索,标准审计可以用来检测任何中断企图,如果企图没有成功,则将产生错误代码。而 细粒度审计不能。

?标准审计可以写数据库表或 OS 文件。后者在审计员(不是数据库管理员)能够访问线索时非常有用。这个选项保护了审计线索的完整性。然而,细粒度审计 日志仅写到数据库表 FGA_LOG$ 中。

?标准审计可以设置用于默认对象。当表是在运行期创建时,这个功能变得极为有用:默认的审计选项允许没有数据库管理员干预的审计。这在 细粒度审计中是不可能的,用户必须在一个现有的表上创建策略,上述的情况只能在表已创建之后才可能发生。

?在细粒度审计中,审计更加灵活 — 仅当访问某些列,当某个特定的条件为真时等等。这种多功能性在您需要控制线索的增长时非常方便。

?在 细粒度审计 中,SQL 赋值变量默认被捕获。在常规审计中,必须把初始化参数 audit_trail设为 db_extended,以启用这一功能。

?权限上的差异:常规审计需要审计系统或语句权限;细粒度审计只需要 dbms_fga 程序包上的运行权限。

根据需求定义,采用对象审计功能。如果需求审计到具体表中的记录,可使用细粒度审计来实现。

在这里,使用对象审计功能来实现我们的项目需求。

2 ? ? ? 实现方法

2.1 ? ?修改初始化参数AUDIT_TRAIL。

Alter system set audit_trail=DB scope=spfile;

或者手工修改数据库初始化文件。

1.1 ? ?AUDIT_TRAIL

Parameter type String

Syntax AUDIT_TRAIL = {NONE | FALSE | DB | TRUE | OS}

Default value There is no default value.

Parameter class Static

AUDIT_TRAIL enables or disables the automatic writing of rows to the audit trail.

Values:

? NONE or FALSE

Audit records are not written.

? OS

Enables system-wide auditing and causes audited records to be written to the operating system's audit trail.

? DB or TRUE

Enables system-wide auditing and causes audited records to be written to the database audit trail (the SYS.AUD$ table).

?

2.2 ? ?检查是否存在sys.aud$表

Select * from sys.aud$;

如果不存在,需要使用ORACLE系统提供的脚本cataaud.sql创建。

2.3 ? ?重启数据库,使修改参数生效

Shutdown immediate;

Startup open;

Show parameter audit_trail;

SQL> connect / as sysdba

已连接。

SQL> show parameter audit_trail

?

NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TYPE ? ? ? ?VALUE

------------------------------------ ----------- -----------------------------

audit_trail ? ? ? ? ? ? ? ? ? ? ? ? ?string ? ? ?DB_EXTENDED

SQL>

2.4 ? ?检查审计相关视图,确认是否存在审计项目。

Select * from dba_stmt_audit_opts;

<