syslog 配置

作者:Mick Bauer

无论您对 Linux 系统进行何种安全措施,它都必须具有全面、准确和仔细监控的日志。日志有几个用途。首先,它们帮助我们排除几乎所有类型的系统和应用程序问题。其次,它们提供系统滥用的宝贵早期预警信号。第三,当一切都失败时(无论是系统崩溃还是系统 compromise),日志为我们提供关键的取证数据。

本文旨在确保您的系统进程和关键应用程序记录您感兴趣的事件和状态。实现此目的的久经考验的工具是 syslog。 syslog 接受来自内核(通过 klogd)、来自任何和所有本地进程,甚至来自远程系统上的进程的日志数据。它也很灵活,允许您确定记录什么以及记录在哪里。预配置的 syslog 安装是几乎所有 UNIX 和 Linux 变体的基本操作系统的一部分。

因此,本月,我们将深入讨论 syslog 配置和使用,可能比您以前考虑的要详细得多。以我的经验,绝大多数 Linux 用户,甚至管理员,都倾向于使用默认设置保留他们的 syslog 安装,几乎完全不进行调整。这通常不是一个好主意。

我还应该提到,如果您真的对细粒度、灵活的日志记录感兴趣,那么 Balazs Scheidler 出色的 syslog-ng(syslog,新一代)非常值得一看。但它仍然远不如 syslog 那样普及,所以我这次不会做更多的介绍。有关 syslog-ng 的更多信息,请参阅“资源”部分。

klogd 呢?

配置 syslog

每当 syslogd(syslog 守护进程)收到日志消息时,它都会根据消息的类型(或 facility)及其优先级采取行动。 syslog 的操作到 facility 和优先级的映射在 /etc/syslog.conf 中指定。此文件中的每一行都指定一个或多个 facility/优先级选择器,后跟一个操作。一个选择器由一个或多个 facility 和一个(单个)优先级组成。

在以下 syslog.conf 行中,mail.notice 是选择器,而 /var/log/mail 是操作(即,“将消息写入 /var/log/mail”)

mail.notice     /var/log/mail

在选择器中,“mail”是 facility(消息类别),“notice”是优先级级别。

Facilities

Facilities 只是类别。Linux 中支持的 facility 有 auth、authpriv、cron、dæmon、kern、lpr、mail、mark、news、syslog、user、UUCP 和 local0 到 local7。其中一些是不言自明的,但特别值得注意的是

  • auth:用于许多安全事件。

  • authpriv:用于与访问控制相关的消息。

  • dæmon:由系统进程和其他守护进程使用。

  • kern:用于内核消息。

  • mark:由 syslogd 本身生成的消息,仅包含时间戳和字符串“--MARK--”。要指定 mark 之间应经过多少分钟,请使用 -m [分钟] 标志调用 syslogd。

  • user:当应用程序或选择器中未指定 facility 时,默认 facility。

  • local7:启动消息。

  • *:通配符,表示“任何 facility”。

  • none:通配符,表示“无 facility”。

优先级

与 facility 彼此之间没有关系不同,优先级是分层的。Linux 中可能的优先级(按紧急程度递增顺序排列)为:debug、info、notice、warning、err、crit、alert 和 emerg。请注意,给定消息的紧急程度由编写它的程序员确定;facility 和优先级由生成消息的程序设置,而不是由 syslog 设置。

与 facility 一样,也可以使用通配符“*”和“none”。每个选择器只能指定一个优先级或通配符。优先级前面可以带有修饰符“=”和“!”中的一个或两个。

如果在选择器中指定单个优先级(不带修饰符),则实际上是在指定该优先级以及所有更高的优先级。因此,选择器 mail.notice 转换为“所有优先级为 notice 或更高的邮件相关消息”,即,优先级为 notice、warning、err、crit、alert 或 emerg。

此行为可以通过在优先级前面加上 = 来取消。选择器 mail.=notice 转换为“所有优先级为 notice 的邮件相关消息”。优先级也可以被否定:mail.!notice 等效于“除优先级为 notice 或更高的邮件消息之外的所有邮件消息”,而 mail.!=notice 对应于“除优先级为 notice 的邮件消息之外的所有邮件消息”。

操作

在实践中,大多数日志消息都写入文件。如果您在 syslog.conf 中将完整的文件路径列为行的操作,则与该行匹配的消息将被附加到该文件。(如果该文件不存在,syslog 将创建它。)在上面的 syslog.conf 行中,我们指示 syslog 将匹配的消息发送到文件 /var/log/mail。

