Coding Poet, Coding Science

Linux下的日志记录及其策略

本章标题是《系统日志与系统文件》。因为日志在系统当中的确占有非常重的地位。原来自己没有接触过关于syslog与logrotate等工具,所以在查看日志的时候用的只是非常基本的功能。但是按照自己的需求。以后自己也要学习更多的日志分析技巧,如果要学习网络的话。

日志通常如一条一条的概要,由某个应用程序产生并提交到特定的日志系统去处理。有的日志系统比较简单,或是由应用程序服务自动管理。但是更多的时候,需要在系统范围内才能分析出日志包含的重要信息。

日志文件因为它所反映的信息类型的不同而不同。因此需要各自对待。

虽然在操作系统编程与应用程序编程,或者网络编程中也常用到日志,但是日志的最核心的功能还是在于为系统或者应用管理员提供足够的信息,以便支持某种决策。这样一来,在编程中使用的日志只是提供一种基础设施。只在站在系统管理的水平上,我们才能利用好日志记录。

几种对待日志的策略

一般情况下应用程序已经配置好所产生的日志级别。一旦日志产生就进入到日志管理这一主题之下。通常情况下,日志可以分成保存的日志与立即的日志。后者又有立即扔掉与在内存区域中缓存,或者在终端上显示。前者则可以选择转发到另一地点或者在本地保存。

计算机管理系统环境下,一般产生意义的动作只是立刻扔掉,或者定期复位,或者采取轮换,或者将日志压缩或保存到永久介质上。它们的不同完全可以由日志信息存在与时间的函数关系决定:前者总是取零,定期复位使得可追溯的日志像周期函数一样变化;轮换则是一个单调递增,而后保持不变的函数;后者则是一个不断增加的函数。

在unix下无论何种方案,都必须采用cron自动维护日志文件。

关于扔掉日志

一般来说不应当扔掉所有的日志信息。因为日志文件首先为站点提供了非法入侵的重要证据。其次还有助于分析有关硬件或者软件方面的问题。《手册》中给出的意见是所有日志到少保存一个月的时间。特别是站点环境下,可能需要很长时间才能发现入侵。此时需要退回很长时间才可以找到入侵时间。并且还需要以压缩形式保存更长时间的日志。

不过有些时候保存日志的策略有一定的政治,法律或者商业上的原因。这就得具体问题具体分析了。不过留下日志总能够提供某种分析手段,至少能够使得对事物的认识更加具体。

轮换日志文件

这种做法通常是把每周或者每月的日志信息保留在一个单独文件里,就像维护一个长度有限的队列一样。

对于一个日志文件来说,其属主通常很重要,决定着日志管理时的权限使用。日志文件的命名可以使用序号区分,也可以使用日期。在unix上可以通过date命令的+%Y.%m.%d 格式就是通常的做法。

在轮换日志的时候可能会遇到日志正在使用的情况。这种情况下正在使用的日志文件会因为文件位置的改变而自动改变。通常的解决办法是在移动日志后重新启动守护进程,以让守护进程使用新的,空白的日志文件。

比如向syslogd发送HUP信号就会导至syslogd守护进程挂起然后重新读取日志。

存档日志文件

“除非就是要避免留下书面记录,否则就应该在常规备份中包含日志文件”。并且在转储频度允许的情况下以最高频度备份日志文件。此外。我们可以为日志文件专门设计一个备份脚本以直接对日志备份进行控制。

linux日志文件

linux系统的软件包一般将其日志记录到/var/log下的文件里。

/var目录是相当重要的。在正常运行的系统里应该都存在。因为里面还会随时写入很多信息,因此应当以读写方式挂载文件系统。

linux下大多数程序将其日志发送到syslog中央系统。由syslog负责将日志写入文件或者进行转发。总之,应用程序只需要把产生的日志信息提交到syslog就可以了。

日志权限需要管理员仔细衡量。这些权限中查看权限或许最为关键。一般而言黑客会特别照顾日志文件。大多数文件因此应当设置成权限600.

/var目录应当是所有用户都有权限访问的。但是用户不能在/var下删除log/目录。用户查看log/里面的内容也是允许的。但是用户不一定能查看具体某个应用程序的日志。

