Linux运维之认识与分析登录档
什么是登录档:
简单的说,就是记录系统活动记录的几个档案, 例如:何时、何地 (来源 IP)、何人( login name )、做了什么动作, 另外就是系统在什么时候做了什么样的行为时,发生了什么样的事件等等
—— 《鸟哥的Linux私房菜》
登录档的重要性:
为什么要把登录档作为一个专题拿出来讲呢,因为它真的很重要,也非常有用!
就我自己而言,之前经常会碰到某些服务启动失败或者运作过程中出问题的状况,这时候系统就会提示我去看登录档
可惜我当时完全不知道怎么分析登录档,只能去百度
简单的问题百度还好,稍微复杂一点的,百度谷歌一般都很难找到症结所在
最了解系统问题的还是系统自己,所以这个时候登录档可是无比重要的
学会分析登录档,几乎可以解决大部分的系统问题!
另外在攻击溯源的过程中,登录档也是无比重要的线索之一!
常见的几个登录档文件:
不同的Linux distributions, 通常登录档的档名都是不同的(除了messages和网络服务)
下面介绍几个常用的登录档(/var/log/):
-
wtmp
记录登入系统的用户信息,该文件是个二进制文件,必须使用 last 这个指令来读取档案内容。溯源的时候很有用,包含用户,登录权限,登录方式,登录ip和登录时间等信息。 -
lastlog:
可以记录系统上面所有的账号最近一次登入系统时的相关信息。lastlog指令就是利用这个文件的记录信息进行提示的。 -
maillog或mail/*:
记录邮件的往来信息,其实主要是记录 postfix (SMTP 协议提供者) 与 dovecot (POP3 协议提供者) 所产生的讯息。 SMTP 是发信所使用的通讯协议, POP3 则是收信使用的通讯协议。 postfix 与 dovecot 则分别是两套达成通讯协议的软件。 -
messages:
这个文件相当的重要,几乎系统发生的错误讯息 (或者是重要的信息) 都会记录在这个文件中; 如果系统发生莫名的错误时,这个文件是一定要查阅的登录档之一。 -
secure:
基本上,只要牵涉到需要输入账号密码的软件,那么当登入时 (不管登入正确或错误) 都会被记录在此文件中。 包括系统的 login 程序、图形接口登入所使用的 gdm 程序、 su, sudo 等程序、还有网络联机的ssh, telnet 等程序, 登入信息都会被记载在这里; -
cron:
用于记录例行性服务crontab的内容 -
apache2, mysql, httpd等等文件夹:
不同的网络服务会使用它们自己的登录文件来记载它们自己产生的各项讯息,上述的目录内则是个别服务所制订的登录档。
关于登录档的产生:
一般有两种方式,一种是由软件开发商自定义写入的登录档与相关格式,比如上面提到的apache2这个文件夹里的内容。
另外一种就是由该版本的Linux提供的登录档管理服务进行统一管理。例如CentOS就是通过rsyslog.service这个服务来统一管理的。
上一个专题提到过系统是由systemd所管理,所有经由它启动的服务在运作过程中发生的一些问题和正常的讯息,实际上都会先由systemd-journald.service以二进制的方式记录下来,之后再发送给rsyslog.service作进一步的记载。
另外,systemd-journald.service的记录主要放在内存中,比如我们透过journaltctl
和systemctl status unit.service
来查看某个服务的登录档时,就是在内存中进行读取,这样做效能方面比较好,而且在单一服务的处理上也比跑到messages文件中去大海捞针高效的多!
关于rsyslog.service
首先看看它的配置文件:/etc/rsyslog.conf
上面已经提到,rsyslog可以负责主机产生的各个信息的登录,而这些信息本身是有“严重等级“之分的,而且,这些资料最终被送到哪个文件也都是可以修改的。所以就造成了不同版本的Linux放置的登录档档名有所区别,这些都被配置在了rsyslog.conf这个文件里
这个文件主要规定了三点:
(1)什么服务 (2)的什么等级讯息 (3)需要被记录在哪里(装置或文件)
语法如图:
rules
关于讯息等级,也用书中的图来说明:
levels
特别留意一下在讯息等级之前还有 [.=!] 的链接符号,他代表的意思是这样的:
- . :代表『比后面还要严重的等级 (含该等级) 都被记录下来』的意思,例如: mail.info 代表只要是 mail的信息,而且该信息等级严重于 info (含 info 本身)时,就会被记录下来的意思。
- .= :代表所需要的等级就是后面接的等级而已, 其他的不要!
- .! :代表不等于, 亦即是除了该等级外的其他等级都记录。
然后就是讯息放置到哪里的设定了,通常使用的是记录的文件,但也可以输出到装置,例如打印机之类,或者记录到不同的主机上,之前有篇报告里提到的logserver就是内网中专门记录其他主机登录档的服务器,这样便于集中例常排查各主机是否存在问题。
之后我查看了一下自己主机的配置文件的情况,发现:
难怪之前查看登录档的时候没有找打cron.log这个文件呢
再去看了下cron.service的status,也是开机自启的,于是改成:
mine2
虽然不是服务器,但我自己还是经常要用到例行性工作排程的
另外,
mine3
这里就不用再记录cron的讯息了,加一句cron.none
mine4
PS:在记录的文件 /var/log/maillog 前面还有个减号『 - 』是干嘛用的?
由于邮件所产生的讯息比较多
因此我们希望邮件产生的讯息先储存在速度较快的内存中(buffer)
等到数据量够大了才一次性的将所有数据都填入磁盘内
这样将有助于登录文件的存取性能
只不过由于讯息是暂存在内存内
因此若不正常关机导致登录信息未回填到登录档中
可能会造成部分数据的遗失
关于登录档的安全性:
从上面足见登录档的重要性了,如果服务器被黑客入侵了,这些都是很好的证据。
但如果聪明的黑客直接 rm -rf /var/log
呢?那就没得分析了
所以我们得做一些措施来保护登录档,使得只可以增加数据,而不能被删除。
当然,如果root账户被拿到了,那做什么都是徒劳咯
始终要记得:root可以在系统上进行任何操作!
现在来处理一下登录档的隐藏属性,直接上命令:
如果有疑问可以自行查询chattr和lsattr这两条命令的用法
另外,登录档要防止被root权限不小心修改,因为rsyslogd 的登录档只要被编辑过,就无法继续记录,必须重启rsyslog.service服务才行。
谈谈登录档的轮替工作(logrotate):
所谓的 logrotate , 基本上就是将旧的登录档更改名称,然后建立一个空的登录档。
如此一来,新的登录文件将重新开始记录,旧的登录档只需要留下一阵子
这样就可以达到将登录档轮转的目的!
此外,如果旧的记录 (大概要保存几个月) 保存了一段时间没有问题
那么就可以让系统自动的将他砍掉, 免得占掉很多宝贵的硬盘空间
同时,旧记录文件的数目也可以按需设定
比如我在自己的私人电脑上,数目就设置的比较小
因为我的固态硬盘空间实在太宝贵了,而日志一般还比较占地方
它的参数配置文件主要是下面两个:
- /etc/logrotate.conf
- /etc/logrotate.d/
前一个是主要的配置文件
后一个是目录,里面的所有文件都会被主动的读入前一个文件
先来分析分析主要的配置文件,参考书中的一副插图:
figure1
看明白之后就可以动手对自己的配置文件做些修改啦
因为我的电脑是全固态,空间只有可怜的256G,所以当然做些节俭的设置咯
比如刚提到的将保留的登录档减少,对登录档进行压缩,加入user.log和messages等等
PS:前面已经将messages设置了隐藏属性,无法进行更名,因此logrotate处理时会报错
这里该怎么解决呢?我是这样设置的:
mine5
具体可参考书中原文。
最后来看看systemd-journald:
前面已经提到过,开机过程中的所有信息,包括启动服务与服务若启动失败的情况等等,都可以直接被记录到 systemd-journald 里头
但是,由于是使用于内存的登录文件记录方式,因此重新启动过后,开机前的登录文件信息当然就不会被记载了
也就是说,systemd-journald 用来管理与查询这次开机后的登录信息,而 rsyslogd 可以用来记录以前及现在的所以数据到磁盘文件中,方便未来进行查询
PS:虽然 systemd-journald 所记录的数据其实是在内存中,但是系统还是利用文件的型态将它记录到 /run/log/ 底下,当然,重启后会刷新掉的
下面就来看看如何通过journalctl观察登录信息
比起直接找男人(man),鸟哥的图做的真心不错:
figure2
最后补充一句,如果想将自己的数据存储到登录文件中又该怎么做呢?
用logger就好了!举个栗子:logger -p user.info "I will check logger command"
其他用法自己找男人吧
关于登录档的分析,原文中提到了CentOS预设提供的logwatch,欲知详情自行百度啦
(因为我现在还没有需求-。-)