Ubuntu 16.04 服务器,记录到数据库而不是默认日志

Ubuntu 16.04 服务器,记录到数据库而不是默认日志

我目前正在与一个运营小型游戏网络的团队合作,他们最近遇到了一些“问题”,管理员们意见不一致,所以我被叫来保护他们的系统并接管管理工作。

我们目前运行的是 Ubuntu 14.04,但计划在下次维护期间升级到 16.04。

管理人员希望有更安全的命令日志记录(而不是标准.bash_historyauth.log),因为任何有权运行命令的人也有权修改相关日志文件。

我建议使用 MySQL 来存储日志,因为人们可以被授予查看但不能编辑的权限,并且只有选定的用户才能进行更改。

那么,目前是否有一个包可以将日期、时间、用户名和命令存储到 SQL 数据库(包括 sudo 命令)以增加安全性?

如果没有,是否有其他建议,关于如何锁定.bash_history所属用户的写权限,并让 root 写入日志?

我在 Google 上快速浏览了一下,搜索词一直返回 MySQL 日志文件,但我会继续寻找。

答案1

如果您愿意接受其他解决方案,我建议您使用专门的日志记录软件而不是 MySQL。这样做的原因是,众所周知,MySQL 在日志存储方面存在问题,尤其是在没有任何预处理的情况下。换句话说,如果您只是将原始日志条目转储到 MySQL 表中,那么您最终可能会得到很少的列:id、、timestamp和(或这些的任何子组合)。因此,这使得搜索log_level变得log_entry非常困难,因为您必须等待很长时间才能完成全部您的日志条目加上索引的内存开销可能对您的网络来说是不可接受的。当然,您可以设计一个自定义架构,使其在数据存储和检索方面稍微更实用、更高效,但如果日志链的任何部分更改操作,或者您想要记录之前未记录的数据,则可能需要维护。

同样,如果您使用 MySQL 来存储用户/游戏数据/其他内容,那么这样做会给数据库增加更多开销。因此,这可能会减慢整个系统的基础架构(取决于系统负载,我建议进行一些测试)。

无论如何...

如果你确实想深入研究集中日志记录和日志管理,我建议使用 Logstash 与 Elasticsearch 相结合来查询信息。你也可以(如果你愿意)将 Kibana 投入其中,以创建所谓的完整ELK 堆栈。但是,此解决方案的问题在于 Elasticsearch 本质上是一个全局索引,需要投入大量开发和/或运营时间才能有效地进行设置。您还必须留出很多硬盘空间(可能还有内存),如果不是专门的日志服务器的话。当然,ELK 堆栈有很多替代方案,你可以通过一些研究找到最适合你的解决方案。但有一点需要注意,这logstash需要一些 NoSQL 数据库(请参阅支持的输出)。

无论哪种方式,根据您选择的日志解决方案,都有方法将此类日志信息集成到大多数日志堆栈中。例如,我使用完全自定义的基础设施和软件运行一个小型 Minecraft 网络。我们的系统设计为记录到 ELK,然后 ELK 为我们提供有关用户、游戏内命令、“高延迟”事件和类似操作的可搜索信息。当然,这可能不是必要的,但朝这个方向扩展的能力可能对未来的扩展和开发和管理的简单性很有用。


不管怎样,我已经谈论了太多关于日志记录的事情而没有真正给出答案,所以我想我应该尝试这样做。

我目前的看法(根据您的评论)是,您有几个问题需要按无特定顺序解决:

  • 不要让用户去他们不该去的地方。
    Linux 有极其强大的访问控制管理。您可以阻止用户访问他们不应该访问的内容。例如,使用/etc/sudoers限制某人可以(或不能)运行的命令。

  • 给予用户完整权限root使得日志记录无法进行
    所以,我要在这里尽情发挥我的想象力。你让你的用户不受限制地访问。sudo如果我,一个流氓管理员,要运行sudo -s或类似的命令,我会毫无问题地进入 root shell。此时,你会失去一些东西。首先,你不知道谁在实际运行该命令。你只知道是谁root运行了它。其次,流氓管理员可以非常简单地禁用他们想要的任何后端服务器的日志记录,然后运行他们想要的任何命令。当然,您可能能够知道用户何时成为 root,并且或许推断此后谁运行了什么命令,但这不再可靠。

不过,还有一个好用的实用程序,叫做auditd(安装和配置留给读者练习)。基本上,此实用程序将记录和监视用户(甚至是那些具有升级权限的用户)执行的命令在某些情况下)。默认情况下,这将记录到平面文件中,但您可以将其移动到任何您想要的位置。例如,logstash可以记录审计日志,然后你可以将其转发到任何地方(例如MongoDB如果您不想运行 ELK 堆栈,这可能是个不错的选择。但是,这种设置很容易受到恶意管理员禁用日志记录的攻击。

但实际上,数百有多种方法可以使用各种技术来实现这一点,但现有的技术不可能让你随便使用并期望它完美地工作。你需要对现有的平台进行一些研究和实验,然后选择适合你的价格点、开发能力、基础设施资源等的平台。


如果你真的如果你想使用 MySQL,我会遵循 Muru 的评论。本质上,你可以设置auditd并拥有rsyslog 从中提取数据auditd并将其转储到 MySQLommysql项目将以可预测的方式提供存储。根据文档auditd,您将能够非常轻松地获得至少一些有用的字段,这将允许为(至少)已记录的命令建立一个体面的架构。例如,您将能够使用来auid确定哪个用户做了什么,comm或者exe确定运行了什么、审计唯一 ID、状态结果以及运行了什么/如何运行。请参阅这个答案作为示例设置。

对于用户登录和类似情况,您将需要通过 配置其他表rsyslog。实际上,MySQL 中的每个表只能容纳一种操作类型(登录、执行的命令等)。根据您的用例,这可能很好,但它确实限制了您创建完整审计跟踪的能力(NoSQL 提供此类功能)。

您仍然需要一个 syslog 服务器,以及(理想情况下)一个用于日志记录的专用 SQL 服务器。


不过就我个人而言,我会选择auditdELK 堆栈。更简单,而且有扩展空间。

免责声明:我与上述任何技术都没有任何关联,但我几乎使用过所有的技术,并且有我自己最喜欢的技术。

相关内容