15.1 SYSLOG

image-center

syslog 是计算机系统中 消息日志的标准,通过该标准,允许把生成日志的软件、保存日志的系统、报告及分析日志的软件分离开来。每条消息都打上标签,以表明生成日志的软件类别及严重级别。

syslog 可用于系统管理及安全审计,也可用于生成、分析、调试信息。多种硬件平台都使用该标准,如打印机、路由器等。于是,在一个中央信息库中,完全可以把来自不同系统的日志数据合并到一起。

syslog 存在于多种操作系统中,并且成为类 Unix 系统中日志系统的标准配置,同时也普遍存在于网络设备中,如路由器。

系统日志消息的发起者提供的信息包括 设施代码严重性级别。在将条目传递给 syslog 接收器之前,syslog 软件将信息添加到信息头中,包括发起者进程 ID,时间戳以及设备的主机名或 IP 地址。

syslog 是 UNIX 的标准日志解决方案。syslog 这个术语可以表示 syslog 这个协议,也可以表示一个 C API,不过更普遍的还是表示二者的实施。

15.1.1 Logger

日志消息可以被定向到各种目标,如控制台、文件、远程 syslog 服务器、中继器等。

大多数 syslog 实施方案都提供一个命令行工具,称为 logger,也会提供一个链接库,用于把消息发送给日志,一些实施方案会包含报告程序,可以用于过虑消息,以及消息的显示。

15.1.2 网络协议

在网络上操作时,syslog 实施方案可以 client-server 方式部署,服务器在预定的端口上侦听来自客户端的协议请求。用于网络日志的应用最广泛的传输层协议为 UDP,其服务器侦听的端口为 514。

15.2 RSYSLOG

rsyslog 是一个开源的 软件,用于在 IP 网络中转发日志消息。在部署基础 syslog 协议的同时,rsyslog 将其扩展,使用基于内容的过滤,丰富的过滤功能,灵活的配置方式,并增加了诸如使用 TCP 来传输 的功能。

RSYSLOG 的官网将其定义为 “the rocket-fast system for log processing”

rsyslog 系统仅能记录较为简单的事件格式,并非所有应用程序都会使用 syslog 记录。rsyslog 是负责收集 syslog 的程序,可以用来取代 syslogd 或 syslog-ng。

以前用 syslogd,从 CentOS 6 开始,使用 rsyslogd 来管理日志。

15.2.1 配置文件

/etc/rsyslog.conf

其配置文件会指定 rsyslog 需要记录 哪些服务什么等级 以及 需要记录在什么设备或文件 的信息。

配置文件中的每条规则由两个字段组成:选择字段,行为字段

服务名称[.=!]信息等级 信息记录的文件名或设备或主机

mail.info            /var/log/maillog_info

解释:mail 服务产生的 info 等级以上的信息,都记录到 /var/log/maillog_info 文件中。

每种服务产生的数据量差异很大,可以在配置文件 /etc/rsyslog.conf 中为每种服务指定各自的日志保存位置,以便 将不同服务的日志,保存在各自的日志文件中

选择字段

选择字段由两部分组成:服务类别(facility)、优先级(priority),均为大小写敏感。

虽然二者均可用数字表示,但通常使用名字来表示,更容易理解和使用。

服务类别

rsyslog 使用 facility 来指定生成消息的子系统。

多数情况下,任何人可以保存任何类别的日志,但只有内核才可以保存内核类别的日志。

相对序号 服务类别 说明
0 kern 内核
1 user 用户级
2 mail 邮件系统
3 daemon 系统守护进程
4 auth 安全、认证
5 syslog syslogd 内部产生的消息
6 lpr 打印服务
7 news 新闻组
8 uucp Unix to Unix Copy Protocol,unix 主机间的程序数据交换
9 cron 计划任务
10 authpriv ssh,ftp 等登录信息的验证信息
11 ftp FTP 服务
16~23 local0 ~ local7 用户自定义
  • 可以用星号 * 表示所有类别的服务
  • 一条规则中,针对一个优先级,可以同时指定多个服务类别,用逗号 , 分隔
  • 针对一个行为,可以指定多个选择字段,中间用分号 ; 分隔。这些选择字段从左至右依次处理,每个字段都可以覆盖前面的字段。用这种方法可以排除一些优先级。
