Linux学习-rsyslog.service :记录登录文件的服务

时间:2022-12-27 03:33:35

rsyslog.service 的配置文件:/etc/rsyslog.conf

我们现在知道 rsyslogd 可以负责主机产生的各个信息的登录,而这些信息本身是有『严重等级』之分的, 而且, 这些资料最终要传送到哪个文件去是可以修改的呢,所以我们才会在一开头的地方讲说,每个 Linux distributions 放置的登录档档名可能会有所差异啊!

基本上, rsyslogd 针对各种服务与讯息记录在某些文件的配置文件就是 /etc/rsyslog.conf, 这个文件 规定了『(1)什么服务 (2)的什么等级讯息 (3)需要被记录在哪里(装置或文件)』 这三个咚咚,所以设 定的语法会是这样:

服务名称[.=!]讯息等级 讯息记录的文件名或装置或主机
# 底下以 mail 这个服务产生的 info 等级为例:
mail.info /var/log/maillog_info
# 这一行说明:mail 服务产生的大于等于 info 等级的讯息,都记录到
# /var/log/maillog_info 文件中的意思。

我们将上面的数据简单的分为三部分来说明:

  • 服务名称

rsyslogd 主要还是透过 Linux 核心提供的 syslog 相关规范来设定数据的分类的,Linux 的 syslog 本身有规范一些服务讯息, 你可以透过这些服务来储存系统的讯息。Linux 核心的 syslog 认识的服 务类型主要有底下这些:

