2022年Linux系统日志与日志文件 .pdf
《2022年Linux系统日志与日志文件 .pdf》由会员分享,可在线阅读,更多相关《2022年Linux系统日志与日志文件 .pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 10 章 系统日志与日志文件系统守护进程、内核和各种工具都会产生一些数据,这些数据被记录下来,最终保存在容量有限的硬盘上。其中大部分数据有用的寿命都是有限的,因此需要对它们进行汇总、压缩、存档并且最终扔掉。10.1 日志记录的策略日志记录的策略随站点不同而不同。常见的方案包括以下几种:立刻扔掉所有数据;定期重新设置日志文件;轮换日志文件,把数据保留一定的时间;将日志压缩并保存到磁带或其他永久性介质上。对于您的站点来说,正确的选择取决于磁盘空间有多大,您的安全意识有多强。即使具有充足的磁盘空间,还是不要让日志文件过快增长。无论选择何种方案,都必须用cron 自动维护日志文件。有关该守护进程的
2、详细内容,请参考第8 章。10.1.1 扔掉日志文件我们并不建议扔掉所有的日志信息。遭受到安全问题的站点常常会发现,日志文件提供了非法入侵的重要证据。日志文件还有助于提醒您有关硬件和软件方面的问题。总而言之,如果磁盘空间足够的话,建议至少保存数据一个月,然后才可以丢弃。在实际生活中,您可能需要很长一段时间才会意识到站点已经被黑客攻破,这时就需要查看以前的日志。如果有必要回顾更远的过去所发生的事件,那么可以从备份磁带上恢复较早的日志文件。有些管理员听任日志文件任意增长,直到它们变成麻烦后才将其清除并从零开始。这种方案比一点儿数据都不保存要好,但这样做无法保证日志记录项能够存留任何特定的时间长度。
3、磁盘的平均利用率也要比使用其他管理方案的利用率高。在很个别的情况下,一个站点决定保留某些日志文件,可能不是为了任何有益的目的,而更多是为了应付传票。处于这种境地的一个站点可能会留着几周的日志数据,但是它或许要保证这些文件一定不能被存到永久性的介质上。有一个这样的案例:微软已经不止一次受到指控,其管理日志文件和电子邮件的政策破坏性过强。原告称,微软的数据保留政策无异于毁掉证据,尽管删除行动(或者至少是删除策略)是在法律诉讼之前就已经有了。遗憾的是,目前断定 法 庭 将 最 终 如 何 回 应 这 些 诉 讼 还 为 时 过 早1。 在 美 国 ,Sarbanes-Oxley法案最近规定了保留记录
4、的新要求,参考 30.12.8 节。10.1.2 轮换日志文件把每周或者每月的日志信息保存在一个单独的文件里,这是一种通常(但不是通行)的做法。这些周期性的文件都会保留特定一段时间,然后被删除。我们专门在一台中央日志主机上划了一个硬盘分区( /var/log)给日志文件。在每个轮换周期结束的时候,有一个脚本或者工具程序更改每个文件的名字,然后把较早的数据向文件链的结尾推。例如,假设某个日志文件的名字叫做logfile ,则它的备份文件可能叫做logfile.1 、logfile.2 ,依此类推。如果每周轮换一次,并且保存8 周的数据,那么就会有一个logfile.8 文件但没有logfile.
5、9 文件。每周随着logfile.7文件覆盖 logfile.8 文件, 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 是它的名师资料总结 - - -精品资料欢迎下载 - - -
8、- - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 进程ID。该信号可以直接写入脚本,但必须动态判断守护进程的PID , 这 可 以 通 过 读 取 该 守 护 进 程 留 下 的 文 件 ( 比 如 /var/ run/syslogd.pid,这将在下面给予介绍)或是使用kill的变体killall来实现, killall 能够在进程表中查找PID。例如,下面的命令killall -e -HUP syslogd 等价于kill - HUP ,cat /var/run/syslogd
9、.pid, 10.1.3 存档日志文件除非您就是希望避免留下书面记录,否则应该在常规的系列备份中包含有日志文件。因为它们包含的信息对于调查安全事故来说至关重要,所以在您的转储频度允许的情况下,要以最高频度备份它们。日志文件变化很频繁,所以它们能够代表要保存在增量备份上的系统信息的重要部分。在设计您的日志政策和您的备份策略时要记得它们两者之间的相互作用关系。有关备份的更多信息,可参见第9章。除了作为例行备份的一部分之外,日志也可以存档到另一套单独的磁带上。相比之下,单独的一套磁带使用起来不方便,但它们带来的建档负担要轻,同时又不影响您循环使用转储磁带的能力。在使用单独的磁带时,我们建议您采用ta
10、r 格式,并编写一个脚本来自动执行备份方案。10.2 Linux 的日志文件传统的 UNIX系统往往因为它们做日志的方法不一致,甚至还有点儿怪异而受到批评。幸运的是,虽然Linux 系统的每一种发行版本都有自己的一套给日志文件命名和分类的方法,但是一般而言Linux要好一点儿。 Linux 的软件包大多将它们的日志信息记录到/var/log目录下的文件里。 在有些发行版本上, 个别日志也保存在/var/adm 里。现如今,大多数程序都把它们的日志项发到一个称为syslog 的中央清理系统, syslog 将在本章后面予以介绍。默认的syslog 配置一般将这些信息的大部分转储到/var/log
11、 中的某个地方。请检查系统日志的配置文件 /etc/syslog.conf,找出这些信息究竟存在什么地方。有关syslog.conf 文件的格式,请参考10.4 节。表 10.1 总结了一些在我们举例的系统中较为常见的日志文件的有关信息。具体有如下几项:存档、汇总或截断的日志文件;创建各个日志文件的程序;有关如何指定每个文件名的指示;我们认为留意或者清理的合理频率;使用日志文件的发行版本(在我们的例子中出现过);文件内容的说明。除非特别说明,否则文件名都是相对于var/log 而言的。“ 出处 ” 一列中的字符说明了日志文件的指定方法:S 代表使用 syslog的程序, F 代表使用一个配置文
12、件的程序,而H 则代表文件名是否直接包含在代码中。“ 频率 ” 一列表明了我们建议的清理频率。“ 发行版本 ” 一列给出了该项适用的发行版本。虽然各个发行版本上日志文件的所属关系和模式都有不同,但日志文件一般由root 所有。就我们看来, 大多数日志的模式都应该是600(只有属主有读写权限),因为它们的内容对于黑客来说可能有帮助。如果用户的水平相当高,那么能够查看日志对用户会有好处。在这种情况下,放开日志文件的部分权限也是合理的。专为日志建立一个用户组,把日志文件的属组设为这个用户组,让这个用户组的成员都能读取日志文件,这是另一种合理的做法。您可以把本地的系统管理员加入到这个用户组里,让他们不
13、必使用sudo 命令就能看到日志文件的内容。如果站点有一个初级系统管理员,他没有完全的sudo 特权,这样的安排就特有用。至少,应该限制用户对secure 、auth.log 和 sudo.log 文件不经意地查看。绝对不要把任何日志文件的写权限交给属主之外的任何人。值得说明的一点是,表10.1 中给出的日志文件大多数都是由syslog维护的,但是syslog 的默认配置则随系统的不同而变化很大。采用了比较一致的 /etc/syslog.conf 文件后,各 Linux 发行版本上的日志文件看上去就相当相似了。表 10.1 日志文件列表文件程序出处a频率a发行版本a内容auth.log su等
14、bS M DU 授权apache2/* httpd第 2 版F D SDU Apache HTTP服务器的日志(第 2 版)boot.log rc 脚本FcM RF 系统启动脚本的输出boot.msg 内核H - S 内核消息缓冲的转储cron cron S W RF cron 的执行情况和出错信息cups/* CUPS F W 所有与打印有关的消息( CUPS)daemon.log 许多S W DU 所有守护进程功能的消息debug 许多S D DU 调试输出dmesg 内核H - RFDU 内核消息缓冲的转储dpkg.log dkpg F M DU 软件包管理日志faillog login
15、 H W SDU 不成功的登录企图httpd/logs/* httpd F D RF Apache HTTP服务器的日志(在 /etc 下)续表文件程序出频发内容名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 处a率a行版本akern.log 内核S W DU 所有 kern 功能的消息lastlog login H - 所有每个用户上次登录的时间(二进制)mail* 与 mail 有关的S W 所有所有 mail 功能的消息
16、messages 许多S W 所有经常是主要的系统日志文件rpmpkgs cron.daily/rpm H D RF 已安装的 RPM 软件包清单samba/* smbd 等F W - Samba(Windows/CIFS文件共享)secure sshd、sudo等S M RF 保密的授权消息syslog 许多S W DU 经常是主要的系统日志文件warn 许多S W S 所有的警告 /出错级的消息wtmp login H M 所有登录记录(二进制)Xrog.n.log Xorg F W RFS X 窗口服务器的出错信息yum.log yum F W RF 软件包管理日志a出处: S=sysl
17、og, H= 硬连接, F=配置文件。频率: D每天, W 每周, M 每月。发行版本: RRed Hat Enterprise Linux,F = Fedora ,DDebian, SSUSE ,U = Ubuntu 。bpasswd、 login和 shutdown 也可以写入授权日志。在 Red Hat和 Fedora 系统上,它在 /var/adm里。c实际是通过syslog 做日志,但是在 /etc/initlog.conf中配置功能和级别。10.2.1 特殊的日志文件大多数日志是文本文件,当发生“ 感兴趣的 ” 事件时,就会向这些文件中写入日志记录行。但是表10.1 中列出的几个日
18、志的来龙去脉却非常不同。/var/log/wtmp中包含用户登录系统和退出系统的记录,也包含了表明系统何时重启或者关机的记录项。因为新的记录项只是简单地追加到文件的末尾,所以它是一种相当普通的日志文件。不过,wtmp文件是以二进制形式保存的。使用last 命令可以解读这些信息。尽管 wtmp 的格式不一般, 但是应该像其他任何日志文件那样,轮换或者截断这个文件,因为它的自然特性是无限制的增长。/var/log/lastlog 包含的信息类似于/var/log/wtmp 中的信息,但是它只记录每个用户上次登录的时间。它是一个稀疏的二进制文件,以 UID作为索引。如果您的UID 是以某种数字序列来
19、指定的,那么虽然这肯定对现实世界没什么影响,但这个文件会变得小一些。lastlog 文件不需要轮换,因为除非有新用户加入,否则它的大小保持不变。参见 9.3.1 节的脚注了解有关“ 稀疏 ” 文件的更多知识。10.2.2 内核和启动日志内核和系统启动脚本反映出了在日志领域内的一些特殊的挑战。对于内核来说,问题在于既要创建有关引导进程和内核操作的永久记录,又不能增加对任何特殊的文件系统或者文件系统组成的依赖性。对于启动脚本而言,挑战在于既要捕捉启动过程的连贯描述,又不能总是试图把任何系统守护进程都和启动日志文件扯到一块,干扰任何程序自己的日志机制,或是让启动脚本做两份日志项或者把日志输出重定向。
20、内核的日志机制是通过让内核把它的日志项保存在一个大小有限的内部缓冲区来做到的。缓冲区要足够大,以便能放得下内核在引导时的活动所产生的全部消息。一旦系统全部启动以后,用户进程就可以访问内核的日志缓冲,最终处理它的内容。各发行版本一般是运行 dmesg 命令,并把它的输出重定向到/var/log/dmesg(RHEL 、Fedora、Debian 和 Ubuntu)或者 /var/log/boot.msg (SUSE) 。这是查看最近启动过程信息的最好的地方。内核当前运行的日志机制是由一个叫做klogd 的守护进程处理的。klogd 的功能实际上是dmesg功能的超集, 除了转储内核的日志并退出之
21、外,它还可以在内核缓冲区内的消息产生的时候读取它们,并将其发送到一个文件或者syslog。在正常的运行方式下,klogd 采取后一种模式。 syslog 根据对 “kern”的指令来处理这些消息(一般把它们发送到 /var/log/messages) 。我们举例用的发行版本的启动脚本在一开始转储日志消息的时候,都不用 dmesg 的-c 标志,所以虽然读取了内核的消息缓冲区,但并不清除它。当klogd 启动的时候,它在缓冲区里发现了和dmesg 见到的一样的一组消息,于是把它们发送给syslog。出于这个原因, 有些日志项既会出现在dmesg 或者 boot.msg 文件里,又会出现在如/va
22、r/log/messages这样由 syslog 管理的文件里。内核日志机制的另一个问题是要在系统控制台做适当的管理。伴随系统的引导,在控制台上输出信息是很重要的。不过,一旦系统已经启动了,控制台的消息可能与其说是帮助,不如说是烦人,如果用控制台登录的话就更是这样了。dmesg和 klogd 都可以让您用一个命令行标志设置内核的控制台日志级别。例如:$ sudo dmesg-n 2 7 级提供的信息最多, 还包括调试信息。 1 级只包含内核的“panic(恐慌) ” 消息(编号小的级别最严重)。所有的内核消息继续进入中央缓冲区(也进入syslog) ,而不管它们是否被转发到控制台。名师资料总结
23、 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - 内核在 /proc/sys 目录下提供了一些控制文件,让大量重复发生的日志消息在来源处就被阻塞。参见28.4 节,了解通过设置哪些内核参数 来 实 现 一 般 控 制 机 制 的 更 多 信 息 。 这 些 专 门 的 控 制 文 件 是/proc/sys/kernel/printk_ratelimit和/proc/sys/kernel/printk_ratelimit_burst ,前者指
24、定在启动阻塞之后内核消息之间必须间隔最少多少秒(默认为 5s) ,后者规定在启动阻塞之前允许多少组消息通过(默认为 10) 。这两个参数都是建议性的,所以它们不会绝对保证能制止大量消息。遗憾的是, 系统启动脚本的日志机制没有内核的日志机制管理得好。 Red Hat Enterprise Linux采用一条叫做initlog的命令来捕获启动命令的输出,并把它发送给syslog。遗憾的是,无论什么时候运行命令,都必须明确调用 initlog ,所以确实要以某种复杂性为代价才能捕获到信息。这些日志项最终还是会进入/var/log/boot.log 。我们举例用的其他系统都没有连续捕获启动脚本的历史输
25、出。个别命令和守护进程能记录下来一些信息,但是大多数信息都不作日志记录。Fedora 以前使用和Red Hat 一样的 initlog 系统,但是现在这条提交日志记录的命令已经从启动脚本中注释掉了。 幸好还有一个工具函数的中央库/etc/init.d/functions ,您可以在那里去掉initlog 的注释行重新启用它们。10.3 logrotate: 管理日志文件Erik Troan 提供了一种优秀的工具logrotate,它实现了多种多样的日志管理策略,而且在我们举例的所有发行版本上都是标准应用。logrotate 的配置文件由一系列规范组成,它们说明了要管理的日志文件组。出现在日志文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年Linux系统日志与日志文件 2022 Linux 系统 日志 文件
限制150内