防止审计表篡改

我们的数据库中有审计表。 使用触发器完成对此表的记录。

目前,没有什么能阻止用户登录数据库服务器,从管理工作室打开表并更改审计表中的数据。

哪些可能的机制可以防止(或至少检测)审计数据篡改的情况?

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

编辑:

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

没有什么能阻止有人通过SQL管理器访问您的数据库来更改内容。 你可以让它明显篡改。

基本上你需要使用键控哈希的HMAC 。 不幸的是,这导致您需要密钥管理以确保密钥保持秘密,这在触发器中可能是不可能的。 我们使用加密服务来提供密钥管理,但可以从代码访问。

您还需要考虑用户删除记录而不是更改其内容的能力。 我们最终得到了两个HMAC,一个是使用记录的内容计算的(用于更改记录的明显),第二个使用当前记录HMAC和前一行的HMAC来使任何行删除篡改明显。

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

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

以下是一些可能性:

  • 您无法阻止或检测具有sysadmin (sa)权限的人员的篡改。 如果您不信任您的系统管理员,那么您可能遇到的问题比此特定问题更严重。
  • 很难防止或检测本地管理员的篡改。 这样的人可以在单用户模式下重新启动SQL Server,并使用SQL作为sysadmin进行访问。
  • 要检测数据库所有者 (dbo)的篡改,可以使用SQL Server 2008中的Server Audit或早期版本的SQL Server中的服务器端SQL Trace 。
  • 您可以通过限制其对相关触发器和审计表的权限来防止其他用户篡改。

您可以启用更改跟踪,以便对审计表进行“审计”。

如果您的基础设施得到妥善管理,我猜用户没有sa权限,他们使用Management Studio查看数据库使用他们的Windows帐户登录,在这种情况下,您可以在该审计表上设置安全性,只有sa和其他管理帐户将是能够更改内容但不能更改普通用户/开发者帐户。

希望这可以帮助。

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

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

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

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

  1. 将审核数据分离到自己的架构中,然后设置权限,使您关注的用户无权访问该架构。

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

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

    也许你可以让你的触发器将审计数据写入队列。 然后,您可以拥有一个每隔几分钟运行一次的计划作业,以从队列中获取审计数据并将其写入审计存储。