# rsyslog.service 记录登录文件的服务

Linux 的日志文件主要是由 rsyslog.service 在负责,检查该服务是否有启动

[root@study system]# ps aux | grep rsyslog
root      1376  0.0  0.0 216420  7316 ?        Ssl  Mar17   0:11 /usr/sbin/rsyslogd -n

[root@study system]# systemctl status rsyslog.service 
* rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-03-17 10:49:56 CST; 3 days ago
     Docs: man:rsyslogd(8)
           http://www.rsyslog.com/doc/
 Main PID: 1376 (rsyslogd)
    Tasks: 3
   CGroup: /system.slice/rsyslog.service
           `-1376 /usr/sbin/rsyslogd -n

Mar 17 10:49:55 study.centos.mrcode systemd[1]: Starting System Logging Service...
Mar 17 10:49:56 study.centos.mrcode rsyslogd[1376]:  [origin software="rsyslogd" swVersion="8.24.0-38.el7" x-pid="1376" x-info="http://www.rsyslog.com"] start
Mar 17 10:49:56 study.centos.mrcode systemd[1]: Started System Logging Service.
Mar 17 11:07:02 study.centos.mrcode rsyslogd[1376]:  [origin software="rsyslogd" swVersion="8.24.0-38.el7" x-pid="1376" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
# 确实在运行,并且是开机启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 配置文件 /etc/rsyslog.conf

rsyslogd 的配置文件是 /etc/rsyslog.conf,可以针对各种服务与信息记录在某些文件的配置,该文件规范了

  1. 什么服务
  2. 什么等级
  3. 需要被记录在哪里(设备或文件)

语法如下

服务名称[.=!]信息等级	 信息记录的文件名或设备或主机
# 下面以 mail 服务产生的 info 等级为例
mail.info			  /var/log/maillog_info
# 这一行含义:mail 服务产生的大于等于 info 等级的信息,都记录到后面的指定文件中
1
2
3
4

# 服务名称

rsyslogd 主要还是通过 Linux 核心提供的 syslog 相关规范来设置数据的分类,Linux 的 syslog 本身有规范一些服务信息,可以通过这些服务来存储系统的信息。主要认识的服务类型有如下:(可使用 man 3 syslog 或查询 syslog.h 文件来了解)

相对序号 服务类别 说明
0 kern(kernel) 核心产生的信息,大部分是硬件侦测以及核心功能的启用
1 user 在用户层级所产生的信息。例如后续会介绍到使用 logger 指令来记日志文件的功能
2 mail 只要与邮件收发有关的信息记录都属于这个
3 daemon 主要是系统的服务所产生的信息,例如 systemd
4 auth 主要与认证授权有关的机制,例如 login、ssh、su 等需要账户密码的
5 syslog syslog 相关协议产生的信息,其实就是 rsyslogd 程序本身产生的信息
6 lpr 打印相关信息
7 news 与新闻组服务器有关
8 uucp Unix to Unix Copy Protocol ,早期用于 unix 系统间的程序数据交换
9 cron 定时任务 cron/at 等产生信息记录的地方
10 authpriv 与 auth 类似,但记录较多账户私人的信息,包括 pam 等模块的运行
11 ftp 与 FTP 通信协议有关信息的输出
16~23 local0~local7 保留给本机用户使用的一些日志文件信息,较常与终端机互动

上述列出的都是 Linux 核心的 syslog 函数自行制定的服务名称,软件开发商可以通过调用上述服务名称来记录他们的软件日志信息。

比如:sendmail 与 postfix 和 dovecot 都是与邮件有关的软件,这些软件在设计日志文件记录时,都会主动调用 syslog 内的 mail 服务名名称(LOG_MAIL)。所以上述三个服务的信息在 syslog 看来就是 mail 类型的服务了,这个概念如下图所示

image-20200320172449541

另外每种服务所产生的数据量差异很大,比如 mail 的信息就很大,为了让不同的信息放置到不同的文件中,可以使用 /etc/rsyslog.conf 来规范他们分类存放

# 信息等级

Linux 核心的 syslog 将信息分为 7 个主要等级

等级数值 等级名称 说明
7 debug 用来除错时产生的信息数据
6 info 一些基本的信息说明
5 notice 虽说是正常信息,但比 info 还需要被注意到的一些信息
4 warning(warn) 警告信息,可能有问题,但是还不至于影响到某个 daemon 运行的信息。
3 err(error) 一些重大的错误信息。例如配置文件某些设置导致无法启动服务的信息说明
2 crit 比 error 还严重的错误信息,是 critical 临界点的缩写,很严重的错误信息
1 alert 警告警告,已经很有问题的等级,比 crit 还严重
0 emerg(panic) 疼痛等级,系统几乎要宕机的状态!大概只有硬件出问题,导致整个核心无法顺利运行的情况了吧

除了 0~6 之外,debug 与 none(不需记录等级?)是两个特殊的,当需要调试错误或则忽略掉某些服务的信息时,就可以使用他们

在信息等级前有一些特殊符号 [.=!] 他们的含义如下:

  • .:代表:比后面还要严重的等级(含该等级)都被记录下来

  • .=:代表所需要的等级等于后面的等级,才记录

  • .!:不等于,除了该等级之外的都记录

# 信息记录的文件名或设备或主机

表示该信息要存放在哪里的配置。通常是记录在文件,下面是一些常见的放置:

  • 文件的绝对路径:通常放在 /var/log/
  • 打印机或其他:例如 /dev/lp0
  • 使用者名称:显示给用户
  • 远程主机:例如 @study.mrcode.tsai ,当然需要对方主机要能支持接收才可以
  • *:目前在线的所有人,类似 wall 指令

# 服务、daemon 与函数名称

syslog、rsyslogd、rsyslog.service 咋会有这么多名称,可以如下来看待

  • syslog

    是 Linux 核心所提供的日志文件设计指引,所有的要求大概都写入到一个名为 syslog.h 的文件中。如果你想要开发与日志文件有关的软件,就需要遵循这个 syslog 函数的要求去设计才行,可以使用 man 3 syslog 查询相关数据

  • rsyslogd

    为了要达成实际上进行信息的分类所开发的一套软件,这就是最基本的 daemon 程序

  • rsyslog.service

    为了加入 systemd 的控制,rsyslogd 开发者设计的启动服务脚本

    早期 CentOS 5.x 以前要完成 syslog 的功能由 syslogd 的 daemon 来完成,现在则是由 rsyslogd 的 daemon 来完成

# rsyslog.conf 语法练习

例题:将 mail 相关数据给它写入 /var/log/maillog

mail.info	/var/log/maillog
1

例题:将新闻组资料 news 以及定时任务 cron 的信息都写入到一个名为 /var/log/cronnews 的文件中,但是他们的警告信息则额外记录在 /var/log/cronnews.warn

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

例题:message 文件需要记录所有的信息,但是不要记录 cron、mail、news 的信息

*.*;news,cron,mail.none						/var/log/messages
*.*;news.none;cron.none;mail.none			/var/log/messages
# 两种方式,第一种用了逗号语法来完成重复的配置
1
2
3

# CentOS 7.x 预设的 rsyslog.conf 内容

[root@study ~]#  vim /etc/rsyslog.conf
# rsyslog configuration file
....
上面省略了很多配置,主要是下面的 RULES

#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
  • #kern.*

    只要是核心产生的信息,都送到 console (终端机)去。console 通常是外部设备连接到系统的,比如,很多封闭的主机(无键盘无屏幕),可以通过连接 RS232 端口将信息输出到外部系统中

  • *.info;mail.none;authpriv.none;cron.none

    由于 mail、authpriv、cron 软件产线的信息太多,且已经分配配置到各个目录中,这里就不再写入 messages 中了

  • authpriv.*:认证方面的信息都写入该文件

  • mail.*:邮件方面的信息

  • cron.*:定时任务方面的信息

  • *.emerg

    当产生最严重的错误登记时,将该登记的信息以 wall 的方式广播给所有在系统登录的账户

  • uucp,news.crit

    uucp 是早期 Unix-like 系统进行数据传递的通信信息,后来常用在新闻组的用途中,当 news 出现严重错误时写入该文件

  • local7.*:将本机开机时应该显示到屏幕的信息写到该文件夹中

mail.* -/var/log/maillog该项配置前有 - 符号,该符号表示,使用缓存存储信息,当信息量达到一定大小时才写入硬盘中,这是由于 mail 的日志信息太多了,使用缓存信息减少磁盘交互

每个 distribution 的日志配置可能都不太一样,需要先行查看 /etc/rsyslog.conf 文件,你才知道那些日志信息去哪里查看

# 自定义增加日志文件功能

比如,你想让「所有的信息」额外写入到 /var/log/admin.log 中,可以如下实现

# 1. 先设置好所建立的文件
[root@study ~]# vim /etc/rsyslog.conf
# Add by mrcode 2020/03/22		# 添加自己修改的注释信息
*.info          /var/log/admin.log

# 2. 重启 rsyslogd 服务
[root@study ~]# systemctl restart rsyslog.service 
[root@study ~]# ll /var/log/admin.log 
-rw-------. 1 root root 771 Mar 15 22:24 /var/log/admin.log
# 就出现日志信息了
1
2
3
4
5
6
7
8
9
10

# 日志文件的安全性设置

在某些情况下你需要考虑文件的安全性,比如黑客入侵后,对你系统做了一些操作,由前面所学的知识知道,大部分的操作都会留下日志信息,那么黑客就需要清理掉这些日志信息。可以使用隐藏属性来配置它的安全性

注意:rsyslogd 的日志文件,只能写入,不能被修改的,当知己 vim 修改后,在保存,那么就无法继续记录了(笔者就有一个疑问了:这么大的 BUG,黑客只要先进来修改下日志文件不就可以了?)

在第 6 章中提到过 lsattr 和 chattr 指令,将一个文件以 chattr 设置 i 属性时,该文件连 root 都不能删掉,而且也不能新增数据。那么我们可以使用 a 属性设置,只能被新增数据,而不能被删除

[root@study ~]# chattr +a /var/log/admin.log
[root@study ~]# lsattr /var/log/admin.log 
-----a---------- /var/log/admin.log
# 如果想取消,使用 chattr -a 取消
1
2
3
4

使用了 a 属性之后,解决了上面笔者的担忧,只能追加写入数据,而无法修改保存,也无法删除,除非 root 权限被攻破

# 日志文件服务器设置

前面讲到,在 rsyslog.conf 中,可以将日志数据传送到打印机或则是远程主机上,那么利用这个功能,来看几个场景

你办公室有 10 台服务器,每一台负责一个网络服务,可以通过该功能把日志信息聚合到一台主机上面,你检查的时候就可以只登录这一台主机就可以了解到 10 台服务器的日志了

CentOS 7.x 预设 rsyslogd 本身就具有这个文件服务器的功能了,只是没有启动该功能而已。可以通过 man rsyslogd 查询下相关的选项。

这就涉及到:

  • 服务端 Server:接受客户端的日志数据保存下来
  • 客户端 Clinet:把日志转发到服务端

服务端配置

# 1. Server 端:修改 rsyslogd 的启动配置文件
[root@study ~]# vim /etc/rsyslog.conf
#### MODULES ####
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
# 提供 UDP 和 TCP 方式,如果你的网络很问题,就用 UDP
# 不过,想要数据稳定传输,那么还是建议使用 TCP,把 TCP 的配置打开

# 2. 重启 rsyslog 服务
[root@study ~]# systemctl restart rsyslog.service  
[root@study ~]# netstat -ltnp | grep rsyslog
tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN      7107/rsyslogd       
tcp6       0      0 :::514                  :::*                    LISTEN      7107/rsyslogd  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

客户端配置

[root@study ~]# vim /etc/rsyslog.conf
*.*		@@192.168.1.100
#*.*	@192.168.1.100		# 这个是 UDP 的配置方式

# 重启服务
[root@study ~]# systemctl restart rsyslog.service  
1
2
3
4
5
6