Linux 基础学习篇 - CentOS 5.x

第十九章、认识与分析注册表 - for CentOS 5.x

注册表的分析啦!

最近更新时间: 2009/09/14

本文数据主要针对 CentOS 5.x 的系统进行说明,而 CentOS 5.x 已经在 2017 年 3 月份正式不再进行维护,事实上,在 2012 年底几乎就不再维护了。 因此,建议您前往本站查找最新版本的 Linux distribution 文章来阅读,比较不会浪费时间。那为何还需要编辑 CentOS 5 的数据呢? 鸟哥只想要做个自己曾经撰写过的文档内容保存而已啰! ^_^!最新文章请前往鸟站首页查阅啰!

当你的 Linux 系统出现不明原因的问题时,很多人都告诉你,你要查阅一下注册表才能够知道系统出了什么问题了,所以说, 了解注册表是很重要的事情呢。注册表可以记录系统在什么时间、哪个主机、哪个服务、出现了什么消息等信息, 这些信息也包括用户识别数据、系统故障排除须知等信息。如果你能够善用这些注册表信息的话,你的系统出现错误时, 你将可以在第一时间发现,而且也能够从中找到解决的方案,而不是昏头转向的乱问人呢。 此外,注册表所记录的信息量是非常大的,要人眼分析实在很困难。此时利用 shell script 或者是其他软件提供的分析工具来处理复杂的注册表,可以帮助你很多很多喔!

什么是注册表

详细而确实的分析以及备份系统的注册表』是一个系统管理员应该要进行的任务之一。 那么什么是注册表呢?简单的说,就是记录系统活动信息的几个文件, 例如:何时、何地 (来源 IP)、何人 (什么服务名称)、做了什么动作 (消息登录啰)。 换句话说就是:记录系统在什么时候由哪个进程做了什么样的行为时,发生了何种的事件等等

要知道的是,我们的 Linux 主机在背景之下有相当多的 daemons 同时在工作着,这些工作中的进程总是会显示一些消息, 这些显示的消息最终会被记载到注册表当中啦。也就是说,记录这些系统的重要消息就是注册表的工作啦!


注册表的重要性

为什么说注册表很重要,重要到系统管理员需要随时注意他呢?我们可以这么说:

  • 解决系统方面的错误

    用 Linux 这么久了,你应该偶而会发现系统可能会出现一些错误,包括硬件捉不到或者是某些系统程序无法顺利运作的情况。 此时你该如何是好?由于系统会将硬件侦测过程记录在注册表内,你只要通过查找注册表就能够了解系统作了啥事! 并且由第十七章我们也知道 SELinux 与注册表的关系更加的强烈!所以啰,查找注册表可以克服一些系统问题啦!

  • 解决网络服务的问题

    你可能在做完了某些网络服务的设置后,却一直无法顺利启动该服务,此时该怎办?去庙里面拜拜抽签吗? 三太子大大可能无法告诉你要怎么处理呢!由于网络服务的各种问题通常都会被写入特别的注册表, 其实你只要查找注册表就会知道出了什么差错,还不需要请示三太子大大啦!举例来说,如果你无法启动邮件服务器 (sendmail), 那么查找一下 /var/log/maillog 通常可以得到不错的解答!

  • 过往事件记录簿

    这个东西相当的重要!例如:你发现 WWW 服务 (apache 软件) 在某个时刻流量特别大,你想要了解为什么时, 可以通过注册表去找出该时段是哪些 IP 在连接与查找的网页数据为何,就能够知道原因。 此外,万一哪天你的系统被入侵,并且被利用来攻击他人的主机,由于被攻击主机会记录攻击者,因此你的 IP 就会被对方记录。这个时候你要如何告知对方你的主机是由于被入侵所导致的问题, 并且协助对方继续往恶意来源追查呢?呵呵!此时注册表可是相当重要的呢!
Tips 鸟哥 所以我们常说『天助自助者』是真的啦!你可以通过 (1)察看屏幕上面的错误消息与 (2)注册表的错误信息,几乎可以解决大部分的 Linux 问题!