您也可以将消息发送到其他地方。操作可以是文件、命名管道、设备文件、远程主机或用户屏幕。管道通常用于调试。人们使用的设备文件往往是 TTY,但有些人也喜欢将安全信息发送到 /dev/lp0,即本地行式打印机。已打印出来的日志无法被入侵者擦除或更改,这对于旧的点阵打印机来说是一个极好的用途。

远程日志记录是 syslog 最有用的功能之一。如果您指定一个主机名或 IP 地址,并在其前面加上“@”符号作为行的操作,则与该行匹配的消息将被发送到该远程主机。例如,行

*.emerg          @mothership.mydomain.org

将告诉 syslogd 将所有优先级为 emerg 的消息发送到名为 mothership.mydomain.org 的主机。请注意,远程主机(在本例中为 mothership)的 syslogd 进程需要使用 -r 标志启动,以便它接受您的日志消息。默认情况下,syslogd 不接受来自远程系统的消息。

如果您运行中央日志服务器(我强烈建议这样做),您需要考虑对其传入消息进行某种类型的访问控制。至少您应该考虑 TCPwrappers 的 hosts-access(基于源 IP)控制,甚至可能是本地防火墙规则(ipchains 或 iptables)。

隐蔽日志服务器

更复杂的选择器

您可以在单个 syslog.conf 选择器中列出以逗号分隔的多个 facility。要扩展我们原始的 syslog.conf 行以包括 mail 和 UUCP 消息(仍然是优先级 notice 或更高),您可以使用此行

mail,uucp.notice     /var/log/mail

优先级不是这种情况。请记住,在单个选择器中只能指定一个优先级或优先级通配符。

但是,您可以指定以分号分隔的多个选择器。当一行包含多个选择器时,它们从左到右进行评估;您应该首先列出通用选择器,然后列出更具体的选择器。将选择器视为过滤器:当消息从左到右通过该行时,它首先通过粗过滤器,然后通过更精细的过滤器。

继续我们的单行示例,假设我们仍然希望将重要的邮件和 UUCP 消息记录到 /var/log/mail,但我们想排除优先级为 alert 的 UUCP 消息。那么我们的行看起来像这样

mail,uucp.notice;uucp.!=alert     /var/log/mail

实际上,syslogd 的行为并不像这可能暗示的那样可预测。列出相互矛盾或从具体到一般而不是相反的选择器可能会产生意想不到的结果。因此,更准确地说,为了获得最佳结果,请将通用选择器列在左侧,将其例外情况(和/或更具体的选择器)列在右侧。

在可能的情况下,保持简单。您可以使用 logger 命令来测试您的 syslog.conf 规则(请参阅本文末尾的“使用 logger 测试系统日志记录”部分)。

请注意,在第二个选择器 (uucp.!=alert) 中,我们在优先级之前使用了前缀“!=”来表示“不等于”。如果我们想排除优先级为 alert 及更高(即 alert 和 emerg)的 UUCP 消息,我们可以省略“=”

mail,uucp.notice;uucp.!alert      /var/log/mail

您可能想知道优先级为 info 的 UUCP 消息会发生什么;这与第二个选择器匹配,因此它应该被记录到 /var/log/mail,对吗?根据以上示例,它不会。由于该行的第一个选择器仅匹配优先级为 notice 及更高的邮件和 UUCP 消息,因此此类消息不会针对第二个选择器进行评估。

没有什么可以阻止您使用不同的行来处理 info 级别的 UUCP 消息。如果您愿意,甚至可以有多行处理这些消息。与防火墙规则库不同,每条日志消息都会针对 /etc/syslog.conf 中的所有行进行测试,并在匹配时执行多次操作。

假设我们希望将紧急消息广播给所有已登录用户,并将其写入各自的应用程序日志。我们可以使用类似于清单 1 中所示的示例来实现此目的。请注意写入文件操作前面的“-”符号。这告诉 syslogd 在写入与该行匹配的消息后不要同步指定的日志文件。

清单 1. syslog.conf 文件示例

跳过同步会增加将不一致性(例如丢失或不完整的日志消息)引入这些文件的可能性,但它可以减少磁盘利用率,从而提高性能。因此,在您希望导致频繁文件写入的行中使用减号。

在清单 1 中,我们看到了一些有用的冗余。内核警告以及优先级为 error 及更高(authpriv 消息除外)的所有消息都打印到 X-console 窗口。优先级为 emergency 及更高的所有消息也打印在那里,并且还写入所有已登录用户的屏幕。

