我需要审核所有数据库活动,无论它是来自应用程序还是来自其他方式发出某些 SQL 的人。因此审计必须在数据库级别进行。有问题的数据库是Oracle。我考虑通过触发器以及 Oracle 提供的细粒度审计来实现这一点。在这两种情况下,我们都开启了对特定表和特定列的审计。然而,我们发现当我们使用这两种方法时,性能真的很糟糕。

由于围绕数据隐私的规定,审计是绝对必须的,因此我想知道在不显着性能下降的情况下执行此操作的最佳方法是什么。如果有人在这方面有 Oracle 的具体经验,那将会很有帮助,但即使不是围绕数据库活动审计的一般实践也可以。

有帮助吗?

解决方案

我不确定这是否足以适应生产系统的成熟方法,但是在使用网络流量sniffer监视数据库流量方面,我取得了很大的成功。

将应用程序和数据库之间的原始数据发送到另一台计算机,然后对其进行解码并在此处分析。

我使用了PostgreSQL,并解码流量并将其转换为可以记录的数据库操作流相对简单。我想它可以在记录数据包格式的任何数据库上工作。

要点是它不会给数据库本身带来额外的负载。

另外,它是被动监视,记录了所有活动,但无法阻止任何操作,因此可能不是您想要的。

其他提示

没有必要“自己动手”。只需打开审核即可:

  1. 设置数据库参数AUDIT_TRAIL = DB。
  2. 启动实例。
  3. 使用 SQLPlus 登录。
  4. 输入声明
    audit all;
    这开启了对许多关键 DDL 操作的审计,但 DML 和其他一些 DDL 语句仍然没有审计。
  5. 要启用对这些其他活动的审核,请尝试以下语句:
    audit alter table; -- DDL audit
    audit select table, update table, insert table, delete table; -- DML audit

笔记:所有“as sysdba”活动始终经过操作系统审核。在 Windows 中,这意味着 Windows 事件日志。在 UNIX 中,这通常是 $ORACLE_HOME/rdbms/audit。

查看 Oracle 10g R2 审计章节 数据库 SQL 参考。

可以在 SYS.DBA_AUDIT_TRAIL 视图中查看数据库审计跟踪。

应该指出的是,Oracle内部审计从定义上来说将是高性能的。它的设计正是如此,很难想象还有什么东西可以在性能上与它相媲美。此外,Oracle 审计还具有高度的“细粒度”控制。您可以获得您想要的精确度。最后,可以将 SYS.AUD$ 表及其索引移动到单独的表空间,以防止填满 SYSTEM 表空间。

亲切的问候,作品

如果您想在目标系统上记录更改记录的副本,您可以使用 Golden Gate Software 来完成此操作,并且不会造成源端资源消耗太多。此外,您无需对源数据库进行任何更改即可实施此解决方案。

Golden Gate 会根据您感兴趣的表列表来抓取事务的重做日志。这些更改被写入“跟踪文件”,并且可以应用于同一数据库上的不同模式,或者发送到目标系统并在那里应用(非常适合减少源系统上的负载)。

将跟踪文件获取到目标系统后,您可以进行一些配置调整,您可以设置一个选项来执行审核,如果需要,您可以调用 2 个 Golden Gate 函数来获取有关交易的信息:

1) 设置 INSERTALLRECORDS Replication 参数,以便为对源表进行的每个更改操作在目标表中插入一条新记录。请注意,这可能会占用大量空间,但如果您需要全面审核,这可能是预料之中的。

2) 如果您的记录中尚未附加 CHANGED_BY_USERID 和 CHANGED_DATE,您可以使用目标端的 Golden Gate 函数来获取当前交易的此信息。查看GG参考指南中的以下函数:ggheader(“ userId”)ggheader(“ Timestamp”)

因此,它不是免费的(需要通过 Oracle 许可),并且需要一些努力来启动,但可能比实施和维护自己的自定义解决方案要少得多的工作量/成本,并且您还可以获得传输数据的额外好处到远程系统,这样您就可以保证对源数据库的影响最小。

如果您使用的是 Oracle,那么有一个名为 CDC(捕获数据更改)的功能,它是针对审计类型需求的性能更高效的解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top