11.7. 设定系统日志

Contributed by Niclas Zeising.

产生与读取系统日志对系统管理来说是一件非常重要的事,在系统日志中的信息可以用来侦测硬件与软件的问题,同样也可以侦测应用程序与系统设定的错误。这些信息在安全性稽查与事件响应也同样扮演了重要的角色,大多数系统Daemon与应用程序都会产生日志项目。

FreeBSD提供了一个系统日志程序syslogd用来管理日志。预设syslogd会与系统开机时启动。这可使用在/etc/rc.conf中的变数 syslogd_enable来控制。而且有数个应用程序参数可在/etc/rc.conf使用syslogd_flags来设定。请参考syslogd(8)来取得更多可用参数的信息。

此章节会介绍如何设定FreeBSD系统日志程序来做本地与远端日志并且介绍如何执行日志翻转(Log rotation)与日志管理。

11.7.1. 设定本地日志

配置文件/etc/syslog.conf控制syslogd收到日志项目时要做的事情,有数个参数可以用来控制接收到事件时的处理方式。设施(facility)用来描述记录产生信息的子系统(subsystem),如核心或者Daemon,而层级(level)用来描述所发生的事件严重性。也可以依据应用程序所发出的信息及产生日志事件机器的主机名称来决定后续处置的动作。

此配置文件中一行代表一个动作,每一行的格式皆为一个选择器字段(Selector field)接着一个动作字段(Action field)。选择器字段的格式为facility.level可以用来比对来自facility于层级level或更高层的日志信息,也可以在层级前加入选择性的比对旗标来更确切的指定记录的内容。同样一个动作可以使用多个选择器字段并使用分号()来分隔。用*可以比对任何东西。动作字段可用来指定传送日志信息的目标,如一个档案或远端日志主机。示例为以下为FreeBSD预设的syslog.conf

# $FreeBSD$
#
#       Spaces ARE valid field separators in this file. However,
#       other *nix-like systems still insist on using tabs as field
#       separators. If you are sharing this file between systems, you
#       may want to use only tabs as field separators here.
#       Consult the syslog.conf(5) manpage.
*.err;kern.warning;auth.notice;mail.crit                /dev/console
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err   /var/log/messages
security.*                                      /var/log/security
auth.info;authpriv.info                         /var/log/auth.log
mail.info                                       /var/log/maillog
lpr.info                                        /var/log/lpd-errs
ftp.info                                        /var/log/xferlog
cron.*                                          /var/log/cron
!-devd
*.=debug                                        /var/log/debug.log
*.emerg                                         *
# uncomment this to log all writes to /dev/console to /var/log/console.log
#console.info                                   /var/log/console.log
# uncomment this to enable logging of all log messages to /var/log/all.log
# touch /var/log/all.log and chmod it to mode 600 before it will work
#*.*                                            /var/log/all.log
# uncomment this to enable logging to a remote loghost named loghost
#*.*                                            @loghost
# uncomment these if you're running inn
# news.crit                                     /var/log/news/news.crit
# news.err                                      /var/log/news/news.err
# news.notice                                   /var/log/news/news.notice
# Uncomment this if you wish to see messages produced by devd
# !devd
# *.>=info
!ppp
*.*                                             /var/log/ppp.log
!*

在这个示例中:

  • 第8行会找出所有符合err或以上层级的信息,还有kern.warningauth.noticemail.crit的信息,然后将这些日志信息传送到Console(/dev/console)。

  • 第12行会找出所有符合mail设施中于info或以上层级的信息,并记录信息至/var/log/maillog

  • 第17行使用了比较旗标(=)来只找出符合debug层级的信息,并将信息记录至/var/log/debug.log

  • 第33行是指定程序的示例用法。这可以让在该行以下的规则只对指定的程序生效。在此例中,只有由ppp产生的信息会被记录到/var/log/ppp.log

所以可用层级从最严重到最不严重的顺序为emergalertcriterrwarningnoticeinfo以及debug

设施(facility)则无特定顺序,可用的有authauthprivconsolecrondaemonftpkernlprmailmarknewssecuritysysloguseruucplocal0local7。要注意在其他操作系统的设施可能会不同。

要记录所有所有notice与以上层级的信息到/var/log/daemon.log可加入以下项目:

daemon.notice                                        /var/log/daemon.log

要取得更多有关不同的层级与设施的信息请参考syslog(3)syslogd(8)。要取得更多有关/etc/syslog.conf、语法以及更多进阶用法示例的信息请参考syslog.conf(5)

11.7.2. 日志管理与翻转

日志档案会成长的非常快速,这会消耗磁盘空间并且会更难在日志中找到有用的信息,日志管理便是为了尝试减缓这种问题。在FreeBSD可以使用newsyslog来管理日志档案,这个内置的程序会定期翻转(Rotate)与压缩日志档案,并且可选择性的建立遗失的日志档案并在日志档案被移动位置时通知程序。日志档案可能会由syslogd产生或由其他任何会产生日志档案的程序。 newsyslog正常会由cron(8)来执行,它并非一个系统Daemon,预设会每个小时执行一次。