此外,所有邮件消息和内核消息都写入其各自的日志文件。所有优先级的所有消息(任何优先级的邮件消息除外)都写入 /var/log/messages。

之前的示例改编自 SuSE 7.1 放在我的系统之一上的默认 syslog.conf。但是,为什么这样的默认 syslog.conf 文件就其本身而言不好呢?为什么要更改它呢?

也许您不需要,但可能应该这样做。在大多数情况下,默认的 syslog.conf 文件要么为重要消息分配至少一个无法有效引起您注意的操作(例如,通过将消息发送到您仅通过 SSH 访问的系统上的 TTY 控制台),要么它们处理至少一种类型的消息,冗余度过高或过低,无法满足您的需求。

表 1 总结了 syslog.conf 语法、facility 值、严重性值和操作类型。请注意,此表的三个主要列是独立的;facility、严重性和操作之间没有相关性,即,消息可以发送到任何 facility 并具有任何严重性,并且可以对其执行任何允许的操作。另请注意,数字 facility 和严重性代码仅供参考;您不应在 syslog.conf 中使用这些代码,但您可能会在源代码或网络流量的数据包转储中遇到它们。

表 1. syslog.conf 用法和值摘要

运行 syslogd

正如默认的 syslog.conf 可能无法满足您的需求一样,syslogd 的默认启动模式可能也需要调整。表 2 和后续段落介绍了与安全性特别相关的一些 syslogd 启动标志,但要获取完整列表,您应该参考手册页 sysklogd(8)。

表 2. syslogd 启动标志

此外,请注意,当您更改和测试 syslog 的配置和启动选项时,通常最好同时启动和停止 syslogd 和 klogd(如果您不知道 klogd 是什么,请参阅侧边栏“klogd 呢?”)。由于以与系统相同的方式启动和停止它们也很有意义,因此我建议您使用系统的 syslogd/klogd 启动脚本。

在大多数 Linux 系统上,此启动脚本位于 /etc/init.d/syslog 或 /etc/init.d/sysklog 中(sysklog 是 “syslog 和 klogd” 的缩写)。

我们将讨论的第一个 syslogd 标志是 Red Hat 7.x 在其 /etc/init.d/syslog 脚本中默认使用的唯一标志:-m 0,它禁用 mark 消息。这些消息仅包含时间戳和字符串“--MARK--”,有些人认为这对于导航冗长的日志文件很有用。其他人则认为它们分散注意力且是多余的,因为无论如何每条消息都有自己的时间戳。

要打开 mark 消息,请在 -m 之后指定一个正非零值,告诉 syslogd 在发送 mark 消息之前应经过多少分钟。请记住,mark 有其自己的 facility,顾名思义,mark,您必须至少指定一个与 mark 消息匹配的选择器(例如 mark.*,它匹配发送到 mark facility 的所有消息,或 *.*,它匹配所有 facility 中的所有消息)。

例如,要使 syslogd 每 30 分钟生成 mark 消息并将它们记录在 /var/log/messages 中,您首先需要向 /etc/syslog.conf 添加类似于以下内容的行

mark.*               -/var/log/messages

然后,您需要像这样启动 syslogd

mylinuxbox:/etc/init.d# ./syslogd -m 30
另一个有用的 syslogd 标志是 -a [socket]。这允许您指定一个或多个套接字,除了 /dev/log 之外,syslogd 可以从中接受消息。

如果您曾经保护过运行 BIND 的名称服务器,您可能使用过 -a 来允许 chroot 的 named 进程将其消息从 chroot jail 中的 dev/log 设备文件反弹到非 chroot 的 syslogd 进程。在这种情况下,由于 named 无法访问 /dev/log,因此它有自己的 /var/named/dev/log。因此,您需要在 /etc/init.d/syslog 中添加如下行

daemon syslogd -m 0 -a /var/named/dev/log

请注意,此行开头的 dæmon 函数是 Red Hat 的 init 脚本函数独有的;这里重要的是

syslogd -m 0 -a /var/named/dev/log
可以指定多个 -a 标志,如下所示
syslogd -a /var/named/dev/log -a /var/otherchroot/dev/log -a /additional/dev/log
继续表 2 中的标志列表,假设您需要测试名为 syslog.conf.test 的新 syslog 配置文件,但不希望覆盖 /etc/syslog.conf,而 /etc/syslog.conf 是 syslogd 默认查找其配置文件的位置。使用 -f 标志告诉 syslogd 使用您的新配置文件
mylinuxbox:/etc/init.d# ./syslogd -f ./syslog.conf.test
我们已经介绍了 -r 标志的用法,该标志告诉 syslogd 接受来自远程主机的日志消息,但我们尚未讨论安全影响。一方面,当您使用集中式日志服务器或执行(几乎)任何其他使您更容易管理和监控日志的操作时,安全性显然会得到增强。