优先级

决定日志信息的重要性。同一个服务所产生的信息,按照重要性分为八个等级:

等级 名称 说明
  none 什么都不记录
7 debug 调试
6 info 一般
5 notice 需要注意
4 warning 警告
3 err 错误
2 crit 危急
1 alert 严重警告,需立即采取行动
0 emerg 紧急,系统不可用

可以用星号 * 表示所有优先级。用 none 表示无优先级。

条件语句

选择字段中,服务类别与优先级用句点 . 连接起来,形成一个日志生成的条件语句。

. xxx:小于等于 xxx 级别的日志信息。

.= xxx:等于 xxx 级别的日志信息

.! xxx:大于等于 xxx 的等级的日志信息

.!= xxx: xxx 的等级的日志信息

.*所有 等级的日志信息

行为字段

行为字段用于描述日志文件,这里,日志文件是一个 抽象的概念。它不一定非要是个真实的文件。

普通文件

日志消息通常是保存到实体文件中的,需用绝对路径表示。

*.info;mail.none;authpriv.none;cron.none /var/log/messages

命名的管道

命名的管道,即 FIFO 文件。文件名前必须加上 | 前缀。而且该 FIFO 文件必须在 rsyslogd 启动之前使用 mkfifo 命令提前创建好。

终端或控制台

可以把日志文件指定为一个 tty 终端。

远程主机

syslogd 支持 远程日志。可以向远程主机 发送 消息,也可以从其 接收,远程主机不会继续转发消息,而会将其保存在本地日志。

如果需要将日志继续转发给其它主机,可以指定日志文件为一个主机名,主机名前面要加上 @ 前缀。

如果多个主机可以远程保存日志到当前主机,利用这个功能,可以在一个 中央主机 上收集所有的 syslog 消息。

来自远程主机的消息可以被发送给一个日志程序,通过逐行读取日志消息,该程序有能力在中央日志主机中根据主机名或程序名来整理日志。借此能力,完全可以把日志分割到多个单独的文件中去。

用户列表

重要的消息通常也会给当前主机的 root 转发一份,可以指定一个需要在终端收到日志消息的用户列表。

多个用户可以用 , 分隔。

用户登陆后,就会在终端收到日志信息。如 *.alert root,joey

所有登陆者

紧急事件消息需要发给所有在线的人,使用星号 * 表示。

15.2.2 配置文件范例

普通日志

将 mail 日志写入 /var/log/maillog

mail.info   /var/log/maillog

任何严重等级小于等于 info 的信息,都会被写入到 /var/log/maillog

同一程序不同级别消息分开保存

新闻组及计划任务的日志写入 /var/log/cronnews

另外还要求,newscron 的警告信息单独记录到 /var/log/cronnews.warn 中。

news.*;cron.*     /var/log/cronnews
news.=warn;cron.=warn /var/log/cronnews.warn

排除特定程序

cron,mail,news 的日志不要记录到 /var/log/messages

*.*;news,cron,mail.none      /var/log/messages
*.*;news.none;cron.none;mail.none /var/log/messages

使用逗号 “,” 分隔日志名称时,意味着这些服务要使用同一个优先级,因此只需在最后一个名称后指定等级即可。

如果用分号 “;” 来分隔,意味着不同服务、不同优先级要使用同一个日志文件,每个服务名称后都要指定各自的等级。

rsyslog.conf 默认配置分析

以下为 CetnOS 7 默认配置:

#kern.*    /dev/console

只要是核心产生的日志,全部发送到控制台接口(console),即计算机的 RS-232 串口。

*.info;mail.none;authpriv.none;cron.none  /var/log/messages

由于 mail, authpriv, cron 产生的日志较多,而且已经单独保存到各自的日志文件,因此在 /var/log/messages 里面就不再记录。除此之外的其他信息都写入 /var/log/messages 中。

