认识与分析登录文件
网络老手也常常告诉新手要多查看登录文件。当您启动一个事件的时候,或者是有人登录您的Linux主机的时候,主机会生成一些认证程序或重要信息,由于这些信息很重要,所以自认需要保留下来,以备将来不时之需,这些消息会记录在某些文件上,这些文件就称为登录文件咯。登录者的信息记录在哪里呢?信息量有多大?可以每天查看吗?如果能用Shell脚本来分析的话,不是更快!!
什么是登录文件
“详细而准确地记录或备份系统的登录文件”是很容易被新手忽略的。
登录文件的功能:
解决系统故障:启动过程中检测到的硬件数据会记录到内存中,可以执行dmesg命令查看硬件检测是否发生错误。/var/log/messages这个文件中也会有一些错误信息的记录。
解决网络服务问题:安装或设置新服务的套件时,常用到这个功能。
记录登录信息:
常见的登录文件有:
· /var/log/cron:还记得第十六章例行性工作排程吧?你的 crontab 排程有没有实际被进行? 进行过程有没有发生错误?你的/etc/crontab 是否撰写正确?在这个登录档内查询看看。
· /var/log/dmesg:记录系统在开机的时候核心侦测过程所产生的各项信息。由于 CentOS 默认将开机时核心的硬件侦测过程取消显示, 因此额外将数据记录一份在这个档案中;
· /var/log/lastlog:可以记录系统上面所有的账号最近一次登入系统时的相关信息。第十四章讲到的 lastlog 指令就是利用这个档案的记录信息来显示的。
· /var/log/maillog 戒 /var/log/mail/*:记录邮件的往来信息,其实主要是记录 sendmail (SMTP 协议提供者) 与 dovecot (POP3 协议提供者) 所产生的讯息啦。 SMTP 是发信所使用的通讯协议, POP3 则是收信使用的通讯协议。 sendmail 与 dovecot 则分别是两套达成通讯协议的软件。
· /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/news/*, /var/log/samba/*:不同的网络服务会使用它们自己的登录档案来记载它们自己产生的各项讯息!上述的目录内则是个别服务所制订的登录档。
在Linux的登录文件系统,通常以一个特定的守护程序来写入信息—syslogd。只要软件套件支持syslogd的登录文件写入模式,该套件的信息就会写入到syslogd管理的登录文件中。
logrotate命令,将数据进行轮转,就是将旧的登录文件更改名称,然后建立一个空的登录文件,新的登录文件将从零开始记录,然后只要将旧的登录文件留下一段时间,就可以达到将登录文件“轮转”的目的了。
针对登录文件来设计的服务有:
syslogd:记录系统或者是网络服务的登录文件。
logrotete:将旧的数据更名,并且建立新的登录文件,以保持登录文件的全新,并且设置将最旧的登录文件删除。
登录文件的记录:syslogd
Linux的登录文件主要是由syslogd这个守护程序负责,检查syslogd是否启动:
[root@www ~]# ps aux | grep syslog
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 4294 0.0 0.0 1716 568 ? Ss Mar31 0:00 syslogd -m 0
# 瞧!确实有启动的!
[root@www ~]# chkconfig --list syslog
syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# 默认情况下,文字接口与图形接口 (3, 5) 都有启动喔!
登录文件内容的一般格式
一般情况下,经过syslog记录下来的数据主要有:
·时间发生的日期与时间
·发生此时间的主机名称
·启动此事件的服务名称或函数名称
·该消息数据内容
利用#cat /var/log/secure查看一下。这些消息不要外流需要好好保存。
[root@www ~]# cat /var/log/secure
1 Mar 14 15:38:00 www atd[18701]: pam_unix(atd:session): session
opened for user root by (uid=0)
2 Mar 14 15:38:00 www atd[18701]: pam_unix(atd:session): session closed
for user root
3 Mar 16 16:01:51 www su: pam_unix(su-l:auth): authentication failure;
logn ame=vbird uid=500 euid=0 tty=pts/1 ruser=vbird rhost= user=root
4 Mar 16 16:01:55 www su: pam_unix(su-l:session): session opened for
user root by vbird(uid=500)
5 Mar 16 16:02:22 www su: pam_unix(su-l:session): session closed for user
root
|--日期/时间---|-H-|-----朋务不相关凼数-------|--讯息说明------>
我们拿第一笔数据来说明好了,该资料是说:『在三月14日 (Mar 14) 的下午 15:38 分,由 www 这部主机的 atd [PID 为 18701] 传来的消息,这个消息是透过 pam_unix 这个模块所提出的。讯息内容为 root (uid=0) 这个账号已经开启 atd 的活动了。』有够清楚吧! 那请您自行翻译一下后面的 4 条讯息内容是什么喔!
有很多消息是值得看的,尤其是/var/log/messages的内容。
当系统:
·感觉系统不太正常时
·某个守护程序总是无法正常启动时
·某个用户总是无法顺利登录时
·某个守护程序的执行过程总是不顺畅时
就应该去查看登录文件咯
syslog 的配置文件:/etc/syslog.conf
让不同的信息放到不同的文件中,以便分门别类地进行登录文件的管理,将各种类别的服务登录文件记录在不同的文件里,就是/etc/syslog.conf要做的工作。
这个档案规定了『(1)什么服务 (2)的什么等级讯息 (3)需要被记录在哪里(装置或档案)』所以设定的语法是这样:
服务名称[.=!]讯息等级 讯息记录的文件名或装置或主机 # 底下以 mail 这个服务产生的 info 等级为例: mail.info /var/log/maillog_info # 这一行说明:mail 服务产生的大于等于 info 等级的讯息,都记录到 # /var/log/maillog_info 档案中的意思。 |
我们将上面的数据简单的分为三部分来说明:
服务名称
syslog 认识的服务主要有底下这些:
上面谈到的都是 syslog 自行制订的服务名称,软件开发商可以透过呼叫上述的服务名称来记录他们
Syslog所认识的服务与我们常说的服务不太一样,比如:关于邮件服务器,我们可以选择sendmail,qmail或是postfix软件来实现,但这些服务器使用的都是同一个通信协议,即smtp,所以这些同性质的服务器,产生的信息都属于syslog中的mail所管辖的范围。
2 信息等级
每种服务所产生的信息是有差异的:基本上系统将信息分为7个主要的等级,按顺序如下:
(由不重要排列到重要等级):
除了这些有等级的讯息外,还有两个特殊的等级,那就是 debug(错误侦测等级) 与 none (不需登录等级) 两个,当我们想要作一些错误侦测,或者是忽略掉某些服务的信息时, 就用这两个。
特别留意一下在讯息等级之前还有 [.=!] 的连结符号喔!他代表的意思是这样的:
(.):代表『比后面还要高的等级 (含该等级) 都被记录下来』的意思,例如: mail.info 代表只要是 mail 的信息,而且该信息等级高于 info (含 info 本身)时,就会被记录下来的意思。
(.=):代表所需要的等级就是后面接的等级而已, 其它的不要!
(.!):代表不等于, 亦即是除了该等级外的其它等级都记录。
一般来说,我们比较常使用的是『.』这个连结符号.
3 信息记录的文件名或配置或主机
这个说明信息的记录位置,通常是记录到文件,但也可以输出到设备。
一些常见的位置:
文件的绝对路径:通常是放到/var/log里的文件。
打印机或其他:例如/dev/lp0打印机设备
用户名称:显示给用户
远程主机:当然需要对方的主机也支持才可以。
* :表示“当前在线的所有人”,类似wall命令的意思。
例子:
1把mail相关的数据都写入/var/log/maillog中,在/etc/syslog.conf应该这样写:
mail.info /var/log/maillog
2 我要将新闻群组资料 (news) 及例行性工作排程 (cron) 的讯息都写入到一个称为 /var/log/cronnews 的档案中,但是这两个程序的警告讯息则额外的记录在 /var/log/cronnews.warn 中,那该如何设定我的 syslog.conf 呢?
答: 既然是两个程序,那么只好以分号来隔开了,此外,由于第二个指定档案中,我只要记录警告讯息,因此设定上需要指定『.=』这个符号,所以语法成为了:
news.*;cron.* /var/log/cronnews
news.=warn;cron.=warn /var/log/cronnews.warn
3
我的 messages 这个档案需要记录所有的信息,但是就是不想要记录 cron, mail 及 news 的信息,那么应该怎么写才好?
答: 可以有两种写法,分别是:
*.*;news,cron,mail.none /var/log/messages
*.*;news.none;cron.none;mail.none /var/log/messages
使用『,』分隔时,那么等级只要接在最后一个即可,如果是以『;』來分的话,那么就需要将服务与等级都写上去!
自己如果修改了/etc/syslog.conf里面的内容后,在修改完毕后需要重新启动 syslog服务才可以生效。
CentOS 5.x 预设的 syslog.conf 内容
# 来自 CentOS 5.x 的相关资料
[root@www ~]# vim /etc/syslog.conf
1 #kern.* /dev/console
2 *.info;mail.none;news.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 *
7 uucp,news.crit /var/log/spooler
8 local7.* /var/log/boot.log
9 news.=crit /var/log/news/news.crit
10 news.=err /var/log/news/news.err
11 news.notice /var/log/news/news.notice
上面总共仅有十一行设定值,每一行的意义是这样的:
1. #kern.*:只要是核心产生的讯息,全部都送到 console(终端机) 去。
2. *.info;mail.none;news.none;authpriv.none;cron.none:由于 mail, news, 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 档案中;
9. 后面的 news.=crit、news.=err、news.notice 则主要在分别记录新闻组产生的不同等级的讯息。
自行增加登录文件档案功能
# 1. 先设定好所要建立的档案设置!
[root@www ~]# vim /etc/syslog.conf
# Add by VBird 2009/04/08 <==再次强调,自己修改的时候加入一些说明
*.info /var/log/admin.log <==有用的是这行啦!
# 2. 重新启动 syslog 呢!
[root@www ~]# /etc/init.d/syslog restart
[root@www ~]# ll /var/log/admin.log
-rw------- 1 root root 118 Apr 8 13:50 /var/log/admin.log
# 瞧吧!建立了这个登录档出现啰!
很简单吧!如此一来,所有的信息都会写入 /var/log/admin.log 里面了!
登录文件的安全性设置
知道了登录文件的重要性,就要对它进行安全性方面的设置以防被窃取。
可以通过一个隐藏的属性来设置登录文件,使之只可以增加数据但不能被删除或许可以达到保护的作用。
lsattr 与 chattr 。如果一个文件以chattr设置i属性,那么这个文件连root也不能删除掉,可是也就不能增加数据。使用a属性,这样这个文件就只能增加而不能删除。
[root@www ~]# chattr +a /var/log/messages
[root@www ~]# lsattr /var/log/messages
-----a------- /var/log/messages
登录文件服务器的简单设置
先修改syslogd的启动设置文件,通常是在/etc/sysconfig/这个目录下
Server端
# vi /etc/sysconfig/syslog
找到 SYSLOGD_OPTIONS=“-m 0”
修改成:SYSLOGD_OPTIONS=“-m 0 -r”
重新启动syslogd
#/etc/init.d/syslog restart
客户端的编辑
# vi /etc/syslog.conf
*.* @192.168.1.100
登录文件的轮替(logrotate)
syslog 利用的是 daemon 的方式来启动的, 当有需求的时候立刻就会被执行的,但是 logrotate 却是在规定的时间到了之后才来进行登录档的轮替, 所以这个 logrotate 程序当然就是挂在 cron 底下进行的呦
logrotate的设置文件
/etc/logrotate.conf
/etc/logrotate.d/
logrotate.conf 才是主要的参数文件, logrotate.d 是一个目录, 该目录里面的所有档案都会被主动的读入 /etc/logrotate.conf 当中来进行!另外,在 /etc/logrotate.d/ 里面的档案中,如果没有规定到的一些细部设定,则以 /etc/logrotate.conf 这个文件的规定来指定为默认值!
我们来看一下预设的 logrotate 的内容吧!
[root@www ~]# vim /etc/logrotate.conf # 底下的设定是 "logrotate 的预设设定值" ,如果个别的档案设定了其它的参数, # 则将以个别的档案设定为主,若该档案没有设定到的参数则以这个档案的内容为默认值!
weekly <==预设每个礼拜对登录档进行一次 rotate 的工作 rotate 4 <==保留几个登录档呢?预设是保留四个! create <==由于登录档被更名,因此建立一个新的来继续储存之意! #compress <==被更动的登录档是否需要压缩?如果登录档太大则可考虑此参数启动
include /etc/logrotate.d # 将 /etc/logrotate.d/ 这个目录中的所有档案都读进来执行 rotate 的工作!
/var/log/wtmp { <==仅针对 /var/log/wtmp 所设定的参数 monthly <==每个月一次,取代每周! minsize 1M <==档案容量一定要超过 1M 后才进行 rotate (略过时间参数) create 0664 root utmp <==指定新建档案的权限与所属账号/群组 rotate 1 <==仅保留一个,亦即仅有 wtmp.1 保留而已。 } # 这个 wtmp 可记录登入者与系统重新开机时的时间与来源主机及登入期间的时间。 # 由于具有 minsize 的参数,因此不见得每个月一定会进行一次喔!要看档案容量。 # 由于仅保留一个登录档而已,不满意的话可以将他改成 rotate 5 吧! |
由这个档案的设定我们可以知道 /etc/logrotate.d 其实就是由 /etc/logrotate.conf 所规划出来的目录,所以,其实我们可以将所有的资料都给他写入 /etc/logrotate.conf 即可,但是这样一来这个档案就实在是太复杂了,尤其是当我们使用很多的服务在系统上面时, 每个服务都要去修改 /etc/logrotate.conf 的设定也似乎不太合理~ 所以,如果独立出来一个目录,那么每个以 RPM 打包方式所建立的服务的登录档轮替设定, 就可以独自成为一个档案,并且放置到 /etc/logrotate.d/ 当中即可,真是方便又合理的做法啊! ^_^
一般来说,这个 /etc/logrotate.conf 是『预设的轮替状态』而已, 我们的各个服务都可以拥有自己的登录档轮替设定,你也可以自行修改成自己喜欢的样式啊! 例如,如果你的系统的空间够大,并且担心除错以及黑客的问题,那么可以:
将 rotate 4 改成 rotate 9 左右,以保存较多的备份文件;
大部分的登录档不需要 compress 啰!但是空间太小就需要 compress !尤其是很占硬盘空间的 httpd 更需要 compress 的!
好了,上面我们大致介绍了 /var/log/wtmp 这个档案的设定,现在你知道了 logrotate.conf 的设定语法是:
登录文件的绝对路径文件名 ... { 个别的参数设定值,如 monthly, compress 等等 } |
底下我们再以 /etc/logrotate.d/syslog 这个轮替 syslog 服务的档案,来看看该如何设定他的 rotate 呢?
[root@www ~]# vi /etc/logrotate.d/syslog /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler \ /var/log/boot.log /var/log/cron { sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true /bin/kill -HUP `cat /var/run/rsyslogd.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/ 内的 messages, secure, maillog, spooler, boot.log, cron 有效;
登录档轮替每周一次、保留四个、且轮替下来的登录档不进行压缩(未更改默认值);
轮替完毕后 (postrotate) 取得 syslog 的 PID 后,以 kill -HUP 重新启动 syslogd
假设我们有针对 /var/log/messages 这个档案增加 chattr +a 的属性时, 依据 logrotate 的工作原理,我们知道,这个 /var/log/messages 将会被更名成为 /var/log/messages.1 才是。但是由于加上这个 +a 的参数啊,所以更名是不可能成功的! 那怎么办呢?呵呵!就利用 prerotate 与 postrotate 来进行登录档轮替前、后所需要作的动作啊! 果真如此时,那么你可以这样修改一下这个档案喔!
[root@www ~]# vi /etc/logrotate.d/syslog /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler \ /var/log/boot.log /var/log/cron { 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 /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true /usr/bin/chattr +a /var/log/message endscript } |
看到否?就是先给他去掉 a 这个属性,让登录文件 /var/log/messages 可以进行轮替的动作, 然后执行了轮替之后,再给他加入这个属性!请特别留意的是,那个 /bin/kill -HUP ... 的意义,这一行的目的在于将系统的 syslogd 重新以其参数档 (syslog.conf) 的资料读入一次!也可以想成是 reload 的意思啦! 由于我们建立了一个新的空的纪录文件,如果不执行此一行来重新启动服务的话, 那么记录的时候将会发生错误呦!(请回到第十七章读一下 kill 后面的 signal 的内容说明)
实际测试 logrotate 的动作
好了,设定完成之后,我们来测试看看这样的设定是否可行呢?给他执行底下的指令:
[root@www ~]# logrotate [-vf] logfile
选项与参数:
-v :启动显示模式,会显示 logrotate 运作的过程喔!
-f :不论是否符合配置文件的数据,强制每个登录档都进行 rotate 的动作!
范例一:执行一次 logrotate 看看整个流程为何?
[root@www ~]# logrotate -v /etc/logrotate.conf
reading config file /etc/logrotate.conf <==读取主要配置文件
including /etc/logrotate.d <==呼叫外部的设定
reading config file acpid <==就是外部设定啊!
....(中间省略)....
Handling 21 logs <==共有 21 个登录文件被记录
....(中间省略)....
rotating pattern: /var/log/messages /var/log/secure /var/log/maillog \
/var/log/spooler /var/log/boot.log /var/log/cron weekly (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/messages <==开始处理 messages
log does not need rotating <==因为时间未到,不需要更动!
....(底下省略)....
范例二:强制进行 logrotate 的动作
[root@www ~]# logrotate -vf /etc/logrotate.conf
....(前面省略)....
rotating log /var/log/messages, log->rotateCount is 4
renaming /var/log/messages.4 to /var/log/messages.5 (rotatecount 4, logstart 1, i 4),
renaming /var/log/messages.3 to /var/log/messages.4 (rotatecount 4, logstart 1, i 3),
renaming /var/log/messages.2 to /var/log/messages.3 (rotatecount 4, logstart 1, i 2),
renaming /var/log/messages.1 to /var/log/messages.2 (rotatecount 4, logstart 1, i 1),
renaming /var/log/messages.0 to /var/log/messages.1 (rotatecount 4, logstart 1, i 0),
old log /var/log/messages.0 does not exist
....(底下省略)....
# 看到否?整个 rotate 的动作就是这样一步一步进行的~
[root@www ~]# ll /var/log/messages*; lsattr /var/log/messages
-rw------- 1 root root 63 Apr 8 15:19 /var/log/messages
-rw------- 1 root root 670 Apr 8 14:22 /var/log/messages.1
-rw------- 1 root root 24984 Apr 1 19:26 /var/log/messages.2
-rw------- 1 root root 1911 Mar 28 11:32 /var/log/messages.3
-rw------- 1 root root 25193 Mar 22 04:02 /var/log/messages.4
-----a------- /var/log/messages <==主动加入 a 的隐藏属性啰!
由于 logrotate 的工作已经加入 crontab 里头了!所以现在每天系统都会自动的给他查看 logrotate 啰!不用担心 的啦!只是要注意一下那个 /var/log/messages 里头是否常常有类似底下的字眼:
Apr 8 15:19:47 www syslogd 1.4.1: restart (remote reception).
这说明的是 syslogd 重新启动的时间啦 (就是因为 /etc/logrotate.d/syslog 的设定之缘故!)
分析登录文件
常见的命令 last lastlog dmesg
1 dmesg
2 last –n number
last –f filename
参数:
-n : 使用-n 来限制可以显示的行数 last –n 12 或者 last -20
3 lastlog