长时间听众,第一次来电。
'假设您有一个负责记录用户活动的数据库表。此日志的完整性非常重要,因此您希望能够检测是否有人修改了表中的任何数据。为了使事情更有趣,还要考虑这样一个事实,即您的系统可能由一个完全控制这个可怜系统的邪恶SQL管理员操作。让人惊讶...
您如何保护自己的数据?
您如何检测是否有人篡改了您的数据?
您可以使用无限制的工具。 (即散列,加密等)
答案 0 :(得分:31)
如果您确实必须检测到已发生篡改,则将校验和字段添加到表中。每个新行的校验和必须包含前一行的校验和。然后,为了验证内容,在向前移动时,遍历数据集计算校验和。如果计算的校验和与表中的值不匹配,则某些值已被篡改。
-Mike
答案 1 :(得分:13)
如果“邪恶管理员”无法访问填充数据库的应用程序,则每个表上包含cryptographic signature的其余列的额外列将完成此任务。需要“无法访问”条件,以便他们不仅可以提取您的私钥并签署他们的虚假数据。
编辑:啊,正如评论者指出的那样,我不认为管理员只是删除一行。为此,您需要一个额外的行,其中包含您每次更新的加密签名行计数(或表内容其余部分的签名哈希,或上次访问时间,或您选择的任何指示)。
答案 2 :(得分:5)
创建一个影子表,只有您和应用程序知道的情况下,每个字段都使用键/盐进行哈希处理。如果要检查数据篡改,请重新扫描用户表并与影子表进行比较。
答案 3 :(得分:5)
如果你真的想要安全使用 - 为该表写一次Read Many Media。
答案 4 :(得分:4)
只需使用您的交易ID运行纸质日志,并将打印机放在只有1个键的房间中。使用金融系统,你会发现他们中的许多人仍然依赖于他们的纸质备份。几乎不可能无法“破解”纸质日志......这就是为什么人们不断推动投票机中的纸质记录。
很多人都在说,“只需添加另一个数据库”,虽然我自己实际练习这种记录,但我不相信它。一个恶意的内幕人士可能会以十几种方式淘汰这种保护措施。
我们在这里所做的就是试图找到一种方法,让事情明显发生。你会丢失你的日志。你无法信任它们:如果我遇到一个带有万无一失的日志记录系统的系统,我要么用垃圾数据填充它,要么完全擦除它。不要陷入马其诺防线的心态。
但如果你准备足够,那么必须发生太多失败,你可以将破坏缩小到内部来源。您需要记录数据库中的,需要保留大量的系统日志,需要监控IP流量,将摄像头放在服务器机房中,在控制台上留下键盘记录器等等。最好的会在某个地方滑倒,如果你周围有足够的捕鼠器,你可能会偶然发现它们。
答案 5 :(得分:3)
让我们明确一点:如果你假设一个邪恶系统管理员,没有加密解决方案会阻止他们以无法追踪的方式修改系统上的数据 - 有些解决方案会阻止他们解密信息,但没有什么可以阻止他们以任何他们认为合适的方式撰写新信息。
这种情况需要以下条件:
该系统必然是独立的。如果您可以添加另一个系统,因为Evil Sysadmin无法作为日志记录主机(例如,系统日志服务器)访问,那么突然问题就变成了定期传输日志或哈希的一个简单案例。
< / LI>系统没有非软件一次写入组件。其他人建议的最简单的就是打印机,但是你可以使用CD或自定义一次写入硬件来防止这个问题。如果Evil Sysadmin可以物理访问机器,这些会变得更棘手,但并非难以克服。
您需要确定性,而非统计可能性。如果#1和#2是不可能的,那么你唯一剩下的解决方案就是暗示 - 如果邪恶的系统管理员不知道陷阱,那么设计用于捕获篡改的特技陷阱的实施。
有效#3的秘诀是战术上的惊喜。目的是向攻击者传达他们对任何反措施都知道的印象,而事实上他们知道的更多是他们不知道的。一般来说,这需要至少两层保护 - 你需要至少有一层保护,邪恶的系统管理员可能会受到损害,因为他们会寻找它,如果他们找不到它们,他们会得到它怀疑并深入挖掘,直到他们这样做。
重要的一点是,这个封面应该是如此令人信服,以满足邪恶的系统管理员,一旦他们找到它,他们不再需要看。然后,第二层使用替代技术识别篡改并产生适当的警报。在这个线程重新交易等中有各种可以实现的建议。解决方案的级别越低,成功的可能性就越大(即,修补数据库源代码远比执行连接和查询的标准进程更不明显,修补内核再次不太明显,修改固件.. )。
重要的是要强调这不是一个完美的解决方案。无论您的设置如何复杂,有人可能已经想出/妥协了足够的信息来实施对策。 #1和#2(正确完成)的情况并非如此。也就是说,如果你所保护的信息的价值足够低,那么拥有必要技能的人就不会有兴趣去获取它,那么它应该提供可行的辩护。
答案 6 :(得分:2)
您可以使用触发器来审核插入,更新和删除。现在,如果“邪恶的SQL管理员”禁用触发器,那么你有一些更难的问题。如果我想保护我的数据,我不会允许邪恶的管理员完全控制系统。
答案 7 :(得分:2)
考虑创建滚动,快速,异地,自动的数据备份。 S3现在如此便宜,以至于人们可能需要mysqldump
类型的流程来将您的整个数据存储库经常转移到Transatlantic备份商店。多久一次将取决于你的DBA的邪恶。
为了使这个过程成为可能,只需找到或建立一个网络内部的机器,邪恶的管理员一无所知,或者如果她怀疑有任何东西就不会关心。 plug computer的简洁和优雅在这里不容小觑。
请注意实际的导出机制:对您的特定系统一无所知,我建议mysqldump
或Oracle exp
作为最简单和最愚蠢的解决方案。如果您的应用程序有一种以本机格式(例如XML,JSON或甚至协议缓冲区)导出数据的方式 - 换句话说,任何部分,例如,SOA应用程序用来交谈的格式彼此),然后该格式可以用作滚动转储的格式。
我已在gitosis
框中实施此方法。每三个小时内容就会被转储到欧洲S3桶中。这是另一个VCS的穷人的VCS。
答案 8 :(得分:1)
首先,要非常小心你雇用谁来管理你的系统。
下一个审核表由触发器填充。即使他绕过了他的更改触发器,你至少可以在他更改之前查看数据(特别是从备份中)。
异地删除的第三个自动备份。这样,即使坏人丢弃了数据库并删除了现场备份,您也有一个后备位置。确保数据库管理员无法访问异地备份,只有其他人拥有该权限,以及对数据库服务器没有生产权限的人员。
接下来,除了管理员之外,没有对表的直接权限。这意味着使用没有动态SQL的存储过程。这至少可以防止他人以未经授权的方式更改数据。现在你的会计人员很难进行欺诈。
除了管理员和另一个作为备份之外,没有任何人的生产管理员权限。这样,如果您发现触发器发生了变化,您就知道是谁做的了。现在出了什么问题,你只有两个嫌疑人。
SQL Server 2008具有DDL触发器,可以告诉您谁进行了结构更改。同样,如果触发器没有记录更改,则默认情况下由管理员创建。
加密备份和某些个人数据,使其更难窃取。现在,异地备份交付人员将更难以窃取您的数据。
解雇任何被证明不值得信任的管理员,即使这不是他不值得信赖的数据。如果他伪造时间表或窃取办公用品,他将窃取数据。如果他因某些严重的犯罪行为而被捕(不是违反交通规则),如果需要证明该指控是否已被证实,你可以暂停他。
当管理员决定转到另一份工作时,不要让他从他告诉你他去的那一刻起就可以访问你的系统。如果你要解雇他,这一点尤其重要。
答案 9 :(得分:1)
关于这个主题有两篇有趣的研究论文 其中一个提出使用HMAC alogrith。另一个建议使用浓缩 - RSA方案和BGLS签名方案。
外包数据库中的身份验证和完整性
http://www.isoc.org/isoc/conferences/ndss/04/proceedings/Papers/Mykletun.pdf
关系数据库的通用失真自由水印技术
http://www.dsi.unive.it/~cortesi/paperi/iciss09.pdf
我觉得这两种解决方案都是基于可疑风险的数量。 --Kiran.Kumar
答案 10 :(得分:1)
电源/双电源控制的分离。
我喜欢到目前为止提出的想法。我想加上自己的2美分。
在金融业,权力分立是保持一个人完全邪恶的关键。我们的核心处理解决方案由我们的簿记部门管理(祝福他们的心),因此我们的程序员并没有真正获得对我们的实时数据的大量访问。
此外,第三方记录与系统关键部分的交互。
总的来说,没有一个人有足够的控制权来影响所有的制衡,使得收益减少到足以使其(希望)不值得协调。
答案 11 :(得分:1)
虽然这里有一些非常好的建议,但他们都会沾沾自喜。
因为你有一个“不信任的”演员,邪恶的管理员,作为你的数据保管人,你无法保护自己。网络协议和现实世界中有各种方案可以保护您的数据免受不受信任的传输/信使的篡改。但据我所知,没有任何东西可以保护你免受不信任的托管人的伤害,就像“你好。我是麦道夫先生,我曾经是纽约证券交易所的董事长,你可以信任我......”。
答案 12 :(得分:1)
我喜欢MikeMontana的解决方案,但我认为可能值得添加一个附录。可悲的是我还没有留下评论,所以我把它贴在一个新的答案中,原文引用如下:
如果你真的必须检测到这一点 篡改已经发生,然后添加一个 校验和字段到表。该 每个新行的校验和必须包括 前一行的校验和。然后到 验证内容,走过去 数据集像你一样计算校验和 前进。如果算了 校验和与...中的值不匹配 表然后有一些价值 篡改。
-Mike
有几个人指出:系统管理员可以重新计算校验和(如果你想在他的服务器上生成代码,更是一个问题),我添加了以下增强功能:
当数据插入表中时,它使用公钥加密,因此任何人都可以添加到数据库中(假设您有多个人使用它)。您定期使用私钥解密数据并计算校验和。如果它不同则意味着数据库已被修改(您想要测试的内容)。然后重新计算校验和并将其插入表中(当然也加密公钥)。
如果邪恶的系统管理员试图重新计算新的支票金额,他就会对加密数据进行重新计算。
此外,如果您远程访问此数据,那么通过在本地盒子上进行解密和校验和计算,这种方法可以免受中间人攻击。截获的数据将保持加密状态,因此无法使用。
此系统中唯一的缺陷是检测到数据库的任何事务。你可以通过抽象来解决这个问题并说:
但这消除了让任何人想要访问数据而不泄露私钥的优势。
现在可以用不同的方式解决这个问题,我建议你这样做:
解决网格计算中的信任不对称问题
彼得·迪达http://portal.acm.org/citation.cfm?id=1066656
但实施细节变得更长。
答案 13 :(得分:1)
每隔几个小时,对表的内容进行哈希处理。同时记录开始和结束行。对于第二个散列和on-wards,对整个表的内容进行散列,并在前一个散列(检查散列)中散列行。如果先前的散列和检查散列不匹配,则数据库表已被篡改。我会通过电子邮件将这些哈希发送给您,因此您可以检查流氓管理员是否已经完成并重新生成所有哈希值。我意识到存在差距,但我认为除了这个或者已经提到的内容之外,还有更多的东西可以做(不能删除它们)。
答案 14 :(得分:1)
如果您想要自动化方法,首先必须知道用户类型允许的操作和上下文。这是非常困难的,因为在正确的上下文中,丢弃是可以接受的,但它不适合日常用户。
我确实喜欢纸张备份的想法,但是由于用户群庞大且数据库使用量很大,所产生的信息量很快就会变得很安静。
答案 15 :(得分:1)
我发现这个article,它看起来很有趣,可能是一个可能的解决方案,尽管我还没有花时间去尝试思考漏洞。
我可以想象有两个独立的数据库,“邪恶的”系统管理员只能访问一个。
一个数据库会向另一个数据库提供一次性填充,并记录谁请求填充以及何时。可以对此焊盘以及当前时间和行数据进行哈希处理。
这样一来,如果邪恶的系统管理员改变了某些内容,哈希就不会检查出来,如果他试图重新发布,你就会记录应该发生的时间。
如果系统管理员可以存储时间和一次性填充,则整个系统会崩溃。
这是一个看似很难的问题,我不确定任何协议是否真的有用,但添加物理安全性和审计日志是一个好主意。
答案 16 :(得分:1)
设置系统以将日志记录数据写入恶意SQL管理员无法控制的远程系统。这不会阻止所述管理员删除或篡改您的日志记录程序,但这会阻止他在事后修改它们。
答案 17 :(得分:1)
我认为这是一个很好的问题!但是你的场景违背了数据库的设计原则。
行校验和,触发导出到其他数据库 - 您所做的任何事情都将是妥协!
我只能在框外提出一些建议 - 如果您要应用某种类型的标准,例如PCI合规性,它会有所帮助吗?
如果失败了,我建议找另一份工作!在我们的行业中有足够的工作,您不需要与这些类型的人合作......
答案 18 :(得分:1)
如果您的应用程序一直在运行,您可以在数据库上启动一个事务,并且在您的应用程序关闭之前不要释放它...这样就没有任何东西甚至可以查看该表但您的应用程序......
同样是的,如果你有时间,加密进出你的程序的所有文本字符串数据......
我也喜欢BobbyShaftoe的答案......但是请稍微进一步了解一下,看看你是否可以触发“睡眠”或者其他什么东西,几分钟后所有记录都会回到原来的状态......所以我们的邪恶的管理员认为他做了改变,但他们只会得到恢复。
答案 19 :(得分:1)
这是常见的数据安全问题。简单的答案是 - 如果您遇到一个单独的“邪恶的SQL管理员”可以访问您的整个环境,您就无法保护您的数据。
任务关键型数据的一种常见做法是通过确保没有任何一个人拥有权限来登录多个备份并进行保护。
答案 20 :(得分:0)
您可以添加触发器,以便在将数据输入到非生产数据库时发送数据副本,该数据库也是邪恶管理员无权访问的数据。管理员可以阻止触发器运行,但问题是如何检测操作,而不是阻止它。
答案 21 :(得分:0)
除了审计,校验和等触发器之外,您还可以查看将数据库复制到另一个从属数据库 - 没有人能够直接对其执行任何操作。
你仍然有可能会有人搞乱触发器等,但是当它们被搞乱时它会非常明显,所以你能够检测到复制被破坏的那一点。
答案 22 :(得分:0)
由于您的邪恶管理员可以完全控制服务器,因此您可能需要一个旨在监控特权SQL Server用户活动的外部审计解决方案。
Guardium创建一个可以记录数据库或服务器上所有查询活动的网络设备,并在网络级别(包括本地连接)执行此操作,因此您无法在SQL上执行任何操作服务器级别干扰它。
这并不能阻止你的邪恶管理员更改表格,但由于它是一个锁定的设备,邪恶的管理员无法更改表格,然后说服设备说他没有这样做。
答案 23 :(得分:0)
我在研究如何实现这样的解决方案时找到了这个线程。我想到的一个(非常理论上的)解决方案就像使用完美的前向密钥系统一样。
我认为如果您有一个私钥 - 公钥对(称为Kpr和Kpb)和一组算法(A和B),那么:
(其中K'pr和K'pb是与Kpr和Kpb不同的有效私钥 - 公钥对)
使用此方法,您可以对数据库中的每一行进行签名,在使用后丢弃每个私钥,但保存带有签名的公钥。然后,您可以将第一个公钥保存在邪恶管理员无法切换的位置(即将其发送给您认识的所有人,将其打印在报纸上,纹身贴在您的脸上,以上所有内容)。
由于没有私钥,因此无法重新签名每条记录,并且您可以检查公钥是否全部是连续的。我能想到的只有两个缺陷:
问题在于我不知道一组算法,例如我所描述的算法。但是,我不是密码学家,所以有可能。
编辑:
经过一番思考后,我可能已经找到了一种方法,可以利用现有工具实现这一目标。如果你在第(n-1)条记录中包含第n条记录的公钥及其签名(你可以这样做,因为在写一条记录时你可以可以访问下一个私钥),您将使用前一个记录保护每条记录。删除私钥后,无法重新创建签名,因此只要您拥有第一个公钥,就可以始终验证整个表。这也消除了使用“顺序”私钥的需要,您可以简单地为每一行生成一个新的私钥(尽管这将非常昂贵)。同样的缺陷仍然适用。
答案 24 :(得分:0)
2016年对此问题的回答是使用blockchain数据库。根据维基百科:
通过将最近一批有效交易的散列时间戳加入“块”,块链主要是防篡改,证明数据当时必须存在。每个块都包含先前的时间戳,形成一个块链,每个附加的时间戳加强了之前的时间戳。