75

长期聆听者,第一次来电者。

'假设您有一个负责记录用户活动的数据库表。此日志的完整性很重要,因此您希望能够检测是否有人修改了表中的任何数据。为了让事情变得更有趣,还要考虑这样一个事实,即您的系统可能由一个邪恶的 SQL 管理员操作,他完全控制了这个可恶的系统。哎呀...

您将如何保护您的数据?

您将如何检测是否有人篡改了您的数据?

您可以使用无限的工具。(即散列、加密等)

4

25 回答 25

32

如果您确实必须检测到是否发生了篡改,则将校验和字段添加到表中。每个新行的校验和必须包括前一行的校验和。然后为了验证内容,在您前进时遍历计算校验和的数据集。如果计算的校验和与表中的值不匹配,则某些值已被篡改。

-麦克风

于 2009-11-05T20:46:16.273 回答
13

如果“邪恶管理员”无权访问填充数据库的应用程序,则每个表上的一个额外列包含其余列的加密签名将完成这项工作。需要“禁止访问”条件,这样他们就不能只提取您的私钥并签署他们的假数据。

编辑:啊,正如评论者指出的那样,我不认为管理员只是删除了一行。为此,您需要一个额外的行,其中包含您每次更新的加密签名行数(或表内容其余部分的签名哈希,或上次访问时间,或您选择的任何指标)。

于 2009-11-05T20:44:36.167 回答
5

创建一个影子表,使用只有您和应用程序知道的键/盐对每个文件进行哈希处理。如果要检查数据篡改,请重新散列用户表并与影子表进行比较。

于 2009-11-05T20:45:41.733 回答
5

如果您真的想要安全,请使用 - 为该表编写一次 Read Many Media。

于 2009-11-05T20:46:00.493 回答
4

只需使用您的交易 ID 运行纸质日志,并将打印机放在只有一把钥匙的房间里。使用金融系统,您会发现其中许多仍然依赖于他们的纸质备份。几乎不可能“破解”无法追踪的纸质日志……这就是人们不断推动在投票机中使用纸质日志的原因。

很多人都在说,“只需添加另一个数据库”,尽管我自己实际练习过这种日志记录,但我不相信它。恶意的内部人员可以通过十几种方式破坏该保护措施。

我们在这里所做的只是试图找到一种方法来使某些事情变得明显。你会丢失你的日志。你将无法信任他们:如果我遇到一个带有万无一失的日志系统的系统,我要么用垃圾数据填充它,要么完全擦除它。不要陷入马奇诺线的心态。

但是,如果您准备充分,以至于不得不发生太多失败,您可以将破坏范围缩小到内部来源。您需要记录数据库,需要保留大量系统日志,需要监控 IP 流量,服务器机房中放置摄像头,在控制台上留下键盘记录器等等。即使是最好的也会在某个地方溜走,如果你周围有足够多的捕鼠器,你可能会在某个地方意外捕捉到它们。

于 2009-11-05T21:25:00.640 回答
3

让我们明确一点:如果您假设一个邪恶的系统管理员,没有加密解决方案可以阻止他们以无法追踪的方式修改系统上的数据 - 有一些解决方案可以阻止他们解密信息,但没有什么可以阻止他们以他们认为合适的任何方式编写新信息。

这种情况需要以下条件:

  1. 该系统必须是独立的。如果您可以添加另一个 Evil Sysadmin 无权访问的系统作为日志主机(例如,syslog 服务器),那么问题突然变成了定期传输日志或哈希的小问题。

  2. 该系统不具有非软件一次性写入组件。正如其他人所建议的那样,最简单的就是打印机之类的东西,但是您可以使用 CD 或自定义的一次性写入硬件来防止出现问题。如果 Evil Sysadmin 可以物理访问机器,这些会变得更棘手,但并非无法克服。

  3. 您需要确定性,而不是统计可能性。如果 #1 和 #2 是不可能的,您唯一剩下的解决方案是模糊化 - 如果 Evil Sysadmin 不知道陷阱,则实施旨在捕捉篡改的诡计陷阱。

有效#3 的秘诀是战术上的惊喜。目的是向攻击者传达一种印象,即他们对任何对策都了如指掌,而实际上他们不知道的更多。一般来说,这至少需要两个级别的保护——你需要至少有一层保护,Evil Sysadmin 可能会妥协,因为他们会寻找它,如果他们没有找到它,他们会得到怀疑并深入挖掘,直到他们这样做。

