鸟哥的 Linux 与 ADSL 私房菜
认识与分析登录档
最近更新日期:2003/02/11 什么是登录档、干嘛要分析登录档 Linux 登录档的规划: syslogd, 登录文件的安全属性设定, logrotate, 登录档分析: dmesg, last, VBird 写的 logfile.sh 本章习题练习
什么是登录档、干嘛要分析登录档
这部分是最容易被新手所忽略的,那就是详细而确实的纪录或者是备份系统的登录文件。什么是登录档呢?简单的说,就是记录系统活动记录的几个档案,例如:何时、何地(来源 IP )、何人( login name )、做了什么动作,另外就是系统在什么时候做了什么样的行为时,发生了什么样的事件等等,要知道的是,我们的 Linux 主机在背景之下,有相当多的 daemons 在工作着,那么这些工作中的程序总是会有一些讯息显示,这些显示的讯息就是给记录在登录文件当中啦,也就是说,记录这些系统的重要讯息,就是登录文件所进行的纪录工作的内容了。而由于这些记录的工作内容对于系统的信息太详细了,若被取得将可能影响到系统的安全性,因此,通常这些登录档只有 root 可以进行视察的功能!
那么为何要记录与解析登录文件呢?这是由于记录文件有几个重要的功能:
- 解决系统的错误:这个对于系统管理员来说是很重要的信息,例如:开机的过程当中侦测到的硬件讯息数据会记录到内存当中,由于这些侦测的信息可以提供我们了解硬件信息,所以如果你的系统发生问题时,可以下达 dmesg 看看硬件的侦测有没有发生错误呢!另外,如果系统资源被耗尽、核心活动发生错误等等事件发生的时候,则系统登录文件亦会将错误的讯息记录在登录文件中(通常是 /var/log/messages ),这些都可以藉以取得错误发生时的信息,并加以克服问题!!
- 解决网络服务的问题:在安装或设定新服务的套件时,最常使用到这个功能了!例如在安装启动 sendmail 时,如果 sendmail 无法提供服务的时候,那么无法提供服务的问题则会被纪录到登录文件当中去,则只要分析登录档就可以了解问题点,并藉以解决问题啦!( 所以我们常说『天助自助者』是真的啦!察看(1)屏幕上面的错误讯息与(2)登录文件的错误信息,几乎可以解决大部分的 Linux 问题! )
- 记录登录信息:这个东西相当的重要!例如:有天您的 apache 这个 WWW 服务挂了,你怎么知道何时挂掉的?而最后登入者是谁?!这都可以藉由分析 apache 的登录文件来取得信息;此外,万一有一天您的系统被入侵,并且被利用来攻击他人的主机,这个时候对方的主机查出是您的 Linux 在进行攻击的行为,这个时候你要如何告知对方您的主机是由于被入侵所导致的问题,并且协助对方继续往来源追查呢?!呵呵!此时登录档可是相当重要的呢!
因此,一个有经验的主机管理员,会随时随地查阅一下自己的登录文件,以随时掌握系统的最新脉动!那么见的几个登录档有哪些呢?一般而言,有下面几个:
- /var/log/secure:记录登入系统存取数据的档案,例如 pop3, ssh, telnet, ftp 等都会记录在此档案中;
- /var/log/wtmp:记录登入者的讯息数据,由于本档案已经被编码过,所以必须使用 last 这个指令来取出档案的内容;
- /var/log/messages:这个档案相当的重要,几乎系统发生的错误讯息(或者是重要的信息)都会记录在这个档案中;
- /var/log/boot.log:记录开机或者是一些服务启动的时候,所显示的启动或关闭讯息;
- /var/log/maillog 或 /var/log/mail/*:纪录邮件存取或往来( sendmail 与 pop3 )的使用者记录;
- /var/log/cron:这个是用来记录 crontab 这个例行性服务的内容的!
- /var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log: 分别是几个不同的网络服务的记录文件啦!
好了,那么记录了这些登录文件之后,我要做什么分析呀!?基本上,一个好的系统管理员大概都知道『一部主机负责的服务最好能少尽量少』,这是什么意思呢?也就是说,这部主机为邮件主机那么就专门负责邮件工作,不要还搞 WWW 服务!这样有几个好处,除了系统的安全性较佳之外(因为开的 port 变少了!),记录文件的解析也会比较简单!因为我们的 /var/log/secure 记录的登入者信息就会比较有一致性!那么我们就可以查询一下每日登入的使用者账号啦与错误讯息啦等等的!(当然啰,如果你的频宽够、经验丰富的话,那么一部主机上面安装所有的网络服务也是可以的啦!)基本上,检查/var/log/messages、/var/log/secure这些个档案也就相当够了!因为系统发生的错误或者是警告讯息通常都会写入这个档案中。 但是,如果我手边有数十部主机怎么办?我要不要一部一部去察看 log file 呢?呵呵!那样察看会死人ㄋㄟ?因此,我们底下也使用一个简易的登录档来分析 Red Hat 或 Mandrake 这两种 Linux distribution 的登录档吧!
Linux 登录档的规划: syslogd, logrotate,
在系统的登录文件系统当中,大多以一支常驻程序来进行写入这些讯息的这个工作,那就是 syslogd 这支程序啦!另外,由于登录档如果一直长大的话,那么这些登录档的写入动作将会很没有效率,这是因为档案太大时,ASCII 格式码的数据文件写入比较麻烦的缘故!那么怎么进行登录文件数据的备份工作呢?呵呵!那就使用 logrotate 吧!将数据进行轮转( rotate )?什么是轮转?!(我ㄌㄟ台语不轮转呦!?)其实也可以称为轮替啦!基本上,就是将旧的 log 档案更改名称,然后建立一个空的 log 档案,如此一来,新的 log 档案将从零开始记录,然后只要将旧的 log 档案留下一阵子,嗯!那就可以达到将登录档『轮转』的目的啦!此外,如果旧的纪录(大概要保存几个月吧!)保存了一段时间没有问题,那么就可以让系统自动的将他砍掉,免得占掉很多宝贵的硬盘空间说!(举个例子来说,我的 WWW 网站一个月的登录档,所占掉的硬盘空间大小,大概就有 1GB 这么多....而且都是纯文字文件....很可怕吧!) 所以说,基本上,针对 log 档案来设计的服务有这两支:
- syslogd:进行系统或者是网络服务的登录文件记录工作;
- logrotate:将旧的数据更名,并且建立新的登录档,以保持登录档的『新鲜』,并视设定将最旧的登录档删除。
所以,接着下来我们来谈一谈怎么样规划这两支程序呢?!就由 syslogd 这支程序先谈起吧!毕竟得先有登录档,才可以进行 logrotate 呀!您说是吧!?
- syslogd:
我们在Linux里面预设就已经使用了syslogd这支程序来记录系统的登入数据,不相信的话,你可以使用ps来查询一下:
[root @test root]# ps -aux|grep syslog root 782 0.0 0.8 1340 508 ? S Oct30 0:00 syslogd -m 0 root 11044 0.0 1.1 2408 732 pts/1 S 00:03 0:00 grep syslog | 看到syslog这个服务名称了吧?!呵呵!所以知道他已经在背景底下工作啰!syslog 这支程序可以提供『系统登入信息记录』及『Kernel错误或警示信息记录』等功能,此外,他还提供了『本地端与远程计算机的登录信息记录』功能,所以,可以将远程的主机登入信息同时记录在本地端呢!很不错的功能吧!!此外,目前正规使用的系统服务中,大都预设支持以 syslog 这一个服务来记录他的登录档案数据,例如apache, samba, sendmail 等等。而通常syslog提供的记录参数主要有:
- 事件发生时间;
- 主机名称;
- 启动此事件的服务名称(例如 httpd, samba...)
- 讯息数据内容
等等这些信息,当然,这些信息的详细度是可以修改的,此外,这些信息可以作为系统除错之用呢!我们先来看一下/var/log/secure的内容显示些什么呢?
[root @test root]# vi /var/log/secure Nov 4 16:28:35 test xinetd[7831]: START: telnet pid=7841 from=192.168.1.11 Nov 4 16:28:35 test xinetd[7841]: FAIL: telnet address from=192.168.1.11 Nov 4 23:41:17 test sshd[10803]: Accepted password for test from 192.168.1.11 port 3117 ssh2 Nov 4 23:41:17 test sshd(pam_unix)[10805]: session opened for user test by (uid=500) Nov 4 23:41:29 test su(pam_unix)[10838]: authentication failure; logname=test uid=500 euid=0 tty= ruser=test rhost= user=root Nov 4 23:41:34 test su(pam_unix)[10839]: session opened for user root by test(uid=500) | 在上面的表格中,可以看到每笔记录的主要内容是:
<日期与时间><主机名称><服务名称><显示讯息> 以第一笔资料来看,<日期是 Nov 4 的 16:28:35 时候>,在<主机 test 当中>,<那个 xinetd 服务的内容有数据啦>,<该程序的 PID 为 7831,显示的讯息,说的是telnet这个由xinetd启动的服务有人登入,登入者的IP是192.168.1.11>,这样够详细了吧!还有很多的信息值得看的呢!尤其是/var/log/messages的内容。然后,不要忘记了,在最后一笔数据中,还记录了可以使用su的使用者的uid 为500,账号名称为test,那么如果这个数据被人家夺走了,呵呵!未来外面的cracker将可能试图以test这个账号来猜测你的密码,并加以破解,嗯!真的很重要吧!所以这些数据很多都不能外流呢! 好了,再来看到我们要如何来设定 syslogd 呢?!刚刚说到 syslog 可以记录我们系统中的几乎所有的预设的系统工作,那么万一我的网络服务是自行设定的呢?!例如以 Tarball 安装好的服务套件。OK!我们可以藉由修改 syslog 的参数档来达到这个目的。那么预设的 syslog 参数档放在哪里呢?!
其实预设的 syslogd 程序的参数档案就是 /etc/syslog.conf 这个档案内容啦!这个档案的内容可以规定『什么服务需要被记录、该服务被纪录的讯息等级如何?』。基本上,可以使用底下的句子语法来说明:
- 服务名称:例如 mail, http, news, cron, at 等等的服务名称;
- 讯息等级:总共分成下列几种等级:
- info : 提示一些讯息数据;
- notice : 注意!需要比较留意的讯息;
- waring 或 warn : 警示的讯息,以上三个讯息都还是没有错误的情况,虽然是需要留意,但是还没有到错误的情况;
- err 或 error : 呀!错误讯息出现了!该要检验错误的问题发生原因了;
- crit : 临界点了!再不处理可就伤脑筋了!
- alert : 错误讯息一再地警告警告!你将要完蛋了!
- emerg 或 panic : 阿!系统已经进入混乱的阶段!真的是完蛋了~~
- 特殊等级:例如 debug (显示较多的信息!)及 none (不要记录该服务的内容!)等!
- 存放或显示地点:通常我们使用的都是记录的档案啦!但是也可以输出到装置呦!例如打印机之类的!
- 档案的绝对路径:通常就是放在 /var/log 里头的档案啦!
- 打印机或其它:例如 /dev/lp0 这个打印机装置
- 使用者名称:显示给使用者啰!
- 远程主机:例如 @test.adsldns.org
例题一:如果我要将我的mail相关的数据给他写入/var/log/maillog当中,那么在/etc/syslog.conf就要写成:
mail.info /var/log/maillog 注意到上面喔,当我们的等级使用info时,那么『任何大于info等级(含info这个等级)之上的讯息,都会被写入到后面接的档案之中!』这样可以了解吗?也就是说,我们可以将所有mail的登录信息都纪录在/var/log/maillog里面的意思啦! |
例题二:我要将新闻群组数据(news)及例行性命令的信息(cron)都写入到一个称为/var/log/cronnews的档案中,但是这两个程序的警告讯息记录在/var/log/cronnews.warn该如何设定我的档案呢?很简单啦!既然是两个程序,那么只好以分号来隔开了,此外,由于第二个指定档案中,我只要记录警告讯息,因此设定上需要指定『=』这个符号,所以就成为了:
news.*;cron.* /var/log/cronnews news.=warn;cron.=warn /var/log/cronnews.warn 上面那个『=』就是在指定等级的意思啦!由于指定了等级,因此,只有这个等级的讯息才会被纪录在这个档案里面呢! |
例题三:我的messages这个档案需要记录所有的信息,但是就是不想要记录cron,mail及news的信息,那么应该怎么写才好?可以有两种写法,分别是:
*.*;news,cron,mail.none /var/log/messages 或
*.*;news.none;cron.none;mail.none /var/log/messages 使用『,』分隔时,那么等级只要接在最后一个即可,如果是以『;』来分的话,那么就需要将服务与等级都写上去啰!这样会设定了吧! | 了解语法之后,我们来看一看在尚未开启网络服务的情况下,我们的 syslog 有哪些系统服务已经在纪录了呢?!那就是瞧一瞧 /etc/syslog.conf 这个档案的预设内容啰!(注意!如果需要将该行做为批注时,那么就加上 # 符号就可以啦!)
第一个例子:来自 Red Hat 7.x 版本的 syslog.conf 内容: #kern.* /dev/console # 只要是 kernel 产生的讯息,全部都送到 console 去! # 这个项目预设是关闭的!不过,只要您愿意,可以开启就是了!
*.info;mail.none;authpriv.none;cron.none /var/log/messages # 在已知各服务的讯息中,不要记录到这个档案当中啦! # 例如 mail 我们已经预设要记录在 /var/log/maillog (底下), # 所以自然不要在记录到这个 /var/log/messages 档案中啦! # 然后其它的讯息全部都记录到 /var/log/messages 当中! # 所以这个档案相当的重要!没有被规定到的讯息都可以在这里找到!
authpriv.* /var/log/secure # 这个就是经过一些身份确认的行为之后,需要记录身份的档案啦! # 什么是身份确认呢?例如 pop3 收信要输入账号与密码、 ssh 与 telnet, ftp # 等等的服务需要输入账号与密码,这些都会在 /var/log/secure 里面记录! # 他可也是相当重要的一个档案呢!
mail.* /var/log/maillog # 只要跟 mail 有关的(不论是 pop3 还是 sendmail )都会被纪录到这个档案中!
cron.* /var/log/cron # 还记得例行性命令那一章节吗?!对啦!就是那个 crontab 的东西, # 那东西的服务程序名称就是 cron 啦!执行 cron 的结果都记录于此!
*.emerg * 任何时候发生的警告讯息都会显示给在线的所有人!那个* 就是目前在线的所有人啦!
uucp,news.crit /var/log/spooler # 记录新闻错误高于 crit 的等级的信息,写入 spooler 当中!
local7.* /var/log/boot.log # 将开机的当中的讯息给他写入 /var/log/boot.log 这个档案当中呦! |
第二个例子:来自 Mandrake 9.0 的 syslog.conf 内容! # 各种系统的讯息 # 下面三行中,分别记录的是: # 1. 第一行记录的是有关『身份确认』的信息,只要是有『登入』主机,即有 # 『输入账号与密码』的程序时,都记录到 auth.log 里面去了,这部份的记录主要有: # xinet(telnet, ftp), ssh, su, postfix, pop3 等等 # 2. 第二行则是除了身份记录的信息之外,其它的都需要记录在/var/log/syslog当中! # 3. 第三行则是记录了任何 user 执行的指令有呼叫系统功能所产生的某些讯息! auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog user.* -/var/log/user.log
# 这个部分则是在记录任何信息!其实跟上面的 /var/log/syslog 有点重复了! # 不过,底下这一行中,跟 mail, news, authpriv 有关的信息都不会被纪录。 *.info;mail.none;;news.none;authpriv.none -/var/log/messages
# 任何跟认证信息有关的讯息都会被纪录在 /var/log/secure 这个档案当中, # 其实跟 /var/log/auth.log 也有点重复了!无论如何,多记录几份总是好的! Authpriv.* /var/log/secure
# 任何跟邮件有关的信息都会纪录在底下!不过,还是分为三个等级来记录, # 分别是所有、警告与错误讯息!因为如果是邮件主机的话,你的讯息会非常的杂乱, # 所以适时的将记录文件的等级分开,将有助于了解你的主机主要信息呢! mail.=debug;mail.=info;mail.=notice -/var/log/mail/info mail.=warn -/var/log/mail/warnings mail.err -/var/log/mail/errors
# 这个部分则是在记录关于一些例行性命令的设定之处! # 要晓得的是,由于很多的木马程序都是使用 cron 在进行破坏的行为, # 所以适时的了解 cron 也是很重要的! cron.=debug;cron.=info;cron.=notice -/var/log/cron/info cron.=warn -/var/log/cron/warnings cron.err -/var/log/cron/errors
# 这部份是记录任何跟核心有关的信息!例如我们在前一章提到的模块加载, # 由于那个是核心的功能,所以当执行模块加载时,核心就会有讯息显示啦! kern.=debug;kern.=info;kern.=notice -/var/log/kernel/info kern.=warn -/var/log/kernel/warnings kern.err /var/log/kernel/errors
# 这是关于打印机的信息啦! lpr.=debug;lpr.=info;lpr.=notice -/var/log/lpr/info lpr.=warn -/var/log/lpr/warnings lpr.err -/var/log/lpr/errors
# 这是新闻群组主机的信息 news.=debug;news.=info;news.=notice -/var/log/news/news.notice news.=crit -/var/log/news/news.crit news.=err -/var/log/news/news.err
# 那么这个就是关于所有服务纪录的档案啰! Daemon.=debug;daemon.=info;daemon.=notice -/var/log/daemons/info Daemon.=debug;daemon.=info;daemon.=notice -/var/log/daemons/info Daemon.=warn -/var/log/daemons/warnings Daemon.err -/var/log/daemons/errors
# 将所有已经呈现『严重错误的讯息』随即的发送给目前在主机上面的任何人! # 这有个好处了,如果主机万一不幸有发生紧急事件时,那么在线使用者可以立刻知道, # 如果能够立即联络 root 的话,那么主机的伤害将可减到最低! *.emerg *
# 任何跟 Mandrake Linux 有关的设定工具,所显示的信息都会被纪录在这个档案中! Local1.* -/var/log/explanations | 大致上就是有这些功能啦!这样一来,我们的一些不同的信息就可以存在不同的档案当中,可以方便我们来进行登入资料的解析呢!另外,这些档案都相当的重要(例如什么时候被谁登入进来主机啦!?),所以他们的权限大多是属于 root 的可擦写而已!这点非常需要小心而留意!(请注意,在系统的预设状况中,所有的未知状态的讯息几乎都是写入 /var/log/messages 这个档案中,所以,如果系统有问题,请详细的检查一下这个 /var/log/messages 档案吧!!) 如果您有其它的需求,所以需要特殊的档案来帮你记录时,呵呵!别客气,千万给他记录在/etc/syslog.conf当中,如此一来,您就可以重复的将许多的信息记录在不同的档案当中,以方便您的管理呢!
- 登录文件的安全属性设定
好了,由上一个章节里面我们知道了 syslog.conf 的设定,也知道了登录档内容的重要性了,所以,如果幻想你是一个很厉害的黑客,想利用他人的计算机干坏事,然后又不想留下证据,你会怎么作?对啦!就是离开的时候将屁股擦干净,将所有可能的讯息都给他抹煞掉,所以第一个动脑筋的地方就是登录档的清除工作啦~哇!鸟哥教人家干坏事…..喂!不要乱讲话~俺的意思是,如果改天你发现你的登录档不翼而非了,或者是发现你的登录档似乎不太对劲的时候,最常发现的就是网友常常会回报说,他的/var/log这个目录『不见了!』不要笑!这是真的事情?请记得,『赶快清查你的系统!』 伤脑筋呢!那么有没有办法防止这样的事情呢?有呀!拔掉网络线…..呵呵!别担心,基本上,我们可以透过一个隐藏的属性来设定你的登录档,成为『只可以增加数据,但是不能被删除』的状态,那么或许可以达到些许的保护!不过,如果你的 root 账号被破解了,那么底下的设定还是无法保护的,因为你要记得『 root 是可以在系统上面进行任何事情的』,因此,请将你的 root 这个账号的密码设定的安全一些!千万不要轻忽这个问题呢!好了,开始来设定一下基本的隐藏属性吧!那就是在 档案属性 提过的 lsattr 与 chattr 这个东西啦!如果将一个档案以 chattr 设定i这个属性时,那么该档案连 root 都不能杀掉!而且也不能新增数据,嗯!真安全!但是,如此一来登录文件的功能岂不是也就消失了?因为没有办法写入呀!所以啰,我们要使用的是 a 这个属性!你的登录文件如果设定了这个属性的话,那么他将只能被增加,而不能被删除!嗯!这个项目就非常的符合我们登录档的需求啦!因此,建议您可以这样的增加你的登录文件的隐藏属性。
[root @test root]# chattr +a /var/log/messages [root @test root]# lsattr /var/log/messages ----a--------- messages | 加入了这个属性之后,你的/var/log/messages登录档从此就仅能被增加,而不能被删除,直到root以chattr –a /var/log/messages取消这个a的参数之后,才能被删除或移动喔! 为了您的登录文件信息安全,强烈的建议您使用这个属性!不过,在底下的logrotate当中,我们必需要将这个属性去除之后,才能进行轮替喔!呵呵!接下来我们来看看如何进行登录文件数据的轮替吧!
登录档分析
登录档的分析是很重要的!例如那个 last 可以让你知道到底谁登录进主机啦!但是并没有 pop3 这个收信协议的登录讯息!这个时候就需要考虑到 /var/log/secure 的纪录啦!无论如何,系统最常使用的查阅登录文件的指令分别有底下几个:
- dmesg
| [root @test /root]# dmesg | 在指令列模式直接输入dmesg即可执行!由于系统在开机的过程当中尚未将硬盘 mount 上来,所以无法直接将数据直接给他读到 log file 当中去,但是为了除错上面的方便,所以在开机的过程当中的讯息还是要记录下来,这个时候系统就将 ram 开了一个小区块来储存这个数据啰!这个开机记录的档案就是:『/proc/kmsg』啦!同时,预设的 RAM 的区块容量在不同的版本中并不相同,目前的预设版本是 16KB 的大小呦
- last
[root @test /root]# last 参数说明: -number :number 为数字,如果您的登入讯息太多了,可以使用这个指令! 范例: [test @test /root]# last -5 test pts/0 192.168.1.2 Tue Apr 9 20:34 - 20:35 (00:01) test pts/0 192.168.1.2 Tue Apr 9 20:14 - 20:30 (00:15) test ftpd21546 192.168.1.2 Tue Apr 9 02:55 - 03:06 (00:10) test ftpd15813 192.168.1.2 Tue Apr 9 01:20 - 01:21 (00:00) test pts/0 192.168.1.2 Mon Apr 8 20:14 - 00:27 (04:13) wtmp begins Tue Apr 2 01:12:26 2002 [root @test /root]# last -f /var/log/wtmp.1 <==叫出上个月的登入资料! | 那么如果要叫出来上个月的登入数据呢?!可以使用上面的第二个范例!
VBird 写的 logfile.sh
本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
2002/06/24:第一次完成 2003/02/11:重新编排与加入 FAQ
2002/06/24 以来统计人数
Designed by VBird during 2001-2004. Aerosol Lab.本文出自 51CTO.COM技术博客 |