2011-01-21 101 views
4

我们在我们的数据库中有审计表。 使用触发器完成此表的记录。防止审计表篡改

当前,没有什么能够阻止用户登录到数据库服务器,从management studio中打开表并更改审计表中的数据。

什么是可能的机制,可以防止(或至少检测)审计数据篡改案件?

我正在考虑在审计表中添加一列,它应该包含一些基于在该行中输入的值计算的散列值。但是,由于审计是使用触发器完成的,因此恶意用户可以打开任何触发器并查看计算该散列值的逻辑。

编辑:

我还不够清楚。应用程序用户无权访问数据库。我指的是像DB管理员这样的用户,对数据库有适当的权限。尽管如此,如果这个数据库管理员登录并有权使用审计表进行调和,我希望至少有一些机制来检测这种篡改。

+2

如何不给恶意用户写入访问该表?或者,如果你是偏执的发送日志到一个很少有人可以访问的其他计算机,而不是使用数据库中的表。 – CodesInChaos 2011-01-21 10:16:24

+2

只需限制权限,以便只有某些登录名在该表上具有插入/更新/删除权限。 – LukeH 2011-01-21 10:17:58

+0

只有当他们作为系统管理员以显式或隐式方式登录(例如以管理员身份登录Windows)时,他们才能使用Management Studio绕过权限。强大的SQL安全性取决于良好的网络安全习惯。 – Bruce 2011-05-16 18:24:59

回答

1

您可以启用更改跟踪,以便您拥有“审核表上的审核”。

如果您的基础架构已正确管理我猜用户没有sa权限,他们使用Management Studio查看数据库使用其windows帐户登录,在这种情况下,您可以在该审计表上设置安全性,仅限于sa和其他管理帐户将能够更改内容而不是普通用户/开发者帐户。

希望这会有所帮助。

+0

感谢您的回复。我编辑我的问题更加精确。普通的应用程序用户当然没有DB访问权限。 – buhtla 2011-01-21 10:35:09

0

您正在描述的问题可能表明系统体系结构中存在更严重的问题。 通常,用户甚至不应直接访问运行数据库的机器。

您可能需要考虑一种架构,其中数据库机器与业务逻辑机器分开,并且只能由他们访问。

如果您的用户决定尝试不通过客户端访问您的服务器,那么他们应该能够做的就是到达您决定公开的定义良好的Web服务。

没有理由让用户能够访问数据库机器,或者拥有允许写入数据库的帐户的凭据。您似乎担心会篡改审计信息。什么是阻止恶意用户删除表或篡改功能数据?

+0

嘿,我编辑了我的问题,我用术语不够清楚。我们确实有用于数据库和业务逻辑的独立机器。 – buhtla 2011-01-21 10:29:29

7

什么都不能阻止有人通过SQL管理器访问您的数据库来更改内容。尽管如此,你可以让它变得篡改。

基本上你需要使用HMACs这是keyed散列。不幸的是,这导致您需要密钥管理来确保密钥保密,这在触发器中可能是不可能的。我们使用加密服务来提供密钥管理,但是这是通过代码访问的。

您还需要考虑用户删除记录而不是更改其内容的能力。我们结束了两个HMAC,一个使用记录内容计算(对记录进行更改),第二个使用当前记录HMAC和上一行的HMAC,以显示任何行删除篡改。

然后您需要担心删除第一个或最后一个x记录。为此,我们使用一个总是具有相同内容的尾部和头部记录,如果这些记录不存在,则表格的顶部或底部已被删除。标题的组合HMAC使用后面的记录而不是之前的记录(因为之前没有记录)。

而且,当然,如果您要删除旧记录来管理您存储的数据量,您需要一种机制在删除后添加新的标头记录。

2

这里有一些可能性:

  • 不能防止或发现有人通过与系统管理员(SA)权限篡改。如果你不信任你的系统管理员,你可能会遇到比这个问题更严重的问题。
  • 很难通过域名本地管理员防止或检测篡改。这样的人可以在单用户模式下重新启动SQL Server,并使用SQL作为系统管理员访问。
  • 要检测数据库篡改所有者(dbo),可以在SQL Server 2008中使用Server Audit,或者在早期版本的SQL Server中使用服务器端SQL Trace
  • 您可以通过限制他们对相关触发器和审计表的权限来防止其他用户篡改。
0
  1. 独立审计数据转换成自己的模式,然后设置权限,使你担心的用户没有访问该模式。

  2. 使用完全独立的数据库,甚至可以在不同的机器上。

    我经常看到某种类型的发布/订阅模型,用于从关系数据库发布审计数据,然后将审计数据异步写入审计存储。

    也许你可以让你的触发器将审计数据写入队列。然后,您可以每隔几分钟运行一次计划作业,以便从队列中取得审核数据并将其写入审核商店。