专门为日志文件建立一个组,以使得组里的其它成员有查看它的权限也是不错的。注意这里只是说日志属于某个组,而不是日志属于某个特殊用户。一个用户可以属于多个组,通常从组中得到的权限是各个组之和。

从一个具体的应用程序到日志文件的过程大致是,应用程序首先得使用syslog程序,这样以来就可以把日志提交到syslog系统。这一过程中得保证运行应用程序的当前用户或者进程有向syslog提交日志的权利。然后就是由syslog负责整理日志了。由于syslog是以root的身份执行,因此它总能创建出日志文件,后续的行为只需要chgrp命令修改日志所属组就可以了。特别是修改日志文件所属组的行为可以通过syslog完成。

系统日志的层次安排

/var/log下的常见日志

一般来说secure,auth.log与sudo.log文件都不应当由一般用户查看。除了读限制,应当禁止除了属主外的任何人对日志文件的写权限。

一般来说:

auth.log 由su等程序产生,负责授权
boot.log 系统启动脚本的输出
boot.msg 内核消息缓冲的存储
cron cron的执行情况与出错信息
cups 与打印有关的信息
daemon.log 所有与守护进程相关的信息
debug 调试输出
dmesg 内核输出消息的缓冲
dpkg.log 软件包管理日志
faillog 不成功的登录企图
messages 经常是系统日志文件
secure sshd,sudo等,保密的授权信息
syslog 主要的系统日志文件
warn 所有的警告级与出错级消息
wtmp 二进制记录的所有登录记录
yum.log 软件包管理日志

具体文件因系统不同而有差异,并且因使用的系统日志守护进程的不同而有异。

内核和启动日志

内核的日志机制是通过让内核把它的日志项保存在一个大小有限的内部缓冲区来做到的。缓冲区具有适当的大小,既足以容纳内核引导是产生的所有消息,又要节省内存用量。一旦系统启动完成,用户进程应当能够访问内核的日志缓冲,最终处理其内容。各个发行版本一般使用dmesg命令并将其输出重定向到/var/log/dmesg.(因发行版而异)。

内核当前运行的日志是通过klogd内核线程处理的。在正常运行方式下,klogd将内核产生的日志发送到一个文件或者syslog守护进程。一般情况下syslog依照kern中的规则处理这些日志,并将其发送到/var/log/messages文件。

dmesg与klogd都有一个选项可以设置内核控制台的日志级别。这实际上是同内核进行对话。如dmesg就使用了-n选项。内核的日志级别分为7级(第7级称为调试级,输出最多)。

启动脚本的日志可以没有内核日志机制做得好。

日志管理与分析工具

logrotate

logrotate用于管理日志文件,它的基本功能也就是作为一个过护进程,定期检测日志文件并对日志文件进行转储的操作。一般情况下在/etc/cron.daily下都可以发现logrotate这一个文件。也就是logrotate的计划任务。

原则上说logrotate应该在syslog之后讲述。不过我们可以把logrotate仅看成是一个定期分隔文件的程序而不去管它分隔的是怎样的文件类型,这才是它的功能的完整的应用领域。

前面我们说了logrotate在cron.daily下面定期运行。实际上在crontab中运行它的命令以及参数是

/usr/bin/logrotate /etc/logrotate.conf 2>&1 | tee $TMPF

所以我们知道它的功能是读取logrotate.conf文件并执行。

在该crontab文件下还执行的功能是,如果logrotate异常退出,就向syslog发送一个logrotate运行失败的cron.warning消息。

所以接下来就要学习logrotate.conf的配置了。

logrotate的主配置文件是logrotate.conf,但是在该文件中有一条命令是

include /etc/logrotate.d

所以在目录下才是针对每个程序的配置。主配置文件一般参考logrotate(8)。

针对某些文件的配置格式为:

${path_match} {
    ${rotate_command_list}
}

表示对某一个配置文件执行哪些操作。

实在不想再学习logrotate的配置文件了。又得学习一种配置语言。想写的时候参考实时手册页就可以了。