因此这个文件很重要。

authpriv.*    /var/log/secure

认证相关的日志写入 /var/log/secure 文件。

mail.*    -/var/log/maillog

邮件服务日志写入 /var/log/maillog 文件。

/var/log/maillog 前面的减号 - 的作用: 由于邮件所产生的信息比较多,因此我们希望这些信息暂存在内存中,等数据量足够多时才一次性将其存入磁盘,有助于提升日志文件的存取性能。

cron.*    /var/log/cron

计划任务日志写入 /var/log/cron 文件;

*.emerg   :omusrmsg:*

当产生最严重的错误时,将该等级的日志以 wall 的方式广播给所有在线用户,以便在线用户立即通知系统管理员。

uucp,news.crit    /var/log/spooler

uucp 是早期类 Unix 系统进行数据传递的通讯协议,后来常用在新闻组。当新闻组有严重错误日志时写入 /var/log/spooler 文件。

local7.*   /var/log/boot.log

将本机启动时应显示到屏幕的信息写入 /var/log/boot.log 文件。

自定义日志文件

通过单独指定日志文件来另存一个日志文件。

修改 /etc/rsyslog.conf 配置文件

*.info  /var/log/admin.log

重启 rsyslogd

~]# systemctl restart rsyslog.service
~]# ll /var/log/admin.log
-rw-r--r--. 1 root root 325 Aug 20 00:54 /var/log/admin.log

15.2.3 日志文件的格式

rsyslog 生成的日志其格式为:

  • 日期与时间
  • 主机名
  • 服务、指令或函数
  • 具体信息
[root@study ~]# cat /var/log/secure | tail -4
Nov  5 19:33:27 zion sshd[1140]: Server listening on 0.0.0.0 port 22.
Nov  5 19:33:27 zion sshd[1140]: Server listening on :: port 22.
Nov  5 19:34:56 zion sshd[1407]: Accepted password for root from 192.168.1.5 port 5318 ssh2
Nov  5 19:34:57 zion sshd[1407]: pam_unix(sshd:session): session opened for user root by (uid=0)
# 日期	时间	主机名	服务/函数	详细说明

15.2.4 日志文件的安全性设置

基于安全考虑,日志文件应该 只可追加,不能删除。可通过 chattr 修改隐藏属性 来实现。

~]# chattr +a /var/log/admin.log

但是,root 仍然是突破隐藏属性的最后一道关卡。

另外,使用 logrotate 进行日志文件滚动时,必须修改 logrotate 的配置文件,以确认其有权操作日志文件。

15.2.5 LOGGER 命令

logger 是 syslog 提供的一个 shell 命令接口,借此使用 syslog 的系统日志模块。

可以从命令行直接向系统日志文件 写入 日志条目。

可以将文件,或者自定义的字符串信息通过 syslog 的方式打印到预设的日志文件中,还可以设置日志级别,打印进程 PID 等。

语法

logger [-p 服务名称.等级] "信息"

以当前用户身份直接把字符串写入日志

~]# logger -p user.info "I will check logger command"

~]# journalctl SYSLOG_FACILITY=1 -n 3
-- Logs begin at Mon 2015-08-17 18:37:52 CST, end at Wed 2015-08-19 18:03:17 CST. --
Aug 19 18:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[29710]: starting 0yum-hourly.cron
Aug 19 18:01:01 study.centos.vbird run-parts(/etc/cron.hourly)[29714]: finished 0yum-hourly.cron
Aug 19 18:03:17 study.centos.vbird dmtsai[29753]: I will check logger command

范例

把前面自定义的备份服务脚本更新一下,允许在备份前和备份后在日志加加注释文字。

运行 /backups/backup.sh log 命令,手动在日志中增加备份开始和结束的注释,从而可以追溯备份的开始结束时间。

~]# vim /backups/backup.sh
#!/bin/bash

if [ "${1}" == "log" ]; then
        logger -p syslog.info "backup.sh is starting"