newsyslog会读取其配置文件/etc/newsyslog.conf来决定其要采取的动作,每个要由newsyslog所管理的日志档案会在此配置文件中设定一行,每一行要说明档案的拥有者、权限、何时要翻转该档案、选用的日志翻转旗标,如:压缩,以及日志翻转时要通知的程序。以下为FreeBSD的预设设定:

# configuration file for newsyslog
# $FreeBSD$
#
# Entries which do not specify the '/pid_file' field will cause the
# syslogd process to be signalled when that log file is rotated.  This
# action is only appropriate for log files which are written to by the
# syslogd process (ie, files listed in /etc/syslog.conf).  If there
# is no process which needs to be signalled when a given log file is
# rotated, then the entry for that file should include the 'N' flag.
#
# The 'flags' field is one or more of the letters: BCDGJNUXZ or a '-'.
#
# Note: some sites will want to select more restrictive protections than the
# defaults.  In particular, it may be desirable to switch many of the 644
# entries to 640 or 600.  For example, some sites will consider the
# contents of maillog, messages, and lpd-errs to be confidential.  In the
# future, these defaults may change to more conservative ones.
#
# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num]
/var/log/all.log                        600  7     *    @T00  J
/var/log/amd.log                        644  7     100  *     J
/var/log/auth.log                       600  7     100  @0101T JC
/var/log/console.log                    600  5     100  *     J
/var/log/cron                           600  3     100  *     JC
/var/log/daily.log                      640  7     *    @T00  JN
/var/log/debug.log                      600  7     100  *     JC
/var/log/kerberos.log                   600  7     100  *     J
/var/log/lpd-errs                       644  7     100  *     JC
/var/log/maillog                        640  7     *    @T00  JC
/var/log/messages                       644  5     100  @0101T JC
/var/log/monthly.log                    640  12    *    $M1D0 JN
/var/log/pflog                          600  3     100  *     JB    /var/run/pflogd.pid
/var/log/ppp.log        root:network    640  3     100  *     JC
/var/log/devd.log                       644  3     100  *     JC
/var/log/security                       600  10    100  *     JC
/var/log/sendmail.st                    640  10    *    168   B
/var/log/utx.log                        644  3     *    @01T05 B
/var/log/weekly.log                     640  5     1    $W6D0 JN
/var/log/xferlog                        600  7     100  *     JC

每一行的开始为要翻转的日志名称、接着是供翻转与新建档案使用的拥有者及群组(选填)。mode字段可设定日志档案的权限,count代表要保留多少个翻转过的日志档案,而sizewhen字段会告诉newsyslog何时要翻转该档案。日志档案会在当其档案超过size字段的大小或已超过when字段指定的时间时翻转,可使用星号(*)忽略该字段。flags字段可以给予进阶的参数,例如:如何压缩翻转后档案或建立遗失的日志档案。最后两个字段皆为选填,可指定程序的程序ID(PID)档名称以及档案翻转后要传送给该程序的信号(Signal)编号。

要取的更多有关所有字段、可用的旗标及如何指定翻转时间,请参考newsyslog.conf(5)。由于newsyslog是由cron(8)执行,因此无法比其在cron(8)中所排定的时间间距内更频繁的执行翻转档案。

11.7.3. 设定远端日志

Contributed by Tom Rhodes.

处理系统日志对于系统安全和管理是一个重要方面。 当有多台分布在中型或大型网络的机器,再或者是处于各种不同类型的网络中, 监视他们上面的日志文件则显得非常难以操作, 在这种情况下, 配置远程日志记录能使整个处理过程变得更加轻松。

集中记录日志到一台指定的机器能够减轻一些日志文件管理的负担。 日志文件的收集, 合并与循环可以在一处配置, 使用 FreeBSD 原生的工具, 比如 syslogd(8)newsyslog(8)。 在以下的配置示例中, 主机 A, 命名为 logserv.example.com, 将用来收集本地网络的日志信息。 主机 B, 命名为 logclient.example.com 将把日志信息传送给服务器。 在现实中, 这两个主机都需要配置正确的正向和反向的 DNS 或者在 /etc/hosts 中记录。 否则, 数据将被服务器拒收。

11.7.3.1. 日志服务器设定

日志服务器是接受来自其他主机的日志信息的系统。在配置日志服务器之前,请检查以下内容:

  • 服务器和客户端的防火墙规则允许 514 端口上的 UDP 报文通过。

  • 日志记录服务器和所有客户端计算机必须具有本地 DNS 中的正向和反向条目。如果网络没有 DNS 服务器,请在每个系统的 /etc/hosts中创建条目。需要正确的名称解析,以便日志记录服务器不会拒绝日志条目。

在日志服务器上,编辑/etc/syslog.conf以指定要接收日志条目的客户端的名称、要使用的日志记录工具以及用于存储主机日志项的日志名称。本示例添加 B 的主机名,记录所有设施,并将日志条目存储在/var/log/logclient.log中。

例 11.1. 日志服务器设定示例
+logclient.example.com
*.*     /var/log/logclient.log

添加多个日志客户端时,为每个客户端添加类似的双行条目。有关现有设施的更多信息, 可在syslog.conf(5)中查阅。

