第10章Linux系统日志与日志文件.doc_第1页
第10章Linux系统日志与日志文件.doc_第2页
第10章Linux系统日志与日志文件.doc_第3页
第10章Linux系统日志与日志文件.doc_第4页
第10章Linux系统日志与日志文件.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第10章 系统日志与日志文件系统守护进程、内核和各种工具都会产生一些数据,这些数据被记录下来,最终保存在容量有限的硬盘上。其中大部分数据有用的寿命都是有限的,因此需要对它们进行汇总、压缩、存档并且最终扔掉。10.1 日志记录的策略日志记录的策略随站点不同而不同。常见的方案包括以下几种: 立刻扔掉所有数据; 定期重新设置日志文件; 轮换日志文件,把数据保留一定的时间; 将日志压缩并保存到磁带或其他永久性介质上。对于您的站点来说,正确的选择取决于磁盘空间有多大,您的安全意识有多强。即使具有充足的磁盘空间,还是不要让日志文件过快增长。无论选择何种方案,都必须用cron自动维护日志文件。有关该守护进程

2、的详细内容,请参考第8章。10.1.1 扔掉日志文件我们并不建议扔掉所有的日志信息。遭受到安全问题的站点常常会发现,日志文件提供了非法入侵的重要证据。日志文件还有助于提醒您有关硬件和软件方面的问题。总而言之,如果磁盘空间足够的话,建议至少保存数据一个月,然后才可以丢弃。在实际生活中,您可能需要很长一段时间才会意识到站点已经被黑客攻破,这时就需要查看以前的日志。如果有必要回顾更远的过去所发生的事件,那么可以从备份磁带上恢复较早的日志文件。有些管理员听任日志文件任意增长,直到它们变成麻烦后才将其清除并从零开始。这种方案比一点儿数据都不保存要好,但这样做无法保证日志记录项能够存留任何特定的时间长度。

3、磁盘的平均利用率也要比使用其他管理方案的利用率高。在很个别的情况下,一个站点决定保留某些日志文件,可能不是为了任何有益的目的,而更多是为了应付传票。处于这种境地的一个站点可能会留着几周的日志数据,但是它或许要保证这些文件一定不能被存到永久性的介质上。有一个这样的案例:微软已经不止一次受到指控,其管理日志文件和电子邮件的政策破坏性过强。原告称,微软的数据保留政策无异于毁掉证据,尽管删除行动(或者至少是删除策略)是在法律诉讼之前就已经有了。遗憾的是,目前断定法庭将最终如何回应这些诉讼还为时过早1。在美国,Sarbanes-Oxley法案最近规定了保留记录的新要求,参考30.12.8节。10.1.2

4、 轮换日志文件把每周或者每月的日志信息保存在一个单独的文件里,这是一种通常(但不是通行)的做法。这些周期性的文件都会保留特定一段时间,然后被删除。我们专门在一台中央日志主机上划了一个硬盘分区(/var/log)给日志文件。在每个轮换周期结束的时候,有一个脚本或者工具程序更改每个文件的名字,然后把较早的数据向文件链的结尾推。例如,假设某个日志文件的名字叫做logfile,则它的备份文件可能叫做logfile.1、logfile.2,依此类推。如果每周轮换一次,并且保存8周的数据,那么就会有一个logfile.8文件但没有logfile.9文件。每周随着logfile.7文件覆盖logfile.8

5、文件,logfile.8中原来的数据就没了。稍微麻烦一点,压缩一下数据就能延长保存的时间。您可以运行zgrep,不必解压压缩文件,就能搜索压缩文件。下面的脚本就可以实现一个适当的轮换策略:呃对于某些日志文件来说,权属信息很重要。您可能需要以日志文件属主的身份,而不是以root的身份从cron运行自己的轮换脚本,或者要在这些命令中加上chown命令。大多数Linux发行版本(包括我们全部的示例版本)都支持一种叫做logrotate的很不错的日志轮换工具,我们将从10.3节开始介绍它。比起编写您自己的脚本来说,它要容易得多(也可靠得多),如果您的发行版本没有包含它,那么还是值得找到并安装它的。某些

6、站点用日期而不是序列号来标识日志文件,例如logfile.tues或logfile.2005.04.01。这种系统实现起来稍微困难一点儿,但如果需要频繁用到旧的日志文件,那么还是值得这么做的。在Perl里设置用日期给文件起名字要比在sh中容易得多。一种不需要任何编程技巧的习惯用法是:mv logfile logfile.date +%Y.%m.%d 这种方法也有能让ls命令对日志文件按时间顺序进行排序这一优点。(ls的-t选项让它把任何目录下的文件按修改时间排序,但是如果这些文件没有要求就这样自行安排也挺不错。)有些守护进程的日志文件自始至终都处于打开状态。由于文件系统工作方式的缘故,我们举例

