注册表的分析啦!
当你的 Linux 系统出现不明原因的问题时,很多人都告诉你,你要查阅一下注册表才能够知道系统出了什么问题了,所以说, 了解注册表是很重要的事情呢。注册表可以记录系统在什么时间、哪个主机、哪个服务、出现了什么消息等信息, 这些信息也包括用户识别数据、系统故障排除须知等信息。如果你能够善用这些注册表信息的话,你的系统出现错误时, 你将可以在第一时间发现,而且也能够从中找到解决的方案,而不是昏头转向的乱问人呢。 此外,注册表所记录的信息量是非常大的,要人眼分析实在很困难。此时利用 shell script 或者是其他软件提供的分析工具来处理复杂的注册表,可以帮助你很多很多喔!
『详细而确实的分析以及备份系统的注册表』是一个系统管理员应该要进行的任务之一。 那么什么是注册表呢?简单的说,就是记录系统活动信息的几个文件, 例如:何时、何地 (来源 IP)、何人 (什么服务名称)、做了什么动作 (消息登录啰)。 换句话说就是:记录系统在什么时候由哪个进程做了什么样的行为时,发生了何种的事件等等。
要知道的是,我们的 Linux 主机在背景之下有相当多的 daemons 同时在工作着,这些工作中的进程总是会显示一些消息, 这些显示的消息最终会被记载到注册表当中啦。也就是说,记录这些系统的重要消息就是注册表的工作啦!
为什么说注册表很重要,重要到系统管理员需要随时注意他呢?我们可以这么说:
注册表可以帮助我们了解很多系统重要的事件,包括登录者的部分信息,因此注册表的权限通常是设置为仅有 root 能够读取而已。 而由于注册表可以记载系统这么多的详细信息,所以啦,一个有经验的主机管理员会随时随地查阅一下自己的注册表, 以随时掌握系统的最新脉动!那么常见的几个注册表有哪些呢?一般而言,有下面几个:
常见的注册表就是这几个,但是不同的 Linux distributions ,通常注册表的文件名不会相同 (除了 /var/log/messages 之外 )。所以说,你还是得要查阅你 Linux 主机上面的注册表设置数据, 才能知道你的注册表主要文件名喔!
那么这些注册表是怎么产生的呢?基本上有两种方式,一种是由软件开发商自行定义写入的注册表与相关格式, 例如 WWW 软件 apache 就是这样处理的。另一种则是由 Linux distribution 提供的注册表管理服务来统一管理。 你只要将消息丢给这个服务后,他就会自己分门别类的将各种消息放置到相关的注册表去!CentOS 提供 syslogd 这个服务来统一管理注册表喔!
除了这个 syslogd 之外,我们的内核也需要额外的登录服务来记录内核产生的各项信息, 这个专门记录内核信息的注册表服务就是 klogd 啦。所以说,注册表所需的服务主要就是 syslogd 与 klogd 这两者。
不过要注意的是,如果你任凭注册表持续记录的话,由于系统产生的信息天天都有,那么你的注册表的容量将会长大到无法无天~ 如果你的注册表容量太大时,可能会导致大文件读写效率不佳的问题 (因为要从磁盘读入内存,越大的文件消耗内存量越多)。 所以啰,你需要对注册表备份与更新。那...需要手动处理喔?当然不需要,我们可以通过 logrotate (注册表轮替) 这玩意儿来自动化处理注册表容量与更新的问题喔!
所谓的 logrotate 基本上,就是将旧的注册表更改名称,然后创建一个空的注册表,如此一来, 新的注册表将重新开始记录,然后只要将旧的注册表留下一阵子,嗯!那就可以达到将注册表『轮转』的目的啦! 此外,如果旧的纪录 (大概要保存几个月吧!) 保存了一段时间没有问题,那么就可以让系统自动的将他砍掉, 免得占掉很多宝贵的硬盘空间说!
总结一下,针对注册表所需的功能,我们需要的服务与程序有:
由于我们着眼点在于想要了解系统上面软件所产生的各项信息,因此本章主要针对 syslogd 与 logrotate 来介绍。 接着下来我们来谈一谈怎么样规划这两个玩意儿。就由 syslogd 这支程序先谈起吧!毕竟得先有注册表,才可以进行 logrotate 呀!您说是吧!
刚刚提到说 Linux 的注册表主要是由 syslogd 在负责,那么你的 Linux 是否有启动 syslogd 呢?而且是否有设置开机时启动呢?呵呵!检查一下先:
[root@www ~]# ps aux | grep syslog USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 4294 0.0 0.0 1716 568 ? Ss Mar31 0:00 syslogd -m 0 # 瞧!确实有启动的! [root@www ~]# chkconfig --list syslog syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off # 缺省情况下,文本接口与图形接口 (3, 5) 都有启动喔!
看到 syslog 这个服务名称了吧?所以知道他已经在系统中工作啰!好了,既然本章主要是讲注册表,那么你知道注册表的内容是如何展现的? syslog 的设置档在哪里?如何设置?如果你的 Linux 主机想要当作整个区网的注册表服务器时,又该如何设置? 底下就让我们来玩玩这玩意!
一般来说,系统产生的消息经过 syslog 而记录下来的数据中,每条消息均会记录底下的几个重要数据:
当然,这些信息的『详细度』是可以修改的,而且,这些信息可以作为系统调试之用呢! 我们拿登录时一定会记载帐号信息的 /var/log/secure 为例好了:
[root@www ~]# cat /var/log/secure 1 Mar 14 15:38:00 www atd[18701]: pam_unix(atd:session): session opened for user root by (uid=0) 2 Mar 14 15:38:00 www atd[18701]: pam_unix(atd:session): session closed for user root 3 Mar 16 16:01:51 www su: pam_unix(su-l:auth): authentication failure; logn ame=vbird uid=500 euid=0 tty=pts/1 ruser=vbird rhost= user=root 4 Mar 16 16:01:55 www su: pam_unix(su-l:session): session opened for user root by vbird(uid=500) 5 Mar 16 16:02:22 www su: pam_unix(su-l:session): session closed for user root |--日期/时间---|-H-|-----服务与相关函数-------|--消息说明------>
我们拿第一笔数据来说明好了,该数据是说:『在三月14日 (Mar 14) 的下午 15:38 分,由 www 这部主机的 atd [PID 为 18701] 传来的消息,这个消息是通过 pam_unix 这个模块所提出的。消息内容为 root (uid=0) 这个帐号已经打开 atd 的活动了。』有够清楚吧! 那请您自行翻译一下后面的 4 条消息内容是什么喔!
其实还有很多的信息值得查阅的呢!尤其是 /var/log/messages 的内容。记得一个好的系统管理员, 要常常去『巡视』注册表的内容喔!尤其是发生底下几种情况时:
还有很多啦!反正觉得系统不太正常,就得要查找查找注册表就是了。
什么?注册表还有设置档?喔!不是啦~是 syslogd 这个 daemon 的设置档啦! 我们现在知道 syslogd 可以负责主机产生的各个信息的登录,而这些信息本身是有『严重等级』之分的, 而且,这些数据最终要发送到哪个文件去是可以修改的呢,所以我们才会在一开头的地方讲说, 每个 Linux distributions 放置的注册表文件名可能会有所差异啊!
基本上, syslog 针对各种服务与消息记录在某些文件的设置档就是 /etc/syslog.conf, 这个文件规定了『(1)什么服务 (2)的什么等级消息 (3)需要被记录在哪里(设备或文件)』 这三个咚咚,所以设置的语法会是这样:
服务名称[.=!]消息等级 消息记录的文件名或设备或主机 # 底下以 mail 这个服务产生的 info 等级为例: mail.info /var/log/maillog_info # 这一行说明:mail 服务产生的大于等于 info 等级的消息,都记录到 # /var/log/maillog_info 文件中的意思。
我们将上面的数据简单的分为三部分来说明:
syslog 本身有规范一些服务,你可以通过这些服务来保存系统的消息。syslog 认识的服务主要有底下这些: (可使用 man 3 syslog 查找到相关的信息)
服务类别 | 说明 |
auth (authpriv) | 主要与认证有关的机制,例如 login, ssh, su 等需要帐号/密码的咚咚; |
cron | 就是例行性工作调度 cron/at 等产生消息记录的地方; |
daemon | 与各个 daemon 有关的消息; |
kern | 就是内核 (kernel) 产生消息的地方; |
lpr | 亦即是打印相关的消息啊! |
只要与邮件收发有关的消息纪录都属于这个; | |
news | 与新闻群组服务器有关的东西; |
syslog | 就是 syslogd 这支程序本身产生的信息啊! |
user, uucp, local0 ~ local7 | 与 Unix like 机器本身有关的一些消息。 |
上面谈到的都是 syslog 自行制订的服务名称,软件开发商可以通过调用上述的服务名称来记录他们的软件。 举例来说, sendmail 与 postfix 及 dovecot 都是与邮件有关的软件,这些软件在设计注册表记录时,都会主动调用 syslogd 内的 mail 服务名称 (LOG_MAIL),所以上述三个软件 (sendmail, postfix, dovecot) 产生的消息在 syslog 看起来,就会『是 mail 』类型的服务了。我们可以将这个概念绘制如底下的图标来理解:
另外,每种服务所产生的数据量其实差异是很大的,举例来说, mail 的注册表消息多的要命, 每一封信件进入后, mail 至少需要记录『寄信人的信息;与收信者的消息』等等; 而如果是用来做为工作站主机的,那么登录者 (利用 login 登录主机处理事情) 的数量一定不少,那个 authpriv 所管辖的内容可就多的要命了。
为了让不同的信息放置到不同的文件当中,好让我们分门别类的进行注册表的管理, 所以啰,将各种类别的服务之注册表,记录在不同的文件里面,就是我们 /etc/syslog.conf 所要作的规范了!
同一个服务所产生的消息也是有差别的,有启动时仅通知系统而已的一般消息 (information), 有出现还不至于影响到正常运作的警告消息 (warn) ,还有系统硬件发生严重错误时,所产生的重大问题消息 (error 等等); 消息到底有多少种严重的等级呢?基本上,syslog 将消息分为七个主要的等级,依序是这样的(由不重要排列到重要消息等级):
等级 | 等级名称 | 说明 |
1 | info | 仅是一些基本的消息说明而已; |
2 | notice | 比 info 还需要被注意到的一些信息内容; |
3 | warning (warn) |
警示的消息,可能有问题,但是还不至于影响到某个 daemon 运作的信息;基本上, info, notice, warn 这三个消息都是在告知一些基本信息而已,应该还不至于造成一些系统运作困扰; |
4 | err (error) |
一些重大的错误消息,例如设置档的某些设置值造成该服务服法启动的信息说明, 通常借由 err 的错误告知,应该可以了解到该服务无法启动的问题呢! |
5 | crit | 比 error 还要严重的错误信息,这个 crit 是临界点 (critical) 的缩写,这个错误已经很严重了喔! |
6 | alert | 警告警告,已经很有问题的等级,比 crit 还要严重! |
7 | emerg (panic) |
疼痛等级,意指系统已经几乎要当机的状态! 很严重的错误信息了。通常大概只有硬件出问题,导致整个内核无法顺利运作,就会出现这样的等级的消息吧! |
除了这些有等级的消息外,还有两个特殊的等级,那就是 debug(错误侦测等级) 与 none (不需登录等级) 两个,当我们想要作一些错误侦测,或者是忽略掉某些服务的信息时, 就用这两个咚咚吧!
特别留意一下在消息等级之前还有 [.=!] 的链接符号喔!他代表的意思是这样的:
一般来说,我们比较常使用的是『.』这个链接符号啦!^_^
再来则是这个消息要放置在哪里的纪录了。通常我们使用的都是记录的文件啦!但是也可以输出到设备呦! 例如打印机之类的!也可以记录到不同的主机上头去呢!底下就是一些常见的放置处:
基本上,整个 syslog 的设置档就只是这样而已,底下我们来思考一些例题,好让你可以更清楚的知道如何设置 syslogd 啊!
例题:
如果我要将我的 mail 相关的数据给他写入 /var/log/maillog 当中,那么在 /etc/syslog.conf 的语法如何设计?
答:
基本的写法是这样的:
mail.info /var/log/maillog注意到上面喔,当我们的等级使用 info 时,那么『任何大于 info 等级(含 info 这个等级)之上的消息, 都会被写入到后面接的文件之中!』这样可以了解吗?也就是说,我们可以将所有 mail 的登录信息都纪录在 /var/log/maillog 里面的意思啦! |
例题:
我要将新闻群组数据 (news) 及例行性工作调度 (cron) 的消息都写入到一个称为
/var/log/cronnews 的文件中,但是这两个进程的警告消息则额外的记录在 /var/log/cronnews.warn 中,
那该如何设置我的 syslog.conf 呢?
答:
很简单啦!既然是两个进程,那么只好以分号来隔开了,此外,由于第二个指定文件中,我只要记录警告消息,
因此设置上需要指定『.=』这个符号,所以语法成为了:
news.*;cron.* /var/log/cronnews上面那个『.=』就是在指定等级的意思啦!由于指定了等级,因此,只有这个等级的消息才会被纪录在这个文件里面呢! 此外你也必须要注意,news 与 cron 的警告消息也会写入 /var/log/cronnews 内喔! |
例题:
我的 messages 这个文件需要记录所有的信息,但是就是不想要记录 cron, mail 及 news 的信息,那么应该怎么写才好?
答:
可以有两种写法,分别是:
*.*;news,cron,mail.none /var/log/messages使用『,』分隔时,那么等级只要接在最后一个即可,如果是以『;』来分的话, 那么就需要将服务与等级都写上去啰!这样会设置了吧! |
了解语法之后,我们来看一看 syslog 有哪些系统服务已经在记录了呢?就是瞧一瞧 /etc/syslog.conf 这个文件的缺省内容啰! (注意!如果需要将该行做为注解时,那么就加上 # 符号就可以啦)
# 来自 CentOS 5.x 的相关数据 [root@www ~]# vim /etc/syslog.conf 1 #kern.* /dev/console 2 *.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages 3 authpriv.* /var/log/secure 4 mail.* -/var/log/maillog 5 cron.* /var/log/cron 6 *.emerg * 7 uucp,news.crit /var/log/spooler 8 local7.* /var/log/boot.log 9 news.=crit /var/log/news/news.crit 10 news.=err /var/log/news/news.err 11 news.notice /var/log/news/news.notice
上面总共仅有十一行设置值,每一行的意义是这样的:
在上面的第四行关于 mail 的记录中,在记录的文件 /var/log/maillog 前面还有个减号『 - 』是干嘛用的?由于邮件所产生的消息比较多,因此我们希望邮件产生的消息先保存在速度较快的内存中 (buffer) ,等到数据量够大了才一次性的将所有数据都填入磁盘内,这样将有助于注册表的访问性能。 只不过由于消息是暂存在内存内,因此若不正常关机导致登录信息未回填到注册表中,可能会造成部分数据的遗失。
此外,每个 Linux distributions 的 syslog.conf 设置差异是颇大的,如果你想要找到相对应的登录信息时, 可得要查阅一下 /etc/syslog.conf 这个文件才行!否则可能会发生分析到错误的信息喔!举例来说, 鸟哥有自己写一支分析注册表的 script,这个 script 是依据 Red Hat 系统缺省的注册表所写的,因此不同的 distributions 想要使用这支程序时,就得要自行设计与修改一下 /etc/syslog.conf 才行喔!否则就可能会分析到错误的信息啰。 那么如果你有自己的需要而得要修订注册表时,该如何进行?
如果你有其他的需求,所以需要特殊的文件来帮你记录时,呵呵!别客气,千万给他记录在 /etc/syslog.conf 当中,如此一来,你就可以重复的将许多的信息记录在不同的文件当中,以方便你的管理呢! 让我们来作个练习题吧!如果你想要让『所有的信息』都额外写入到 /var/log/admin.log 这个文件时, 你可以怎么作呢?先自己想一想,并且作一下,再来看看底下的作法啦!
# 1. 先设置好所要创建的文件设置! [root@www ~]# vim /etc/syslog.conf # Add by VBird 2009/04/08 <==再次强调,自己修改的时候加入一些说明 *.info /var/log/admin.log <==有用的是这行啦! # 2. 重新启动 syslog 呢! [root@www ~]# /etc/init.d/syslog restart [root@www ~]# ll /var/log/admin.log -rw------- 1 root root 118 Apr 8 13:50 /var/log/admin.log # 瞧吧!创建了这个注册表出现啰!
很简单吧!如此一来,所有的信息都会写入 /var/log/admin.log 里面了!
好了,由上一个小节里面我们知道了 syslog.conf 的设置,也知道了注册表内容的重要性了, 所以,如果幻想你是一个很厉害的黑客,想利用他人的电脑干坏事,然后又不想留下证据, 你会怎么作?对啦!就是离开的时候将屁股擦干净,将所有可能的消息都给他抹煞掉, 所以第一个动脑筋的地方就是注册表的清除工作啦~ 如果你的注册表不见了,那该怎办?
伤脑筋呢!有没有办法防止注册表被删除?或者是被 root 自己不小心变更呢?有呀!拔掉网络线或电源线就好了……呵呵! 别担心,基本上,我们可以通过一个隐藏的属性来设置你的注册表,成为『 只可以增加数据,但是不能被删除 』的状态,那么或许可以达到些许的保护!不过,如果你的 root 帐号被破解了,那么底下的设置还是无法保护的,因为你要记得『 root 是可以在系统上面进行任何事情的 』,因此,请将你的 root 这个帐号的密码设置的安全一些!千万不要轻忽这个问题呢!
既然如此,那么我们就来处理一下隐藏属性的东东吧!我们在第七章谈到过 lsattr 与 chattr 这两个东西啦!如果将一个文件以 chattr 设置 i 这个属性时,那么该文件连 root 都不能杀掉!而且也不能添加数据,嗯!真安全!但是,如此一来注册表的功能岂不是也就消失了? 因为没有办法写入呀!所以啰,我们要使用的是 a 这个属性!你的注册表如果设置了这个属性的话,那么 他将只能被增加,而不能被删除!嗯! 这个项目就非常的符合我们注册表的需求啦!因此,你可以这样的增加你的注册表的隐藏属性。
[root@www ~]# chattr +a /var/log/messages [root@www ~]# lsattr /var/log/messages -----a------- /var/log/messages
加入了这个属性之后,你的 /var/log/messages 注册表从此就仅能被增加,而不能被删除,直到 root 以『 chattr -a /var/log/messages 』取消这个 a 的参数之后,才能被删除或移动喔!
虽然,为了你注册表的信息安全,这个 chattr 的 +a 旗标可以帮助你维护好这个文件, 不过,如果你的系统已经被取得 root 的权限,而既然 root 可以下达 chattr -a 来取消这个旗标, 所以啰,还是有风险的啦!此外,前面也稍微提到,新手最好还是先不要增加这个旗标, 很容易由于自己的忘记,导致系统的重要消息无法记录呢。
基本上,鸟哥认为,这个旗标最大的用处除了在保护你注册表的数据外, 他还可以帮助你避免掉不小心写入注册表的状况喔。要注意的是,当『 你不小心 "手动" 更动过注册表后,例如那个 /var/log/messages , 你不小心用 vi 打开他,离开却下达 :wq 的参数,呵呵!那么该文件未来将不会再继续进行登录动作! 』这个问题真的很常发生!由于你以 vi 保存了注册表,则 syslogd 会误判为该文件已被更动过, 将导致 syslogd 不再写入该文件新的内容~很伤脑筋的!
要让该注册表可以继续写入,你只要重新启动 syslog (/etc/init.d/syslog restart) 即可。 不过,总是比较麻烦。所以啊,如果你针对注册表下达 chattr +a 的参数,嘿嘿! 未来你就不需要害怕不小心更动到该文件了!因为无法写入嘛!除了可以添加之外~ ^_^
不过,也因为这个 +a 的属性让该文件无法被删除与修改,所以啰,当我们进行注册表案轮替时 (logrotate) ,将会无法移动该注册表的文件名呢!所以会造成很大的困扰。这个困扰虽然可以使用 logrotate 的设置档来解决,但是,还是先将注册表的 +a 旗标拿掉吧!
[root@www ~]# chattr -a /var/log/messages
我们在之前稍微提到的,在 syslog.conf 文件当中,可以将登录数据发送到打印机或者是远程主机上面去。这样做有什么意义呢? 如果你将登录信息直接发送到打印机上面的话,那么万一不小心你的系统被 cracker 所入侵, 他也将你的 /var/log/ 砍掉了,怎么办?没关系啊!反正你已经将重要数据直接以打印机记录起来了, 嘿嘿!他是无法逃开的啦!^_^
再想像一个环境,你的办公室内有十部 Linux 主机,每一部负责一个网络服务, 你为了要了解每部主机的状态,因此,你常常需要登录这十部主机去查阅你的注册表~ 哇!光用想的,每天要进入十部主机去查数据,想到就烦~没关系~这个时候我们可以让某一部主机当成 『注册表服务器』,用他来记录所有的十部 linux 主机的信息,嘿嘿!这样我就直接进入一部主机就可以了! 省时又省事,真方便~
那要怎么达到这样的功能呢?很简单啦,我们 CentOS 5.x 缺省的 syslog 本身就已经具有这个注册表服务器的功能了, 只是缺省并没有启动该功能而已。你可以通过 man syslogd 去查找一下相关的选项就能够知道啦! 既然是注册表服务器,那么我们的 Linux 主机当然会启动一个端口口来监听了,那个缺省的端口口就是 UDP 的 514 喔!
如上图所示,服务器会启动监听的端口口,用户端则将注册表再转出一份送到服务器去。 而既然是注册表『服务器』,所以当然有服务器与用户端 (client) 啰!这两者的设置分别是这样的:
# 1. Server 端:修改 syslogd 的启动设置档,通常在 /etc/sysconfig 内! [root@www ~]# vim /etc/sysconfig/syslog # 找到底下这一行: SYSLOGD_OPTIONS="-m 0" # 改成底下这样子! SYSLOGD_OPTIONS="-m 0 -r" # 2. 重新启动与观察 syslogd 喔! [root@www ~]# /etc/init.d/syslog restart [root@www ~]# netstat -lunp | grep syslog Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name udp 0 0 0.0.0.0:514 0.0.0.0:* 13981/syslogd # 嘿嘿!你的注册表主机已经设置妥当啰!很简单吧!
通过这个简单的动作,你的 Linux 主机已经可以接收来自其他主机的登录信息了! 当然啦,你必须要知道网络方面的相关基础,这里鸟哥只是先介绍, 未来了解了网络相关信息后,再回头来这里瞧一瞧先! ^_^
至于 client 端的设置就简单多了!只要指定某个信息发送到这部主机即可! 举例来说,我们的注册表服务器 IP 为 192.168.1.100 ,而 client 端希望所有的数据都送给主机, 所以,可以在 /etc/syslog.conf 里面添加这样的一行:
[root@www ~]# vim /etc/syslog.conf *.* @192.168.1.100
再重新启动 syslog 后,立刻就搞定了!而未来主机上面的注册表当中,每一行的『主机名称』就会显示来自不同主机的信息了。 很简单吧! ^_^。接下来,让我们来谈一谈,那么如何针对注册表来进行轮转 (rotate) 呢?
假设我们已经将登录数据写入了记录档中了,也已经利用 chattr 设置了 +a 这个属性了,那么该如何进行 logrotate 的工作呢?这里请特别留意的是:『syslog 利用的是 daemon 的方式来启动的, 当有需求的时候立刻就会被运行的,但是 logrotate 却是在规定的时间到了之后才来进行注册表的轮替, 所以这个 logrotate 进程当然就是挂在 cron 底下进行的呦!』 仔细看一下 /etc/cron.daily/ 里面的文件,嘿嘿~看到了吧! /etc/cron.daily/logrotate 就是记录了每天要进行的注册表轮替的行为啦! ^_^!底下我们就来谈一谈怎么样设计这个 logrotate 吧!
既然 logrotate 主要是针对注册表来进行轮替的动作,所以啰,他当然必须要记载『 在什么状态下才将注册表进行轮替』的设置啊!那么 logrotate 这个程序的参数设置档在哪里呢?呵呵!那就是:
那个 logrotate.conf 才是主要的参数文件,至于 logrotate.d 是一个目录, 该目录里面的所有文件都会被主动的读入 /etc/logrotate.conf 当中来进行!另外,在 /etc/logrotate.d/ 里面的文件中,如果没有规定到的一些细部设置,则以 /etc/logrotate.conf 这个文件的规定来指定为默认值!
好了,刚刚我们提到 logrotate 的主要功能就是将旧的注册表案移动成旧档, 并且重新创建一个新的空的文件来记录,他的运行结果有点类似底下的图标:
由上面的图标我们可以清楚的知道,当第一次运行完 rotate 之后,原本的 messages 会变成 messages.1 而且会制造一个空的 messages 给系统来保存注册表。而第二次运行之后,则 messages.1 会变成 messages.2 而 messages 会变成 messages.1 ,又造成一个空的 messages 来保存注册表!那么如果我们仅设置保留三个注册表而已的话,那么运行第四次时,则 messages.3 这个文件就会被删除,并由后面的较新的保存注册表所取代!基本的工作就是这样啦!
那么多久进行一次这样的 logrotate 工作呢?这些都记录在 logrotate.conf 里面,我们来看一下缺省的 logrotate 的内容吧!
[root@www ~]# vim /etc/logrotate.conf # 底下的设置是 "logrotate 的缺省设置值" ,如果个别的文件设置了其他的参数, # 则将以个别的文件设置为主,若该文件没有设置到的参数则以这个文件的内容为默认值! weekly <==缺省每个礼拜对注册表进行一次 rotate 的工作 rotate 4 <==保留几个注册表呢?缺省是保留四个! create <==由于注册表被更名,因此创建一个新的来继续保存之意! #compress <==被更动的注册表是否需要压缩?如果注册表太大则可考虑此参数启动 include /etc/logrotate.d # 将 /etc/logrotate.d/ 这个目录中的所有文件都读进来运行 rotate 的工作! /var/log/wtmp { <==仅针对 /var/log/wtmp 所设置的参数 monthly <==每个月一次,取代每周! minsize 1M <==文件容量一定要超过 1M 后才进行 rotate (略过时间参数) create 0664 root utmp <==指定新建文件的权限与所属帐号/群组 rotate 1 <==仅保留一个,亦即仅有 wtmp.1 保留而已。 } # 这个 wtmp 可记录登录者与系统重新开机时的时间与来源主机及登录期间的时间。 # 由于具有 minsize 的参数,因此不见得每个月一定会进行一次喔!要看文件容量。 # 由于仅保留一个注册表而已,不满意的话可以将他改成 rotate 5 吧!
由这个文件的设置我们可以知道 /etc/logrotate.d 其实就是由 /etc/logrotate.conf 所规划出来的目录,所以,其实我们可以将所有的数据都给他写入 /etc/logrotate.conf 即可,但是这样一来这个文件就实在是太复杂了,尤其是当我们使用很多的服务在系统上面时, 每个服务都要去修改 /etc/logrotate.conf 的设置也似乎不太合理~ 所以,如果独立出来一个目录,那么每个以 RPM 打包方式所创建的服务的注册表轮替设置, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中即可,真是方便又合理的做法啊! ^_^
一般来说,这个 /etc/logrotate.conf 是『缺省的轮替状态』而已, 我们的各个服务都可以拥有自己的注册表轮替设置,你也可以自行修改成自己喜欢的样式啊! 例如,如果你的系统的空间够大,并且担心调试以及黑客的问题,那么可以:
好了,上面我们大致介绍了 /var/log/wtmp 这个文件的设置,现在你知道了 logrotate.conf 的设置语法是:
注册表的绝对路径文件名 ... { 个别的参数设置值,如 monthly, compress 等等 }
底下我们再以 /etc/logrotate.d/syslog 这个轮替 syslog 服务的文件,来看看该如何设置他的 rotate 呢?
[root@www ~]# vi /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler \
/var/log/boot.log /var/log/cron {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
在上面的语法当中,我们知道正确的 logrotate 的写法为:
那么 /etc/logrotate.d/syslog 内设置的六个文件的轮替功能就变成了:
假设我们有针对 /var/log/messages 这个文件增加 chattr +a 的属性时, 依据 logrotate 的工作原理,我们知道,这个 /var/log/messages 将会被更名成为 /var/log/messages.1 才是。但是由于加上这个 +a 的参数啊,所以更名是不可能成功的! 那怎么办呢?呵呵!就利用 prerotate 与 postrotate 来进行注册表轮替前、后所需要作的动作啊! 果真如此时,那么你可以这样修改一下这个文件喔!
[root@www ~]# vi /etc/logrotate.d/syslog /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler \ /var/log/boot.log /var/log/cron { sharedscripts prerotate /usr/bin/chattr -a /var/log/messages endscript sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true /usr/bin/chattr +a /var/log/messages endscript }
看到否?就是先给他去掉 a 这个属性,让注册表 /var/log/messages 可以进行轮替的动作, 然后运行了轮替之后,再给他加入这个属性!请特别留意的是,那个 /bin/kill -HUP ... 的意义,这一行的目的在于将系统的 syslogd 重新以其参数档 (syslog.conf) 的数据读入一次!也可以想成是 reload 的意思啦! 由于我们创建了一个新的空的纪录档,如果不运行此一行来重新启动服务的话, 那么记录的时候将会发生错误呦!(请回到第十七章读一下 kill 后面的 signal 的内容说明)
好了,设置完成之后,我们来测试看看这样的设置是否可行呢?给他运行底下的指令:
[root@www ~]# logrotate [-vf] logfile 选项与参数: -v :启动显示模式,会显示 logrotate 运作的过程喔! -f :不论是否符合设置档的数据,强制每个注册表都进行 rotate 的动作! 范例一:运行一次 logrotate 看看整个流程为何? [root@www ~]# logrotate -v /etc/logrotate.conf reading config file /etc/logrotate.conf <==读取主要设置档 including /etc/logrotate.d <==调用外部的设置 reading config file acpid <==就是外部设置啊! ....(中间省略).... Handling 21 logs <==共有 21 个注册表被记录 ....(中间省略).... rotating pattern: /var/log/messages /var/log/secure /var/log/maillog \ /var/log/spooler /var/log/boot.log /var/log/cron weekly (4 rotations) empty log files are rotated, old logs are removed considering log /var/log/messages <==开始处理 messages log does not need rotating <==因为时间未到,不需要更动! ....(底下省略).... 范例二:强制进行 logrotate 的动作 [root@www ~]# logrotate -vf /etc/logrotate.conf ....(前面省略).... rotating log /var/log/messages, log->rotateCount is 4 renaming /var/log/messages.4 to /var/log/messages.5 (rotatecount 4, logstart 1, i 4), renaming /var/log/messages.3 to /var/log/messages.4 (rotatecount 4, logstart 1, i 3), renaming /var/log/messages.2 to /var/log/messages.3 (rotatecount 4, logstart 1, i 2), renaming /var/log/messages.1 to /var/log/messages.2 (rotatecount 4, logstart 1, i 1), renaming /var/log/messages.0 to /var/log/messages.1 (rotatecount 4, logstart 1, i 0), old log /var/log/messages.0 does not exist ....(底下省略).... # 看到否?整个 rotate 的动作就是这样一步一步进行的~ [root@www ~]# ll /var/log/messages*; lsattr /var/log/messages -rw------- 1 root root 63 Apr 8 15:19 /var/log/messages -rw------- 1 root root 670 Apr 8 14:22 /var/log/messages.1 -rw------- 1 root root 24984 Apr 1 19:26 /var/log/messages.2 -rw------- 1 root root 1911 Mar 28 11:32 /var/log/messages.3 -rw------- 1 root root 25193 Mar 22 04:02 /var/log/messages.4 -----a------- /var/log/messages <==主动加入 a 的隐藏属性啰!
上面那个 -f 具有『强制运行』的意思,如果一切的设置都没有问题的话,那么理论上,你的 /var/log 这个目录就会起变化啰!而且应该不会出现错误消息才对!嘿嘿!这样就 OK 了!很棒不是吗?!
由于 logrotate 的工作已经加入 crontab 里头了!所以现在每天系统都会自动的给他查看 logrotate 啰!不用担心的啦!只是要注意一下那个 /var/log/messages 里头是否常常有类似底下的字眼:
Apr 8 15:19:47 www syslogd 1.4.1: restart (remote reception).
这说明的是 syslogd 重新启动的时间啦 (就是因为 /etc/logrotate.d/syslog 的设置之缘故!) 底下我们来进行一些例题的练习,让你更详细的了解 logrotate 的功用啊!
假设前提是这样的,前一小节当中,假设你已经创建了 /var/log/admin.log 这个文件, 现在,你想要将该文件加上 +a 这个隐藏标签,而且设置底下的相关信息:
那你可以怎么样设置呢?呵呵~很简单啊!看看底下的动作吧!
# 1. 先创建 +a 这个属性啊! [root@www ~]# chattr +a /var/log/admin.log [root@www ~]# lsattr /var/log/admin.log -----a------- /var/log/admin.log [root@www ~]# mv /var/log/admin.log /var/log/admin.log.1 mv: cannot move `/var/log/admin.log' to `/var/log/admin.log.1': Operation not permitted # 这里确定了加入 a 的隐藏属性!所以 root 无法移动此注册表! # 2. 开始创建 logrotate 的设置档,增加一个文件在 /etc/logrotate.d 内就对了! [root@www ~]# vi /etc/logrotate.d/admin # This configuration is from VBird 2009/04/08 /var/log/admin.log { monthly <==每个月进行一次 size=10M <==文件容量大于 10M 则开始处置 rotate 5 <==保留五个! compress <==进行压缩工作! sharedscripts prerotate /usr/bin/chattr -a /var/log/admin.log endscript sharedscripts postrotate /usr/bin/killall -HUP syslogd /usr/bin/chattr +a /var/log/admin.log endscript } # 3. 测试一下 logrotate 相关功能的信息显示: [root@www ~]# logrotate -v /etc/logrotate.conf ....(前面省略).... rotating pattern: /var/log/admin.log 10485760 bytes (5 rotations) empty log files are rotated, old logs are removed considering log /var/log/admin.log log does not need rotating not running prerotate script, since no logs will be rotated not running postrotate script, since no logs were rotated ....(底下省略).... # 因为还不足一个月,文件也没有大于 10M,所以不需进行轮替! # 4. 测试一下强制 logrotate 与相关功能的信息显示: [root@www ~]# logrotate -vf /etc/logrotate.d/admin reading config file /etc/logrotate.d/admin reading config info for /var/log/admin.log Handling 1 logs rotating pattern: /var/log/admin.log forced from command line (5 rotations) empty log files are rotated, old logs are removed considering log /var/log/admin.log log needs rotating rotating log /var/log/admin.log, log->rotateCount is 5 renaming /var/log/admin.log.5.gz to /var/log/admin.log.6.gz (rotatecount 5, logstart 1, i 5), old log /var/log/admin.log.5.gz does not exist renaming /var/log/admin.log.4.gz to /var/log/admin.log.5.gz (rotatecount 5, logstart 1, i 4), old log /var/log/admin.log.4.gz does not exist renaming /var/log/admin.log.3.gz to /var/log/admin.log.4.gz (rotatecount 5, logstart 1, i 3), old log /var/log/admin.log.3.gz does not exist renaming /var/log/admin.log.2.gz to /var/log/admin.log.3.gz (rotatecount 5, logstart 1, i 2), old log /var/log/admin.log.2.gz does not exist renaming /var/log/admin.log.1.gz to /var/log/admin.log.2.gz (rotatecount 5, logstart 1, i 1), old log /var/log/admin.log.1.gz does not exist renaming /var/log/admin.log.0.gz to /var/log/admin.log.1.gz (rotatecount 5, logstart 1, i 0), old log /var/log/admin.log.0.gz does not exist log /var/log/admin.log.6.gz doesn't exist -- won't try to dispose of it running prerotate script renaming /var/log/admin.log to /var/log/admin.log.1 running postrotate script compressing log with: /bin/gzip [root@www ~]# lsattr /var/log/admin.log* -----a------- /var/log/admin.log ------------- /var/log/admin.log.1.gz <==有压缩过喔!
看到了吗?通过这个方式,我们可以创建起属于自己的 logrotate 设置文件, 很简便吧!尤其是要注意的, /etc/syslog.conf 与 /etc/logrotate.d/* 文件常常要搭配起来,例如刚刚我们提到的两个案例中所创建的 /var/log/admin.log 就是一个很好的例子~创建后,还要使用 logrotate 来轮替啊! ^_^
注册表的分析是很重要的!你可以自行以 vi 进入注册表去查阅相关的信息。而系统也提供一些软件可以让你从注册表中取得数据, 例如之前谈过的 last, lastlog, dmesg 等等指令。不过,这些数据毕竟都非常的分散,如果你想要一口气读取所有的登录信息, 其实有点困扰的。不过,好在 CentOS 有提供 logwatch 这个注册表分析程序,你可以借由该程序来了解注册表信息。 此外,鸟哥也依据 Red Hat 系统的 syslog 写了一支小程序给大家使用喔!
虽然有一些有用的系统指令,不过,要了解系统的状态,还是得要分析整个注册表才行~ 事实上,目前已经有相当多的注册表分析工具,例如 CentOS 5.x 上面缺省的 logwatch 这个套件所提供的分析工具, 他会每天分析一次注册表案,并且将数据以 email 的格式寄送给 root 呢! 你也可以直接到 logwatch 的官方网站上面看看:
logwatch 分析的结果如下所示:
[root@www ~]# mail Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/root": 433 messages 433 new >N 1 logwatch@www.vbird.t Fri Sep 5 11:42 43/1542 "Logwatch for www.vbird.tsai (Linux)" N 2 logwatch@www.vbird.t Sat Sep 6 15:34 92/2709 "Logwatch for www.vbird.tsai (Linux)" N 3 logwatch@www.vbird.t Mon Sep 8 15:26 43/1542 "Logwatch for www.vbird.tsai (Linux)" ....(中间省略).... N431 logwatch@www.vbird.t Wed Apr 8 04:02 53/1772 "Logwatch for www.vbird.tsai (Linux)" & 431 Message 431: From root@www.vbird.tsai Wed Apr 8 04:02:05 2009 Date: Wed, 8 Apr 2009 04:02:05 +0800 To: root@www.vbird.tsai From: logwatch@www.vbird.tsai Subject: Logwatch for www.vbird.tsai (Linux) MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="iso-8859-1" # 先会说明分析的日期与相关的分析期间! ################### Logwatch 7.3 (03/24/06) #################### Processing Initiated: Wed Apr 8 04:02:05 2009 Date Range Processed: yesterday ( 2009-Apr-07 ) Period is day. Detail Level of Output: 0 Type of Output: unformatted Logfiles for Host: www.vbird.tsai ################################################################## # 底下则是依据各种服务来进行各项分析!先是登录者的 ssh 服务分析 --------------------- SSHD Begin ------------------------ Users logging in through sshd: root: 192.168.100.101: 1 time 192.168.100.254: 1 time ---------------------- SSHD End ------------------------- # 磁盘容量分析!可以避免你的系统使用过量磁盘,导致的系统不稳问题! --------------------- Disk Space Begin ------------------------ Filesystem Size Used Avail Use% Mounted on /dev/hda2 9.5G 3.8G 5.3G 42% / /dev/hda3 4.8G 1.1G 3.5G 23% /home /dev/hda1 99M 21M 73M 23% /boot ---------------------- Disk Space End ------------------------- ###################### Logwatch End #########################
由于鸟哥的测试用主机尚未启动许多服务,所以分析的项目很少。若你的系统已经启动许多服务的话, 那么分析的项目理应会多很多才对。
虽然已经有了类似 logwatch 的工具,但是鸟哥自己想要分析的数据毕竟与对方不同~ 所以啰,鸟哥就自己写了一支小程序 (shell script 的语法) 用来分析自己的注册表, 这支程序分析的注册表数据其实是固定的,包括有:
当然啦,还不只这些啦,包括各个主要常见的服务,如 pop3, mail, ftp, su 等会使用到 pam 的服务, 都可以通过鸟哥写的这个小程序来分析与处理呢~整个数据还会输出一些系统信息。如果你想要使用这个程序的话, 欢迎下载:
安装的方法也很简单,只要将上述文件下载并解压缩后,就会得到一个名为 logfile 的目录, 将此目录移动到 /usr/local/virus/ 目录下并修改一下: /usr/local/virus/logfile.sh 文件, 里面的 email 与相关的信息只要修改一下,你就可以使用啦~啊!还要记得,将这支程序的运行写入 /etc/crontab 当中喔! 可以在每天的 12:10am 运行这支小程序啦! ^_^
[root@www ~]# mkdir /usr/local/virus [root@www ~]# tar -zxvf logfile-0.1-4-2.tgz -C /usr/local/virus [root@www ~]# cd /usr/local/virus/logfile [root@www logfile]# vi logfile.sh email="root@localhost" <==大约在 93 行左右,请填入你的 email ,否则保留默认值 basedir="/usr/local/virus/logfile" <==保留默认值,除非你的运行目录不同与此! [root@www logfile]# sh logfile.sh # 开始尝试分析系统的注册表,依据你的注册表大小,分析的时间不固定! [root@www logfile]# vi /etc/crontab 10 0 * * * root /usr/local/virus/logfile/logfile.sh # 增加这一行!让系统在每天的凌晨自己进行注册表分析! [root@www logfile]# mail # 自己找到刚刚输出的结果,该结果的输出有点像底下这样: # 先进行程序的声明!你也可以在底下的链接找到一些错误回报! ########################################################## 欢迎使用本程序来查验您的注册表 本程序目前版本为: Version 0.1-4-2 程序最后更新日期为: 2006-09-22 若在您的系统中发现本程序有问题, 欢迎与我联系! 鸟哥的首页 http://vbird.org.cn 问题回报: http://phorum.vbird.org/viewtopic.php?t=3425 ########################################################## # 先看看你的硬件与操作系统的相关情况,尤其是 partition 的使用量更需要随时注意! =============== 系统汇整 ================================= 内核版本 : Linux version 2.6.18-92.el5 (mockbuild@builder16.centos.org) CPU 信息 : Intel(R) Celeron(TM) CPU : 1200.062 MHz 主机名称 : www.vbird.tsai 统计日期 : 2009/April/08 17:00:59 ( Wednesday ) 分析的日期: Apr 8 已开机期间: 7 days, 22:46, 目前主机挂载的 partitions Filesystem Size Used Avail Use% Mounted on /dev/hda2 9.5G 3.8G 5.3G 42% / /dev/hda3 4.8G 1.1G 3.5G 23% /home /dev/hda1 99M 21M 73M 23% /boot tmpfs 363M 0 363M 0% /dev/shm # 这个程序会将针对 internet 与内部监听的端口口分开来显示! ================= Ports 的相关分析信息 ======================= 主机激活的 port 与相关的 process owner: 仅对本机接口开放的 ports (PID|owner|command) tcp 25|(root)|sendmail: accepting connections tcp 631|(root)|cupsd tcp 2207|(root)|python ./hpssd.py tcp 2208|(root)|./hpiod 对外部接口开放的 ports (PID|owner|command) tcp 22|(root)|/usr/sbin/sshd tcp 111|(rpc)|portmap tcp 737|(root)|rpc.statd udp 111|(rpc)|portmap udp 514|(root)|syslogd -m 0 -r udp 631|(root)|cupsd udp 731|(root)|rpc.statd udp 734|(root)|rpc.statd udp 5353|(avahi)|avahi-daemon: running [www.local] udp 32768|(avahi)|avahi-daemon: running [www.local] udp 32769|(avahi)|avahi-daemon: running [www.local] # 以下针对有启动的服务个别进行分析! ================= SSH 的注册表信息汇整 ======================= 今日没有使用 SSH 的纪录 ================= Sednamil 的注册表信息汇整 ================== 您的主机有进行 SASL 身份认证的功能 今日没有 sendmail 的相关信息 ================= 全部的注册表信息汇整 ======================= 1. 重要的登录记录档 ( Secure file ) 说明:已经取消了 pop3 的信息! Apr 8 15:46:22 www su: session opened for user vbird by root(uid=0) Apr 8 15:47:02 www su: session closed for user vbird 2. 使用 last 这个指令输出的结果 wtmp begins Wed Apr 8 15:19:47 2009 3. 将特重要的 /var/log/messages 列出来瞧瞧! 已经取消 crond 与 snmpd 的消息 Apr 8 15:19:47 www syslogd 1.4.1: restart (remote reception). Apr 8 15:34:25 www syslogd 1.4.1: restart (remote reception).
目前鸟哥都是通过这支程序去分析自己管理的主机,然后再据以了解系统状况,如果有特殊状况则即时进行系统处理! 而且鸟哥都是将上述的 email 调整成自己可以在 Internet 上面读到的邮件,这样我每天都可以收到正确的注册表分析信息哩!