重要的一点是,这个封面应该如此令人信服,以使 Evil Sysadmin 感到满意,一旦他们找到它,他们就不需要再看了。然后第二层使用替代技术识别篡改并产生适当的警报。在这个线程重新交易等中有各种可以实施的建议。解决方案的级别越低,成功的可能性就越大(即,修补数据库源代码远不如执行连接和查询的标准进程可见,修补内核再次不可见,修改固件.. )。

需要强调的是,这不是一个完美的解决方案。无论您的设置多么复杂,都可能有人已经找出/泄露了足够的信息来实施对策。#1和#2(正确完成)并非如此。也就是说,如果您要保护的信息的价值足够低,以至于具有必要技能的人不会对努力获取它感兴趣,那么它应该提供一个可行的防御措施。

于 2009-11-06T00:37:00.973 回答
2

每隔几个小时,对表的内容进行哈希处理。同时记录开始行和结束行。对于第二个散列和以后的散列,对整个表的内容和在前一个散列中散列的行(检查散列)进行散列。如果之前的散列和校验散列不匹配,则数据库表已被篡改。我会将这些哈希通过电子邮件发送给您,这样您就可以检查流氓管理员是否已经通过并重新生成了所有哈希。我意识到存在差距,但我认为除了这个或已经提到的之外,没有什么可以做的(除了删除他们的访问权限)。

于 2009-11-06T01:07:18.697 回答
2

考虑创建一个滚动的、快速的、异地的、自动的数据备份。如今, S3非常便宜,以至于人们可能会不时地使用 cronmysqldump类型的进程将整个数据存储库传输到跨大西洋备份存储。确切的频率取决于您的 DBA 的邪恶程度。

为了使该过程成为可能,只需在您的网络中找到或建立一台机器,邪恶的管理员对此一无所知,或者如果她怀疑有任何事情,也不会关心查看。插电式计算机的简单和优雅在这里怎么强调都不为过。

关于实际导出机制的注意事项:我建议对您的特定系统一无所知,mysqldump或者 Oracleexp作为最简单和最愚蠢的解决方案。如果您的应用程序有一种以本机格式(例如 XML、JSON 甚至是协议缓冲区 - 换句话说,SOA 应用程序的一部分用来相互通信的任何格式)导出数据的方法,那么format 可以用作滚动转储的格式。

我已经在我的gitosis盒子上实现了这种方法。每三个小时,内容就会被转储到欧洲 S3 存储桶中。这是另一个 VCS 的穷人 VCS。

于 2009-11-06T00:34:11.867 回答
2

您可以使用触发器来审核插入、更新和删除。现在,如果“邪恶的 SQL 管理员”禁用触发器,那么您将遇到一些更棘手的问题。如果我想保护我的数据,我不会允许邪恶的管理员完全控制系统。

于 2009-11-05T20:43:50.420 回答
1

电源/双电源控制分离。

我喜欢迄今为止提出的想法。我想加我自己的 2 美分。

在金融业,分权是防止一个人完全邪恶的关键。我们的核心处理解决方案由我们的簿记部门管理(祝福他们),所以我们程序员并没有真正获得对我们实时数据的大量访问。

此外,第三方记录与我们系统关键部分的交互。

总体而言,没有人有足够的控制权来影响所有的制衡,使得收益减少到(希望)不值得协调。

于 2009-11-06T03:01:04.520 回答
1

我喜欢 MikeMontana 的解决方案,但我认为它可能值得添加一个附录。遗憾的是,我还不能发表评论,所以我将其发布在一个新的答案中,原文如下:

如果您确实必须检测到是否发生了篡改,则将校验和字段添加到表中。每个新行的校验和必须包括前一行的校验和。然后为了验证内容,在您前进时遍历计算校验和的数据集。如果计算的校验和与表中的值不匹配,则某些值已被篡改。

-麦克风

一些人指出:系统管理员可以重新计算校验和(如果你想在他的服务器上编写代码,那就更成问题了),我在其中添加了以下增强功能:

当数据被插入到表中时,它使用公钥加密,因此任何人都可以添加到数据库中(假设您有多个人使用它)。您定期使用您的私钥解密数据并计算校验和。如果不同,则表示数据库已被修改(您想要测试的内容)。然后,您重新计算校验和并将其插入表中(当然,公钥也加密了)。

如果邪恶的系统管理员尝试重新计算新的校验和,他正在对加密数据执行此操作。

此外,如果您正在远程访问这些数据,那么通过在本地机器上进行解密和校验和计算,这种方法可以免受中间人攻击。截获的数据将保持加密状态,因此无法使用。

该系统的唯一缺陷是检测到数据库的任何事务。你可以通过抽象来解决这个问题并说:

  • 验证校验和
  • 插入数据
  • 重新计算校验和

