认识与分析登录档

登录档简介


登录档是记录系统活动信息的几个文件, 例如:何时、何地 (来源 IP)、何人 (什么服务名称)、做了什么动作 (讯息登录)。 即:记录系统在什么时候由哪个程序做了什么样的行为时,发生了何种的事件等等

Linux 常见的登录档档名


登录文件的权限通常是设定为仅有 root 能够读取而已,常见的登录档如下:

  • /var/log/boot.log: 开机的时候系统核心会去侦测与启动硬件,接下来开始各种核心支持的功能启动等。这些流程都会记录在 /var/log/boot.log 里面,这个文件只会存在这次开机启动的信息,前次开机的信息并不会被保留
  • /var/log/cron: 记录crontab 排程是否实际被进行,进行过程有没有发生错误, /etc/crontab 是否撰写正确等相关信息
  • /var/log/cron: 记录系统在开机的时候核心侦测过程所产生的各项信息
  • /var/log/lastlog: 可以记录系统上面所有的账号最近一次登入系统时的相关信息。 lastlog 指令就是利用这个 文件的记录信息来显示
  • /var/log/maillog 或 /var/log/mail/*: 记录邮件的往来信息,其实主要是记录 postfix (SMTP 协议提供者) 与 dovecot (POP3 协议提供者) 所产生的讯息
  • /var/log/messages: 几乎系统发生的错误讯息 (或者是重要的信息) 都会记录在这个文件中; 如果系统发生莫名的错误时,这个文件是一定要查阅的登录档之一
  • /var/log/secure: 只要牵涉到『需要输入账号密码』的软件,那么当登入时 (不管登入正确或错误) 都会被记录在此 文件中。 包括系统的 login 程序、图形接口登入所使用的 gdm 程序、 su, sudo 等程序、还有网络联机的 ssh, telnet 等程序
  • /var/log/wtmp, /var/log/faillog: 这两个文件可以记录正确登入系统者的帐户信息 (wtmp) 与错误登入时所使用的帐户信息 (faillog),last 就是读取 wtmp 来显示的, 这对于追踪一般账号者的使用行为很有帮助
  • /var/log/httpd/, /var/log/samba/: 不同的网络服务会使用它们自己的登录文件来记载它们自己产生的各项讯息

登录档内容的一般格式


登录档含有以下内容:

  • 事件发生的日期与时间
  • 发生此事件的主机名
  • 启动此事件的服务名称 (如 systemd, CROND 等) 或指令与函式名称 (如 su, login..)
  • 该讯息的实际数据内容

例如 /var/log/secure 内容:

[root@study ~]# more /var/log/secure 
Aug 17 18:38:06 study login: pam_unix(login:session): session opened for user root by LOGIN(uid=0) 
Aug 17 18:38:06 study login: ROOT LOGIN ON tty1 
Aug 17 18:38:19 study login: pam_unix(login:session): session closed for user root 
|--日期/时间---|--H--|-服务与相关函数-|-----------讯息说明------> 

第一行和第二行的意思是: 在 08/17 的 18:38 左右,在名为 study 的这部主机系统上,由 login 这个程序产生的讯息,内容显示 root 在 tty1 登入了,而相关的权限给予是透过 pam_unix 模块处理的 (共两行数据)。

因为主机可以做成登录档服务器,可以收集来自其他服务器的登录文件数据所以第二个字段项目是主机名。

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


Linux 的登录档主要是由 rsyslog.service 负责,其负责将日志写入文件,而logrotate 负责登录档的轮替,查看该服务是否启动:

[root@centos764 ~]# ps aux | grep rsyslog
root       1141  0.0  0.3 220580  6184 ?        Ssl  16:58   0:02 /usr/sbin/rsyslogd -n
root       5708  0.0  0.0 112724   980 pts/0    R+   19:23   0:00 grep --color=auto rsyslog
[root@centos764 ~]# 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  2018-10-09 08:57:33 CST; 6 days ago
     Docs: man:rsyslogd(8)
           http://www.rsyslog.com/doc/
 Main PID: 1141 (rsyslogd)
    Tasks: 3
   CGroup: /system.slice/rsyslog.service
           └─1141 /usr/sbin/rsyslogd -n

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


rsyslogd 针对各种服务与讯息记录在某些文件的配置文件就是 /etc/rsyslog.conf, 这个文件 规定了(1)什么服务 (2)的什么等级讯息 (3)需要被记录在哪里(装置或文件)。格式如下:

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

[1] 代表服务名称,有 kern(kernel), user, mail, daemon, auth, syslog, lpr, news, uucp, cron, authpriv, ftp, local ~ local7 。 [2] 代表讯息等级,如下:

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

讯息等级之前还有 [.=!] 的链接符号,他代表的意思是这样的:

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

一般来说,常使用的是『.』

[3] 代表 讯息记录的文件名或装置或主机,常见放置处如下:

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

登录档的安全性设置


黑客想利用他人的计算机干坏事,然后又不想留下证据,离开的时候将屁股擦干净,将所有可能的讯息都给他抹煞掉,首先会清除登录档。 可以使用 chattr +a /var/log/filename.log 让其只能新增内容而无法修改、删除。 如果 "手动" 更动过登录档后,如: 用vi 开启某个.log 文件,离开却下达 :wq 的参数,那么该文件未来将不 会再继续进行记录,这时候重新启动 rsyslog.service 服务( sudo systemctl resstart rsyslog.service )

登录档服务器的设定


使用 rsyslogd(配置文件为 /etc/rsyslog.conf) 进行登录文件服务器的功能,登录档服务器默认设置端口为 port 514。 服务器端配置:

# 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 2

客户端配置 :

[root@study ~]# vim /etc/rsyslog.conf
*.* @@192.168.1.100 # 填写服务端主机 ip 地址
#*.* @192.168.1.100 # 若用 UDP 传输,设定要变这样!
[root@study ~]# systemctl restart rsyslog.service

设置完后,在服务端主机登录文件中,每一行的 主机名 会显示来自不同主机了。

登录档的轮替(logrotate)


rsyslogd 利用的是 daemon 的方式来启动,当有需求时立即会被执行,logrotate 是到规定时间之后进行登录档的轮替,即 logrotate 程序在 cron 底下,其放置在 /etc/cron.daily/ 下。

logrotate 的配置文件

主要在 :

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

logrotate.conf 是主要配置文件,而 logrotate.d/ 是一个目录,该目录内的文件会被主动的读入 /etc/logrotate.conf 中。 logrotate 的主要功能是将所有旧的的日志文件更名(末尾数字加一),然后建立空的文件。logrotate 内容及参数信息:

[root@study ~]# vim /etc/logrotate.conf
# 底下的设定是 "logrotate 的预设设定值" ,如果个别的文件设定了其他的参数,
# 则将以个别的文件设定为主,若该文件没有设定到的参数则以这个文件的内容为默认值!
weekly <==预设每个礼拜对登录档进行一次 rotate 的工作
rotate 4 <==保留几个登录档呢?预设是保留四个!
create <==由于登录档被更名,因此建立一个新的来继续储存之意!
dateext <==就是这个设定值!可以让被轮替的文件名加上日期作为档名,Ubuntu 中默认没有
#compress <==被更动的登录档是否需要压缩?如果登录档太大则可考虑此参数启动
include /etc/logrotate.d
# 将 /etc/logrotate.d/ 这个目录中的所有文件都读进来执行 rotate 的工作!
/var/log/wtmp { <==仅针对 /var/log/wtmp 所设定的参数
 monthly <==每个月一次,取代每周!
 create 0664 root utmp <==指定新建文件的权限与所属账号/群组
 minsize 1M <==文件容量一定要超过 1M 后才进行 rotate (略过时间参数)
 rotate 1 <==仅保留一个,亦即仅有 wtmp.1 保留而已。
}
# 这个 wtmp 可记录登入者与系统重新启动时的时间与来源主机及登入期间的时间。
# 由于具有 minsize 的参数,因此不见得每个月一定会进行一次喔!要看文件容量。
# 由于仅保留一个登录档而已,不满意的话可以将他改成 rotate 5

当我们使用很多的服务在系统上面时,每个服务都要去修改 /etc/logrotate.conf的设定也似乎不太合理, 所以,独立出来一个目录,每个以 RPM 打包方式所建立的服务的登录档轮替设定, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中即可。

logrotate.conf 的设定语法是:

登录文件的绝对路径文件名 ... {
个别的参数设定值,如 monthly, compress 等等
}

比如 /etc/logrotate.d/syslog 为例:

[root@study ~]# vim /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
 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 的设定为:

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

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

[root@study ~]# 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
 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
}

/bin/kill -HUP ... 目的在于将系统的 rsyslogd 重新将其参数档 (rsyslog.conf) 的资料读入一次,也可以想成是 reload。由于我们建立了一个新的空的记录文件,如果不执行此一行来重新启动服务的话, 那么 记录的时候将会发生错误。 比如你不小心将日志文件删了,会发现日志将不会记录了(我曾经不小心将 Apache 的日志全删了....,然后发现不能正常记录了,此时重新启动Apache服务即可)。




发表评论

评论列表,共 0 条评论

    暂无评论