fi
source="/etc /home /root /var/lib /var/spool/{cron,at,mail}"
target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz"
[ ! -d /backups ] && mkdir /backups
tar -zcvf ${target} ${source} &> /backups/backup.log
if [ "${1}" == "log" ]; then
        logger -p syslog.info "backup.sh is finished"
fi

[root@study ~]# /backups/backup.sh log
[root@study ~]# journalctl SYSLOG_FACILITY=5 -n 3
Aug 19 18:09:37 study.centos.vbird dmtsai[29850]: backup.sh is starting
Aug 19 18:09:54 study.centos.vbird dmtsai[29855]: backup.sh is finished

15.2.6 日志文件服务器

rsyslogd 本身具有日志文件服务器的功能,默认没有开启。开启后,该服务的监听端口为 UDP 514 或 TCP 514。

image-center

如图所示,服务器会启动监听的端口,客户端则将日志文件转存一份,传送到服务器。

配置文件

服务端

修改 /etc/rsyslog.conf

$ModLoad imtcp
$InputTCPServerRun 514

重启 rsyslog 服务

~]# systemctl restart rsyslog.service
~]# netstat -ltnp | grep syslog
Proto Recv-Q Send-Q Local Address  Foreign Address   State    PID/Program name
tcp        0      0 0.0.0.0:514    0.0.0.0:*         LISTEN   2145/rsyslogd
tcp6       0      0 :::514         :::*              LISTEN   2145/rsyslogd
客户端

修改 /etc/rsyslog.conf,新增一行:

*.*       @@192.168.1.100
#*.*       @192.168.1.100  # 若用 UDP
~]# systemctl restart rsyslog.service

15.2.7 RSYSLOG 的缺点

基本上就是 syslog 的缺点。

缺乏结构

rsyslog 会把日志消息写入纯文本文件中。虽然 UNIX 有很多优秀的工具可以处理纯文本文件,但 结构的缺乏 是几乎所有 syslog 问题的根源。

查找困难

在一个巨大的纯文本文件中 查找信息非常困难,因为其中存在着大量的不相关信息。rsyslog 通常允许管理员根据预定义的主题来切割文件,但随之而来的是一些小文件,又要考虑如何把所有文件的相关部分组织到一起。

管理成本

另外,syslog 协议无法按程序定义的标签把消息分开,syslog 无法处理这些元信息。比如,web 服务器通常保存自己的访问日志,以避免其状态信息充斥整个系统日志。 这样一来,类似的程序都要保存自己的日志,而这些独立的配置文件、独立的消息源都要靠管理员来 手动管理

滚动问题

纯文本的日志文件也需要日志滚动(rotation),以防止它们变的太大。在日志滚动时,现有的日志文件会被重命名、压缩。任何需要通过 syslog 消息来查看问题的程序,都要面对 “日志滚动期间无法查看日志” 的问题,通常需要另外的工具帮忙来告知所有程序,何时日志在滚动,何时重新可用。

多行消息

因为日志文件写入消息时会以换行符做为结尾,因此 日志消息中无法包含换行符。这一点让程序无法生成多行信息,但有时程序会需要这样的信息来追溯错误。同样,日志解析软件需要额外付出很大的精力来合并多行消息。

本地时间戳

使用本地时间戳,本地设置不对的话,将导致不同服务器上的日志时间不一致。

无进程验证

不对写入进程进行验证,任何一个进程不需要任何权限都可以伪装成其它进程来生成日志。

无权限控制

任何进程都可以读写其他进程的日志。

滚动功能弱

只支持定时滚动,不支持根据日志大小进行滚动,被攻击后会导致磁盘写满。

无法记录启动日志

由于 rsyslogd 必须要在启动完成后,再执行 rsyslogd 守护进程,日志才会开始记录。内核不得不自己用一个 klogd 的服务,来专门记录启动过程、启动服务过程中的日志,然后等 rsyslogd 启动后再传递给它处理。

15.3 JOURNALD

systemd-journald.service

