【问题标题】:how to prevent anyone from dropping, deleting, and changing the contents of a log table in mysql如何防止任何人删除、删除和更改mysql中日志表的内容
【发布时间】:2015-10-23 13:54:34
【问题描述】:

出于安全目的,我们将创建一个数据库日志,其中将包含对数据库上不同表所做的所有更改,为此我们将使用here 所述的触发器,但我担心的是,如果系统管理员或任何人拥有root权限会为了他们的利益而更改日志上的数据,这将使日志变得毫无意义。因此,我想知道是否有办法阻止任何人,我的意思是根本没有人对日志表进行任何更改,即删除表、更新和删除一行。如果这甚至可能?同样关于我的日志表,是否可以跟踪使用更新查询更改的先前数据?我想在我的日志表中保存以前的和新的数据,以便我们知道进行了哪些更改。

【问题讨论】:

  • 每天将新内容转储到 csv 并通过电子邮件发送给某人,但问题是如果您不信任系统管理员而不是遇到更大的问题
  • 在你工作的地方听起来很有趣
  • 如果涉及金钱,您就不能真正信任任何人,@Mihai 这实际上不是一个坏主意,也许我应该将他们的权限限制为不能删除任何行,这是不可能的限制每个表的权限,仅限每个数据库?
  • 这听起来像你正在密谋制造核弹来杀死隔壁房间的蚊子......只要你想用关系做这样的事情> 数据库,你可以 100% 确定你们在架构中做错了什么(因此你最终这样做了,并且卡在了权限模型上)。

标签: mysql sql database logging


【解决方案1】:

您要解决的问题很难解决,因为您希望有人可以管理您的系统,但您不希望他们能够对系统的所有部分进行实际操作。这意味着您要么需要自己管理系统并授予某人有限的访问权限,要么信任所有管理员,要么寻找外部解决方案。

您可以做的是将您的日志写入一个只有您(或至少:另一个管理员然后是第一个管理员)可以访问的系统。

然后,如果您只在此系统上写入(并且不允许更改/更新和删除),您将能够保留受信任的日志,甚至在被篡改的情况下发现不一致。

第二种方法是使用一种特定的方法来编写日志,一种添加签名消息的方法。通过这种方式,您可以确定该系统已添加日志。如果您还保存(签名)完整系统状态的消息,您可能能够识别任何篡改。用于签名的“系统”显然应该存在于另一台机器上,使其在某种程度上等同于第一个选项。

【讨论】:

  • 签名消息是指代码,对吗?只有我能理解,这根本不是一个坏主意,尽管考虑到这将使用触发器来完成,添加代码会很麻烦吗?我不太确定,因为这将是我第一次使用触发器,而且我也只是在刷新我的 Java。我还不如成为系统的超级管理员,只是限制系统管理员的访问,反正他们不需要手动更改数据。
  • 如果你想安全地对抗系统管理员,你不能只使用触发器。它们可以被读取、更改等。对于签名,您需要由外部系统完成签名,并且您当然不能让某人调用该系统来完成他们讨厌的工作。您确实可以让自己成为管理员,而只是不授予任何其他人更改表格的权利,这样就可以了,但这并不是我要说的结构性解决方案。
  • 除了触发器让我记录数据库中表的任何更改之外,您还能建议哪些其他选择?到目前为止,我只在我的研究中阅读了有关触发器的信息,这确实是我成为管理员的最后手段。这是一个非常困难的困境谢谢你的时间
  • 好吧,您可以对数据库的内容进行签名。因此,在应用程序级别添加一条签名消息,让您知道它来自应用程序。来自其他来源的任何更改(例如,管理员试图固定他的薪水)都不会有签名。一定要一个。从所述管理员那里获得安全签名,并且 b。签署所有进入数据库的数据
  • 我现在有点明白了,但我必须确保签名的消息是随机的,并且只有我知道它们虽然我仍然需要保留日志所以我猜我仍然会使用一些触发器为他们
【解决方案2】:

没有办法阻止 root 访问具有进行更改的权限。不过,组合方法可以帮助您检测篡改。您可以创建另一台具有更有限访问权限的服务器并在那里克隆数据库表。记录两台服务器上的所有登录活动,并在服务器之间交叉备份日志。此外,进行非常定期的服务器外备份。您还可以创建一个与日志表的每一行匹配的哈希表。他们不仅要找到创建哈希的代码,还要对其进行逆向工程并更改时间戳以匹配。但是,我认为您最好的选择是制作一个没有网络登录的克隆服务器。仅限物理登录。如果你认为有任何篡改,你将不得不做一些取证。您甚至可以将 USB 密钥添加到物理克隆服务器,并将其留给 CEO 或其他人。当然,如果您不能信任系统管理员,那么无论您从事什么工作都是非常困难的。诀窍不是建立坚固的墙,而是建立一个细网并仔细检查通过网的所有东西。

一旦你设置了主从关系,并且只允许不受信任的用户访问从数据库,你就不需要改变你的代码。只需在代码中使用主数据库作为主数据库。下面的链接是有关设置主从复制的信息。但是,要完全有效,它们需要位于不同的服务器上。我不知道这个解决方案如何在一台服务器上工作。有可能,我就是不知道。

https://dev.mysql.com/doc/refman/5.1/en/replication.html

【讨论】:

  • 加密日志也不错,他们不仅会知道那里写了什么,而且他们也不会破解它。但是root用户可以访问mysql中的触发代码吗?
  • 如果您只是使用触发器,是的。您需要数据库之外的东西来加密或创建散列。这只会增加黑客攻击的复杂性,而不是让它变得不可能。确实,最好的解决方案是保留日志和快速同步备份以及数据库克隆。通常,日志会写入没有任何简单访问路径的不同服务器。
  • true 可以只在我是唯一用户的不同数据库上创建日志,以防止任何人操纵数据,这似乎是最安全的方法,但我将如何处理这个使用数据库触发器的解决方案?我是否在我的 Java 代码中连接到 2 个数据库并在不同的数据库上运行插入查询?请原谅我,因为我还没有体验过同时使用 2 个数据库
  • 你用的是什么数据库?
  • 我必须更加努力地考虑这个...但是如果您设置一个主从复制并将从属用作主数据库,并且所有写入都对主数据库进行,那么篡改从属会被注意到。管理员可以访问从属服务器,只有受信任的工作人员可以访问主服务器。为了回答您的问题,此时您不必将两个数据库连接到您的代码。
【解决方案3】:

打开 PhpMyAdmin 打开桌子 并在表上分配表级权限

【讨论】:

  • 有可能。限制管理员从特定 IP 访问该表,其余的只能读取。
猜你喜欢
  • 2017-06-17
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2016-07-12
相关资源
最近更新 更多