使用sql server在Web应用程序中审计跟踪

时间:2010-07-13 09:09:13

标签: asp.net sql-server audit-trail

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

为了迎合这一点,我可以创建一个触发器并处理所有事情。我也做了一些谷歌搜索,发现SQL服务器有能力进行审计跟踪。但是,使用触发器的问题是我不会获得登录网站的用户信息。我会得到sql用户,但我没有给出两个hoots,我担心网站用户。

我想出的解决方案也是 a)从我的Web应用程序中获取审计跟踪并设置触发器。在审计报告中,我只是显示来自Web应用程序的审计日志和来自sql server的审计日志。 这种方法明显存在问题:头脑清醒。在每个DB CHANGE上写入两组不同的表。

b)我有一个名为UserId ON EVERY DB TABLE的列。然后我创建一个触发器来捕获所有数据库更改。我在我更改的每个表(插入,更新,删除)上传递此userId,并从触发器获取此id。 显而易见的挫折:每个表中不必要的用户标识列

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

将欣赏这方面的任何意见。

非常感谢

xeshu

4 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:4)

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

Audit_Table( ID, 表名, RecordId,(链接到相关记录) ModifiedBy, ModifiedOn, 类型(I,U或D) )

Audit_Details_Table( ID, AuditId, 字段名, 的OldValue, NewValue)

我认为应该这样做。有什么想法吗?

答案 2 :(得分:3)

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

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

请注意,每个表中都不需要Username列,只需要在每个审计表中。

希望其中一些有用。

干杯

大卫

答案 3 :(得分:3)

我同意其他两张海报。最重要的是,如果您想存储您的Web应用程序用户的用户名(即您的自定义身份验证),那么触发器不会帮助您审核正在发生的事情。 - 警告,除非您可以使用集成身份验证

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