7、的脚本不能用于这样的守护进程。日志记录数据不会保存到再次创建的logfile中,而是继续保存到logfile.1里;即使在将文件重新命名之后,对原来文件的活动引用仍然存在。若想安装一个新的日志文件,则必须向守护进程发信号或者杀死并重启它。参考本书的相关章节(或者您的手册)确定在每种情况必须采取什么样的步骤。下面的例子在上述例子的基础上进行了修改,它同时使用了压缩和信号:其中的signal代表向程序发出的写日志文件的适当信号,pid是它的进程ID。该信号可以直接写入脚本,但必须动态判断守护进程的PID,这可以通过读取该守护进程留下的文件(比如/var/ run/syslogd.pid,这将在下面

8、给予介绍)或是使用kill的变体killall来实现,killall能够在进程表中查找PID。例如,下面的命令killall -e -HUP syslogd 等价于kill -HUP cat /var/run/syslogd.pid 10.1.3 存档日志文件除非您就是希望避免留下书面记录,否则应该在常规的系列备份中包含有日志文件。因为它们包含的信息对于调查安全事故来说至关重要,所以在您的转储频度允许的情况下,要以最高频度备份它们。日志文件变化很频繁,所以它们能够代表要保存在增量备份上的系统信息的重要部分。在设计您的日志政策和您的备份策略时要记得它们两者之间的相互作用关系。有关备份的更多信息,

9、可参见第9章。除了作为例行备份的一部分之外,日志也可以存档到另一套单独的磁带上。相比之下,单独的一套磁带使用起来不方便,但它们带来的建档负担要轻,同时又不影响您循环使用转储磁带的能力。在使用单独的磁带时,我们建议您采用tar格式,并编写一个脚本来自动执行备份方案。10.2 Linux的日志文件传统的UNIX系统往往因为它们做日志的方法不一致,甚至还有点儿怪异而受到批评。幸运的是,虽然Linux系统的每一种发行版本都有自己的一套给日志文件命名和分类的方法,但是一般而言Linux要好一点儿。Linux的软件包大多将它们的日志信息记录到/var/log目录下的文件里。在有些发行版本上,个别日志也保存

10、在/var/adm里。现如今,大多数程序都把它们的日志项发到一个称为syslog的中央清理系统,syslog将在本章后面予以介绍。默认的syslog配置一般将这些信息的大部分转储到/var/log中的某个地方。请检查系统日志的配置文件/etc/syslog.conf,找出这些信息究竟存在什么地方。有关syslog.conf文件的格式,请参考10.4节。表10.1总结了一些在我们举例的系统中较为常见的日志文件的有关信息。具体有如下几项: 存档、汇总或截断的日志文件; 创建各个日志文件的程序; 有关如何指定每个文件名的指示; 我们认为留意或者清理的合理频率; 使用日志文件的发行版本(在我们的例子中

11、出现过); 文件内容的说明。除非特别说明,否则文件名都是相对于var/log而言的。“出处”一列中的字符说明了日志文件的指定方法:S代表使用syslog的程序,F代表使用一个配置文件的程序,而H则代表文件名是否直接包含在代码中。“频率”一列表明了我们建议的清理频率。“发行版本”一列给出了该项适用的发行版本。虽然各个发行版本上日志文件的所属关系和模式都有不同,但日志文件一般由root所有。就我们看来,大多数日志的模式都应该是600(只有属主有读写权限),因为它们的内容对于黑客来说可能有帮助。如果用户的水平相当高,那么能够查看日志对用户会有好处。在这种情况下,放开日志文件的部分权限也是合理的。专为

12、日志建立一个用户组,把日志文件的属组设为这个用户组,让这个用户组的成员都能读取日志文件,这是另一种合理的做法。您可以把本地的系统管理员加入到这个用户组里,让他们不必使用sudo命令就能看到日志文件的内容。如果站点有一个初级系统管理员,他没有完全的sudo特权,这样的安排就特有用。至少,应该限制用户对secure、auth.log和sudo.log文件不经意地查看。绝对不要把任何日志文件的写权限交给属主之外的任何人。值得说明的一点是,表10.1中给出的日志文件大多数都是由syslog维护的,但是syslog的默认配置则随系统的不同而变化很大。采用了比较一致的/etc/syslog.conf文件后

