分类: LINUX
2008-04-08 21:56:49
基本上,在 Linux 系统上的每一个事件,例如使用者的登录、服务的启动和关闭、系统错误、突发事件、等等等等,都能够透过系统日志记录下来。例如dmesg 命令,其实就是显示系统核心资讯记录档 /var/log/dmesg 的内容而已。没错,除非您另外设定,一般而言,系统的所有日志记录都存放在 /var/log 这个目录里面。除了 dmesg 之外,其它诸如 messages、maillog、secure、xferlog 等等档案也经常被用来作检查。某些服务程式,例如 httpd、samba、squid 等,还有专门独立的目录来管理它们的日志档案。
Tips:如果您想看看系统最近有哪些人登录过进来、以及使用什麽服务进行登录、逗留的时间多长、等等资讯,您可以执行 last 命令来获得,不过,它的显示顺序是最古老的登录显示在最後面。如果显示的资料超过一个荧幕,那您可能只看到最旧的登录资讯。您可以将结果导到 more 或 less 命令慢慢看,也可以传给 tac 命令将显示顺序颠倒过来:
last | tac |
这些资讯非常有用,尤其在您进行报告、除错、事件追踪、系统规划、等等的时候。要分析这些资讯,其实满累人的,因为大部份格式都不是很容易阅读和理解。不过,您可以借助某些工具来帮忙检查和整理这些记录档,例如 swatch 和 logcheck 之类的程式,假如它们发现有不寻常的现像,则透过设定形式通知管理员,有的甚至很能将信息送到 BB Call 或手机上面去。不过,我们这里不是教您如何使用记录档的资讯,而是教您如何设定管理这些档案的服务程式而已。
负责管理和提供系统日志的服务叫 syslog,请务必用 ntsysv 确定它的服务程式 syslogd 在开机的时候能够自动执行。和前面介绍的 xinetd 一样,每当您修改过 syslog 的设定,也必须重新执行这个 deamon 才能生效。当然,要让 syslog 能够记录服务程式所产生的资讯,您必须在编译的时候或透过设定来告诉服务程式使用 syslog 服务才行。现在的服务程式,大都预设上使用 syslog 进行日志管理,但有些服务程式,例如自己手工编译的 apache,除非您另行指定,否则是按照它自己的习性进行日志记录的。
至於 syslog 是如何进行记录的,则是透过 /etc/syslog.conf 这个设定档进行控制。在进一步讨论这个档案之前,先让我们了解一下 syslog.conf 的设定语法:
facility.level action |
(注意:action 前面必须使用 tab 而非空白键进行分隔!)
其中的 facility 主要是日志系统所能管理的服务程式,例如:auth、cron、daemon、kernel、lpr、mail、以及 syslog 本身、等等。另外,facility 也接受 local0 到 local7 的定义,这可以让您自行设定特定的记录类别,比方说,ssh 预设会使用 local5 这个定义。还有,您甚至可以用 " * " 符号来泛指所有 facility 。
在 facility 後面是一个小数点,然後配合 log level 来指定一个 facility 的讯息重要程度,按重要程度来分、由低至高一共有如下这些 level:info、notice、err、crit、alert、emerg 或 panic ;另外,还有一些特殊的 level:debug 主要用来除错时使用的,因为它产生的资讯实在太多了,除非真的有此必要,否则不要设定;和 facility 一样,您也可以用 " * " 符号来泛指所有 level;另外,还有一个 none,它是当使用 * 的时候,进行排他设定的。
当您指定一个 level 的时候,syslog 会记录这个 level 本身,以及所有高於它的其它 level 讯息;例如,crit 事实上会包含 crit、alert、emerg 这三个 level 所产生的资讯。但如果您在 level 名称前面加上一个 " = " 符号,则仅仅指定该 level 本身的讯息而已;例如,=crit 只包含 crit 这个 level 产生的信息。
在设定行的最後部份,则是用一个或多个 tab 键分隔的 action。它可以是如下任何一个项目:
档案绝对路径: 通常以位於 /var/log 目录里面的档案来记录信息;
terminal 或印表机名称: 将信息显示在 terminal 或印表机上,例如 /dev/console、/dev/tty1、/dev/lp0 等;
使用者名称: 用 write 命令将讯息显示在使用者登录的第一个 console 上面,如设定为 " * " 符号则代表所有使用者;
远端主机名称: 必须冠以 " @ " 符号作开头,通常是用来集中管理 syslog 的服务主机,其上必须有执行 syslogd 服务,并能接受这台主机所产生的 syslog 连线;
由 mkfifo 程式所产生的 name pipe : 必须冠以 " | " 符号做开头,通常给其它程式或 script 使用。
当您了解 syslog.conf 的设定语法之後,让我们看看这个档案的范例:
#kern.* /dev/console # 上面这行是注解起来的,如果您将它打开的话, # 那麽所有由 kern 产生的讯息都会显示在荧幕上面。 *.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages # 上面用多个 " ; " 分隔多项设定, # 除了 mail、news、authpriv、cron 这些之外, # 所有 facility 的 info 以上的资讯,将记录到 /var/log/messages 档案。 authpriv.* /var/log/secure # 关於 privileged 资讯的记录全部写到 /var/log/secure 档里面。 # 这通常是与帐号相关的资讯,例如 PAM 就通常会使用这个 facility。 mail.* /var/log/maillog # 关於 mail 产生的所有资讯,记录到 /var/log/maillog 档案。 cron.* /var/log/cron # 关於 cron 的所有资讯,记录到 /var/log/cron 档案。 *.emerg * # 所有 emerg level 的资讯,将送给线上的所有使用者。 uucp,news.crit /var/log/spooler # 关於 uucp 和 news 的 crit 及以上 level 的资讯,记录到 /var/log/spooler 档案。 local7.* /var/log/boot.log # 自定义的 local7 所产生的所有资讯,都记录到 /var/log/boot.log 档案。 news.=crit /var/log/news/news.crit # 仅将 news 产生的 crit level 资讯写进 /var/log/news/news.crit 档案。 news.=err /var/log/news/news.err # 仅将 news 产生的 err level 资讯写进 /var/log/news/news.err 档案。 news.notice /var/log/news/news.notice # 将 news 的 notice 及以上 level 所产生的资讯,记录到 /var/log/news/news.notice 档案。 |
Tips:如果您想把讯息记录到远端的日志伺服器上(假设名称为 doraemon ),您必须确定可以连上对方的 UDP port 514 。同时修改其上的 /etc/sysconfig/syslog,在原本的 SYSLOG_OPTIONS 增加一个 ' -r ' 参数:
SYSLOG_OPTIONS="-m 0 -r" |
然後在本机的 /etc/syslog.conf 上增加相应的设定,使之记录到远端机器上:
*.info @doraemon |
修改完别忘了双方都要重新跑 syslog 服务哦。
有条件的话,我强烈建议您架设一台专用的日志伺服器,用 486 机器就好了(如果您还能从杂物间找得到的话)。然後设定所有的 Linux 机器,让记录产生一个副本到集中的日志伺服器上。当然,这台日志伺服器的安全性就显得非常重要了,您甚至可以将上面的所有远端服务都关闭掉,只剩必要的 UDP 514 就好。
透过 syslog.conf 设定档,您可以指定哪些资讯,以及何种等级的资讯,要记录到哪里去。假如您是使用档案的形式进行记录的话,您需要留意的一个问题是:每次有新的资讯产生,都会增加到这些档案中。换句话说:这些档案的体积会根据信息量的多寡而不断增加,如果控制不宜,可能会将您档案系统空间吃光!假如您还没忘记第一章“安装 Linux”里面所提到的 partiton 和 mount point 的安排,那应该会知道为什麽人们通常会将 /var/log 挂在独立的 partition 上面了。
而另外一个问题是:这些档案通常会记录到一些关於系统的敏感资料,记录档的真实程度就显得非常重要了。假如您的系统糟到入侵,但同时被入侵者修改了记录档的话,那就丢失了稽查的证据,从而导致入侵的侦测与防范更显困难。所以,如何设定档案的权限和属性,也非常讲究。一般而言,这些记录档通常只允许 root 读取得到,而最好还要加上 +a 的属性(attribute),让它们只能增加而不能删除或改名。不过,当您要删除或改名的时候(例如进行 logrotate 的动作),就要事先将 -a 属性拿掉才能进行了。
Tips:记录档之所以能作为检查依据,其中一个很重要的因素是它的时间记录。在进行联机日?管理和查询的时候,假如时间不同步的话会造成很大困绕,不过,您可以利用网路上的 time server 进行校时:
ntpdate time.stdtime.gov.tw |
当然,您必须确定您的机器可以连得上 Iternet。您可以用 cron (後面介绍) 帮您定期执行以上命令,以确保时间的准确性。如果您不执行 clock -w 的话,则不会写入 CMOS,第一行命令仅更新系统自己的时间而已(如果执行失败,不妨试试:rdate -s clock.nthu.edu.tw 或 rdate -s time.stdtime.gov.tw )。
不过,无论如何,要手工的控制这些记录档案的体积和属性是非常不便的。下面介绍另外一个工具:logrotate,它可以帮您更好的管理这些记录档哦~~
logrotate 这苹程式,主要透过 cron 服务(後面再介绍),定期的帮您更换设定档。它可以根据您的设定要求,例如时间或体积,将记录档的名字换掉,然後再建立一个新的空白档让其後的记录从新开始。
这样说恐怕也不好理解,不如先让我们看看 /etc/logrota.conf 这个设定档的内容吧:
weekly rotate 4 errors root create #compress include /etc/logrotate.d /var/log/wtmp { monthly create 0664 root utmp rotate 1 } |
在前面的 5 行是属於 global 设定,这些都是预设值。在後面的独立单元设定中可以重新定义设定值,否则就使用 global 设定值。最後 5 行则是独立单元的设定,待会再说明。在中间的 include 那行,类似 xinetd.conf 的设定一样,也就是将其它个别单元设定以独立的档案形式集中存放在 /etc/logrotate.d 目录中,当然,如果您喜欢,也可以全部写在一个档案上面。
让我们先解读前面的 global 设定吧:
weekly: 进行记录档更换的时间间隔,这里是每星期一次,您也可以改为 daily 或 monthly。除了以时间为标准之外,您还可以用档案体积为标准,如 size=100K 。不管用哪种标准,只要条件成立,就进行 rotate 的动作。;
rotate 4: 一共进行多少次更换。也就是说,一共要保存多少个旧的记录档。在 logroate 进行更换的时候,原本的记录档,例如 messages,会被更名为 messages.1;而 messages.1 则改名为 messages.2 ;如此类推,一直更换下去。这里设定为 rotate 4 ,也就是说,最多将档案更换为 messages.4 就不再更换了,那麽,如果原本已经有 messages.4 这个档的话,就会被删除,除非您有另外的备份,否则就永远找不回来了。
errors root: 当 lograote 程式在执行的时候,如果遇到错误,会将信息以 email 形式寄给 root 信箱。
create: 档原本的记录档被 rotate 之後,是否要建立一个新的空的原始记录档名称。这个当然要啦,除非您确定不用,则可以用 nocreate 设定代替。
compress: 经过 rotate 的档案,是否使用 gzip 进行压缩。目前是注解起来的,所以没有使用这个功能
最後面的 5 行句子呢,则是关於 /var/log/wtmp 这个记录档的设定,它的更换标准改为 monthly,而不采用 global 的 weekly 设定;然後进行 rotate 之後以 0664 的 permission 建立空白原始档,其 owner 身份是 root、goup 身份是 utmp。而且,它只进行一次 rotate 就够了。
接下来,再让我们看看 /etc/logroate.d 这个目录里面的设定档之设定,这里不再一一介绍了,我挑其中的 samba 进行说明吧:
/var/log/samba/*.log { notifempty missingok sharedscripts copytruncate postrotate /bin/kill -HUP `cat /var/lock/samba/*.pid 2> /dev/null` 2> /dev/null || true endscript } |
首先,第一行定义的记录档是 /var/log/samba 目录下所有以 .log 结尾的档案。第二行:如果记录档是空白的话,就不进行更换。第三行:如果档案不存在,可以接受,否则视为有错误。第四行:所使用的 logrotate script 只执行一次,并非每执行一个档案的更换就执行一次。第五行:先以 copy 的方式将当前记录档复制为备份档,然後再切除原来的部份,它的用处是允许记录在进行 rotate 处理的时候还能继续写入当前档案。
再下来的三行,是关於 postrotae 的设定,它必须以 edscript 结尾。仔细检查其中的设定,其实是重新执行 samba 的服务程式而已。
Tips:您要知道的是,postrotate 是当所有记录档完成 rotate 之後要进行的动作。相对的,您也可以设定 prerotate ... endscript 的设定,则是在进行 logrotate 之前要进行的处理。
假如您将记录档的属性设定为 +a 的话,那您就必须在 rotate 之前将 +a 属性拿掉,然後在 rotate 结束之後,再加上 +a 属性。然则,您可以这样修改设定档:
/var/log/samba/*.log { prerotate /usr/bin/chattr -a /var/log/samba/*.log endscript notifempty missingok sharedscripts copytruncate postrotate /bin/kill -HUP `cat /var/lock/samba/*.pid 2> /dev/null` 2> /dev/null || true /usr/bin/chattr +a /var/log/samba/*.log endscript } |
如果其它设定档也需要相同的设定,那您就花点时间,全部设定起来棉。例如 /etc/logrotate.d/syslog 这个档,本身就包含了许多记录档的设定,一一搞定它们吧。假如您要注重系统安全的话,这些繁琐的功夫免不了,同时也是您的责任。
当一切都设定完毕之後,接下来的工作则交给下面介绍的 cron 来完成。您只需确定 /etc/cron.daily/logratate 档案的内容如下就可以了:
#!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf EXITVALUE=$? |
至此我们就为IPtables创建了单独的滚动日志,可以更好地分析网络攻击信息。