处理系统日志对于系统安全和管理是一个重要方面。 当有多台分布在中型或大型网络的机器,再或者是处于各种不同类型的网络中, 监视他们上面的日志文件则显得非常难以操作, 在这种情况下, 配置远程日志记录能使整个处理过程变得更加轻松。
集中记录日志到一台指定的机器能够减轻一些日志文件管理的负担。 日志文件的收集, 合并与循环可以在一处配置, 使用 FreeBSD 原生的工具, 比如 syslogd(8) 和 newsyslog(8)。 在以下的配置示例中, 主机 A, 命名为 logserv.example.com, 将用来收集本地网络的日志信息。 主机 B, 命名为 logclient.example.com 将把日志信息传送给服务器。 在现实中, 这两个主机都需要配置正确的正向和反向的 DNS 或者在 /etc/hosts 中记录。 否则, 数据将被服务器拒收。
日志服务器是配置成用来接收远程主机日志信息的机器。 在大多数的情况下这是为了方便配置, 或者是为了更好的管理。 不论是何原因, 在继续深入之前需要提一些必需条件。
一个正确配置的日志服务器必须符合以下几个最基本的条件:
服务器和客户端的防火墙规则允许 514 端口上的 UDP 报文通过。
syslogd 被配置成接受从远程客户发来的消息。
syslogd 服务器和所有的客户端都必须有配有正确的正向和反向 DNS, 或者在 /etc/hosts 中有相应配置。
配置日志服务器, 客户端必须在 /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 -vv"
第一个选项表示在系统启动时启用 syslogd 服务,
第二个选项表示允许服务器接收来自指定日志源客户端的数据。 第二行配置中最后的部分, 使用
-vv
, 表示增加日志消息的详细程度。 在调整 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 日志中查阅相关输出。
日志客户端是一台发送日志信息到日志服务器的机器, 并在本地保存拷贝。
与日志服务器类似, 客户端也需要满足一些最基本的条件:
syslogd(8) 必须被配置成发送指定类型的消息到能接收他们的日志服务器。
防火墙必须允许 514 端口上的 UDP 包通过;
必须配置正向与反向 DNS, 或者在 /etc/hosts 中有正确的记录。
相比服务器来说配置客户端更轻松一些。 客户端的机器在 /etc/rc.conf 中做如下的设置:
syslogd_enable="YES" syslogd_flags="-s -vv"
和前面类似, 这些选项会在系统启动过程中启用 syslogd
服务, 并增加日志消息的详细程度。 而 -s
选项则表示禁止服务接收来自其他主机的日志。
Facility 是描述某个消息由系统的哪部分生成的。 举例来说, ftp 和 ipfw 都是 facility。 当这两项服务生成日志消息时, 它们通常在日志消息中包含了这两种工具。 Facility 通常带有一个优先级或等级, 就是用来标记一个日志消息的重要程度。 最普通的为 warning 和 info。 请参阅 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 中。
在某些情况下, 如果日志服务器没有收到消息的话就需要调试一番了。 有几个可能的原因, 最常见的两个是网络连接的问题和 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 -vv"
# /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 -vv"
这行应该包涵有 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
此刻, 消息能够被正确接收并保存入文件了。
就像其他的网络服务一样, 在实现配置之前需要考虑安全性。 有时日志文件也包含了敏感信息, 比如本地主机上所启用的服务, 用户帐号和配置数据。 从客户端发出的数据经过网络到达服务器, 这期间既没有加密也没有密码保护。 如果有加密需要的话, 可以使用 security/stunnel, 它将在一个加密的隧道中传输数据。
本地安全也同样是个问题。 日志文件在使用中或循环转后都没有被加密。 本地用户可能读取这些文件以获得对系统更深入的了解。 对于这类情况, 给这些文件设置正确的权限是非常有必要的。 newsyslog(8) 工具支持给新创建和循环的日志设置权限。 把日志文件的权限设置为 600 能阻止本地用户不必要的窥探。
本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.