这是一份真实的客户需求实现方案。客户要求监控到某些关键表在什么时间段、什么用户、什么应用程序以及访问哪些具体的记录。
数据库系统是Oracle9.2.0.1,它的审计功能可实现该需求。
基于审计对正常运行的应用的性能压力,需要设置特定时间段的数据访问审计。
从审计日志中获得的监控详细信息,那些表被什么应用访问,什么时候访问。提供详细报告信息。
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 程序包上的运行权限。
根据需求定义,采用对象审计功能。如果需求审计到具体表中的记录,可使用细粒度审计来实现。
在这里,使用对象审计功能来实现我们的项目需求。