Chinaunix首页 | 论坛 | 博客
  • 博客访问: 783529
  • 博文数量: 201
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 2391
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-06 22:16
文章分类

全部博文(201)

文章存档

2011年(1)

2010年(2)

2009年(57)

2008年(141)

我的朋友

分类: LINUX

2008-04-08 21:56:49

基本上,在 Linux 系统上的每一个事件,例如使用者的登录、服务的启动和关闭、系统错误、突发事件、等等等等,都能够透过系统日志记录下来。例如dmesg 命令,其实就是显示系统核心资讯记录档 /var/log/dmesg 的内容而已。没错,除非您另外设定,一般而言,系统的所有日志记录都存放在 /var/log 这个目录里面。除了 dmesg 之外,其它诸如 messagesmaillogsecurexferlog 等等档案也经常被用来作检查。某些服务程式,例如 httpdsambasquid 等,还有专门独立的目录来管理它们的日志档案。

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 主要是日志系统所能管理的服务程式,例如:authcrondaemonkernellprmail、以及 syslog 本身、等等。另外,facility 也接受 local0 local7 的定义,这可以让您自行设定特定的记录类别,比方说,ssh 预设会使用 local5 这个定义。还有,您甚至可以用 " * " 符号来泛指所有 facility

facility 後面是一个小数点,然後配合 log level 来指定一个 facility 的讯息重要程度,按重要程度来分、由低至高一共有如下这些 levelinfonoticeerrcritalertemerg panic ;另外,还有一些特殊的 leveldebug 主要用来除错时使用的,因为它产生的资讯实在太多了,除非真的有此必要,否则不要设定;和 facility 一样,您也可以用 " * " 符号来泛指所有 level;另外,还有一个 none,它是当使用 * 的时候,进行排他设定的。

当您指定一个 level 的时候,syslog 会记录这个 level 本身,以及所有高於它的其它 level 讯息;例如,crit 事实上会包含 critalertemerg 这三个 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

# 上面用多个 " ; " 分隔多项设定,

# 除了 mailnewsauthprivcron 这些之外,

# 所有 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
clock -w

当然,您必须确定您的机器可以连得上 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 身份是 rootgoup 身份是 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=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0



至此我们就为IPtables创建了单独的滚动日志,可以更好地分析网络攻击信息。

阅读(2995) | 评论(0) | 转发(0) |
0

上一篇:太阳出来啦

下一篇:集中管理服务器日志

给主人留下些什么吧!~~