syslog日志分发程序

系统事件日志程序

syslog最初是由Eric Allman编写的一个综合日志记录系统。syslog具有两个重要的特性。首先它能让消息按照其来源和严重级别排序;其次是能够把消息送到各种目的地,包括日志文件,用户终端,甚至是其它计算机。这给予syslog以极大的灵活性。

尽管如此syslog也有一些缺点。所以已经开发出几种替代方案。比如syslog-ng.以及圣地亚哥超级计算中心的sdscsyslog.除此之外,SUSE上使用的是rsyslog.

syslog的体系结构

syslog由三个部分组成。其一是syslog守护进程,其二是库调用,其三是logger提交日志的命令。

syslog在系统启动后连续运行。懂得syslog的应用程序把日志发送到/dev/log文件,然后由syslog守护进程读取消自息并根据配置文件分发信息到目的地。syslog接受挂起信号并解释为重新打开配置文件;同时接受TERM信号并使守护进程退出。

syslog守护进程还会把它的进程PID写入到/var/run/syslogd.pid文件里。这使得向它发送信号变得比较容易,如: kill -HUP $(/bin/cat /var/run/syslogd.pid)

因为logrotate就经常要求syslog重新读取相关的日志文件。

守护进程使用/etc/syslog.conf配置文件。

其它的syslog程序通常也支持类似于syslog.conf配置文件里的语法。

配置文件的基本格式是:

$selector   $action

其中$selector的基本格式为$facility.$level.表示的含义是属于这一类别的某个等级的日志将会采取$action所指定的行为处理。$facility$level都是由syslog规定好了的取值范围。一般情况下,比如cron代表来自cron的日志,daemon代表来自系统守护进程,而kern代表来自内核,local0-7代表来自本地的8种类型,user代表来自用户进程,syslog代表syslog内部消息。级别从低到高依次是debug, info, notice, warning, err, crit, alert, emerg.这些级别的具体含义由用户安排。

facility支持使用星号通配。

$action可以是一个本地文件名,或者@hostname,或者@ip,或者用户列表,或者fifoname,或者*(代表所有用户)。在$action前面加一个短划线代表写入文件后不执行sync命令。syslog对待一条日志的行为类似于一个匹配器。前面说到$selector的格式。实际上syslogd还支持语法糖的形式,允许一条匹配应用多个规则。分号表示取并区间。

具体来说$f.$l表示$l及以上,$f.=$l表示只匹配该级别, s1;s2表示选择器取并,在s1及s2之间。

syslog守护进程在启动时默认是不接收其它机器的消息的,除非是以-r选项启动的。并且syslog如果从网络接收到一条日志,无论符合哪一$selector都不会转发,除非使用了-h选项。开机时候的syslog选项可以从/etc/init.d/syslog里配置。

站点设计方案

在一个小型站点中重要的系统错误和警告保存在每台计算机的文件当中就可以了。但是在在个大型的网络中必须有中央日志记录。有了中央日志记录的话,大量的日志信息就会处于可管理的状态,而且运气好的话还能使破坏计算机安全的人无法访问到审计数据。(这要求站点级的防火墙禁止从外部向syslog提交信息。)

一般来说选择一台稳定的机器作为日志记录服务器,并且最好有很好的安全措施而且登录用户不多的一台机器。其他的计算机可以使用保存在中央主机上的通用配置文件。这样一来只需要维护两份不同的syslog.conf文件。

syslog服务器应当具有足够的安全性。其安全性可通过防火墙对于连接的控制,以及系统管理员访问的途径体现。

syslog应用

有许多程序或守护进程使用了syslog系统。并且通过logger命令,一般脚本也可以向syslog发送某些信息。如果要了解可详细的信息,可能需要查找POSIX相关规范。

logger的通常用法是

logger -p $selector "${messages}"

该命令可以用于调试syslog.方法是先在配置文件中添加一个指令选择器的地址,然后使用logger向该选择器写入指定的信息。

在应用的时候都忽略了权限的问题。但是我们应该知道让任何人都有发送日志的权利也是不应该的。

日志分析工具

比如swatch, logcheck, logwatch.