C# 防止审计表篡改
我们的数据库中有审计表。 此表的记录是使用触发器完成的 目前,并没有任何东西可以阻止用户登录到数据库服务器,从ManagementStudio打开表并更改审核表中的数据 有哪些机制可以防止(或至少检测)审计数据篡改 我正在考虑在审计表中添加一列,该列应该包含一些根据该行中输入的值计算的哈希值。然而,由于审计是使用触发器完成的,恶意用户可以打开任何触发器并查看计算此哈希的逻辑 编辑:C# 防止审计表篡改,c#,sql-server,audit,tampering,C#,Sql Server,Audit,Tampering,我们的数据库中有审计表。 此表的记录是使用触发器完成的 目前,并没有任何东西可以阻止用户登录到数据库服务器,从ManagementStudio打开表并更改审核表中的数据 有哪些机制可以防止(或至少检测)审计数据篡改 我正在考虑在审计表中添加一列,该列应该包含一些根据该行中输入的值计算的哈希值。然而,由于审计是使用触发器完成的,恶意用户可以打开任何触发器并查看计算此哈希的逻辑 编辑: 我还不够清楚。应用程序用户无权访问数据库。我指的是像DB admin这样的用户,拥有数据库的适当权限。不过,如果这
我还不够清楚。应用程序用户无权访问数据库。我指的是像DB admin这样的用户,拥有数据库的适当权限。不过,如果这个DB管理员登录并有权修改审计表,我希望至少有一些机制来检测这种篡改。您可以启用更改跟踪,这样您就可以“审计表上的审计” 如果您的基础结构得到了正确管理,我猜用户没有sa权限,他们使用Management Studio查看使用windows帐户登录的数据库,在这种情况下,您可以在该审核表上设置安全性,只有sa和其他管理帐户可以更改内容,但普通用户/开发人员帐户不能
希望这能有所帮助。您描述的问题可能表明系统架构中存在更严重的问题。 通常,用户甚至不应该直接访问运行数据库的机器
您可能想考虑一种架构,其中数据库机与业务逻辑机分离,并且只能访问它们。
如果您的用户决定尝试不通过客户端访问您的服务器,那么他们所能做的就是访问您决定公开的定义良好的web服务用户没有理由能够访问数据库计算机,或者拥有允许写入数据库的帐户的凭据。你似乎担心篡改审计信息。如何阻止恶意用户删除表或篡改功能数据?没有任何东西可以阻止通过SQL manager访问您的数据库的人更改内容。不过,你可以让它被篡改 基本上,您需要使用键控哈希。不幸的是,这导致您需要密钥管理来确保密钥保持机密,而这在触发器中是不可能的。我们使用加密服务来提供密钥管理,但这是通过代码访问的 您还需要考虑用户删除记录而不是更改其内容的能力。我们最终得到了两个HMAC,一个使用记录的内容进行计算(使对记录的更改变得明显),第二个使用当前记录HMAC和前一行的HMAC使任何行删除篡改变得明显 然后您需要担心删除第一个或最后一个x记录。为此,我们使用始终具有相同内容的尾部和标题记录,如果这些内容不存在,则表的顶部或底部已被删除。标头的组合HMAC使用它之后的记录,而不是之前的记录(因为之前没有记录)
当然,如果要删除旧记录以管理存储的数据量,则需要一种机制在删除后添加新的标题记录。以下是一些可能性:
- 您无法阻止或检测具有系统管理员(sa)权限的人的篡改。如果您不信任您的系统管理员,您可能会遇到比此特定问题更严重的问题
- 很难防止或检测域或本地管理员的篡改。这样的人可以在单用户模式下重新启动SQL Server,并使用SQL作为系统管理员获得访问权限
- 要检测数据库所有者(dbo)的篡改,可以在SQL Server 2008中使用,也可以在早期版本的SQL Server中使用服务器端
- 您可以通过限制其他用户对相关触发器和审核表的权限来防止其篡改
不给恶意用户对该表的写访问权如何?或者,如果您患有妄想症,请将日志发送到其他很少有人可以访问的计算机,而不是使用数据库中的表。只需限制权限,以便只有某些登录名对该表具有插入/更新/删除权限。如果他们以系统管理员身份登录,则只能使用Management Studio绕过权限,显式或隐式(例如以管理员身份登录Windows)。强大的SQL安全性取决于良好的网络安全习惯。嘿,我编辑了我的问题,我对术语不够清楚。我们有单独的机器用于数据库和业务逻辑。谢谢回复。我对我的问题进行了编辑,使之更加准确。普通的应用程序用户当然没有数据库访问权限。在我看来,这就像一个复杂但几乎是防弹的概念:)。您是通过代码还是通过触发器进行审核?我想你是在做代码审计。若您这样做,那个么就并没有什么可以阻止用户更改您创建的某个表中的数据