FreeBSD 使用手册
上一页 | 第29章 　网络服务器 | 下一页

# 29.11 使用 `syslogd` 记录远程主机的日志

Contributed by Tom Rhodes.

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

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

## 29.11.1 日志服务器的配置

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

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

- 服务器和客户端的防火墙规则允许 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` 日志中查阅相关输出。

## 29.11.2 日志客户端配置

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

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

- 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` 中。

## 29.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 -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

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

## 29.11.4 安全性方面的思考

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

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

上一页 | 起始页 | 下一页
通过 NTP 进行时钟同步 | 上一级 | 防火墙

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

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