另一方面,您必须考虑不同的威胁模型。您的日志是否敏感?如果日志消息遍历任何不受信任的网络,并且如果最好对发送这些消息的服务器的内部工作原理保密,那么实际上风险可能超过收益(至少,syslogd 未经身份验证的明文远程日志记录机制的特定收益)。

如果情况是这样,您绝对应该考虑使用 syslog-ng。 syslog-ng 可以通过 TCP 协议发送远程消息,因此可以与 stunnel、ssh 和其他可以大大增强其安全性的工具结合使用。由于 syslog 仅使用无连接的 UDP 协议进行远程日志记录,因此无法通过 stunnel 或 ssh 隧道传输其消息,因此 syslog 在本质上不如 syslog-ng 安全。

如果您的日志消息不敏感(至少,您发送到远程记录器的那些消息),那么仍然存在拒绝服务和消息伪造攻击的问题。如果您使用 -r 标志调用 syslogd,它将接受所有远程消息,而不会对消息本身的有效性或其发送者执行任何检查。同样,通过使用 syslog-ng 可以最有效地缓解此风险。

您可以与 syslog 一起使用以部分缓解无效远程消息风险的一种工具是 TCPwrappers。具体而言,TCPwrappers 的 hosts-access 身份验证机制提供了一种简单的方法来定义哪些主机可以通过哪些协议连接到您的日志服务器。Hosts-access 身份验证很容易被源 IP 欺骗所欺骗(尤其是在 syslog 事务严格来说是单向的情况下),但这总比没有好,并且可能足以防止调皮但懒惰的攻击者干扰 syslog。

如果您愿意相信它是,请获取并安装 TCPwrappers(所有现代 Linux 发行版都有它的二进制软件包;有些甚至默认安装它),并参考其 hosts_access(5) 手册页以获取详细信息。请注意,尽管 TCPwrappers 的名称如此,但 hosts access 可以用于控制基于 UDP 的应用程序。

使用 logger 测试系统日志记录

在我们离开系统日志记录器配置和使用的主题之前,我们应该介绍一种工具,该工具可用于测试您的新配置,而无需考虑您使用哪个日志守护进程。 logger 是一个命令行应用程序,它将消息发送到系统日志记录器。除了作为诊断工具的相关性之外,logger 特别适用于向 shell 脚本添加日志记录功能。

我们在此处感兴趣的用法是诊断。(虽然,仔细想想,您真的应该在您经常运行的任何重要脚本中使用此工具,尤其是那些通过 cron 或 at 无人值守运行的脚本。)解释如何在这方面使用 logger 的最简单方法是举例说明。

假设您已重新配置 syslog,以将所有优先级为“warn”的守护进程消息发送到 /var/log/warnings。要测试新的 syslog.conf 文件,您首先需要重新启动 syslogd 和 klogd,然后输入如下命令

mylinuxbox:~# logger -p daemon.warn
"This is only a test."

如您所见,logger 的语法很简单。-p 参数允许您指定 facility/优先级选择器。此选择器之后的所有内容以及任何其他参数或标志都被视为消息。

因为我是一个快速打字员,所以我经常在交互式 bash 会话中使用 while-do 循环来运行即兴脚本(实际上是复杂的命令行)。以下 bash 命令序列可以在交互式或脚本中工作

mylinuxbox:~# for i in
> do
> logger -p daemon.$i "Test daemon message, level $i"
> done

这会将测试消息发送到所有八个优先级的守护进程 facility。清单 2 以实际脚本的形式呈现,生成每个优先级级别所有 facility 的消息。

清单 2. 为每个优先级级别生成所有 Facility 的消息

结论

希望这足以让您开始构建、测试和使用自定义 syslog 配置。愿您的日志详细、丰富、受到密切关注且无趣!

资源

电子邮件:mick@visi.com

Mick Bauer (mick@visi.com) 是双子城地区的网络安全顾问。自 1995 年以来,他一直是 Linux 的忠实拥护者,自 1997 年以来,他一直是 OpenBSD 的狂热爱好者,并且喜欢让这些尖端的操作系统在过时的垃圾上运行。

加载 Disqus 评论