但这消除了让您想要的任何人访问数据而无需提供您的私钥的优势。

现在可以用不同的方式解决这个问题,我建议你:

解决网格计算中的信任不对称问题

彼得丁达

http://portal.acm.org/citation.cfm?id=1066656

但实现细节变得更长。

于 2009-11-06T01:38:42.920 回答
1

关于这个主题有两篇有趣的研究论文,其中一篇提出了使用 HMAC 算法。另一个建议使用 Condensed-RSA 方案和 BGLS 签名方案。

外包数据库中的身份验证和完整性

http://www.isoc.org/isoc/conferences/ndss/04/proceedings/Papers/Mykletun.pdf

一种用于关系数据库的通用无失真水印技术

http://www.dsi.unive.it/~cortesi/paperi/iciss09.pdf

我觉得两者都是基于感知风险量的可行解决方案。——基兰·库马尔

于 2011-03-03T07:48:40.287 回答
1

这是一个常见的数据安全问题。简单的答案是 - 如果您处于一个“邪恶的 SQL 管理员”可以访问您的整个环境的情况,您将无法保护您的数据。

关键任务数据的一种常见做法是记录到多个备份并通过确保没有一个人拥有权限来保护。

于 2009-11-05T20:44:07.520 回答
1

如果您的应用程序一直在运行,您可以在数据库上启动一个事务,并且在您的应用程序关闭之前不要释放它......这样,除了您的应用程序之外,没有任何东西可以查看表......

同样是的,如果您有时间,请加密进出程序的所有文本字符串数据...

我也喜欢 BobbyShaftoe 的回答...不过,再进一步,看看您是否可以触发“睡眠”之类的东西,所以几分钟后所有记录都会恢复到原来的状态...所以我们邪恶的管理员认为他进行了更改,但它们只会被还原。

于 2009-11-05T20:46:05.330 回答
1

我发现这篇文章,看起来很有趣,可能是一个可能的解决方案,虽然我还没有花时间去尝试和思考漏洞。


在我的脑海中,我可以想象有两个独立的数据库,“邪恶的”系统管理员只能访问一个。

一个数据库将向另一个数据库提供一次性便笺簿,并记录谁请求了便笺簿以及何时请求。这个垫,连同当前时间和行数据可以被散列。

这样,如果邪恶的系统管理员更改了某些内容,哈希就不会检查出来,如果他试图重新哈希,你就会有一个日志记录应该发生的时间。

如果系统管理员可以存储时间和一次性密码,那么整个系统就会崩溃。

这是一个看似困难的问题,我不确定任何协议是否真的有效,但增加物理安全性和审计日志将是一个好主意。

于 2009-11-05T23:40:30.780 回答
1

我认为这是一个很好的问题!但是您的方案违背了数据库的设计原则。

行校验和,触发器导出到其他数据库 - 你做的任何事情都是妥协!

我只能提出一些开箱即用的建议——如果您应用某种类型的标准(例如PCI合规性)会有所帮助吗?

如果失败,我会建议寻找另一份工作!在我们的行业中有足够的工作,您不需要与这些类型的人一起工作......

于 2009-11-05T21:17:32.897 回答
1

如果您想要一种自动化的方法,您首先必须知道用户类型允许哪些操作和上下文。这是相当困难的,因为在正确的上下文中,下降是可以接受的,但它不适合日常用户。

我确实喜欢纸质备份的想法,但是随着大量用户群和大量数据库使用,所产生的信息量会很快变得非常大。

于 2009-11-06T00:29:30.233 回答
1

设置您的系统以将日志记录数据写入邪恶的 SQL 管理员无法控制的远程系统。这不会阻止该管理员删除或篡改您的日志记录程序,但会阻止他在事后修改它们。

于 2009-11-05T20:43:34.813 回答
1

虽然这里有一些非常好的建议,但它们都会尘埃落定。

因为您有一个“不受信任”的演员,即邪恶的管理员,作为您无法保护自己的数据的保管人。网络协议和现实世界中有各种方案可以让您保护您的数据不被不受信任的传输/信使篡改。但据我所知,没有什么可以保护您免受不受信任的托管人的侵害,例如“嗨。我是麦道夫先生,我曾经是纽约证券交易所的主席,您可以信任我......”。

于 2009-11-06T02:23:53.580 回答
1

首先,要非常小心您雇用谁来管理您的系统。

由触发器填充的下一个审计表。即使他绕过了更改的触发器,您至少可以查看他更改之前的数据(尤其是备份中的数据)。

第三个在异地删除的自动备份。这样即使坏人删除了数据库并删除了现场备份,你也有一个后备位置。确保数据库管理员无法访问异地备份,只有其他人拥有权限,即没有数据库服务器生产权限的人。