相对序号 服务类别 说明
0 kern(kernel) 就是核心 (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 函数自行制订的服务名称,软件开发商可以透过呼叫上述的服 务名称来记录他们的软件。

Linux学习-rsyslog.service :记录登录文件的服务

为了让不同的信息放置到不同的文件当中,好让我们分门别类的进行登录档的管理, 所以啰,将各 种类别的服务之登录文件,记录在不同的文件里面,就是我们 /etc/rsyslog.conf 所要作的规范了!


  • 讯息等级

同一个服务所产生的讯息也是有差别的,有启动时仅通知系统而已的一般讯息 (information), 有出 现还不至于影响到正常运作的警告讯息 (warn) ,还有系统硬件发生严重错误时,所产生的重大问题 讯息 (error 等等);讯息到底有多少种严重的等级呢?基本上,Linux 核心的 syslog 将讯息分为七 个主要的等级,名称与数值的对应如下:

等级数值 等级名称 说明
7 debug 用来 debug (除错) 时产生的讯息数据;
6 info 仅是一些基本的讯息说明而已;
5 notice 虽然是正常信息,但比 info 还需要被注意到的一些信息内容;
4 warning(warn) 警示的讯息,可能有问题,但是还不至于影响到某个 daemon 运作的信息;基本上,info, notice, warn 这三个讯息都是在告知一些基本信息而已,应该还不至于造成一些系统运作 困扰;
3 err(error) 一些重大的错误讯息,例如配置文件的某些设定值造成该服务服法启动的信息说明, 通 常藉由 err 的错误告知,应该可以了解到该服务无法启动的问题呢!
2 crit 比 error 还要严重的错误信息,这个 crit 是临界点 (critical) 的缩写,这个错误已经很 严重了喔!
1 alert 警告警告,已经很有问题的等级,比 crit 还要严重!
0 emerg(panic) 疼痛等级,意指系统已经几乎要当机的状态! 很严重的错误信息了。通常大概只有硬件 出问题,导致整个核心无法顺利运作,就会出现这样的等级的讯息吧!

基本上,在 0(emerg) 到 6(info) 的等级之间,等级数值越高代表越没事,等级靠近 0 则代表事情大条了!除了 0 到 6 之外还有两个比较特殊的等级, 那就是 debug(错误侦测等级) 与 none (不需登 录等级) 两个。当我们想要作一些错误侦测,或者是忽略掉某些服务的信息时, 就用这两个吧!

特别留意一下在讯息等级之前还有 [.=!] 的链接符号喔!他代表的意思是这样的:

  • . :代表『比后面还要严重的等级 (含该等级) 都被记录下来』的意思,例如: mail.info 代表只要是 mail 的信息,而且该信息等级严重于 info (含 info 本身)时,就会被记录下来的意思。
  • .=:代表所需要的等级就是后面接的等级而已, 其他的不要!
  • .!:代表不等于, 亦即是除了该等级外的其他等级都记录。

  • 讯息记录的文件名或装置或主机

再来则是这个讯息要放置在哪里的设定了。通常我们使用的都是记录的文件啦!但是也可以输出到装 置呦! 例如打印机之类的!也可以记录到不同的主机上头去呢!底下就是一些常见的放置处:

  • 文件的绝对路径:通常就是放在 /var/log 里头的文件啦!
  • 打印机或其他:例如 /dev/lp0 这个打印机装置
  • 使用者名称:显示给用户啰!
  • 远程主机:例如 @study.vbird.tsai 当然啦,要对方主机也能支持才行!
  • *:代表『目前在在线的所有人』,类似 wall 这个指令的意义!

  • 服务、daemon 与函数名称
syslog 这个是 Linux 核心所提供的登录档设计指引,所有的要求大概都写入道一个名为 syslog.h 的头文 件案中。如果你想要开发与登录文件有关的软件, 那你就得要依循这个 syslog 函数的要求去设 计才行!可以使用 man 3 syslog 去查询一下相关的数据!
rsyslogd 为了要达成实际上进行讯息的分类所开发的一套软件,所以,这就是最基本的 daemon 程序!
rsyslog.service 为了加入 systemd 的控制,因此 rsyslogd 的开发者设计的启动服务脚本设定!

早期 CentOS 5.x 以前,要达成 syslog 的 功能是由一只名为 syslogd 的 daemon 来完成的, 从 CentOS 6 以来 (包含 CentOS 7) 则是透过 rsyslogd 这个 daemon 啰!


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

我们来看一看 rsyslogd 有哪些系统服务已经在记录了呢?就是瞧一瞧 /etc/rsyslog.conf 这个文件的预设内容啰! (注意!如果需要将该行做为批注时,那么就加上 # 符号 就可以啦)

# 来自 CentOS 7.x 的相关资料
[root@study ~]# vim /etc/rsyslog.conf
1 #kern.* /dev/console
2 *.info;mail.none;authpriv.none;cron.none /var/log/messages
3 authpriv.* /var/log/secure
4 mail.* -/var/log/maillog
5 cron.* /var/log/cron
6 *.emerg :omusrmsg:*
7 uucp,news.crit /var/log/spooler
8 local7.* /var/log/boot.log

上面总共仅有 8 行设定值,每一行的意义是这样的:

  1. #kern.*:只要是核心产生的讯息,全部都送到 console(终端机) 去。console 通常是由外部装置连接到系统 而来, 举例来说,很多封闭型主机 (没有键盘、屏幕的系统) 可以透过连接 RS232 连接口将讯息传输到外 部的系统中, 例如以笔记本电脑连接到封闭主机的 RS232 插口。这个项目通常应该是用在系统出现严重 问题而无法使用默认的屏幕观察系统时, 可以透过这个项目来连接取得核心的讯息。

  2. *.info;mail.none;authpriv.none;cron.none:由于 mail, authpriv, cron 等类别产生的讯息较多, 且已经写入底 下的数个文件中,因此在 /var/log/messages 里面就不记录这些项目。除此之外的其他讯息都写入 /var/log/messages 中。这也是为啥我们说这个 messages 文件很重要的缘故!

  3. authpriv.*:认证方面的讯息均写入 /var/log/secure 文件;

  4. mail.*:邮件方面的讯息则均写入 /var/log/maillog 文件;

  5. cron.*:例行性工作排程均写入 /var/log/cron 文件;

  6. *.emerg:当产生最严重的错误等级时,将该等级的讯息以 wall 的方式广播给所有在系统登入的账号得知, 要这么做的原因是希望在线的用户能够赶紧通知系统管理员来处理这么可怕的错误问题。

  7. uucp,news.crit:uucp 是早期 Unix-like 系统进行数据传递的通讯协议,后来常用在新闻组的用途中。 news 则是新闻组。当新闻组方面的信息有严重错误时就写入 /var/log/spooler 文件中;

  8. local7.*:将本机开机时应该显示到屏幕的讯息写入到 /var/log/boot.log 文件中;

在记录的文件 /var/log/maillog 前面还有个减号『 - 』是干嘛 用的?由于邮件所产生的讯息比较多,因此我们希望邮件产生的讯息先储存在速度较快的内存中 (buffer) ,等到数据量够大了才一次性的将所有数据都填入磁盘内,


  • 自行增加登录文件文件功能

如果你有其他的需求,所以需要特殊的文件来帮你记录时,呵呵!别客气,千万给他记录在 /etc/rsyslog.conf 当中,如此一来,你就可以重复的将许多的信息记录在不同的文件当中,以方便你的管理呢!让我们来作个练习题吧!

# 1. 先设定好所要建立的文件设置!
[root@study ~]# vim /etc/rsyslog.conf
# Add by VBird 2015/08/19 <==再次强调,自己修改的时候加入一些说明
*.info /var/log/admin.log <==有用的是这行啦! # 2. 重新启动 rsyslogd 呢!
[root@study ~]# systemctl restart rsyslog.service
[root@study ~]# ll /var/log/admin.log
-rw-r--r--. 1 root root 325 Aug 20 00:54 /var/log/admin.log
# 瞧吧!建立了这个登录档出现啰!

登录档的安全性设置

如果你的登录档不见了,那该怎办?

基本上,我们可以透过一个隐藏的属性来设定你的登录档,成为 『 只可以增加数据,但是不能被删除 』的状态,那么或许可以达到些许的保护!不过,如果你的 root 账号被破解了,那么底下的设定还是无法保护的,因为你要记得『 root 是可以在系统上面进行任何 事情的 』。

既然如此,那么我们就来处理一下隐藏属性。如果将一个文件以 chattr 设定 i 这个属性时,那么该文件连 root 都不能杀掉!而且也不能 新增数据,嗯!真安全!但是,如此一来登录文件的功能岂不是也就消失了? 因为没有办法写入呀! 所以啰,我们要使用的是 a 这个属性!你的登录文件如果设定了这个属性的话,那么 他将只能被增 加,而不能被删除!

基本上,这个旗标最大的用处除了在保护你登录文件的数据外, 他还可以帮助你避免掉 不小心写入登录档的状况喔。要注意的是,当『 你不小心 "手动" 更动过登录档后,例如那个 /var/log/messages , 你不小心用 vi 开启他,离开却下达 :wq 的参数,呵呵!那么该文件未来将不 会再继续进行登录动作! 』

不过,也因为这个 +a 的属性让该文件无法被删除与修改,所以啰,当我们进行登录文件轮替时 (logrotate) ,将会无法移动该登录档的档名呢!

登录档服务器的设定

很简单啦,我们 CentOS 7.x 预设的 rsyslogd 本身就已经具有这个登录 文件服务器的功能了, 只是默认并没有启动该功能。你可以透过 man rsyslogd 去查询一下相关 的选项就能够知道啦!既然是登录档服务器,那么我们的 Linux 主机当然会启动一个埠口来监听了, 那个预设的埠口就是 UDP 或 TCP 的 port 514 喔!

Linux学习-rsyslog.service :记录登录文件的服务

如上图所示,服务器会启动监听的埠口,客户端则将登录档再转出一份送到服务器去。 而既然是登 录档『服务器』,所以当然有服务器与客户端 (client) 啰!这两者的设定分别是这样的:

# 1. Server 端:修改 rsyslogd 的启动配置文件,在 /etc/rsyslog.conf 内!
[root@study ~]# vim /etc/rsyslog.conf
# 找到底下这几行:
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514 # Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
# 上面的是 UDP 埠口,底下的是 TCP 埠口!如果你的网络状态很稳定,就用 UDP 即可。
# 不过,如果你想要让数据比较稳定传输,那么建议使用 TCP 啰!所以修改底下两行即可!
$ModLoad imtcp
$InputTCPServerRun 514 # 2. 重新启动与观察 rsyslogd 喔!
[root@study ~]# systemctl restart rsyslog.service
[root@study ~]# 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
# 嘿嘿!你的登录文件主机已经设定妥当啰!很简单吧!

至于 client 端的设定就简单多了!只要指定某个信息传送到这部主机即可! 举例来说,我们的登录 档服务器 IP 为 192.168.1.100 ,而 client 端希望所有的数据都送给主机, 所以,可以在 /etc/rsyslog.conf 里面新增这样的一行:

[root@study ~]# vim /etc/rsyslog.conf
*.* @@192.168.1.100
#*.* @192.168.1.100 # 若用 UDP 传输,设定要变这样! [root@study ~]# systemctl restart rsyslog.service