鸟哥的 Linux 私房菜
Linux 基础篇 | Linux 服务器篇 | Linux 企业应用篇 | 安全管理
     
 
第十九章、认识与分析登录档
最近更新日期:2009/09/14
当你的 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 老是无法正常启动时;
  • 某个使用者老是无法登入时;
  • 某个 demon 执行过程老是不顺畅时;

还有很多啦!反正觉得系统不太正常,就得要查询查询登录档就是了。

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/message
  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 ~]# vi logfile.sh
email="root@localhost" <==大约在 93 行左右,请填入你的 email ,否则保留预设值
basedir="/usr/local/virus/logfile" <==保留预设值,除非你的执行目录不同与此!

[root@www ~]# sh logfile.sh
# 开始尝试分析系统的登录档,依据你的登录档大小,分析的时间不固定!

[root@www ~]# vi /etc/crontab
10 0 * * * root /usr/local/virus/logfile/logfile.sh
# 增加这一行!让系统在每天的凌晨自己进行登录档分析!

[root@www ~]# mail
# 自己找到刚刚输出的结果,该结果的输出有点像底下这样:

# 先进行程序的宣告!你也可以在底下的连结找到一些错误回报!
##########################################################
欢迎使用本程序来查验您的登录档
本程序目前版本为: Version 0.1-4-2
程序最后更新日期为: 2006-09-22
若在您的系统中发现本程序有问题, 欢迎与我联络!
鸟哥的首页 http://linux.vbird.org
问题回报: 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 为 super 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:加入了一些例题而已。这一篇太简单了~想不到什么好的题目说~



 
     
中国存储网 ChinaStor.com排版整理
原文作者鸟哥,主页,更多Linux学习资料在线看:Linux系统管理员手册 - Linux命令大全 - Linux调用大全- Linux专栏 - 国产Linux