接下来,除了管理员之外,任何人都没有对表的直接权限。这意味着使用没有动态 SQL 的存储过程。这至少可以防止其他人以未经授权的方式更改数据。现在,您的会计人员更难进行欺诈了。

除了管理员和另一个作为备份之外的任何人都没有生产管理员权限。这样,如果您发现触发器发生了变化,您就会知道是谁做的。现在出事了,你只有两个嫌疑人。

SQL Server 2008 具有 DDL 触发器,可以告诉您谁进行了结构更改。同样,如果触发器没有记录更改,则默认情况下是由管理员创建的。

加密备份和某些个人数据,使其更难窃取。现在,异地备份交付人员将更难窃取您的数据。

解雇任何被证明不值得信任的管理员,即使这不是他不值得信任的数据。如果他伪造时间表或窃取办公用品,他就会窃取数据。如果他因某些严重罪行(不是交通违规)而被捕,如果需要,您可以将他停职,以查看指控是否得到证实。

当管理员决定转到另一份工作时,从他告诉你他要去的那一刻起,不要让他访问你的系统。如果你要解雇他,这一点尤其重要。

于 2009-11-05T21:37:42.557 回答
0

Since you evil admin has full control of the server, you probably need an external auditing solution that's designed to monitor the activity of privileged SQL Server users.

Guardium make a network appliance that can log all of the query activity on a database or a server, and it does it at the network level (including local connections) so you can't do anything at the SQL Server level to interfere with it.

This doesn't prevent your evil admin from changing the table but, because it's a locked down appliance, the evil admin can't change the table then persuade the appliance to say that he didn't do it.

于 2009-11-08T00:28:06.007 回答
0

您可以添加一个触发器来发送数据副本,因为它被输入到邪恶管理员也无权访问的非生产数据库中。管理员可以阻止触发器运行,但问题是如何检测操纵,而不是阻止它。

于 2009-11-05T21:11:58.023 回答
0

除了用于审计、校验和等的触发器之外,您还可以查看将数据库复制到另一个从属数据库 - 没有人能够直接对其执行任何操作。

您仍然有有人弄乱触发器等的风险,但是当它们被弄乱时它会非常明显,因此您可以检测到复制被破坏的时间点。

于 2009-11-05T20:48:13.303 回答
0

我在研究如何实现这样的解决方案时发现了这个线程。我想到的一个(非常理论上的)解决方案很像使用完美的前向密钥系统。

我的想法是,如果您有一个私钥-公钥对(称为 Kpr 和 Kpb)和一组算法(A 和 B),那么:

A(K_pr)=K'_pr

B(K_pb)=K'_pb

(其中 K'pr 和 K'pb 是不同于 Kpr 和 Kpb 的有效私钥-公钥对)

使用它,您可以对数据库中的每一行进行签名,在使用后丢弃每个私钥,但将公钥与签名一起保存。然后,您可以将第一个公钥保存在邪恶管理员无法更改的位置(即,将其发送给您认识的每个人,将其打印在报纸上,将其纹身在您的脸上,以上所有)。

由于不再有私钥,因此无法重新签署每条记录,并且您可以检查公钥是否都是连续的。我能想到的缺陷只有两个:

  • 如果邪恶的管理员获得了私钥的副本,他将能够从那一刻起更改任何记录。这可以通过使用硬件模块来创建签名来规避,因此无法从软件访问私钥
  • 邪恶的管理员将能够将数据附加到您的表中。

问题是我不知道一组算法,例如我描述的算法。但是,我不是密码学家,所以有可能。

编辑:

经过更多思考后,我可能已经找到了一种使用现有工具实现这一点的方法。如果您在第 (n-1) 条记录中包含第 n 条记录的公钥及其签名(您可以这样做,因为在写入记录时您可以访问下一个私钥),您' d 用前一条记录保护每条记录。删除私钥后,无法重新创建签名,因此只要您拥有第一个公钥,您就可以随时验证整个表。这也消除了拥有“顺序”私钥的需要,您可以简单地为每一行生成一个新的私钥(尽管这将非常昂贵)。同样的缺陷仍然适用。

于 2015-10-22T10:44:45.733 回答
0

这个问题的 2016 年答案是使用区块链数据库。根据维基百科:

区块链主要通过将最近有效交易批次的哈希标记为“块”来实现防篡改,证明数据当时一定已经存在。每个区块都包含先前的时间戳,形成一个区块链,每个额外的时间戳都会加强它之前的时间戳。

于 2016-01-17T06:18:08.563 回答