什么是登录档
【详细而确实的分析以及备份系统的登录文件】是一个系统管理员应该要进行的任务之一。
登录档 就是记录系统活动信息的几个文件,例如:何时、何地(来源IP)、何人(什么服务名称)、做了什么动作(讯息登录啰)。
换句话说就是:记录系统在什么时候由哪个程序做了什么样的行为时,发生了何种的事件等等。
CentOS 7 登录档简易说明
Linux 主机在背景之下有相当多的 daemons 同时在工作着,这些工作中的程序总是会显示一些讯息,这些显示的讯息最终会被记载到登录文件当中。也就是说,记录这些系统的重要讯息就是登录文件的工作。
登录档的重要性
1.解决系统方面的错误:
系统可能会出现一些错误,包括硬件捉不到或者是某些系统服务无法顺利运作的情况。由于系统会将硬件侦测过程记录在登录文件内,只要透过查询登录文件就能够了解系统出了什么问题。
2.解决网络服务的问题:
由于网络服务的各种问题通常都会被写入特别的登录档,只要查询登录档就会知道出了什么差错,例如如果无法启动邮件服务器(postfix),那么查询一下/var/log/maillog 通常可以得到不错的解答。
3.过往事件记录簿:
WWW服务(httpd 软件)在某个时刻流量特别大,要了解为什么时,可以透过登录档去找出该时段是哪些IP在联机与查询的网页数据为何,就能够知道原因。
透过(1)察看屏幕上面的错误讯息与(2)登录文件的错误信息,几乎可以解决大部分的 Linux问题。
Linux 常见的登录档档名
登录文件可以帮助我们了解很多系统重要的事件,包括登入者的部分信息,因此登录文件的权限通常是设定为仅有 root 能够读取而已。
常见的几个登录档有下面几个:
/var/log/cron:
crontab排程有没有实际被进行?进行过程有没有发生错误?/etc/crontab是否撰写正确?在这个登录档内查询看看。
/var/log/dmesg:
记录系统在开机的时候核心侦测过程所产生的各项信息。由于CentOS 默认将开机时核心的硬件侦测过程取消显示,因此额外将数据记录一份在这个文件中;
/var/log/lastlog:
可以记录系统上面所有的账号最近一次登入系统时的相关信息。lastlog 指令就是利用这个文件的记录信息来显示的。
/var/log/maillog或/var /log/mail/*:
记录邮件的往来信息,其实主要是记录 postfix(SMTP 协议提供者)与 dovecot (POP3协议提供者)所产生的讯息啦。SMTP是发信所使用的通讯协议,POP3则是收信使用的通讯协议。postfix 与 dovecot 则分别是两套达成通讯协议的软件。
/var/log/messages:
这个文件相当的重要,几乎系统发生的错误讯息(或者是重要的信息)都会记录在这个文件中;如果系统发生莫名的错误时,这个文件是一定要查阅的登录档之一。
/var/log/secure:
基本上,只要牵涉到【需要输入账号密码】的软件,那么当登入时(不管登入正确或错误)都会被记录在此文件中。包括系统的 login程序、图形接口登入所使用的 gdm程序、su, sudo等程序、还有网络联机的ssh, telnet等程序,登入信息都会被记载在这里;
/var/log/wtmp,/var/loglfaillog:
这两个文件可以记录正确登入系统者的帐户信息 (wtmp)与错误登入时所使用的帐户信息 (faillog);
/var/log/httpd/*, /var/log/samba/*:
不同的网络服务会使用它们自己的登录文件来记载它们自己产生的各项讯息,上述的目录内则是个别服务所制订的登录档。
不同的Linux distributions ,通常登录档的档名不会相同(除了/var/log/messages 之外 )。
登录档所需相关服务(daemon)与程序
登录档的产生基本上有两种方式:一种是由软件开发商自行定义写入的登录档与相关格式,例如 WWW软件 apache 就是这样处理的。另一种则是由 Linux distribution 提供的登录档管理服务来统一管理。只要将讯息丢给这个服务后,他就会自己分门别类的将各种讯息放置到相关的登录档去。CentOS 提供 rsyslog.service 这个服务来统一管理登录档。
不过要注意的是,如果任凭登录文件持续记录的话,由于系统产生的信息天天都有,那么登录文件的容量将会持续增长,如果登录文件容量太大时,可能会导致大文件读写效率不佳的问题(因为要从磁盘读入内存,越大的文件消耗内存量越多)。所以需要对登录档备份与更新。
可以透过 logrotate(登录档轮替)来自动化处理登录文件容量与更新的问题。
所谓的 logrotate 基本上,就是将旧的登录档更改名称,然后建立一个空的登录档,如此一来,新的登录文件将重新开始记录,然后只要将旧的登录档留下一阵子就可以达到将登录档【轮转】的目的。
此外,如果旧的记录(大概要保存几个月吧!)保存了一段时间没有问题,那么就可以让系统自动的将他砍掉,免得占掉很多宝贵的硬盘空间。
总结一下,针对登录文件所需的功能,需要的服务与程序有:
systemd-journald.service:最主要的讯息收受者,由systemd提供的;
rsyslog.service:主要登录系统与网络等服务的讯息;
logrotate:主要在进行登录文件的轮替功能。
CentOs 7.x 使用 systemd 提供的 journalctl 日志管理
CentOS 7 除了保有既有的 rsyslog.service 之外,其实最上游还使用了systemd 自己的登录文件日志管理功能。他使用的是 systemd-journald.service 这个服务来支持的。基本上,系统由 systemd 所管理,那所有经由 systemd 启动的服务,如果再启动或结束的过程中发生一些问题或者是正常的讯息,就会将该讯息由 systemd-journald.service 以二进制的方式记录下来,之后再将这个讯息发送给 rsyslog.service 作进一步的记载。
systemd-journald.service 的记录主要都放置于内存中,因此在存取方面效能比较好~我们也能够透过journalctl 以及 systemctl status unit.service 来查看各个不同服务的登录档。登录档可以随着个别服务供用户查阅,在单一服务的处理上面,要比 /var/log/messages 简易很多。
登录档内容的一般格式
一般来说,系统产生的讯息经过记录下来的数据中,每条讯息均会记录几个重要数据:
事件发生的日期与时间;
发生此事件的主机名;
启动此事件的服务名称(如 systemd, CROND等)或指令与函式名称(如su, login…);
该讯息的实际数据内容。
这些信息的【详细度】是可以修改的,而且,这些信息可以作为系统除错之用。
发生底下几种情况时:
当你觉得系统似乎不太正常时;
某个 daemon 老是无法正常启动时;
某个使用者老是无法登入时;
某个 daemon 执行过程老是不顺畅时;
要去【巡视】登录档的内容。
rsyslog.service:记录登录文件的服务
Linux 的登录档主要是由 rsyslog.service 在负责,查看其是否自启动:
rsyslog.service 的配置文件:/etc/rsyslog.conf
rsyslogd 可以负责主机产生的各个信息的登录,而这些信息本身是有【严重等级】之分的。
基本上,rsyslogd 针对各种服务与讯息记录在某些文件的配置文件就是 /etc/rsyslog.conf,这个文件规定了【(1)什么服务(2)的什么等级讯息3需要被记录在哪里(装置或文件)】,所以设定的语法会是这样:
服务名称
rsyslogd 主要是透过Linux核心提供的 syslog 相关规范来设定数据的分类的,Linux 的 syslog 本身有规范一些服务讯息,可以透过这些服务来储存系统的讯息。Linux核心的 syslog 认识的服务类型主要有底下这些:(可使用man 3 syslog 查询到相关的信息,或查询 syslog.h这个文件来了解)
Linux 核心的 syslog 函数自行制订的服务名称,软件开发商可以透过呼叫上述的服务名称来记录他们的软件。
举例来说, sendmail 与 postfix 及 dovecot 都是与邮件有关的软件,这些软件在设计登录文件记录时,都会主动呼叫 syslog 内的 mail 服务名称(LOG_MAIL)。所以上述三个软件(sendmail, postfix, dovecot)产生的讯息在 syslog 看起来,就会是 【mail】类型的服务了。
另外,每种服务所产生的数据量其实差异是很大的,举例来说,mail 的登录文件讯息很多,每一封信件进入后, mail 至少需要记录【寄信人的信息;与收信者的讯息】等等;而如果是用来做为工作站主机的,那么登入者(利用login登录主机处理事情)的数量一定不少,那个authpriv所管辖的内容就很多了。
讯息等级
同一个服务所产生的讯息也是有差别的,有启动时仅通知系统而已的一般讯息(information),有出现还不至于影响到正常运作的警告讯息 (warn),还有系统硬件发生严重错误时,所产生的重大问题讯息 (error 等等);讯基本上,Linux核心的 syslog 将讯息分为七个主要的等级,根据syslog.h 的定义,讯息名称与数值的对应如下:
基本上,在0(emerg)到6(info)的等级之间,等级数值越高代表越没事,等级靠近0则代表事情大了。
除了 0 到 6 之外还有两个比较特殊的等级,那就是debug(错误侦测等级)与none(不需登录等级)两个,当我们想要作一些错误侦测,或者是忽略掉某些服务的信息时,就用这两个。
特别留意一下在讯息等级之前还有【=!】的链接符号。他代表的意思是:
.
:代表【比后面还要严重的等级(含该等级)都被记录下来】的意思,例如: mail.info 代表只要是 mail
的信息,而且该信息等级严重于info (含 info本身)时,就会被记录下来的意思。
.=
:代表所需要的等级就是后面接的等级而已,其他的不要。
.!
:代表不等于,亦即是除了该等级外的其他等级都记录。
一般来说,比较常使用的是【.
】这个链接符号。
讯息记录的文件名或装置或主机
一些常见的放置处:
文件的绝对路径:通常就是放在 /var/log 里头的文件;
打印机或其他:例如/dev/lp0 这个打印机装置;
使用者名称:显示给用户;
远程主机:例如@study.vbird.tsai 要对方主机也能支持才行;
*
:代表【目前在在线的所有人】,类似 wall 这个指令的意义。
服务、daemon 与函数名称
CentOs 7.x 预设的 rsyslog.conf 内容
vim /etc/rsyslog.conf
#kern.*:只要是核心产生的讯息,全部都送到 console(终端机)去。console通常是由外部装置连接到系统而来。这个项目通常应该是用在系统出现严重问题而无法使用默认的屏幕观察系统时,可以透过这个项目来连接取得核心的讯息。
*.info;mail.none;authpriv.none;cron.none:由于 mail, authpriv, cron等类别产生的讯息较多,且已经写入底下的数个文件中,因此在 /var/log/messages 里面就不记录这些项目。除此之外的其他讯息都写入
/var/log/messages 中。
authpriv.*:认证方面的讯息均写入 /var/log/secure 文件;
mail.*:邮件方面的讯息则均写入 /var/log/maillog 文件;
cron.*:例行性工作排程均写入/var/log/cron文件;
*.emerg:当产生最严重的错误等级时,将该等级的讯息以 wall 的方式广播给所有在系统登入的账号得知,要这么做的原因是希望在线的用户能够赶紧通知系统管理员来处理这么可怕的错误问题。
uucp,news.crit: ucp 是早期 Unix-like 系统进行数据传递的通讯协议,后来常用在新闻组的用途中。news则是新闻组。当新闻组方面的信息有严重错误时就写入 /var/log/spooler 文件中;
local7.*:将本机开机时应该显示到屏幕的讯息写入到 /var/log/boot.log 文件中;
登录档的安全性检查
可以透过一个隐藏的属性来设定登录档,成为【只可以增加数据,但是不能被删除】的状态。
chatt r +a /var/1og/ admin.log
加入了这个属性之后,/var/log/admin.log 登录档从此就仅能被增加,而不能被删除,直到 root 以 【chattr -a /var/log/admin.log
】 取消这个 a 的参数之后,才能被删除或移动。
登录档服务器的设定
登录档服务器的架构:
如上图所示,服务器会启动监听的埠口,客户端则将登录档再转出一份送到服务器去。而既然是登录档【服务器】,所以当然有服务器与客户端(client)。两者的设定分别是这样的:
1.Server 端:修改 rsyslogd 的启动配置文件,在 /etc/rsyslog.conf 内
上面的是UDP埠口,底下的是TCP埠口。如果网络状态很稳定,就用UDP即可。不过,如果想要让数据比较稳定传输,那么建议使用TCP。
2.client 端:指定某个信息传送到这部主机即可
可以在 /etc/rsyslog.conf 内新增一行:TCP:*.* @@192.168.1.100
,UDP:*.* @192.168.1.100
重新启动 rsyslog.service 后就OK。。。。
登录档的轮替
【rsyslogd 利用的是 daemon 的方式来启动的,当有需求的时候立刻就会被执行的,但是 logrotate 却是在规定的时间到了之后才来进行登录档的轮替,所以这个logrotate 程序是挂在cron底下进行的】
logrotate
logrotate主要是针对登录档来进行轮替的动作,记载了【在什么状态下才将登录档进行轮替】的设定。
logrotate这个程序的参数配置文件在:/etc/logrotate.conf
、/etc/logrotate.d/
logrotate.conf 才是主要的参数文件,至于 logrotate.d 是一个目录,该目录里面的所有文件都会被主动的读入 /etc/logrotate.conf 当中来进行。另外,在 /etc/logrotate.d 里面的文件中,如果没有规定到的一些细部设定,则以 /etc/logrotate.conf 这个文件的规定来指定为默认值。
logrotate 的主要功能就是将旧的登录文件移动成旧档,并且重新建立一个新的空的文件来记录,他的执行结果类似底下的图示:
当第一次执行完 rotate 之后,原本的 messages 会变成 messages.1 而且会制造一个空的 messages 给系统来储存登录文件。而第二次执行之后,则 messages.1 会变成 messages.2 而 messages 会变成messages.1,又造成一个空的 messages 来储存登录档。
如果仅设定保留三个登录档而已的话,那么执行第四次时,则messages.3这个文件就会被删除,并由后面的较新的保存登录档所取代。
vim /etc/logrotate.conf
可以知道 /etc/logrotate.d 其实就是由 /etc/logrotate.conf 所规划出来的目录。
如果独立出来一个目录,那么每个以 RPM 打包方式所建立的服务的登录档轮替设定,就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中即可。
一般来说,这个 /etc/logrotate.conf 是【预设的轮替状态】而已,各个服务都可以拥有自己的登录档轮替设定,也可以自行修改成自己喜欢的样式。
logrotate.conf 的设定语法是:
/etc/logrotate.d/syslog 这个轮替 rsyslog.service服务的文件:
在上面的语法当中,正确的 logrotate 的写法为:
档名:被处理的登录文件绝对路径文件名写在前面,可以使用空格符分隔多个登录档;
参数:上述档名进行轮替的参数使用 {}
包括起来;
执行脚本:可呼叫外部指令来进行额外的命令下达,这个设定需与 sharedscripts …endscript 设定合用才行。至于可用的环境为:
1.prerotate:在启动 logrotate 之前进行的指令,例如修改登录文件的属性等动作;
2.postrotate:在做完 logrotate之后启动的指令,例如重新启动(kill -HUP)某个服务;/bin/kill -HUP… 的目的在于将系统的 rsyslogd 重新以其参数档(rsyslog.conf)的资料读入一次;
3.Prerotate 与 postrotate对于已加上特殊属性的文件处理上面,是相当重要的执行程序;
那么、/etc/logrotate.d/syslog 内设定的 5 个文件的轮替功能就变成了:
该设定只对 /var/log/ 内的 cron, maillog, messages, secure, spooler 有效;
登录档轮替每周一次、保留四个、且轮替下来的登录档不进行压缩(未更改默认值);
轮替完毕后(postrotate)取得 syslog 的 PID 后,以 kill -HUP 重新启动 syslogd。
实际测试 logrotate 的动作
logrotate [-vf] logfile;
由于 logrotate 的工作已经加入 crontab 里了,所以现在每天系统都会自动的给他查看 logrotate。
systemd-journald.service 简介
过去只有 rsyslogd 的年代中,由于 rsyslogd 必须要开机完成并且执行了 rsyslogd 这个daemon之后,登录文件才会开始记录。所以,核心还得要自己产生一个 klogd 的服务,才能将系统在开机过程、启动服务的过程中的信息记录下来,然后等 rsyslogd 启动后才传送给它来处理。
systemd 是核心唤醒的,然后又是第一支执行的软件,它可以主动呼叫 systemd-journald 来协助记载登录文件。因此在开机过程中的所有信息,包括启动服务与服务若启动失败的情况等等,都可以直接被记录到systemd-journald里。
不过 systemd-journald 由于是使用于内存的登录文件记录方式,因此重新启动过后,开机前的登录文件信息就不会被记载了。
虽然 systemd-journald 所记录的数据其实是在内存中,但是系统还是利用文件的型态将它记录到 /run/log/ 底下。不过 /run 在 CentOS 7 其实是内存内的数据,所以重新启动过后,这个/run/log 底下的数据就被刷新,旧的就不再存在了。
使用 journalctl 观察登录信息
journalctl [-nrpf] [--since TIME] [--until TIME] _optional
logger 指令的应用
logger [-p 服务名称,等级] "讯息"
手动使用 logger 来传送数据到登录文档内:
保存 journal 的方式
systemd-journald.servicd 的讯息是不会放到下一次开机后的,所以,重新启动后,那之前的记录通通会遗失。
基本上,systemd-journald.service 的配置文件主要参考 /etc/systemd/journald.conf 的内容。
只是如果想要保存 journalctl 所读取的登录档那么就得要建立一个 /var/log/journal 的目录,并且处理一下该目录的权限,那么未来重新启动systemd-journald.service 之后,日志登录文件就会主动的复制一份到/var/log/journal目录下了。
1.先处理所需要的目录与相关权限设定;
2.重新启动 systemd- journald 并且观察备份的日志数据。
logwatch 为 CentOS 7 预设提供的一个登录文件分析软件。
《鸟哥的Linux私房菜-基础篇》学习笔记