17

我们正在使用 asp.net 和 sql server 开发一个 Web 应用程序。我们需要对应用程序进行审计跟踪。据我了解,审计跟踪基本上是针对数据库上的所有插入、更新和删除的,对吗?现在解决这个问题的方法是我在数据库中有一个审计跟踪表,在每次插入、更新或删除被触发后填充(在 DAL 中手动编写脚本)。但是,任何直接从 SQL Management Studio 触发的数据库更改都不会被记录(原因很明显:P)。

为了满足这一点,我可以创建一个触发器,它会处理所有事情。我也做了一些谷歌搜索,发现 SQL Server 有能力做审计跟踪。然而,使用触发器的问题是我不会获得登录网站的用户信息。我会得到 sql 用户,但我对此不屑一顾,我担心网站用户。

我想出的一个解决方案是 a) 从我的 Web 应用程序中获得审计跟踪,并且还设置了触发器。在审计报告中,我只是显示了来自 web 应用程序的审计日志和来自 sql server 的审计日志。这种方法的明显问题:开销。在每次数据库更改时写入两组不同的表。

b)我在每个数据库表上都有一个名为 UserId 的列。然后我创建一个触发器来捕获所有数据库更改。我在我更改的每个表(插入、更新、删除)上传递这个 userId,并从触发器中获取这个 id。明显的挫折:每个表中不必要的用户 ID 列

我为这篇长文道歉。基本上,我需要一个审计日志来记录所有数据库更改(包括直接入侵数据库),但同时为我提供从 Web 应用程序进行的那些数据库更改的用户登录信息。

将不胜感激在这方面的任何意见。

非常感谢

谢树

4

4 回答 4

12

通过 SQL 管理工作室或其他方式直接对数据库执行 SQL 查询,对数据库进行合法更改的可能性有多大。我建议假设数据中的所有数据都是通过您的应用程序输入的,并在您的 BL 层中进行审核。然后,您可以简单地将对数据库的访问限制为受信任的用户。最终,必须有一个或多个用户有权更改数据库模式,如果这些用户想要绕过审计,他们可以简单地禁用触发器或伪造审计跟踪。如果有正当的理由对数据库运行直接 SQL 查询,例如从其他系统不经常导入数据等,那么您可以将此活动限制为受信任的用户,并确保他们的导入脚本正确填充审计表。

于 2010-07-13T09:37:05.333 回答
4

谢谢大家的回复。经过一番谷歌搜索,这是我认为合适的方法:通用审计表

Audit_Table(Id、TableName、RecordId、(指向相关记录的链接)ModifiedBy、ModifiedOn、Type(I、U 或 D))

Audit_Details_Table(Id、AuditId、FieldName、OldValue、NewValue)

我认为这应该做到这一点。有什么想法吗?

于 2010-07-14T10:24:10.667 回答
3

听起来你在正确的路线上。但是,您通常不会有一个审计跟踪表,而是每个表都有一个审计表。因此,对于 TableA 中的行的每次修改,都会将新行添加到 TableA_Audit 中,其中包含 TableA 中的新状态以及用户的日期和名称。

通常为此使用触发器,但是如果您要存储网络应用程序的用户名,我不知道如何将此数据传递给触发器(其他人可以帮忙吗?)在这种情况下,我可能会想使用存储程序。对于每个表,都有存储过程来插入、更新和删除行。这些存储过程将分别调用另一个将行插入审计表的存储过程。这样,您可以轻松地将 Web 应用程序用户名传递给将行插入审计表的存储过程。显然,缺点是必须为每个表维护一堆存储过程,这可能有点乏味,因为您必须确保它们都与表(以及应用程序的数据访问层)保持同步,因为不可避免地需要模式更改.

请注意,您不需要在每个表中都有用户名列,只需要在每个审计表中。

希望其中一些有用。

干杯

大卫

于 2010-07-13T09:20:34.107 回答
3

我同意其他两个海报。底线是,如果您想存储您的网络应用程序用户的用户名(即您的自定义身份验证),那么触发器不会帮助您审核正在发生的事情。-除非您可以使用集成身份验证,否则请注意

例如,如果您还想使用审计跟踪来监控用户的活动量,这一点非常重要。对此的解决方案是通过存储过程执行所有 DDL,并在这些存储过程中添加您的审计逻辑(如果您希望所有日志记录都用 T-SQL 编写)。或者,从应用程序中执行此操作,并查看可用于 ASP.Net 的众多日志库之一,例如NLog

于 2010-07-13T12:55:08.930 回答