接下来,配置/etc/rc.conf

syslogd_enable="YES"
syslogd_flags="-a logclient.example.com -v -v"

第一个条目在系统启动时启动syslogd。第二个条目允许来自指定客户端的日志条目。-v -v 增加了记录消息的冗量。这对于调整设施非常有用,因为管理员能够查看每个设施下记录的消息类型。

可以指定多个-a选项以允许从多个客户端进行日志记录。也可以指定IP地址和整个网络块。有关可能的选项的完整列表, 请参阅syslogd(8)

最后,创建日志文件:

# touch /var/log/logclient.log

此时,应重新启动并验证syslogd

# service syslogd restart
# pgrep syslog

如果返回了一个 PID 的话, 服务端应该被成功重启了, 并继续开始配置客户端。 如果服务端没有重启的话, 请在 /var/log/messages 日志中查阅相关输出。

11.7.3.2. 日志客户端设定

日志客户端是一台发送日志信息到日志服务器的机器, 并在本地保存拷贝。

配置日志记录服务器后, 在日志记录客户端上编辑 /etc/rc.conf:

syslogd_enable="YES"
syslogd_flags="-s -v -v"

第一个条目在启动时启用syslogd。第二个条目防止此客户端从其他主机(-s)接受日志,并增加日志消息的详细程度。

日志服务器必须在客户端的 /etc/syslog.conf 中指明。 在此例中, @ 符号被用来表示发送日志数据到远程的服务器, 看上去差不多如下这样:

*.*		@logserv.example.com

添加后, 必须重启 syslogd 使得上述修改生效:

# service syslogd restart

测试日志消息是否能通过网络发送, 在准备发出消息的客户机上用 logger(1) 来向 syslogd 发出信息:

# logger "Test message from logclient"

这段消息现在应该同时出现在客户机的 /var/log/messages 以及日志服务器的 /var/log/logclient.log 中。

11.7.3.3. 调试日志服务器

如果在日志服务器上没有收到任何消息,原因很可能是网络连接问题、主机名解析问题或配置文件出错。要了解出错原因原因,请确保日志服务器和日志客户端都能使用其/etc/rc.conf中指定的主机名来ping对方。如果失败,请检查网络布线、防火墙规则集以及日志服务器和客户端上的DNS服务器或/etc/hosts中的主机名条目。重复执行,直到两个主机上的ping成功。

如果双向 ping 成功,仍没收到日志信息,请临时增加日志记录的详细程度,以减少配置问题。本例中日志服务器上的/var/log/logclient.log是空的且客户端没有报错。为了开启调试输入,在日志服务器上编辑syslogd_flags选项并重启日志服务器:

syslogd_flags="-d -a logclient.example.com -v -v"
# service syslogd restart

重启后控制台上会显示调试信息:

logmsg: pri 56, flags 4, from logserv.example.com, msg syslogd: restart
syslogd: restarted
logmsg: pri 6, flags 4, from logserv.example.com, msg syslogd: kernel boot file is /boot/kernel/kernel
Logging to FILE /var/log/messages
syslogd: kernel boot file is /boot/kernel/kernel
cvthname(192.168.1.10)
validate: dgram from IP 192.168.1.10, port 514, name logclient.example.com;
rejected in rule 0 due to name mismatch.

在此示例中,由于拼写错误导致主机名不匹配,日志消息被拒绝。客户端的主机名应该是logclient,而非logclien。修复拼写错误并重新启动,验证结果:

# service syslogd restart
logmsg: pri 56, flags 4, from logserv.example.com, msg syslogd: restart
syslogd: restarted
logmsg: pri 6, flags 4, from logserv.example.com, msg syslogd: kernel boot file is /boot/kernel/kernel
syslogd: kernel boot file is /boot/kernel/kernel
logmsg: pri 166, flags 17, from logserv.example.com,
msg Dec 10 20:55:02 <syslog.err> logserv.example.com syslogd: exiting on signal 2
cvthname(192.168.1.10)
validate: dgram from IP 192.168.1.10, port 514, name logclient.example.com;
accepted in rule 0.
logmsg: pri 15, flags 0, from logclient.example.com, msg Dec 11 02:01:28 trhodes: Test message 2
Logging to FILE /var/log/logclient.log
Logging to FILE /var/log/messages

此时,消息正在正确接收并放置在正确的文件中。

11.7.3.4. 安全注意事项

就像其他的网络服务一样, 在实现配置之前需要考虑安全性。 有时日志文件也包含了敏感信息, 比如本地主机上所启用的服务, 用户帐号和配置数据。 从客户端发出的数据经过网络到达服务器, 这期间既没有加密也没有密码保护。 如果有加密需要的话, 可以使用 security/stunnel, 它将在一个加密的隧道中传输数据。

本地安全也同样是个问题。 日志文件在使用中或循环转后都没有被加密。 本地用户可能读取这些文件以获得对系统更深入的了解。 对于这类情况, 给这些文件设置正确的权限是非常有必要的。 newsyslog(8) 工具支持给新创建和循环的日志设置权限。 把日志文件的权限设置为 600 能阻止本地用户不必要的窥探。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.