Linux基础学习笔记之——认识与分析登录文件

认识与分析登录文件

1、什么是登录文件

记录系统在什么时候由哪个程序做了什么样的行为,发生了什么事情等等。

1.1、CentOS 7 登录文件简易说明

1.1.1、Linux 常见的登录文件名

  • /var/log/boot.log

    开机的时候系统内核会去侦测与启动硬件,接下来开始各种内核支持的功能启动等。这些流程都会记录在 /var/log/boot.log 里面。不过这个文件只会保留这次开机的信息,不会保留上次的信息。

  • /var/log/cron

    例行性工作的登录文件。

  • /var/log/dmesg

    可以记录系统上面所有的账号最近一次登录系统时的相关信息。lastlog 指令就是利用这个文件的记录信息来显示的。

  • /var/log/maillog 或 /var/log/mail/*:

    记录文件的往来信息,其实主要是记录 postfix 与 dovecot 所产生的信息。

  • /var/log/message

    这个文件相当重要,几乎系统发生的所有错误信息都会被记录在这个文件。

  • /var/log/secure

    基本上,只要涉及到 “需要输入账号密码” 的软件,那么当登录时(不管登录正确与否)都会被记录在此文件中。

  • /var/log/wtmp,/var/log/faillog

    这两个文件可以记录正确登录系统的账号信息与错误登录时所使用的账号信息。last 就是读取 wtmp 显示的。

  • /var/log/httpd/*,/var/log/samba/*:

    不同的网络服务会使用它们自己的登录文件来记载它们所产生的信息。

1.1.2、登录文件所需相关服务与程序

那么这些登录文件是怎么产生的呢?基本上有两种方式,一种是由软件开发商自行定义写入的登录文件与相关格式,例如 WWW 软件 apache 就是这样的。另一种是由 Linux distribution 提供的登录文件管理服务来统一管理的。你只需要将信息丢给这个服务后,它就会分门别类地将各种信息放置到相关的登录文件中去!CentOS 提供 rsyslog.service 这个服务来统一管理登录文件

不过要注意的是,如果你任凭登录文件持续记录的话,由于系统产生的信息天天都有,那么你的登录文件的容量将会长大到无法无天…如果你的登录文件过大,可能会导致大文件的读写效率不佳。所以,你需要对登录文件备份与更新。那需要手动处理吗?当然不需要,我们可以通过 logrotate(登录文件轮替)来自动化处理登录文件容量与更新的问题

所谓的 logrotate 基本上,就是将旧的登录文件更改名称,然后建立一个空的登录文件。如此一来,新的登录文件将重新开始记录,然后将旧的登录文件留下来一阵子。此外,旧的记录保存了一段时间没有问题,那么就可以让系统自动地将他砍掉,免得占用空间。

总结一下,针对登录文件所需的功能,我们需要的服务与程序有:

  • systemd-journald.service:最主要的信息接收者,由 systemd 提供;
  • rsyslog.service:主要登录系统与网路等服务的信息;
  • logrotate:主要在进行登录文件的轮替功能。

1.1.3、CentOS 7.x 使用 systemd 提供的 journalctl 日志功能

CentOS 7 除了保有既有的 rsyslog.service 之外,其实最上游还使用了 systemd 自己的登录文件日志管理功能!它使用的是 systemd-journald.service 这个服务来支持的。基本上,系统由 systemd 所管理,那所有经由 systemd 启动的服务,如果再启动或结束的过程中发生一些问题或者正常的信息,就会将该信息由 systemd-journald.service 以二进制的方式记录下来,之后再将这个信息发送给 rsyslog.service 作进一步的记载。systemd-journald.service 的记录主要都放置在内存中,因此在存取方面的效能比较好。

1.1.4、登录文件内容的一般格式

一把来说,系统产生的信息经过记录下来的数据中,每条信息均会记录底下的几个重要数据:

  • 事件发生的日期与时间;
  • 发生此事件的主机名;
  • 启动此事件的服务名称或指令与函式名称;
  • 该信息的实际数据内容。

当然,这些信息的 “详细度” 是可以修改的,而且,这些信息可以作为系统排错之用。我们以登录时一定会记载账号信息的 /var/log/secure 为例:

[root@li ~]# cat /var/log/secure
Jul 31 17:15:15 li login: pam_unix(login:session): session opened for user root by LOGIN(uid=0)
Jul 31 17:15:15 li login: ROOT LOGIN ON tty1
#其中的一条信息,显示的是 “在 7月31号 17:15:15 这个时间,在名为 li 的主机上,由 login 这个程序产生的信息,内容显示 root 在 tty1 登录,而相关权限给予是通过 pam_unix 这个模块处理的”

2、rsyslog.service:记录登录文件的服务

上面提到 Linux 的登录文件主要是由 rsyslog.service 在负责,那么你的 Linux 是否有启动 rsyslog 呢?而且是否有设定开机时启动呢?先检查一下:

[root@li ~]# ps aux | grep rsyslog
root       1017  0.0  0.4 214456  4000 ?        Ssl  08:46   0:00 /usr/sbin/rsyslogd -n
root      28566  0.0  0.0 112824   980 pts/0    R+   10:01   0:00 grep --color=auto rsyslog

[root@li ~]# systemctl status rsyslog
● rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) #开机自启
   Active: active (running) since 四 2020-08-20 08:46:42 CST; 1h 15min ago
     Docs: man:rsyslogd(8)
           http://www.rsyslog.com/doc/
 Main PID: 1017 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           └─1017 /usr/sbin/rsyslogd -n

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

这个文件规定了(1)服务(2)等级讯息(3)需要被记录在哪里;设置的语法如下:

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

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

  • 服务名称

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

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

    在这里插入图片描述

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

  • 信息等级

    Linux 将信息分为七个主要的等级,根据 syslog.h 的定义,信息名称与数值的对应关系如下:

    等级数值 等级名称 说明
    7 debug 用来 debug(除错)时产生的信息数据
    6 info 仅是一些基本的信息说明而已
    5 notice 虽然是正常信息,但比 info 还需要被注意到的一些信息内容
    4 warning 警示的信息,可能有问题,但不会影响某个 daemon 的运行。
    3 err 一些重大的错误
    2 crit 比 error 还要严重的错误信息
    1 alert 警告浸膏,比 crit 还要严重
    0 emerg 紧急事件

    特别留意一下在信息等级之前还有 [.=!] 的链接符号,它的代表意思是:

    • .:代表 “比后面还要严重的等级(含该等级)都会被记录下来” 的意思。
    • .=:代表所需要的等级就是后面接的等级而已,其他的不要!
    • .!:代表不等于,即除了该等级外的其他等级都记录。
  • 信息记录的文件或设备或主机

    底下是一些常见的设置:

    • 文件的绝对路径:通常是放置在 /var/log/ 底下的文件;
    • 打印机或其他:例如 /dev/lp0 的打印机设备;
    • 使用者名称:显示给用户;
    • 远程主机
    • *:代表 “目前在线的所有人”。

2.2、服务、daemon 与函数名称

syslog 这个是 Linux 内核所提供的登录文件设计指引,所有的要求大概都写入一个名为 syslog.h 的头文件中。如果你想要开发与登录文件有关的软件,那你就得依循这个 syslog 函数的要求去设计才行。
rsyslog 为了要达成实际上进行信息的分类所开发的一套软件,所以,这就是基本的 daemon 程序
rsyslog.service 为了加入 systemd 的控制,因此 rsyslogd 的开发者设计的启动服务脚本设定

2.3、CentOS 预设的 rsyslog.conf 内容

[root@li ~]# vim /etc/rsyslog.conf
#kern.*                                                 /dev/console
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log

2.4、自行增加登录文件的内容

如果你想要让 “所有的信息” 都额外写入 /var/log/admin.log 文件时,应该怎么办呢?

#1、预设设定好要建立的文件设置
[root@li ~]# vim /etc/rsyslog.conf
# ADD By Li
*.info          /var/log/admin.lo

#2、重新启动 rsyslog 
[root@li ~]# systemctl restart rsyslog
[root@li ~]# ll /var/log/admin.log
-rw-------. 1 root root 764 8月  21 08:01 /var/log/admin.log		#已经建立了这个文件

2.5、登录文件的安全设置

如果一个文件以 chattr 设定 i 属性时,那么该文件连 root 都不能杀掉!而且也不能新增数据。但是如此一来登录文件的功能岂不是消失了吗?因为没有办法写入啊!所以,我们要使用的是 a 这个属性。你的登录文件如果设定了这个属性的话,那么它将只能被增加,而不能被删除

[root@li ~]# chattr +a /var/log/admin.log
[root@li ~]# lsattr /var/log/admin.log
-----a---------- /var/log/admin.log

其实,还是有风险的。如果 root 被攻陷,取消 a 属性一样可以消除痕迹。对于新手来说,还是保持默认值就好:

[root@li ~]# chattr -a /var/log/admin.log

3、登录文件的轮替(logrotate)

需要特备注意的是:rsyslog 是利用 daemon 的方式启动的,当有需求的时候立刻就会被执行的,但是 logrotate 却是在规定的时间到了之后才进行登录文件的轮替,所以这个 logrotate 程序当然就是挂在 cron 底下进行的。仔细查看以下 /etc/cron.daily/ 里面的文件:

[root@li ~]# ll /etc/cron.daily/
-rwx------. 1 root root 219 4月   1 11:26 logrotate

3.1、logrotate 配置文件

既然 logrotate 主要是针对登录文件来进行轮替的动作,所以,它当然必须要记载 “在什么状态下才将登录文件进行轮替” 的设定啊!那 logrotate 这个程序的参数配置文件在哪里呢?

  • /etc/logrotate.conf
  • /etc/logrotate.d/

那个 logrotate.conf 才是主要的配置文件,至于 logrotate.d 是一个目录,该目录的所有文件都会被主动地读入 /etc/logrotate.conf 当中。另外,在目录中如果没有规定到一些细节的设定,都以 /etc/logrotate.conf 的默认值为准。

刚刚,我们说到 logrotate 的主要功能是将旧的登录文件移动或移动成旧文件,并且重新建立一个新的空的文件来记录,它的执行结果优点类似于:

在这里插入图片描述

我们先来看一下预设的 logrotate 的内容:

[root@li ~]# vim /etc/logrotate.conf
weekly		#预设每周进行一次 rotate 的工作
rotate 4	#保留几个登录文件的意思,预设是保留 4 个
create		#由于登录文件被更名,因此建立一个新的来继续存储的意思
dateext		#就是这个设定值,可以让被轮替的文件名加上日期
#compress	#被更改的登录文件是否被压缩?

include /etc/logrotate.d
#将 /etc/logrotate.d 这个目录下的所有文件都读进来执行 rotate 的工作

/var/log/wtmp {
    
    		#仅针对 /var/log/wtmp 所设定的参数
    monthly			#每个月一次
    create 0664 root utmp	#指定新建文件的权限与所属账号/群组
        minsize 1M		#文件超过 1MB 后才进行 rotate
    rotate 1		#仅保留一个
}
...

底下我们以 /etc/logrotate.d/syslog 这个轮替 rsyslog.service 服务的文件,来看看该如何设定它的 rotate 呢?

[root@li ~]# vim /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    
    
    missingok
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

在上面的语法中,我们知道正确的 logrotate 的写法为:

  • 文件名:被处理的登录文件绝对路径名,可使用空格符分隔多个文件名;
  • 参数:上述文件名进行轮替的参数使用 {} 包括起来;
  • 执行脚本:可呼叫外部指令来进行额外的命令下达,这个设定需与 sharedscripts…endscript 设定合用才行。至于可用的环境为:
    • prerotate:在启动 logrotate 之前进行的指令,例如修改登录文件的属性等动作;
    • postrotate:在做完 logrotate 之后启动的指令,例如重启启动(kill -HUP)某个服务;
    • prerotate 与 postrotate 对于已加上特殊属性的文件处理上面,是相当重要的执行程序!

那么 /etc/logrotate.d/syslog 内设定的 5 个文件的轮替功能就变成了:

  • 该设定只对 /var/log 内的 cron,maillog,messages,secure,spooler 有效;
  • 登录文件轮替每周一次、保留四个、且轮替下来的登录文件不进行压缩;
  • 轮替完毕后取得 syslog 的 PID 后,以 kill -HUP 重新启动 syslog

假如我们针对 /var/log/messages 这个文件增加 chattr +a 的属性时,依据 logrotate 的工作原理,我们知道,这个 /var/log/messages 将会被更名为 /var/log/messages.1 才是。但是由于加上了 +a 的参数,所以更名是不可能成功的!那怎么办呢?就利用 prerotate 与 postrotate 来进行登录文件的轮替前、后所需要的动作!那我们来修改一下文件:

[root@li ~]# vim /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    
    
    sharedscripts
    prerotate
        /usr/bin/chattr -a /var/log/messages
    endscript
    missingok
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /usr/bin/chattr +a /var/log/messages
    endscript
}

3.2、实际测试 logrotate 的动作

[root@li ~]# logrotate [-vf] logfile
选项与参数:
-v:启动显示模式,会显示 logroatate 运行的过程
-f:不论是符合配置文件的数据,强制每个流程文件都进行 rotate 的动作
#1、执行一次 logrotate 看看整体流程如何
[root@li ~]# logrotate -v /etc/logrotate.conf
reading config file /etc/logrotate.conf		#读取主要的配置文件
including /etc/logrotate.d		#呼叫外部的设定
reading config file bootlog		#这就是外部的设定
...
Handling 7 logs		#一共有 7 个登录文件被记录
...
rotating pattern: /var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
empty log files are rotated, old logs are removed
...
considering log /var/log/yum.log	#开始处理 yum.log
  log does not need rotating (log has been rotated at 2020-8-16 10:0, that is not year ago yet)	
#因为时间未到,不需要变动

#2、强制进行 logrotate 的动作
[root@li ~]# logrotate -vf /etc/logrotate.conf
...
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
running prerotate script
fscreate context set to system_u:object_r:cron_log_t:s0
renaming /var/log/cron to /var/log/cron-20200821
creating new /var/log/cron mode = 0600 uid = 0 gid = 0
...
#整个 rotate 是一步一步进行的

[root@li ~]# ll /var/log/messages*;lsattr /var/log/messages
-rw-------. 1 root root     152 8月  21 08:54 /var/log/messages
-rw-------. 1 root root 1157993 8月  21 08:09 /var/log/messages-20200821
-----a---------- /var/log/messages		#主动加上了 a 这个属性

3.3、自定义登录文件的轮替功能

假设前面我们已将建立了 /var/log/admin.log 这个登录文件,现在,你想要将该文件加上 +a 这个隐藏标签,而且设定底下的相关信息:

  • 登录文件轮替一个月一次;
  • 该登录文件若大于 10MB 时,则主动进行轮替,不需要考虑一个月的期限;
  • 保存五个备份文件;
  • 备份文件需要压缩。
#1、先建立 +a 这个属性
[root@li ~]# chattr +a /var/log/admin.log
[root@li ~]# lsattr /var/log/admin.log
-----a---------- /var/log/admin.log
[root@li ~]# mv /var/log/admin.log /var/log/admin.log.1
mv: 无法将"/var/log/admin.log" 移动至"/var/log/admin.log.1": 不允许的操作		#确认一下 a 属性

#2、开始建立 logrotate 的配置文件,增加一个文件在 /etc/logrotate.d/ 内
[root@li ~]# vim /etc/logrotate.d/admin
#This configuration is from li 2020/08/21
/var/log/admin.log{
    
    
        monthly
        size=10M
        rotate 5
        compress

        sharedscripts
        prerotate
                /usr/bin/chattr -a /var/log/admin.log
        endscript
        sharedscripts
        postrotate
                /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
                /usr/bin/touch /var/log/admin.log
                /usr/bin/chattr +a /var/log/admin.log
        endscript
}

#3、测试
[root@li ~]# logrotate -v /etc/logrotate.d/admin
...
rotating pattern: /var/log/admin.log 10485760 bytes (5 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/admin.log
  log does not need rotating (log size is below the 'size' threshold)
not running prerotate script, since no logs will be rotated	#因为不到一个月,文件也不大于 10MB,所以不轮替
not running postrotate script, since no logs were rotated
...
[root@li ~]# logrotate -vf /etc/logrotate.d/admin
...
running prerotate script
fscreate context set to system_u:object_r:var_log_t:s0
renaming /var/log/admin.log to /var/log/admin.log.1
running postrotate script
compressing log with: /bin/gzip
set default create context to system_u:object_r:var_log_t:s0
set default create context

[root@li ~]# lsattr /var/log/admin.log*
-----a---------- /var/log/admin.log
---------------- /var/log/admin.log.1.gz	#有被压缩过

猜你喜欢

转载自blog.csdn.net/qq_36879493/article/details/108140629