13、,各Linux发行版本上的日志文件看上去就相当相似了。表10.1 日志文件列表文 件程 序出 处a频 率a发行版本a内 容auth.logsu等bSMDU授权apache2/*httpd第2版FDSDUApache HTTP服务器的日志(第2版)boot.logrc脚本FcMRF系统启动脚本的输出boot.msg内核H-S内核消息缓冲的转储croncronSWRFcron的执行情况和出错信息cups/*CUPSFW所有与打印有关的消息(CUPS)daemon.log许多SWDU所有守护进程功能的消息debug许多SDDU调试输出dmesg内核H-RFDU内核消息缓冲的转储dpkg.logdkp

14、gFMDU软件包管理日志faillogloginHWSDU不成功的登录企图httpd/logs/*httpdFDRFApache HTTP服务器的日志(在/etc下)续表文 件程 序出 处a频 率a发行版本a内 容kern.log内核SWDU所有kern功能的消息lastlogloginH-所有每个用户上次登录的时间(二进制)mail*与mail有关的SW所有所有mail功能的消息messages许多SW所有经常是主要的系统日志文件rpmpkgscron.daily/rpmHDRF已安装的RPM软件包清单samba/*smbd等FW-Samba(Windows/CIFS文件共享)secures

15、shd、sudo等SMRF保密的授权消息syslog许多SWDU经常是主要的系统日志文件warn许多SWS所有的警告/出错级的消息wtmploginHM所有登录记录(二进制)Xrog.n.logXorgFWRFSX窗口服务器的出错信息yum.logyumFWRF软件包管理日志a出处:S=syslog, H=硬连接,F=配置文件。 频率:D每天,W每周,M每月。发行版本: RRed Hat Enterprise Linux,F = Fedora,DDebian,SSUSE,U = Ubuntu。bpasswd、login和shutdown也可以写入授权日志。在Red Hat和Fedora系统上,

16、它在/var/adm里。c实际是通过syslog做日志,但是在/etc/initlog.conf中配置功能和级别。10.2.1 特殊的日志文件大多数日志是文本文件,当发生“感兴趣的”事件时,就会向这些文件中写入日志记录行。但是表10.1中列出的几个日志的来龙去脉却非常不同。/var/log/wtmp中包含用户登录系统和退出系统的记录,也包含了表明系统何时重启或者关机的记录项。因为新的记录项只是简单地追加到文件的末尾,所以它是一种相当普通的日志文件。不过,wtmp文件是以二进制形式保存的。使用last命令可以解读这些信息。尽管wtmp的格式不一般,但是应该像其他任何日志文件那样,轮换或者截断这个

17、文件,因为它的自然特性是无限制的增长。/var/log/lastlog包含的信息类似于/var/log/wtmp中的信息,但是它只记录每个用户上次登录的时间。它是一个稀疏的二进制文件,以UID作为索引。如果您的UID是以某种数字序列来指定的,那么虽然这肯定对现实世界没什么影响,但这个文件会变得小一些。lastlog文件不需要轮换,因为除非有新用户加入,否则它的大小保持不变。参见9.3.1节的脚注了解有关“稀疏”文件的更多知识。10.2.2 内核和启动日志内核和系统启动脚本反映出了在日志领域内的一些特殊的挑战。对于内核来说,问题在于既要创建有关引导进程和内核操作的永久记录,又不能增加对任何特殊的

18、文件系统或者文件系统组成的依赖性。对于启动脚本而言,挑战在于既要捕捉启动过程的连贯描述,又不能总是试图把任何系统守护进程都和启动日志文件扯到一块,干扰任何程序自己的日志机制,或是让启动脚本做两份日志项或者把日志输出重定向。内核的日志机制是通过让内核把它的日志项保存在一个大小有限的内部缓冲区来做到的。缓冲区要足够大,以便能放得下内核在引导时的活动所产生的全部消息。一旦系统全部启动以后,用户进程就可以访问内核的日志缓冲,最终处理它的内容。各发行版本一般是运行dmesg命令,并把它的输出重定向到/var/log/dmesg(RHEL、Fedora、Debian和Ubuntu)或者/var/log/b

19、oot.msg(SUSE)。这是查看最近启动过程信息的最好的地方。内核当前运行的日志机制是由一个叫做klogd的守护进程处理的。klogd的功能实际上是dmesg功能的超集,除了转储内核的日志并退出之外,它还可以在内核缓冲区内的消息产生的时候读取它们,并将其发送到一个文件或者syslog。在正常的运行方式下,klogd采取后一种模式。syslog根据对“kern”的指令来处理这些消息(一般把它们发送到/var/log/messages)。我们举例用的发行版本的启动脚本在一开始转储日志消息的时候,都不用dmesg的-c标志,所以虽然读取了内核的消息缓冲区,但并不清除它。当klogd启动的时候,它

20、在缓冲区里发现了和dmesg见到的一样的一组消息,于是把它们发送给syslog。出于这个原因,有些日志项既会出现在dmesg或者boot.msg文件里,又会出现在如/var/log/messages这样由syslog管理的文件里。内核日志机制的另一个问题是要在系统控制台做适当的管理。伴随系统的引导,在控制台上输出信息是很重要的。不过,一旦系统已经启动了,控制台的消息可能与其说是帮助,不如说是烦人,如果用控制台登录的话就更是这样了。dmesg和klogd都可以让您用一个命令行标志设置内核的控制台日志级别。例如:$ sudo dmesg-n 27级提供的信息最多,还包括调试信息。1级只包含内核的“

21、panic(恐慌)”消息(编号小的级别最严重)。所有的内核消息继续进入中央缓冲区(也进入syslog),而不管它们是否被转发到控制台。内核在/proc/sys目录下提供了一些控制文件,让大量重复发生的日志消息在来源处就被阻塞。参见28.4节,了解通过设置哪些内核参数来实现一般控制机制的更多信息。这些专门的控制文件是/proc/sys/kernel/printk_ratelimit和/proc/sys/kernel/printk_ratelimit_burst,前者指定在启动阻塞之后内核消息之间必须间隔最少多少秒(默认为5s),后者规定在启动阻塞之前允许多少组消息通过(默认为10)。这两个参数都

22、是建议性的,所以它们不会绝对保证能制止大量消息。遗憾的是,系统启动脚本的日志机制没有内核的日志机制管理得好。Red Hat Enterprise Linux采用一条叫做initlog的命令来捕获启动命令的输出,并把它发送给syslog。遗憾的是,无论什么时候运行命令,都必须明确调用initlog,所以确实要以某种复杂性为代价才能捕获到信息。这些日志项最终还是会进入/var/log/boot.log。我们举例用的其他系统都没有连续捕获启动脚本的历史输出。个别命令和守护进程能记录下来一些信息,但是大多数信息都不作日志记录。Fedora以前使用和Red Hat一样的initlog系统,但是现在这条提

23、交日志记录的命令已经从启动脚本中注释掉了。幸好还有一个工具函数的中央库/etc/init.d/functions,您可以在那里去掉initlog的注释行重新启用它们。10.3 logrotate: 管理日志文件Erik Troan提供了一种优秀的工具logrotate,它实现了多种多样的日志管理策略,而且在我们举例的所有发行版本上都是标准应用。logrotate的配置文件由一系列规范组成,它们说明了要管理的日志文件组。出现在日志文件规范之外的选项(诸如下面例子中的errors、rotate和weekly)适用于后面所有的规范,它们可以在特定日志文件的规范内被覆盖,也可以在文件的后面重新指定,修

24、改默认值。下面是一个有点儿故意人为的例子,它设定了几种不同的日志文件:这一配置每周轮换一次/var/log/messages文件。它保持了这个文件的5个版本,并且在每次重置文件的时候通知syslogd。Samba的日志文件(这样的文件可能有好几个)也每周轮换一次,但不是移到一边后开始一个新的,而是复制以后截短。只有在轮换了所有的日志文件之后,才向守护进程Samba发HUP信号。表10.2列出了logrotate.conf最有用的选项。表10.2 logrotate的选项选 项含 义compress压缩日志文件的所有非当前版本daily, weekly, monthly以指定的时间安排来轮换日志

25、文件delaycompress压缩除了当前和最近之外的所有其他版本endscript标记prerotate或者postrotate脚本结束errors emailaddr向指定的emailaddr发送出错通知邮件missingok如果日志不存在,不会发出抱怨notifempty如果日志为空,则不轮换它olddir dir指定要放入dir里的日志文件老版本postrotate引入在轮换过日志之后要运行的脚本prerotate引入在进行任何改动之前运行的脚本rotate n在轮换方案中包括n个版本的日志sharedscripts只为整个日志组运行一次的脚本size=logsize如果日志文件大于l

26、ogsize(例如,100K,4M)才轮换logrotate一般每天由cron运行一次。它的标准配置文件是/etc/logrotate.conf,但是在logrotate的命令行上一次可以出现多个配置文件(或者包含配置文件的目录)。这一特性被我们所举的发行版本充分利用,它们规定/etc/logrotate.d目录是保存logrotate配置文件的标准位置。懂得logrotate的软件包(这种软件有很多)能把执行日志管理指令作为它们安装过程的一部分,这大大地简化了管理工作。除了logrotate之外,Debian和Ubuntu还提供了一种更简单的程序,它叫做savelog,能够管理单个文件的轮转

27、工作。它比logrotate更直接,不用(或者不需要用)配置文件。有些软件包更愿意使用它们自己的savelog配置,而不用logrotate。10.4 syslog:系统事件的日志程序syslog最初是由Eric Allman编写的,它是一个综合的日志记录系统。syslog有两项重要的功能:使程序员从繁重、机械的编写日志文件代码的工作中解脱来,使管理员更好地控制日志的记录过程。在出现syslog之前,每个程序都有自己的日志记录策略。系统管理员对保存什么信息或是信息保存在哪儿没有控制权。syslog相当灵活,它能让消息按照其来源和重要性(“严重性级别”)来排序,也能把消息送到各种目的地:日志文件

28、、用户的终端、或者甚至是别的计算机。syslog集中管理网络日志的功能是它最有价值的特性之一。10.4.1 syslog的其他替代方案虽然syslog已经长期主导UNIX和Linux的日志系统,但是人们已经开发出了替代它的几种方案,试图解决它的一些缺点。syslog-ng(下一代syslog)就是这其中之一,它现在成为SUSE系统上默认采用的日志工具。从配置的观点来看,它和标准的syslog有很大的不同,我们在本书里就不详细介绍它了。如果想在非SUSE的系统上试试,可以从获得它。syslog-ng增加了更多的配置功能、能基于消息内容进行过滤,确保了消息一致性,以及

29、在消息通过网络转发时针对防火墙的限制提供了更好的支持。(圣地亚哥超级计算中心的)SDSC Secure Syslog也叫做高性能syslog。它通过实现RFC 3195的规范,提供了一种“达到举证水平”的审计系统。它的设计考虑到了大流量站点的需要,包含了大量性能优化措施。您可以从/projects/sdscsyslog获得它的源代码。10.4.2 syslog的体系结构syslog包括3个部分: syslogd,日志守护进程(及其配置文件/etc/syslog.conf); openlog等,将消息提交给syslogd的库例程; logger,一条从shell提交

30、日志记录项的用户级命令。在下面的讨论中,我们先介绍syslogd的配置,然后简要说明如何从Perl脚本中使用syslog。syslogd在系统引导时启动并连续运行,它不能用inetd来管理。懂得syslog的程序把日志项(使用syslog库例程)写到专门的文件/dev/log中,这是一个UNIX的域套接口。syslogd从这个文件中读取消息,参考其配置文件,并将各条信息分发到合适的目的地。挂起信号(HUP,信号1)可以让syslogd关闭它的日志文件,重新读取它的配置文件,并再度开始日志记录。如果用户修改了/etc/syslog.conf,那么必须向syslogd发送一个挂起信号来使修改生效。

31、TERM信号将使syslogd退出。syslogd将它的进程ID写入到文件/var/run/syslogd.pid里。这一约定使得从一个脚本向syslogd发送信号变得比较容易。例如,下面的命令将发送一个挂起信号:# kill-HUP /bin/cat /var/run/syslogd.pid 试图压缩或者修改一个已经由syslogd打开以供写入信息的日志文件是不太安全的,可能会导致不可知的结果。恰当的步骤是把老的日志移到别处,重新创建日志,权属关系和权限都保持不变,然后向syslogd发送一个HUP信号。这个过程用logrotate很容易就能实现,参考10.3节的例子。10.4.3 配置sy

32、slogd 配置文件/etc/syslog.conf控制着syslogd的行为。这是一个格式相当简单的文本文件。空白行和以字符“#”开始的行都被忽略。基本格式为:selector action例如,下面的一行: /var/log/maillog将把来自电子邮件系统的信息保存在文件/var/log/maillog中。selector用语法facility.level指明正在发送日志消息的程序(即“设备facility”)和消息的严重性级别。设备的名称和严重性级别必须从已定义值的一个简短列表中选择,程序不能使用自己定义的值。设备分别为内核、常用应用程序组、以及本地编写的程序进行定

33、义。任何其他程序则归为普通设备“用户(user)”一类。selector可以包含特殊的关键字*和none,其含义分别为“所有的”或“什么都没有”。selector可以包括多个用逗号分开的设备。多个selector可以用分号组合起来。一般而言,selector相互之间为“或(OR)”的关系,和某个selector匹配的消息将由同一行的action处理。但是,不管同一行中其他的selector是如何定义的,只要有一个带有none级别的selector就会排除列出的设备。这里有几个格式化和组合selector的例子:表10.3列出了有效的设备名。目前的设备有21种。syslogd本身可以产生时间戳消

34、息,如果syslog.conf中出现了“mark”设备(facility)为其指定的一个目的地,那么会记录这些消息。时间戳可以帮助用户确定机器是在早上3:00和3:20之间崩溃的,而不仅仅是“昨天晚上的某个时间”。这个信息在调试有规律发生的问题时有很大用处。例如,许多站点都经历过当清洁工在深夜插上吸尘器电源时发生跳闸而导致神秘崩溃的事。表10.3 syslog的设备名设备(facility)使用该设备的程序*除了“mark”之外的所有设备auth与安全和授权有关的命令authpriv敏感/保密的授权消息acron守护进程cron续表设备(facility)使用该设备的程序daemon系统守护进

35、程ftpFTP守护进程,ftpdkern内核local0-7本地消息的8种类型lpr行式打印机的假脱机系统mailsendmail以及其他与电子邮件相关的软件mark定期产生的时间戳newsUsenet新闻系统syslogsyslogd内部消息user用户进程(如果没有指定,这将是默认值)uucp为UUCP保留,并未使用 a所有与授权有关的消息都敏感。authpriv消息和auth消息不应该让任何人都能读取。如果系统十分繁忙,其他日志消息通常可以提供充分的时间戳信息。但在凌晨的几个小时并不总是这种情况。syslog的严重性级别按照重要性递减的顺序在表10.4中列出。消息的严重性级别指明了它的重

36、要性。各个级别间的区别有时候显得比较模糊。在notice和warning之间(以及在warning和err之间)有一条清晰的界限,但是alert和crit相比,在所表达的含义上准确的细微差别则有点要靠猜测。表10.7列出了各种常用软件程序采用的特定级别。表10.4 syslog的严重性级别(降序)级 别大 致 含 义级 别大 致 含 义emerg恐慌状态warning警告消息alert紧急状态notice需要调查的事项crit临界状态info提供信息的消息err其他错误情况debug仅供调试在syslog.conf文件中,这些级别指定了最低程度的重要性,只有重要性大于(包括)它的消息才会被记录

37、下来。例如,来自电子邮件系统的一条警告级消息和mail.warning匹配,也同样和mail.notice、、mail.debug、*.warning、*.notice、*.info和*.debug匹配。如果syslog.conf文件指定了消息应该被记录到某个日志文件中,那么mail.warning消息也将被记录到该文件中。Linux版的syslog对基本语法做了改进,它也允许在优先级前面加上字符=和!,分别表示“仅此优先级”和“除此优先级及其以上级别”的意思。表10.5给出了一些例子。表10.5 在syslog.conf中限定优先级的例子选 择 符含 义m

38、选择与邮件相关的、优先级为info或者更高的消息mail.=info只选择优先级为info的消息;mail.!err只选择优先级为info、notice和warning的消息mail.debug;mail.!=warning选择除warning之外的所有优先级action字段说明如何处理一则消息。表10.6列出了可以选择的处理方法。表10.6 syslog的动作动作(Action)含 义filename把消息写入本地机器上的一个文件里hostname把消息转发给主机hostname上的syslogdipaddress把消息转发给IP地址为ipaddress的主

39、机| fifoname把消息写入有名管道fifonameauser1,user2,如果用户登录到了系统上,那么就把消息写在用户的屏幕上*把消息写给目前已经登录的所有用户 a. 参考info mkfifo了解更多的信息。如果采取了filename(或者fifoname)这样的动作,那么文件名应该用绝对路径。如果您指定了一个不存在的文件名,那么在首次有消息送到这个文件的时候,syslod会创建它2。您可以在filename动作之前加一个短划线“-”,表示在写完每条日志记录项后,不应该对文件系统执行sync。执行sync有助于在发生崩溃的时候尽可能多地保留日志信息,但是从磁盘吞吐上来看,代价又太大。

40、如果用的是hostname而不是IP地址,那么主机名必须能通过DNS或者NIS这样的转换机制解析出来。虽然一个selector可以包含多个设备(facility)和级别,但是却不能提供多个动作。为了把一则消息发送到两个地方(比如,到本地文件和到中央日志主机),您可以在配置文件中包含具有相同Selector的两行。因为syslog消息能够用来实施拒绝服务攻击,所以除非syslogd以-r标志启动,否则它不会接受来自其他机器的日志消息。默认情况下,syslogd也会拒绝充当第三方消息转发器,从一台网络主机来的消息不会再被发给另一台网络主机。使用-h标志能够取消这一功能。(如果您想让这些选项始终都被

41、启用,那么对于RHEL和Fedora,可以在脚本/etc/rc.d/init.d/syslog中加上这些标志,对于Debian和Ubuntu,可以在脚本/etc/init.d/sysklogd里加上这些标志。)10.4.4 设计站点日志方案配置日志记录以便把重要的系统错误和警告保存在每台计算机上的一个文件中,在一个小型站点中这样做足够了,就像前面我们用syslog做的那样。syslog.conf文件可以针对每台主机进行定制。在一个大型网络中,必须有中央日志记录。它使得大量信息保持在可管理的状态,而且运气好的话,破坏网络计算机安全的人可能无法访问到审计数据。黑客常常通过修改系统日志来擦去他们留下

42、的痕迹。如果日志消息刚一产生就被转移到别的位置,那么想要破坏它就更难了。站点级的防火墙不应该让外部站点向syslogd提交消息。但要清楚一点,任何人都可以调用syslog,并且可以伪造从任何守护进程或者应用程序来的日志项。syslog也使用UDP协议,而这个协议并不保证是可靠的,消息可能会丢失。选择一台稳定的计算机作为日志记录服务器,最好是有很好的安全措施而且登录用户不多的一台机器。其他计算机可以使用保存在中央主机上的一个通用配置文件。因此,只需要维护两个版本的syslog.conf文件。这样可以保持日志记录的完整性,但同时对于管理员来说又不再是个恶梦。有关在网络上分布文件的更多信息,请参见第

43、17章。为了达到最好的安全性,syslog服务器应该通过防火墙与网络的其余部分隔离开,只能让连到syslog端口的网络连接通过,另外只能让得到允许可以向syslog记录日志的主机访问syslog服务器。根据周边的风险程度不同,可以从系统管理员的工作站用SSH连接,让管理员更方便地检查日志。某些非常大的站点可能还需要给日志记录体系添加几个级别。遗憾的是,syslog的当前版本只能为最后一跳(hop)保留原来的主机名称。如果主机“client”将某些日志项发送到主机“server”,“server”又将它们发送到“master”,“master”只能知道消息来自“server”,而不知道是来自“c

44、lient”。10.4.5 配置文件举例在syslog的配置上,不同的Linux发行版本变化非常大。因为读懂syslog.conf文件并不困难,所以就不详细看我们举例的发行版本中使用的配置文件了,它们都很直观易懂。我们转而要看一些常见的方法,如果您做出了不同于系统默认的选择,那么可能想要以这些方法来设置日志功能。下面有3个syslog.conf文件的实例,分别对应于小型网络上的一台单机、较大网络中的一台客户机和一台中央日志记录主机。中央日志记录主机称为“netloghost”3。一、单机下面是单机的基本配置:第1个非注释行把紧急(emergency)消息写到所有当前在线用户的屏幕上。在系统即将

45、关闭时,shutdown所产生的消息就是一个紧急级别消息的例子。第2行把重要(important)消息写入/var/log/messages文件。info级别比warning级别低,因此daemon,子句又包含了来自passwd、su和守护进程的日志记录消息。第三行把打印机错误信息写入到/var/log/lpd-errs。二、网络客户机网络客户机通常把重要的消息转发给中央日志记录主机:这样的配置并没有在本地保存太多日志消息。值得一提的是,如果netloghost已经关闭或者不可达,日志消息将会不可避免地丢失。用户可以在本地机器上保存某些重要消息的额外副本来应付这种可能发生的情

46、况。在安装了许多本地软件的站点中,许多消息可能会被不恰当地记录到user设备(facility)的emerg级别里。在本例中,第一行用user.none子句专门把user/emerg排除在外。第2和第3行把所有重要消息转发到中央日志记录主机,从打印系统和全校刷卡访问系统(local1)来的信息都被排除在外。第4行把本地日志消息也传送到netloghost。最后3项将保存打印机错误、sudo日志消息和内核消息的本地备份。有关sudo的更多信息,请参见3.4.2节。三、中央日志记录主机本例针对netloghost,它是由大约7000台主机构成的一个中等规模网络上的中央安全日志主机。从本地程序和网络

47、上的syslogd来的日志记录数据被写入到文件。在某些情况下,每种设备(facility)的输出结果都保存在它自己的文件中。中央日志记录主机在写入每条消息时都为其生成一个时间戳。时间戳并不反映原来主机上的时间。如果用户拥有位于不同时区的主机,或者系统时钟不同步,那么时间戳就会有点儿误导性。10.4.6 syslog输出的样本下面的日志文件片段取自科罗拉多大学计算机系主控syslog主机中的日志文件之一。这个例子包含的记录项源自不同的主机(av18、proxy-1、mroe和coyote)和不同的程序:sbatchd、pop-proxy、pingem以及PAM(Pluggable Authent

48、ication Module,可插入式身份验证模块)库。请注意节录的最后一行,它抱怨说有一条消息重复了100遍。为了使日志更加简短,syslog通常会合并重复的消息,并用这样的总结来替换它们。但是,取得这个日志示例的主机还可以接受来自许多其他主机的日志记录,因此这条特别的消息就有一点儿误导性。在这一混合的日志中,这条消息实际上指的是前面来自av18的日志记录,而不是紧接在它前面的那条日志记录。定期细读日志文件是个不错的想法。确切知道什么是正常的,以便在发生异常时可以很容易地发现它。还有一个更好的方法,安装一个日志的事后处理程序(例如swatch)来自动捕获异常情况。请参阅10.5节。10.4.

49、7 使用syslog的软件表10.7中列出了使用syslog的一些程序,还包括了这些程序的日志记录的设备(facility)和重要程度的级别,以及对每个程序的简短描述。有些行加了阴影是为了便于阅读。表10.7 使用syslog的软件程 序设 备级 别描 述croncron,daemoninfo系统任务调用守护进程cupslprinfo-err常用的UNIX打印系统ftpdftpdebug-critFTP守护进程(wu-ftpd)inetddaemonerr,warningInternet超级守护进程(Debian)imapdmailinfo-alertIMAP邮件服务器loginauthpri

50、vinfo-err登录程序lpdlprinfo-err单行打印机守护进程nameddaemoninfo-err名字服务器(DNS)ntpddaemon,userinfo-crit网络时间守护进程passwdauthnotice,warning口令设置程序popperlocal0debug,noticePOP3邮件服务器sendmailmaildebug-alert邮件传输系统sshauthinfo安全shell(远程登录)suauthnotice,crit切换UIDsudolocal2notice,alert受限的su程序syslogdsyslog,markinfo-err内部错误、时间戳tc

51、pdlocal7debug-errinetd的TCP封装程序vmlinuzkern所有级别内核xinetd可配置info (默认)inetd的变体(Red Hat、SUSE)有了所有这些信息,用户应该非常清楚哪些消息应该保留、哪些应该删除了,不是吗?但是,可能未必如此。实际上,用户必须知道什么样的日志级别对自己的系统有用。最好的方式是首先让日志记录超过需要,然后去掉那些不想要的内容。等到产生数据的平均速率令您满意时就可以了。10.4.8 调试sysloglogger命令用于从shell脚本提交日志项。用户也可以用它来检测syslogd的配置文件的变化。例如,如果已经添加了一行:local5.w

52、arning /tmp/evi.log而且想看看它是否起了作用,则运行:$ logger -p local5.warning test message含有“test message”的一行记录项应该写到/tmp/evi.log文件中。如果没有写入,那么可能是忘记了给syslogd发送挂起信号。把日志记录发给控制台设备/dev/console、任何虚拟终端或支持流控的端口的时候应该小心。如果有人在控制台键入了,那么控制台的输出将会停止。所有对syslog的调用都将受阻,系统将变得非常缓慢。检查这种性能下降情况有一个好方法,即通过logger向控制台发送一条syslog消息。如果logger挂起了

53、,则用户需要找到出了问题的端口,键入,然后重新考虑日志记录的策略。在控制台上做日志记录的另外一个缺点是,由一个大问题产生的大量消息可以使控制台变得不稳定,而此时正是最需要它的时候。如果没有优化过控制台驱动程序,又采用某种帧缓冲类型的话,大量的消息确实会让整个系统无法使用。根据控制台的设置和管理情况不同(例如,通过一台控制台服务器),控制台的日志记录也应该有一些安全措施。10.4.9 在程序中使用syslog库例程openlog、syslog和closelog能够让程序使用syslog系统。这些库例程有C、Perl、Python和PHP的版本,这里只讨论Perl的接口。在Perl脚本的开始处加上

54、下面的一行,就可以引入库例程的定义:use Sys:Syslog;openlog例程使用指定的设备(facility)名称初始化日志记录:openlog(ident, logopt, facility);消息按照logopt指定的选项被记录下来,并以标识字符串ident开头。如果没有用过openlog,那么默认ident为当前用户名,logopt为一个空字符串,而facility为“user”。logopt字符串应该包含一个由逗号隔开的选项清单,这些选项在表10.8中列出。表10.8 例程的日志记录选项选 项含 义pid在每条日志消息上包含当前进程的PIDndelay立即连接到syslogd(不用等到要发消息的时候再连接)cons如果syslogd不可达,就把消息发送到系统控制台nowait不用等待(wait(3))派生子进程来写控制台消息例如,合理的openlog调用可以是:openlog(adminscript, pid,cons, local4);syslog例程发送一个消息至syslogd,将其以指定的优先级记录:syslog(priority, message, .);来自openlog调用的日期、时间、主机名称和ident字符串都预先加入到日志文件的消息中。message后面可跟各种其他参数,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论