找回密码
 立即注册
Qt开源社区 门户 查看内容

Linux | 使用日志系统监控

2019-10-26 13:15| 发布者: admin| 查看: 475| 评论: 0

摘要: 一次性付费进群,长期免费索取教程,没有付费教程。进微信群回复公众号:微信群;QQ群:460500587教程列表见微信公众号底部菜单 |本文底部有推荐书籍微信公众号:计算机与网络安全ID:Computer-network日志条目(log ...
一次性付费进群,长期免费索取教程,没有付费教程。

进微信群回复公众号:微信群;QQ群:460500587
 教程列表 见微信公众号底部菜单 |  本文底部有推荐书籍


微信公众号:计算机与网络安全

ID:Computer-network

日志条目(log entry)是某个系统事件基于文本的一项记录。当用户输入身份验证信息时,一个远程客户端向Web服务器请求数据时,应用程序崩溃时,或者新的硬件设备连接时,一条描述性的记录就会附加到一个或多个日志文件中。

即便是一个很少使用的系统,在其启动到关机的这段时间内也会生成几千行日志文件,一些频繁使用的应用程序每天可以很容易地生成数百万行。由于日志文件往往冗长且乏味,我们希望将它的读取外包给可以智能过滤出紧急条目的软件,例如即时错误警告,并且仅在绝对必要时才通知反馈。在配置系统的日志行为和管理日益增长的日志文件方面做得越好,就越能理解系统的优势和弱点——系统也能变得越可靠。

对于那些能够阅读日志的人来说,日志文件是一个有见解价值的智库。它们可以告诉您系统在安全防御上的弱点和过往未经授权的入侵。日志条目可以帮助您预测系统安全性和性能方面的问题,也可以在事故发生后做诊断。

本文提供一个可以处理的日志资源清单,并描述配置、使用和管理日志的最佳实践途径。主要聚焦于故障预防以保护系统免受安全漏洞和性能中断的影响。了解学习入侵检测工具,它可以设置为定期扫描服务器和网络环境以寻找可疑活动的迹象。

1、使用系统日志

几十年来,Linux日志一直由syslogd后台程序管理。syslogd将收集系统进程和应用程序发送给/dev/log/伪设备的日志消息。然后它将该消息定向到/var/log/directory目录下相应的纯文本文件。syslogd(如图1)将会获知发送消息的位置,因为每一个消息头都包含元数据字段(包括时间戳、消息源和优先级)。



图1  syslogd后台程序中部分源的日志数据流

由于systemd无情地征服世界的强大力量,现在Linux日志也由journald处理。说“也”是因为syslogd没有被弃用,仍然可以在/var/log/中找到它的大部分常规日志文件。

就像接入系统管理服务程序的其他所有内容一样,变为journalctl也一直存在争议。没有人会否认journald新功能背后的价值(如图2)。但是journald将日志数据存储在二进制文件而非纯文本文件中的这一事实的确是一个问题。



图2  应用journalctl命令行工具(包括syslogd产生的)使用journald日志

实际上,因为它们是二进制的,所以有时可能很难甚至不可能访问日志。想一想:在您最需要它们的时候(比如,努力从系统崩溃中恢复时),journalctl可能会停止服务。另一方面,只要安装驱动,syslogd日志将始终供您访问。当试图寻找导致系统崩溃的原因以及必须采取哪些措施来备份时它将非常有用。好消息是,在可预见的未来,这两种日志系统将继续共存。

(1)使用journald记录日志

笔记本中运行的Ubuntu死机了。事实上,引导程序(boot)已经停滞,剩下了一块黑屏,只显示一条这样的信息:



获得了对/dev/sda1的引用这一事实证明硬盘驱动器还在工作,引导进程使它通过了GRUB,并且至少有一部分Linux已经被加载。事实上,屏幕上出现的这个特殊的信息正在起误导作用,因为它代表死机前引导进程完成的最后一个成功的阶段,并且与问题本身无关。

经过一些试验和错误,包括用一个实时USB驱动器引导笔记本启动并安装笔记本驱动器,结果证明Linux已经被完全加载,但是依然无法启动GUI桌面。回看那个失败的引导(屏幕上显示/dev/sdaq:…),按下Alt+F1并进入虚拟控制台的登录界面。在那里有完整的命令行内核shell访问权限。

事实证明可以按下Alt-F2、Alt-F3等打开多台虚拟控制台,还可以在Alt-<相应的F键>之间来回切换。可以使用Alt-F7回到主机shell(通常是GUI会话)。

键入journalctl本身将返回一个界面,其中包含当前系统中最旧的日志条目。第一行显示可用条目的开始和结束日期。在下面有将近九个月的日志条目,依顺序显示它们需要非常多个屏幕:



-n 20这个参数将会显示最近的20个条目:



每隔一段时间检查一下日志总是一个好主意。在工作站上运行该命令以确保它在按照预想工作,同时还发现了一个孤立的OpenVPN客户端。每隔五秒钟,该客户端就会忠实地连接一台VPN服务器,但令人遗憾的是,那个VPN服务器不再存在,然后发送新的日志条目告诉我们这些。为了解决这个问题,使用systemctl先停止再禁用了OpenVPN服务。

越能准确地缩小结果范围,就能越快地得到想要的信息。一个有效的过滤日志的途径是根据优先级显示结果。例如,增加-p emerg只显示那些被归类为紧急的日志条目。如果知道系统中的某些内容已经损坏但是不能隔绝这一问题,那么查看emerg或许是一个很好的首选:



除了emerg,还可以过滤出调试(debug)、信息(info)、通知(notice)、警告(warning)、错误(err)、临界(crit)以及报警(alert)消息(见下一部分syslogd的优先级)。增加-f标志(用于跟随)显示最近的10条条目,以及创建时随之产生的所有条目。这允许在事件发生情况时进行实时观察:



还可以通过日期和时间来过滤日志。这里我们回到不能启动GUI的笔记本。如果在引导进程停滞时就有一个非常好的想法,可以缩小搜索范围仅返回事发时间段内的事件。幸运的是,--since和--until参数可限定日期和时间。如果没有指定日期的话,将得到满足那些条件的最近时间。

在该例中,可以指定两分钟的范围,错误在这期间发生。两分钟,尤其是在系统启动期间,仍然会产生大量的日志条目——但是这也比浏览20分钟简单得多:



当在笔记本上运行了该命令后,可能已经节省了一些时间。然而,事实上选择了更旧的syslog系统日志文件。让我们一起看看它们是如何工作的。

(2)使用syslogd记录日志

syslogd系统上的所有事件生成的日志都被加入/var/log/syslog文件。但是根据它们不同的标识特征,它们也有可能被发送到相同目录下的一个或多个其他文件。

通过syslogd,消息的分布方式由/etc/rsyslog.d/目录下的50-default.conf文件的内容所决定。这个来自50-default.conf的示例展示了被标记为与cron命令相关的日志消息如何被写入cron.log文件。这里,星号(*)告诉syslogd发送所有优先级的条目(与只发送emerg或err这样单一级别不同):



使用syslogd日志文件不需要任何像journalctl这样特别的工具。但如果想熟练地使用它,需要知道每个标准日志文件中包含了哪种信息。表1列出了最常见的syslogd日志文件以及它们的用途(为了快速了解它们,请查看它们的man页面。例如man lsatlog)。



表1  常用的syslogd工具

此外,单个应用程序有时会写入自己的日志文件。可能也会经常看到日志目录(如/var/log/apache2/或/var/log/mysql/)被创建用来接收应用程序数据。除了前面看到的符号*外,还可以通过八个优先级中的任何一个控制日志重定向。表2列出了syslogd的优先级。



表2  syslogd的优先级

这句话出现在syslogd日志文件中:



X服务器是操控桌面图形界面的Linux系统。如果用户无法与之连接,则可能出现以下两种情况:

● X服务器已经崩溃

● 存在某种身份认证问题

到目前为止,这里并不是前者,已经使用不用的用户账户成功登录到了桌面会话。但是很难看出笔记本电脑所有者如何在命令行shell中进行身份验证并仍被拒绝访问桌面。尽管如此,这似乎值得进一步探索,所以打开了auth.log文件,看到了如下信息(这里用username代替了开发者的姓名):



lightdm是Ubuntu计算机使用的桌面管理器,pam是处理Linux用户身份验证的一个模块。

将问题定位到保存在用户主目录下.Xauthority文件的错误所有权中。显然X服务器只能为拥有.Xauthority文件的用户加载GUI会话。经核对,这个用户的.Xauthority文件实际上属于root。修复这个问题相当简单,只需运行chown将所有权变回username:



灵活地使用日志文件修复了这个问题。

2、管理日志文件

由于数百个系统进程每小时会产生几千条日志消息,不受管理的日志系统会很快填满为它分配的可用存储空间。那时日志记录将会中断,其他任何依赖这块存储空间的系统进程也会中断。

(1)journald方法

Journald通过自动限制journald系统准许使用的最大磁盘空间来处理这个问题。一旦达到限定值,较早的消息会被移动和删除。这项设置由/etc/systemd/journal.conf文件中的SystemMaxUse=及RuntimeMaxUse=控制。



这些设置之间的区别是什么?默认情况下,journald在/run/log/journal文件中构建并维护它的日志,这个文件是一个在每次关机时都会销毁的易失性文件。然而可以指示journald在/var/log/journal文件中维护一个持久性文件。可以使用这两个journal.conf设置中的任何一个,具体取决于系统设置。设定为持久性日志文件时只需要创建一个/var/log/journal/目录,并且使用systemd-tmpfiles相应地指示日志流量去向:



(2)syslogd方法

默认情况下,syslogd处理日志轮转(logrotate)、压缩和删除都在后台运行无须任何帮助。但应该知道它是如何完成的,以防有需要特殊处理的日志。

一个简单的日志需要哪种特殊处理?假设您的公司需要遵守监管部门的交易报告规则或行业标准,如果IT基础设施记录必须保持较长时间周期的可连通性,那么您一定想知道如何通过关键文件获取该方法。

查看日志轮转系统的运行状态,列出/var/log目录下的一些内容,如图3所示。例如auth.log文件以如下三种格式显示:



图3  /var/log/目录下的内容

auth.log:当前处于活动状态的文件版本,并且新的auth消息正在被写入。

auth.log.1:已经转为停止服务的最新文件。它保持在未压缩的格式中,以便在必要时将其快速调用回来。

auth.log.2.gz:一个较早的文件集合(如在下面列表中看到的.gz文件扩展名一样),为了节省空间已经被压缩,因为它们可能不太会被需要。

7天后,当下一个轮转日期到来时,auth.log.2.gz将会被重命名为auth.log.3.gz,auth.log.1将会被压缩并重命名为auth.log.2.gz,auth.log将会变成auth.log.1,再创建一个新的文件并命名为auth.log。默认的日志轮转周期由/etc/logrotate.conf文件控制,如图4所示。该清单中设置的值会在一个活动周后轮转文件,并在4周后删除旧文件。



图4  /etc/logrotate.conf文件中的一些常见设置

/etc/logrotate.d/目录中也包含一些自定义的配置文件来管理单个服务器或应用的日志轮转。列出这个目录下的内容,如图5所示,将会看到这些配置文件:



图5  /etc/logrotate.d/apt日志轮转配置文件中的内容



这是系统中apt设置文件的样子。

很多管理员选择将日志条目重定向到一个专门建立的远程日志服务器,在那里,数据可以得到它需要的所有特殊关照。这样可以释放应用程序服务器来执行即时任务,并将日志数据整合到一个易于访问的中枢位置。

3、处理大文件

下面介绍三个文本处理工具。

(1)使用grep

过滤文本最通用且最直接的工具是grep。这里有一个显而易见的例子,在auth.log文件中寻找登录尝试失败的证据。搜索单词failure将返回包含短语authentication failure的任一行。偶尔做这一检查可以发现那些通过猜测正确密码破坏账户的企图。任何人都有可能输错一次或两次密码,但是频繁的错误尝试理应引起怀疑:



如果是那种从不出错的管理员,那么这个搜索结果可能为空。通过手动地使用名为logger的程序手动地生成一条日志条目可以保证至少得到一个结果。尝试如下的操作:



也可以事先通过输入错误的密码登录账户从而产生一个真正的错误。

grep完成了这项工作,但从结果中只能看到身份认证失败。可以通过告诉grep包含匹配行之前和之后的行来展开其返回结果。这个例子打印出了匹配项和周围的行。它告诉您有人使用账户david尝试用su(切换用户)登录studio账户,但失败了:



也可以用grep在多个文件中进行搜索。

(2)使用awk

grep可以做很多事情,但它也不是万能的。以/var/log/mysql/error.log文件中的这些条目为例,如图6所示。



图6  /var/log/mysql/error.log文件中的一些节选条目

日志条目按照括号中的优先级分类(例如[Warning])。假设想知道自上次日志轮转以来有多少条警告信息。也许会定期将这一数字与一个能接受的基准频率进行比较,以知晓您何时会有问题需要调查。可以在每次[Warning]出现时使用grep并将其输送到wc,它将统计输出的行数、字数及字符数:



[Warning]似乎出现了4219次。有人试图在此引起您的注意。但是使用awk工具做相同的事情,wc只返回了204行!这是怎么回事:



grep似乎用括号将一串字符括了起来,并在文本流中搜索其中的每一个字符。因为Warning中有6个不同的字母,所以相当于几乎每一行都与之匹配。当然也可以去掉括号只搜索Warning,但也可能存在返回很多错误匹配的情况。

只要搜索用正斜杠括起来的字符串(如/[Warning]/),awk就不会有括号的问题。awk复杂的语法为它带来了独特的好处。例如,请注意上个例子中的$3。默认情况下,awk将一行文本分为几个字段,每个字段都用一个或多个空格分开。例如这条日志条目被分为7段:



grep将最后4个单词(Shutting down plugin binlog)当作4个不同的数据字段,因此很难找到一个行之有效的方法去搜索它们。但是第3个字段代表该条目的优先级,所以可以使用带$3的awk命令只返回与这个字段匹配的结果。

(3)使用sed

如果键入wc返回流中的行数依然不能使您满意,还可以使用sed命令做相同的事情,在这里=符号将打印当前的行号(-n告诉sed不打印当前的行文本本身):



可能不需要强行使用一个像sed这样优质的流编辑器只做记行数这样简单的事。

如下简单例子,在这里将文本hello world赋给sed并告诉它用单词fishtank替换(s)第一个world单词实例:



在结束引号之前添加一个g会告诉sed替换每一个world实例,假设这里有很多个单词world。

这虽然很好,但不是特别有用。sed的闪光点是在一些较大型进程中作为文本清理工具。也许您正在处理的Bash脚本下一步只需要输入它接收到的一部分。或者也许您正在准备对最终的读者更具有可读性的文本。

假设得到了一份名为number.txt的文件,其中包含一些带行号的代码。需要在不打乱代码本身的情况下删除行号,包括代码中的行。这里有一些可以使用的文本,如图7所示(将其粘贴到电脑的一个文件中以进行下一步)。



图7  带有多余行号的示例代码片段

现在将文件number.txt提供给sed:使用插入符号(^)将sed指向每一行的开头。指定任意数字,在开头位置的任意数字的实例都将被删除。注意如何使行号消失但保留Item数字:



或者,可以将输出重定向到一个新的文件中:



最后,sed可以有选择地只打印一个目录列表的子目录(且不是单个文件)。未滤过的列表如下所示:



以下是使用带^d的sed命令打印(p)那些以d开头的行(指定的目录):



4、使用入侵检测进行监控

除了日志,还有一种监控系统健康和稳定的方式:入侵检测。其理念是为系统状态创建一个基准描述文件以及应有的方式来周期性地扫描系统,寻找那些可能出现问题的变动。

实现它的办法是实现一个基于网络的入侵检测系统(Network-based Intrusion Detection System,NIDS),该系统依靠软件(如Snort、Nmap和Wireshark)定期地“嗅探”网络邻居以寻找那些本不该在这里的硬件、开放端口和主机

还可以建立一个基于主机入侵检测系统(Host-based Intrusion Detection System,HIDS)来持续监控您的服务器。这就是我们将要学习的如何使用Tripwire开源软件包。

Tripwire扫描服务器并将重要系统文件的关键属性(如文件大小)添加到它自己的数据库中。如果这些文件中的任何一个需要编辑或删除,或者需要将新文件添加到监控目录中,这些属性将会改变。当稍晚再告诉Tripwire让它检查系统时,它将把当前值与在数据库中存储的值进行比较,然后报告任何存在的差异。

要启动Tripwire,首先需要安装一个普通的邮件服务器将电子邮件报告发送给任何指定的管理员。然后安装并配置Tripwire本身,再编辑和加密它的策略和配置文件(分别为tw.cfg和tw.pol)。最后可以模拟系统更改以查看它在电子邮件报告中的样子。



(1)搭建邮件服务器

创建一个基本的Linux邮件服务器比想象的要简单得多。安装postfix包(对于Ubuntu,还有mailutils)。在安装过程(至少对于Ubuntu)中,当系统提示输入邮件配置类型时选择“Internet Site”并将系统邮件名设置为localhost.localdomain。还需要确保将/etc/postfix/main.cf文件中的inet_interfaces设定为localhost。剩下的就是确保端口25在运行的所有防火墙上都已经为SMTP打开,并重启postfix:



现在已经有一个活动的邮件服务器可以让您向远程收件人发送邮件了。

如何知道邮件服务器正在运行?

使用sendmail steve向本地地址(例如命名为Steve)发送一些邮件。将会面对一个空白行,在这里可以键入您的信息,然后是硬回车,单点和另一个硬回车。Steve就可以在它的命令行中键入mail以查收它的邮件。

(2)安装Tripwire

安装过程很简单,尽管在Ubuntu和CentOS上有细微的差别。

 Ubuntu

当apt安装Tripwire软件包时,系统会提示为两组签名密钥创建新的口令。这一进程会将您的口令在未加密的状态下短暂地暴露给其他碰巧登录您的系统的人(如图8)。



图8  Debian/Ubuntu中Tripwire安装进程的警告界面

为两组密钥都创建口令后,将被询问是否想重建加密的Tripwire配置文件(如图9)。在对源文本文件进行任何编辑之后都需要重建配置文件和策略文件。稍后将会看到如何手动地完成此操作,但是首次操作Tripwire安装程序已经帮您完成。



图9  Tripwire重建加密设置文件前的最终界面

当安装过程完成时,将会看到一个(如图10)包含关键Tripwire文件位置信息的界面。记录下它们,特别注意记录/usr/share/中的文件位置。/etc/tripwire/目录中也有配置文件。



图10  安装完成时,Tripwire显示重要文件的位置

 CentOS

CentOS安装与Ubuntu向导程序相比缺少那种华丽的、先进的、复古的20世纪80年代的图形界面。实际上,假设已经安装了epel-release库(install epel-release),则需要安装Tripwire软件包并看着文本行飞速闪过。

在CentOS中,签名密钥是在主安装程序运行之后通过运行一个叫作tripwiresetup-keyfiles的程序而创建的。这时会被提示创建两个口令。一旦安装程序完成(Ubuntu和CentOS相同),需要运行tripwire--init以初始化数据库



如果正在LXC容器中设置Tripwire,请注意可能看到一系列这样的错误:



发生这些错误是因为被Tripwire监视的系统文件正被容器的托管主机共享。这意味着正在容器中运行的进程并不总有完全的访问权限。不过,别担心。除了产生许多令人讨厌的错误消息外,这并不会对Tripwire的工作产生任何影响。

(3)配置Tripwire

通过保存在/etc/tripwire/目录下的两个文件:tw.cfg和tw.pol,可以控制Tripwire的行为方式。但问题是,这两个文件是加密的,不仅不可能被编辑,而且除非有一些特殊的超级英雄的技能,否则它们也不能被读取。这两个文件是根据两个纯文本文件中的信息构建的:twcfg.txt和twpol.txt。

twcfg.txt文件中包含一些基本的环境变量,如图11所示,可以根据需要对所有这些变量进行更改。它们中的大多数都可以完美地开箱即用。但是改变一些文件位置可以通过隐晦的方式增加一层安全性,特别是如果担心一些别有用心的人想在它们开始工作之前识别并禁用警报系统。如果决定移动它们,编辑twcfg.txt是不二选择。



图11  tecfg.txt文件中的默认内容

为这个文件添加的内容可以是发送报告的邮件地址(或邮件地址列表)。可以通过增加一行GLOBALEMAIL来指向您的地址:



twpol.txt文件设置了Tripwire用于分类和扫描文件系统的策略。该文件给了一个通用的工作策略,但是几乎肯定至少需要进行一些自定义来适应特定服务器设置。可以随着时间的推移增加这些自定义项,因为能感觉到看到的报告中有错误结果,以及一些Tripwire可能错过的东西。

可能会很快感觉到系统产生的错误结果。可能的罪魁祸首包括正在积极处理的进程ID(PID)文件和应用程序配置文件。一旦运行了几次Tripwire并且开始识别假阳性,那么就能检查twpol.txt文件中引用违规文件的行(例如:引用bashrc文件的行,如/etc/bashrc->$(SEC_CONFIG);),并用#号将其注释(如:#/etc/bashrc->$(SEC_CONFIG);)。

浏览在服务器上安装好的twpol.txt,并注意那些诸如以Invariant Directories命名的规则定义的策略方式,每种规则都被赋予严重性等级(如图12中的SIG_MED为中等重要性)。一个Invariant的描述意味着不希望该类对象更改权限或所有权,并且如果发生此类事件,应该因此收到警报。



图12  twpol.txt文件中的一个Tripwire策略规则的示例

显然,可以自由编辑构成Tripwire策略的十几条规则中的任何一条的内容和值,以满足需求。这个文件记录得很清楚,因此花10~15分钟通读它应该能使您非常清楚可以用它做什么事情。

编辑完纯文本文件后,并且假设还在相同的目录下,使用twadmin--create-cfgfile和twadmin--create-polfile更新加密版本:



由于源文件是纯文本的,因此一旦其中的设置成功合并到加密文件中,就应当立即删除它们:



如果在将来的某个时间,需要更新配置,则可以通过运行twadmin--print-cfgfile或twadmin--print-polfile来恢复原值。这些命令提供了一个文件,可以对它进行任何必要的编辑:



是时候拿出Tripwire进行试验了。在命令行中,tripwire使用了很多带有-m前缀的参数,此处m代表模块,所以-m c会加载检查模块。运行一次检查将会在屏幕上打印一次报告,该报告(可能)主要由几十个文件系统错误消息组成,这些错误消息是关于文件和目录不在指定位置的:



现在可以根据之前的扫描结果更新Tripwire数据库了:



Tripwire还可能报告无法打开的报告文件。如果这种情况发生,请在/var/lib/tripwire/report/目录中对当前最新文件运行--update-r。将在文本编辑器中看到这一报告。退出后,更新将继续(当发现自己在vi编辑器中,应该采用:q!命令):



(4)生成Tripwire测试报告

让我们制造一些麻烦看看Tripwire是否会注意得到。为系统添加一个新用户会到处留下一些蛛丝马迹。最起码,/etc/中的passwd、shadow和group文件会被更新。给您的朋友Max一个账号和密码



现在运行tripwire,指定电子邮件报告应该使用冗长级别1:



如果一切工作都完成,应当收到一封包含下列文本的邮件:



一旦对策略进行微调,可以将tripwire--check和tripwire-m u命令增加到cron中来自动完成该过程,开心地实践吧!

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】

----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:计算机与网络安全,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了