systemd-journald 是一个收集并存储 各类日志数据系统服务。它基于来自各处的日志信息,创建并维护结构化的、有索引的日志数据库。

journald 是为 Linux 服务器打造的新系统日志方式,它标志着 文本日志文件的终结

journald 最大的不同就是抛弃了纯文本日志文件,改为使用为日志消息优化过的 特殊文件格式,该格式允许管理员更高效地访问所需消息,它把 “由数据库驱动的中央日志系统的” 某些能力也带到了独立的系统中。

但同时,它不包含预定义的远程日志的实施,只是依靠现有的 syslog 实施方案,把消息中转到中央日志主机,从而失去了新系统的大部分优势。

journal 是 systemd 的一个组件,由 journald 处理。它捕获系统日志信息、内核日志信息,以及来自原始 RAM 磁盘的信息,早期启动信息以及所有服务中写入标准输出和标准错误数据流的信息。

journald 快速改变着服务器处理日志信息与管理员访问日志的方式。

15.3.1 日志文件

journald 以安全和不可假冒的方式,隐式地为每条日志消息收集 大量元数据字段。搜集来的日志数据主要是基于 文本 的,不过需要时也 可以包含二进制数据。日志中单独字段的大小甚至可以高达 2^64-1 字节。

journald 可以用持续的方式把日志保存在 /var/log/journal 目录中,也可以一次性地保存在 /run/log/journal 目录中,后者在重启后会丢失。默认情况下,系统启动时只要找到 /var/log/journal 目录,就会持续保存日志于其中,如找不到再退而求其次,使用易失性存储 /run/log/journal。即系统 优先考虑持续保存日志

在配置文件 journald.conf(5) 中修改 Storage= 参数,可以 指定日志数据保存的位置

journald 把日志全部保存到日志目录的 二进制文件 中,只能用 journalctl 命令来查看,并可使用特定字段 过滤输出,以单独显示某个服务的日志。

15.3.2 字节流的保存

systemd 服务管理器调用所有的服务进程时,会 默认 将其标准输出和标准错误全部 连接到 journal。该行为可以在单元文件中借助 StandardOutput=StandardError= 参数来修改。journal 将其收到的日志字节流在换行 \n 和空字符 NUL 处切割,然后 转换 成单独的日志记录予以保存。

15.3.3 访问控制

日志文件默认为 systemd-journal 系统组所有,并仅对该组开放读取权限,但无写入权限。把用户加入该组,则该用户有权读取日志文件。

每个登陆用户默认会产生自己的日志文件,但这些文件并不属于他们,为了防止用户直接修改日志,文件系统使用 ACL 来确保用户只可以读取。

借助 ACL,可以允许附加的用户和组来访问日志文件。如允许 whelladm 系统组读取:

# setfacl -Rnm g:wheel:rx,d:g:wheel:rx,g:adm:rx,d:g:adm:rx /var/log/journal/

15.3.4 文件

配置文件

/etc/systemd/journald.conf journald 配置文件

日志文件

