30.11 使用 syslogd 记录远程主机的日志

Contributed by Tom Rhodes.

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

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

30.11.1 日志服务器的配置

  日志服务器是配置成用来接收远程主机日志信息的机器。 在大多数的情况下这是为了方便配置, 或者是为了更好的管理。 不论是何原因, 在继续深入之前需要提一些必需条件。

  一个正确配置的日志服务器必须符合以下几个最基本的条件:

  配置日志服务器, 客户端必须在 /etc/syslog.conf 中列出, 并指定日志的 facility:

+logclient.example.com
*.*     /var/log/logclient.log

注意: 更多关于各种被支持并可用的 facility 能在 syslog.conf(5) 手册页中找到。

  一旦加入以后, 所有此类 facility 消息都会被记录到先前指定的文件 /var/log/logclient.log

  提供服务的机器还需要在其 /etc/rc.conf 中配置:

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

  第一个选项表示在系统启动时启用 syslogd 服务, 第二个选项表示允许服务器接收来自指定日志源客户端的数据。 第二行配置中最后的部分, 使用 -v -v, 表示增加日志消息的详细程度。 在调整 facility 配置的时候, 这个配置非常有用, 因为管理员能够看到哪些消息将作为哪个 facility 的内容来记录。

  可以同时指定多个 -a 选项来允许多个客户机。 此外, 还可以指定 IP 地址或网段, 请参阅 syslog(3) 联机手册以了解可用配置的完整列表。

  最后, 日志文件应该被创建。 不论你用何种方法创建, 比如 touch(1) 能很好的完成此类任务:

# touch /var/log/logclient.log

  此时, 应该重启并确认一下 syslogd 守护进程:

# /etc/rc.d/syslogd restart
# pgrep syslog

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

30.11.2 日志客户端配置

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

  与日志服务器类似, 客户端也需要满足一些最基本的条件:

  相比服务器来说配置客户端更轻松一些。 客户端的机器在 /etc/rc.conf 中做如下的设置:

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

  和前面类似, 这些选项会在系统启动过程中启用 syslogd 服务, 并增加日志消息的详细程度。 而 -s 选项则表示禁止服务接收来自其他主机的日志。

  Facility 是描述某个消息由系统的哪部分生成的。 举例来说, ftpipfw 都是 facility。 当这两项服务生成日志消息时, 它们通常在日志消息中包含了这两种工具。 Facility 通常带有一个优先级或等级, 就是用来标记一个日志消息的重要程度。 最普通的为 warninginfo。 请参阅 syslog(3) 手册页以获得一个完整可用的 facility 与优先级列表。

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

*.*		@logserv.example.com

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

# /etc/rc.d/syslogd restart

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

# logger "Test message from logclient"

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

30.11.3 调试日志服务器

  在某些情况下, 如果日志服务器没有收到消息的话就需要调试一番了。 有几个可能的原因, 最常见的两个是网络连接的问题和 DNS 的问题。 为了测试这些问题, 请确认两边的机器都能使用 /etc/rc.conf 中所设定的主机名访问到对方。 如果这个能正常工作的话, 那么就需要对 /etc/rc.conf 中的 syslogd_flags 选项做些修改了。

  在以下的示例中, /var/log/logclient.log 是空的, /var/log/message 中也没有表明任何失败的原因。 为了增加调试的输出, 修改 ayalogd_flags 选项至类似于如下的示例, 并重启服务:

syslogd_flags="-d -a logclien.example.com -v -v"
# /etc/rc.d/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.

  很明显,消息是由于主机名不匹配而被拒收的。 在一点一点的检查了配置文件之后, 发现了 /etc/rc.conf 中如下这行有输入错误:

syslogd_flags="-d -a logclien.example.com -v -v"

  这行应该包涵有 logclient, 而不是 logclien。 在做了正确的修改并重启之后便能见到预期的效果了:

# /etc/rc.d/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

  此刻, 消息能够被正确接收并保存入文件了。

30.11.4 安全性方面的思考

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

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

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

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