Linux 常见的注册表文件名

注册表可以帮助我们了解很多系统重要的事件,包括登录者的部分信息,因此注册表的权限通常是设置为仅有 root 能够读取而已。 而由于注册表可以记载系统这么多的详细信息,所以啦,一个有经验的主机管理员会随时随地查阅一下自己的注册表, 以随时掌握系统的最新脉动!那么常见的几个注册表有哪些呢?一般而言,有下面几个:

  • /var/log/cron
    还记得第十六章例行性工作调度吧?你的 crontab 调度有没有实际被进行? 进行过程有没有发生错误?你的 /etc/crontab 是否撰写正确?在这个注册表内查找看看。

  • /var/log/dmesg
    记录系统在开机的时候内核侦测过程所产生的各项信息。由于 CentOS 缺省将开机时内核的硬件侦测过程取消显示, 因此额外将数据记录一份在这个文件中;

  • /var/log/lastlog
    可以记录系统上面所有的帐号最近一次登录系统时的相关信息。第十四章讲到的 lastlog 指令就是利用这个文件的记录信息来显示的。

  • /var/log/maillog 或 /var/log/mail/*
    记录邮件的往来信息,其实主要是记录 sendmail (SMTP 协定提供者) 与 dovecot (POP3 协定提供者) 所产生的消息啦。 SMTP 是发信所使用的通信协定, POP3 则是收信使用的通信协定。 sendmail 与 dovecot 则分别是两套达成通信协定的软件。

  • /var/log/messages
    这个文件相当的重要,几乎系统发生的错误消息 (或者是重要的信息) 都会记录在这个文件中; 如果系统发生莫名的错误时,这个文件是一定要查阅的注册表之一。

  • /var/log/secure
    基本上,只要牵涉到『需要输入帐号密码』的软件,那么当登录时 (不管登录正确或错误) 都会被记录在此文件中。 包括系统的 login 程序、图形接口登录所使用的 gdm 程序、 su, sudo 等程序、还有网络连接的 ssh, telnet 等程序, 登录信息都会被记载在这里;

  • /var/log/wtmp, /var/log/faillog
    这两个文件可以记录正确登录系统者的帐号信息 (wtmp) 与错误登录时所使用的帐号信息 (faillog) ! 我们在第十一章谈到的 last 就是读取 wtmp 来显示的, 这对于追踪一般帐号者的使用行为很有帮助!

  • /var/log/httpd/*, /var/log/news/*, /var/log/samba/*
    不同的网络服务会使用它们自己的注册表案来记载它们自己产生的各项消息!上述的目录内则是个别服务所制订的注册表。

常见的注册表就是这几个,但是不同的 Linux distributions ,通常注册表的文件名不会相同 (除了 /var/log/messages 之外 )。所以说,你还是得要查阅你 Linux 主机上面的注册表设置数据, 才能知道你的注册表主要文件名喔!


注册表所需相关服务 (daemon) 与程序

那么这些注册表是怎么产生的呢?基本上有两种方式,一种是由软件开发商自行定义写入的注册表与相关格式, 例如 WWW 软件 apache 就是这样处理的。另一种则是由 Linux distribution 提供的注册表管理服务来统一管理。 你只要将消息丢给这个服务后,他就会自己分门别类的将各种消息放置到相关的注册表去!CentOS 提供 syslogd 这个服务来统一管理注册表喔!

除了这个 syslogd 之外,我们的内核也需要额外的登录服务来记录内核产生的各项信息, 这个专门记录内核信息的注册表服务就是 klogd 啦。所以说,注册表所需的服务主要就是 syslogd 与 klogd 这两者。

不过要注意的是,如果你任凭注册表持续记录的话,由于系统产生的信息天天都有,那么你的注册表的容量将会长大到无法无天~ 如果你的注册表容量太大时,可能会导致大文件读写效率不佳的问题 (因为要从磁盘读入内存,越大的文件消耗内存量越多)。 所以啰,你需要对注册表备份与更新。那...需要手动处理喔?当然不需要,我们可以通过 logrotate (注册表轮替) 这玩意儿来自动化处理注册表容量与更新的问题喔!

所谓的 logrotate 基本上,就是将旧的注册表更改名称,然后创建一个空的注册表,如此一来, 新的注册表将重新开始记录,然后只要将旧的注册表留下一阵子,嗯!那就可以达到将注册表『轮转』的目的啦! 此外,如果旧的纪录 (大概要保存几个月吧!) 保存了一段时间没有问题,那么就可以让系统自动的将他砍掉, 免得占掉很多宝贵的硬盘空间说!

总结一下,针对注册表所需的功能,我们需要的服务与程序有:

  • syslogd:主要登录系统与网络等服务的消息;
  • klogd:主要登录内核产生的各项信息;
  • logrotate:主要在进行注册表的轮替功能。

由于我们着眼点在于想要了解系统上面软件所产生的各项信息,因此本章主要针对 syslogd 与 logrotate 来介绍。 接着下来我们来谈一谈怎么样规划这两个玩意儿。就由 syslogd 这支程序先谈起吧!毕竟得先有注册表,才可以进行 logrotate 呀!您说是吧!

syslogd :记录注册表的服务

刚刚提到说 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 而记录下来的数据中,每条消息均会记录底下的几个重要数据:

  • 事件发生的日期与时间;
  • 发生此事件的主机名称;
  • 启动此事件的服务名称 (如 samba, xinetd 等) 或函数名称 (如 libpam ..);
  • 该消息的实际数据内容。

当然,这些信息的『详细度』是可以修改的,而且,这些信息可以作为系统调试之用呢! 我们拿登录时一定会记载帐号信息的 /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 的内容。记得一个好的系统管理员, 要常常去『巡视』注册表的内容喔!尤其是发生底下几种情况时:

  • 当你觉得系统似乎不太正常时;
  • 某个 daemon 老是无法正常启动时;
  • 某个用户老是无法登录时;
  • 某个 daemon 运行过程老是不顺畅时;

还有很多啦!反正觉得系统不太正常,就得要查找查找注册表就是了。

Tips 鸟哥 提供一个鸟哥常做的检查方式。当我老是无法成功的启动某个服务时,我会在最后一次启动该服务后,立即检查注册表, 先 (1)找到现在时间所登录的信息『第一字段』; (2)找到我想要查找的那个服务『第三字段』, (3)最后再仔细的查阅第四字段的信息,来借以找到错误点。

syslog 的设置档:/etc/syslog.conf

什么?注册表还有设置档?喔!不是啦~是 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亦即是打印相关的消息啊!
mail只要与邮件收发有关的消息纪录都属于这个;
news与新闻群组服务器有关的东西;
syslog就是 syslogd 这支程序本身产生的信息啊!
user, uucp, local0 ~ local7 与 Unix like 机器本身有关的一些消息。

上面谈到的都是 syslog 自行制订的服务名称,软件开发商可以通过调用上述的服务名称来记录他们的软件。 举例来说, sendmail 与 postfix 及 dovecot 都是与邮件有关的软件,这些软件在设计注册表记录时,都会主动调用 syslogd 内的 mail 服务名称 (LOG_MAIL),所以上述三个软件 (sendmail, postfix, dovecot) 产生的消息在 syslog 看起来,就会『是 mail 』类型的服务了。我们可以将这个概念绘制如底下的图标来理解:

syslog 所制订的服务名称与软件调用的方式
图 2.2.1、 syslog 所制订的服务名称与软件调用的方式

另外,每种服务所产生的数据量其实差异是很大的,举例来说, mail 的注册表消息多的要命, 每一封信件进入后, mail 至少需要记录『寄信人的信息;与收信者的消息』等等; 而如果是用来做为工作站主机的,那么登录者 (利用 login 登录主机处理事情) 的数量一定不少,那个 authpriv 所管辖的内容可就多的要命了。

为了让不同的信息放置到不同的文件当中,好让我们分门别类的进行注册表的管理, 所以啰,将各种类别的服务之注册表,记录在不同的文件里面,就是我们 /etc/syslog.conf 所要作的规范了!

    消息等级

同一个服务所产生的消息也是有差别的,有启动时仅通知系统而已的一般消息 (information), 有出现还不至于影响到正常运作的警告消息 (warn) ,还有系统硬件发生严重错误时,所产生的重大问题消息 (error 等等); 消息到底有多少种严重的等级呢?基本上,syslog 将消息分为七个主要的等级,依序是这样的(由不重要排列到重要消息等级):

等级等级名称说明
1info 仅是一些基本的消息说明而已;
2notice 比 info 还需要被注意到的一些信息内容;
3warning
(warn)
警示的消息,可能有问题,但是还不至于影响到某个 daemon 运作的信息;基本上, info, notice, warn 这三个消息都是在告知一些基本信息而已,应该还不至于造成一些系统运作困扰;
4err
(error)
一些重大的错误消息,例如设置档的某些设置值造成该服务服法启动的信息说明, 通常借由 err 的错误告知,应该可以了解到该服务无法启动的问题呢!
5crit 比 error 还要严重的错误信息,这个 crit 是临界点 (critical) 的缩写,这个错误已经很严重了喔!
6alert 警告警告,已经很有问题的等级,比 crit 还要严重!
7emerg
(panic)
疼痛等级,意指系统已经几乎要当机的状态! 很严重的错误信息了。通常大概只有硬件出问题,导致整个内核无法顺利运作,就会出现这样的等级的消息吧!

除了这些有等级的消息外,还有两个特殊的等级,那就是 debug(错误侦测等级) 与 none (不需登录等级) 两个,当我们想要作一些错误侦测,或者是忽略掉某些服务的信息时, 就用这两个咚咚吧!

特别留意一下在消息等级之前还有 [.=!] 的链接符号喔!他代表的意思是这样的:

  • . :代表『比后面还要高的等级 (含该等级) 都被记录下来』的意思,例如: mail.info 代表只要是 mail 的信息,而且该信息等级高于 info (含 info 本身)时,就会被记录下来的意思。
  • .=:代表所需要的等级就是后面接的等级而已, 其他的不要!
  • .!:代表不等于, 亦即是除了该等级外的其他等级都记录。

一般来说,我们比较常使用的是『.』这个链接符号啦!^_^

    消息记录的文件名或设备或主机

再来则是这个消息要放置在哪里的纪录了。通常我们使用的都是记录的文件啦!但是也可以输出到设备呦! 例如打印机之类的!也可以记录到不同的主机上头去呢!底下就是一些常见的放置处:

  • 文件的绝对路径:通常就是放在 /var/log 里头的文件啦!
  • 打印机或其他:例如 /dev/lp0 这个打印机设备
  • 用户名:显示给用户啰!
  • 远程主机:例如 @www.vbird.tsai 当然啦,要对方主机也能支持才行!
  • *:代表『目前在在线的所有人』,类似 wall 这个指令的意义!

    syslog.conf 语法练习

基本上,整个 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.=warn;cron.=warn /var/log/cronnews.warn
上面那个『.=』就是在指定等级的意思啦!由于指定了等级,因此,只有这个等级的消息才会被纪录在这个文件里面呢! 此外你也必须要注意,news 与 cron 的警告消息也会写入 /var/log/cronnews 内喔!

例题:
我的 messages 这个文件需要记录所有的信息,但是就是不想要记录 cron, mail 及 news 的信息,那么应该怎么写才好?
答:
可以有两种写法,分别是:
*.*;news,cron,mail.none      /var/log/messages
*.*;news.none;cron.none;mail.none /var/log/messages
使用『,』分隔时,那么等级只要接在最后一个即可,如果是以『;』来分的话, 那么就需要将服务与等级都写上去啰!这样会设置了吧!

    CentOS 5.x 缺省的 syslog.conf 内容

了解语法之后,我们来看一看 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

上面总共仅有十一行设置值,每一行的意义是这样的:

  1. #kern.*:只要是内核产生的消息,全部都送到 console(终端机) 去。console 通常是由外部设备连接到系统而来, 举例来说,很多封闭型主机 (没有键盘、屏幕的系统) 可以通过连接 RS232 连接口将消息传输到外部的系统中, 例如以笔记本电脑连接到封闭主机的 RS232 插口。这个项目通常应该是用在系统出现严重问题而无法使用缺省的屏幕观察系统时, 可以通过这个项目来连接取得内核的消息。(注1)

  2. *.info;mail.none;news.none;authpriv.none;cron.none:由于 mail, news, authpriv, cron 等类别产生的消息较多, 且已经写入底下的数个文件中,因此在 /var/log/messages 里面就不记录这些项目。除此之外的其他消息都写入 /var/log/messages 中。这也是为啥我们说这个 messages 文件很重要的缘故!

  3. authpriv.*:认证方面的消息均写入 /var/log/secure 文件;

  4. mail.*:邮件方面的消息则均写入 /var/log/maillog 文件;

  5. cron.*:例行性工作调度均写入 /var/log/cron 文件;

  6. *.emerg:当产生最严重的错误等级时,将该等级的消息以 wall 的方式广播给所有在系统登录的帐号得知, 要这么做的原因是希望在线的用户能够赶紧通知系统管理员来处理这么可怕的错误问题。

  7. uucp,news.crit:uucp 是早期 Unix-like 系统进行数据传递的通信协定,后来常用在新闻群组的用途中。 news 则是新闻群组。当新闻群组方面的信息有严重错误时就写入 /var/log/spooler 文件中;

  8. local7.*:将本机开机时应该显示到屏幕的消息写入到 /var/log/boot.log 文件中;

  9. 后面的 news.=crit、news.=err、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 的设置,也知道了注册表内容的重要性了, 所以,如果幻想你是一个很厉害的黑客,想利用他人的电脑干坏事,然后又不想留下证据, 你会怎么作?对啦!就是离开的时候将屁股擦干净,将所有可能的消息都给他抹煞掉, 所以第一个动脑筋的地方就是注册表的清除工作啦~ 如果你的注册表不见了,那该怎办?

Tips 鸟哥 哇!鸟哥教人家干坏事……喂!不要乱讲话~俺的意思是,如果改天你发现你的注册表不翼而飞了, 或者是发现你的注册表似乎不太对劲的时候,最常发现的就是网友常常会回报说,他的 /var/log 这个目录『不见了!』不要笑!这是真的事情!请记得,『赶快清查你的系统!』

伤脑筋呢!有没有办法防止注册表被删除?或者是被 root 自己不小心变更呢?有呀!拔掉网络线或电源线就好了……呵呵! 别担心,基本上,我们可以通过一个隐藏的属性来设置你的注册表,成为『 只可以增加数据,但是不能被删除 』的状态,那么或许可以达到些许的保护!不过,如果你的 root 帐号被破解了,那么底下的设置还是无法保护的,因为你要记得『 root 是可以在系统上面进行任何事情的 』,因此,请将你的 root 这个帐号的密码设置的安全一些!千万不要轻忽这个问题呢!

Tips 鸟哥 为什么注册表还要防止被自己 (root) 不小心所修改过呢? 鸟哥在教 Linux 的课程时,我的学生常常会举手说:『老师,我的注册表不能记录信息了!糟糕!是不是被入侵了啊?』 怪怪!明明是电脑教室的主机,使用的是 Private IP 而且学校计中还有抵挡机制,不可能被攻击吧? 查找了才知道原来同学很喜欢使用『 :wq 』来离开 vim 的环境,但是 syslog 的注册表只要『被编辑过』就无法继续记录! 所以才会导致不能记录的问题。此时你得要 (1)改变使用 vim 的习惯; (2)重新启动 syslog 让他再继续提供服务才行喔!

既然如此,那么我们就来处理一下隐藏属性的东东吧!我们在第七章谈到过 lsattrchattr 这两个东西啦!如果将一个文件以 chattr 设置 i 这个属性时,那么该文件连 root 都不能杀掉!而且也不能添加数据,嗯!真安全!但是,如此一来注册表的功能岂不是也就消失了? 因为没有办法写入呀!所以啰,我们要使用的是 a 这个属性!你的注册表如果设置了这个属性的话,那么 他将只能被增加,而不能被删除!嗯! 这个项目就非常的符合我们注册表的需求啦!因此,你可以这样的增加你的注册表的隐藏属性。

Tips 鸟哥 请注意,底下的这个 chattr 的设置状态:『仅适合已经对 Linux 系统很有概念的朋友』来设置, 对于新手来说,建议你直接使用系统的默认值就好了,免得到最后注册表无法写入~ 那就比较糗一点! @_@
[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 喔!

注册表服务器的架构
图 2.4.1、注册表服务器的架构

如上图所示,服务器会启动监听的端口口,用户端则将注册表再转出一份送到服务器去。 而既然是注册表『服务器』,所以当然有服务器与用户端 (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) 呢?

注册表的轮替(logrotate)

假设我们已经将登录数据写入了记录档中了,也已经利用 chattr 设置了 +a 这个属性了,那么该如何进行 logrotate 的工作呢?这里请特别留意的是:『syslog 利用的是 daemon 的方式来启动的, 当有需求的时候立刻就会被运行的,但是 logrotate 却是在规定的时间到了之后才来进行注册表的轮替, 所以这个 logrotate 进程当然就是挂在 cron 底下进行的呦!』 仔细看一下 /etc/cron.daily/ 里面的文件,嘿嘿~看到了吧! /etc/cron.daily/logrotate 就是记录了每天要进行的注册表轮替的行为啦! ^_^!底下我们就来谈一谈怎么样设计这个 logrotate 吧!

logrotate 的设置档

既然 logrotate 主要是针对注册表来进行轮替的动作,所以啰,他当然必须要记载『 在什么状态下才将注册表进行轮替』的设置啊!那么 logrotate 这个程序的参数设置档在哪里呢?呵呵!那就是:

  • /etc/logrotate.conf
  • /etc/logrotate.d/

那个 logrotate.conf 才是主要的参数文件,至于 logrotate.d 是一个目录, 该目录里面的所有文件都会被主动的读入 /etc/logrotate.conf 当中来进行!另外,在 /etc/logrotate.d/ 里面的文件中,如果没有规定到的一些细部设置,则以 /etc/logrotate.conf 这个文件的规定来指定为默认值!

好了,刚刚我们提到 logrotate 的主要功能就是将旧的注册表案移动成旧档, 并且重新创建一个新的空的文件来记录,他的运行结果有点类似底下的图标:

注册表进行 logrotate 的结果
图 3.1.1、 注册表进行 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 是『缺省的轮替状态』而已, 我们的各个服务都可以拥有自己的注册表轮替设置,你也可以自行修改成自己喜欢的样式啊! 例如,如果你的系统的空间够大,并且担心调试以及黑客的问题,那么可以:

  • 将 rotate 4 改成 rotate 9 左右,以保存较多的备份文件;
  • 大部分的注册表不需要 compress 啰!但是空间太小就需要 compress !尤其是很占硬盘空间的 httpd 更需要 compress 的!

好了,上面我们大致介绍了 /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 的写法为:

  • 文件名:被处理的注册表绝对路径文件名写在前面,可以使用空白字符分隔多个注册表;
  • 参数:上述文件名进行轮替的参数使用 { } 包括起来;
  • 运行脚本:可调用外部指令来进行额外的命令下达,这个设置需与 sharedscripts .... endscript 设置合用才行。至于可用的环境为:
    • prerotate:在启动 logrotate 之前进行的指令,例如修改注册表的属性等动作;
    • postrotate:在做完 logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务!
    • Prerotate 与 postrotate 对于已加上特殊属性的文件处理上面,是相当重要的运行进程!

那么 /etc/logrotate.d/syslog 内设置的六个文件的轮替功能就变成了:

  • 该设置只对 /var/log/ 内的 messages, secure, maillog, spooler, boot.log, cron 有效;
  • 注册表轮替每周一次、保留四个、且轮替下来的注册表不进行压缩(未更改默认值);
  • 轮替完毕后 (postrotate) 取得 syslog 的 PID 后,以 kill -HUP 重新启动 syslogd

假设我们有针对 /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 的内容说明)

实际测试 logrotate 的动作

好了,设置完成之后,我们来测试看看这样的设置是否可行呢?给他运行底下的指令:

[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 这个隐藏标签,而且设置底下的相关信息:

  • 注册表轮替一个月进行一次;
  • 该注册表若大于 10MB 时,则主动进行轮替,不需要考虑一个月的期限;
  • 保存五个备份文件;
  • 备份文件需要压缩

那你可以怎么样设置呢?呵呵~很简单啊!看看底下的动作吧!

# 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 缺省提供的 logwatch

虽然有一些有用的系统指令,不过,要了解系统的状态,还是得要分析整个注册表才行~ 事实上,目前已经有相当多的注册表分析工具,例如 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 的语法) 用来分析自己的注册表, 这支程序分析的注册表数据其实是固定的,包括有:

  • /var/log/secure
  • /var/log/messages
  • /var/log/maillog

当然啦,还不只这些啦,包括各个主要常见的服务,如 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 上面读到的邮件,这样我每天都可以收到正确的注册表分析信息哩!

重点回顾

  • 注册表可以记录一个事件的何时、何地、何人、何事等四大信息,故系统有问题时务必查找注册表;
  • 系统的注册表缺省都集中放置到 /var/log/ 目录内,其中又以 messages 记录的信息最多!
  • 注册表记录的主要服务与程序为: syslogd, klogd, log
  • syslogd 的设置档在 /etc/syslog.conf ,内容语法为:『 服务.等级 记载设备或文件』
  • syslogd 本身有提供注册表服务器的功能,通过修改 /etc/sysconfig/syslog 内容即可达成;
  • logrotate 程序利用 crontab 来进行注册表的轮替功能;
  • logrotate 的设置档为 /etc/logrotate.conf ,而额外的设置则可写入 /etc/logrotate.d/* 内;
  • logwatch 为 CentOS 5 缺省提供的一个注册表分析软件。

本章习题

( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 ) 实作题:
  • 请在你的 CentOS 5.x 上面,依照鸟哥提供的 logfile.sh 去安装,并将结果取出分析看看。


简答题部分:
  • syslogd 可以作为注册表服务器,请以 man page 的方式配合 network 关键字,查出 syslogd 需要加上什么选项就能够成为注册表服务器?
    通过 man syslogd ,查找到 -r 的选项。
  • 如果你想要将 auth 这个服务的结果中,只要消息等级高于 warn 就给予发送 email 到 root 的信箱,该如何处理?
    利用 vim 去编辑 /etc/syslog.conf 文件,内容为
    auth.warn root
  • 启动系统登录信息时,需要启动哪两个 daemon 呢?
    syslogd 记录系统软件, klogd 记录内核信息。
  • syslogd 以及 logrotate 个别通过什么机制来运行?
    syslogd 为 stand alone daemon 的机制; logrotate 则是通过 crontab 来运行的!只是个指令而已。
修改历史:
  • 2002/06/24:第一次完成
  • 2003/02/11:重新编排与加入 FAQ
  • 2005/10/12:旧的文章已经被移动到 此处
  • 2005/10/24:终于写完了~啊!怎么写这么久??
  • 2006/07/23:修改了 /etc/logrotate.d/syslog 的设置数据
  • 2009/03/31:将旧的基于 FC4 版本的数据移动至 此处
  • 2009/09/14:加入了一些例题而已。这一篇太简单了~想不到什么好的题目说~
  • 2010/12/24:感谢网友 eujiang 提供的英文版 logfile.sh 程序喔!
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计