/run/log/journal/machine-id/*.journal

/run/log/journal/machine-id/*.journal~

/var/log/journal/machine-id/*.journal

/var/log/journal/machine-id/*.journal~

journald 会把条目写入 /run/log/journal/machine-id//var/log/journal/machine-id 中的 .journal 文件,如果 journald 守护进程未彻底暂停,或文件被损坏,日志会被重命名为 .journal~,然后,journald 会开始写入一个新文件。

监听对象

/dev/kmsg

/dev/log

/run/systemd/journal/dev-log

/run/systemd/journal/socket

/run/systemd/journal/stdout

以上是 journald 会监听的对象,除了这些套接字和路径,它还可以使用网络链接来监听审计事件。

15.3.5 用 journalctl 查看日志

journalctl 命令用于查询由 journald 生成的日志。

journalctl [-nrpf] [--since TIME] [--until TIME] _optional

默认会列出全部内容,可以用参数过滤。

-n 列出最近几行

-r 反向输出,旧的排最后

-p 用优先级过滤,只显示重要性大于等于指定优先级的日志

-f 实时监测

--since --until 设置开始时间与结束时间,可以分开使用,也可同时使用

_SYSTEMD_UNIT= 查看指定单元的日志

_COMM= 查看指定命令的日志

_PID= 查看指定 PID 的日志

_UID= 查看指定 UID 的日志

SYSLOG_FACILITY=[0-23] 用服务类型序号过滤

查看所有日志

~]# journalctl

本次系统启动以来的所有日志。

查看 指定日期 的日志

~]# journalctl --since "2015-08-18 00:00:00" --until "2015-08-19 00:00:00"
~]# journalctl --since today
~]# journalctl --since yesterday --until today

查看 指定单元 的日志

~]# journalctl _SYSTEMD_UNIT=crond.service -n 10   # 最近10行

查看 指定命令 的日志

~]# journalctl _COMM=su _COMM=login -n 10

查看 su 和 login 的日志。

查看 指定等级 的日志

~]# journalctl -p err

查看 指定程序类型 的日志

~]# journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10

程序类型用日志设备的 相对序号 表示,4 为 pam产生的日志,10 为登录信息的验证信息。

实时监控日志

~]# journalctl -f

15.3.6 JOURNALD 的优势

结构化日志文件

journald 尝试解决 syslog 的历史问题,于是用一个更加结构化的格式来替代纯文本文件。同时,通过提供相同的 C API,journald 与 syslog 完全兼容,它不仅提供相同的协议,而且还会把消息的纯文本版本转发给现有的 syslog 系统。

journald 的 API 支持结构化的数据,日志消息不仅包含固定的字段列表,而且 允许程序定义自己的消息字段。新的日志格式实现了针对任何字段都能进行快速的访问和读取。通过直接使用空间优化格的式,消除了日志滚动,不再需要重命名文件来存档条目。同时,还会自动限制磁盘上日志文件的大小。这些让程序处理日志时变得更加轻松。

对于这种特殊的日志文件格式,journald 提供一个专门的工具 journalctl 来处理。该程序可以快速地访问条目,并且支持用日期、发起程序、程序 PID、UID、服务或其它要素来过滤。

有了这种快速访问的格式,现在可以用 systemctl 来随时快速查看状态,同时在返回的信息中会包含该服务 最近的几个日志条目,甚至可以实现类似于 tail -f 的效果,实时地观察 特定类型的新的日志条目。另外,journalctl 不仅能访问当前系统的日志文件,还可以访问其它系统的备份日志文件。

简言之,新的日志格式使 程序更容易找到自己想要的信息,而且是以 结构化 的方式,同时还可以轻松地 实时追踪新日志 消息流。

JOURNALD 安全机制

封印保护

如果系统被攻破,攻击者会尝试掩盖自己的行踪,以便不被管理员发现。攻击者掩盖行踪的一种方法就是删除日志条目。journald 带来的一个新功能称为 封印保护,Forward Secure Sealing,FSS,用来 检测对日志文件的篡改

网络日志系统能够轻易地防止日志的篡改,但 journald 至少提供了一个在单一系统中检测日志篡改的方法,虽然它无法提供外部日志可提供的所有保障。

启用封印保护之后,日志中的所有条目都是加密哈希过的,文件中包含先前条目的哈希值。这样的结果是一个条目链,每一个条目都可以认证之前的全部。如果最顶端的哈希通常都保存在一个只读的位置,整个链条都可以通过它认证。检测攻击者的修改将变得十分容易。

密钥

封印保护是基于两个密钥,用 journalctl --setup-keys 产生。

一个密钥是封印密钥,保存在系统中,另一个为验证密钥,应安全地保存在别处。

新的封印密钥会按一定频率以不可逆方式生成,旧密钥会被删除。

验证密钥可以用于计算任何时间段内的封印密钥。这意味着攻击者只能访问当前的封印密钥,而管理员则可以可靠地生成任何封印密钥,以验证之前的日志文件封印。如果有人修改了上一个封印之前的日志条目,就会返回验证失败。

封印频率

封印保护的基本概念是,可以对 journald 的二进制日志 以一定的频率进行封印,封印是对日志数据进行一种加密操作,任何先于封印的篡改会被检测到。只要在攻击者取得机会篡改之前进行了封印,他们的足迹就会与其它日志数据一起被封印。他们仍然可以删除日志文件条目,但照样会被注意到。

封印保护默认每 15 分钟封印日志一次。该频率可以在生成密钥时使用 --interval=10s 来修改。生成封印密钥时,会使用系统时钟时间,

缺陷

攻击者入侵系统之后,完全可以重新生成整个日志,导致该检测毫无意义。

唯一保证日志安全性的方法是使用一个 物理的、只追加的设备 来保存日志(如网卡)。并且一旦系统被入侵,后续追加的日志都是无法保证可靠性的。

稳定性

内存存储

日志默认保存在内存文件系统 /run/systemd/journal 中,可以在磁盘损坏的情况下工作

日志滚动

通过监测日志文件大小进行日志滚动。

不错的性能

使用新的二进制格式的日志文件,通过偏移来定位日志位置,避免了文本型日志遍历的低性能。

通过引用相同日志来压缩何种,尽管 journal 记录了更多的元数据信息,但磁盘占用却无明显变化。

权限控制

可以控制用户对日志的访问。从非特权登陆用户发来的消息,用户的日志文件被分别独立保存。使用 POSIX ACL 进行读取权限的控制,保证用户可以访问自己的日志文件。默认情况下,普通用户无权访问系统服务生成的日志条目,除非用户加入特权组。

客户端认证

systemd 在生成日志时,会在日志中添加元数据信息,由 journald 显式生成的元信息其字段名都有下划线 _ 做前缀,这些字段称为 可信字段。这些字段的信息无法被客户端修改。因此,普通权限的应用再也无法伪造身份了。

15.3.7 JOURNALD 的劣势

远程日志。

来自多个不同系统的日志被发送到一个中央日志主机,通常保存在数据库中,这种方式逐渐成为了日志管理的标准。这些中央日志主机解决了许多与 journald 一样的 syslog 问题。通过特定的规范,实现了快速访问日志消息,以及追踪新日志并生成报告。

因为这些中央日志系统使用基于文本的 syslog 守护进程,它们必须用正则表达式,从单行纯文本日志消息中提取程序的自定义字段,journald 允许应用程序发送中央系统能直接使用的键-值字段,而无需使用表达式。可惜的是,journald 没有提供远程日志解决方案。systemd-journal-remote 只是一个概念,并不是一个实用的工具,缺少良好的认证机制。有一些尚处于试验阶段的第三方程序包,如 journald-forwarder。基于此原因,远程日志管理仍然要信赖于现有的 syslog 体系及协议,因此 在远程日志方面,无法使用 journald 的结构化的数据

虽然可以把结构化的数据发送给 syslog,但对其功能少有支持。rsyslog 的当前版本提供了 imjournal 模块,可以导入一些结构化的数据,但仅对一部分的数据进行了映射,而且不支持应用程序自定义的字段。而且就性能表现来看,rsyslog 也不建议使用该模块。

15.6 日志解析

15.5.1 LOGWATCH

CentOS 7 内置的 logwatch 是一个强大的日志解析和分析工具。它的设计目的在于给出一个服务器中所有活动的 统一的报告,可以发送到终端或通过邮件发给管理员。

logwatch 并不提供实时警告,它会生成一个由系统整理出来的摘要,便于查验。也可以与脚本配合生成更详细的报告。

logwatch 默认用邮件发送日志摘要。

如果没有安装,可以使用 yum install logwatch 在线安装。安装好以后,会生成 /etc/cron.daily/0logwatch 文件。

~]# ll /etc/cron.daily/0logwatch
-rwxr-xr-x. 1 root root 434 Jun 10  2014 /etc/cron.daily/0logwatch
~]# /etc/cron.daily/0logwatch