分享

第十五章 日志管理

 czs321 2013-02-21



目标

作为系统管理员,我们会遇到一些奇怪的问题,如网络无法连通、PPP不能用了、X Window无法启动等。这时候通常需要到日志文件中去寻找一些蛛丝马迹来帮助我们解决问题。为了保证系统正常运行,处理每一天可能遇到的各种问题,认真地读取和分析日志文件是系统管理员的一项非常重要的任务。通过对本章的学习,我们应该掌握Linux日志系统运行的原理、熟悉常见日志的格式,能够借助日志对各种情况进行处理。

 

重点内容

         日志子系统类别

         重要的日志文件

         日志文件的后台进程

         logrotate

         日志文件的分析工具


15.1  Linux日志概述

系统日志是对特定事件的记录。一个系统日志中所记录的事件的类型是由特定的日志的性质以及控制这些被记录事件的任何配置决定的。一般情况下,系统日志是用户可以直接阅读的文本文件,其中包含了一个时间戳和这个消息或者子系统所特有的其他信息。

日志对于系统安全来说尤其重要,由于日志记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志可以帮助我们审计和监测,还可以实时地监测系统状态,监测和追踪侵入者等。

15.2  日志子系统类别

Linux系统中,有三个主要的日志子系统:

         连接时间日志子系统

         进程统计日志子系统

         错误日志子系统

15.2.1         连接时间日志

15.2.1.1        运行原理与相关文件

utmpwtmplastlog日志文件是Linux日志系统的关键,它保存用户登录进入和退出的纪录。连接时间日志——由多个程序执行,把纪录写入到/var/log/wtmp/var/run/utmplogin等程序更新wtmputmp文件,使系统管理员能够跟踪谁在何时登录到系统。

有关当前登录用户的信息记录在文件utmp中;登录进入和退出纪录在文件wtmp中;最后一次登录文件可以用lastlog命令察看。数据交换、关机和重起也记录在wtmp文件中。所有的纪录都包含时间戳。这些文件(lastlog通常不大)在具有大量用户的系统中增长十分迅速。例如wtmp文件可以无限增长,除非定期截取。许多系统以一天或者一周为单位把wtmp配置成循环使用。它通常由cron运行的脚本来修改。这些脚本重新命名并循环使用wtmp文件。通常,wtmp在第一天结束后命名为wtmp.1;第二天后wtmp.1变为wtmp.2等等,直到wtmp.7

每次有一个用户登录时,login程序在文件lastlog中察看用户的UID。如果找到了,则把用户上次登录、退出时间和主机名写到标准输出中,然后login程序在lastlog中纪录新的登录时间。在新的lastlog纪录写入后,utmp文件打开并插入用户的utmp纪录。该纪录一直用到用户登录退出时删除。utmp文件被各种命令文件使用,包括whowusersfinger

下一步,login程序打开文件wtmp附加用户的utmp纪录。当用户登录退出时,具有更新时间戳的同一utmp纪录附加到文件中。wtmp文件被程序lastac使用。

15.2.1.2 查看方式

wtmputmp文件都是二进制文件,他们不能被诸如tail命令剪贴或合并(使用cat命令)。用户需要使用whowuserslastac来使用这两个文件包含的信息。

whowho命令查询utmp文件并报告当前登录的每个用户。Who的缺省输出包括用户名、终端类型、登录日期及远程主机。例如:who命令的显示结果:

chyang          pts/0 Aug          18 15:06

ynguo           pts/2 Aug          18 15:32

ynguo           pts/3 Aug          18 13:55

lewis              pts/4 Aug          18 13:35

ynguo           pts/7 Aug          18 14:12

ylou              pts/8 Aug          18 14:15

如果指明了wtmp文件名,则who命令查询所有以前的纪录。命令who /var/log/wtmp将报告自从wtmp文件创建或删改以来的每一次登录。

ww命令查询utmp文件并显示当前系统中每个用户和它所运行的进程信息。例如:w可以显示

3:36pm up 1 day, 22:34, 6 users, load average: 0.23, 0.29, 0.27

USER         TTY          FROM          LOGIN@          IDLE          JCPU          PCPU     WHAT

chyang       pts/0    202.38.68.242     3:06pm          2:04          0.08s        0.04s    -bash

ynguo        pts/2    202.38.79.47      3:32pm          0.00s         0.14s        0.05      w

lewis        pts/3   202.38.64.233      1:55pm          30:39         0.27s        0.22s    -bash

lewis        pts/4   202.38.64.233      1:35pm          6.00s         4.03s        0.01s  sh /home/users/

ynguo        pts/7   simba.nic.ustc.e   2:12pm          0.00s         0.47s        0.24s   telnet mail

ylou         pts/8   202.38.64.235      2:15pm          1:09m         0.10s        0.04s     -bash

 

usersusers用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。例如:users(回车)显示:chyang lewis lewis ylou ynguo ynguo

lastlast命令往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。例如:

chyang   pts/9    202.38.68.242 Tue Aug 1 08:34 - 11:23 (02:49)

cfan       pts/6    202.38.64.224 Tue Aug 1 08:33 - 08:48 (00:14)

chyang   pts/4    202.38.68.242 Tue Aug 1 08:32 - 12:13 (03:40)

lewis       pts/3    202.38.64.233 Tue Aug 1 08:06 - 11:09 (03:03)

lewis        pts/2    202.38.64.233 Tue Aug 1 07:56 - 11:09 (03:12)

如果指明了用户,那么last只报告该用户的近期活动,例如:last ynguo(回车)显示:

ynguo    pts/4  simba.nic.ustc.e Fri Aug 4 16:50 - 08:20 (15:30)

ynguo    pts/4  simba.nic.ustc.e Thu Aug 3 23:55 - 04:40 (04:44)

ynguo    pts/11 simba.nic.ustc.e Thu Aug 3 20:45 - 22:02 (01:16)

ynguo    pts/0  simba.nic.ustc.e Thu Aug 3 03:17 - 05:42 (02:25)

ynguo    pts/0  simba.nic.ustc.e Wed Aug 2 01:04 - 03:16 1+02:12)

ynguo    pts/0  simba.nic.ustc.e Wed Aug 2 00:43 - 00:54 (00:11)

ynguo    pts/9  simba.nic.ustc.e Thu Aug 1 20:30 - 21:26 (00:55)

acac命令根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连结的时间(小时),如果不使用标志,则报告总的时间。例如:ac(回车)显示:total 5177.47

ac -d(回车)显示每天的总的连结时间

Aug 12 total 261.87

Aug 13 total 351.39

Aug 14 total 396.09

Aug 15 total 462.63

Aug 16 total 270.45

Aug 17 total 104.29

Today total 179.02

ac -p (回车)显示每个用户的总的连接时间

 

ynguo 193.23

yucao 3.35

rong  133.40

hdai 10.52

zjzhu 52.87

zqzhou 13.14

liangliu 24.34

total 5178.24

lastloglastlog文件在每次有用户登录时被查询。可以使用lastlog命令来检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示"**Never logged**。注意需要以root运行该命令,例如:

rong     5       202.38.64.187                   Fri Aug 18 15:57:01 +0800 2000

dbb                                                     **Never logged in**

xinchen                                                 **Never logged in**

pb9511                                                  **Never logged in**

xchen        0     202.38.64.190      Sun Aug 13 10:01:22 +0800 2000

另外,可以加一些参数,例如,last -u 102将报告UID102的用户;last -t 7表示限制上一周的报告。

15.2.2         进程统计日志

由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacctacct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。

Linux可以跟踪每个用户运行的每条命令,如果想知道昨晚弄乱了哪些重要的文件,进程统计子系统可以告诉你。它对还跟踪一个侵入者有帮助。与连接时间日志不同,进程统计子系统缺省不激活,它必须启动。在Linux系统中启动进程统计使用accton命令,必须用root身份来运行。Accton命令的形式accton filefile必须先存在。先使用touch命令来创建pacct文件:touch /var/log/pacct,然后运行accton accton /var/log/pacct。一旦accton被激活,就可以使用lastcomm命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何参数的accton命令。

lastcomm命令报告以前执行的文件。不带参数时,lastcomm命令显示当前统计文件生命周期内纪录的所有命令的有关信息。包括命令名、用户、tty、命令花费的CPU时间和一个时间戳。如果系统有许多用户,输入则可能很长。下面的例子:

crond                   F            root     ??     0.00 secs Sun Aug 20 00:16

promisc_check                   root     ??     0.01 secs Sun Aug 20 00:16

sh                                      root     ??     0.01 secs Sun Aug 20 00:15

ping                     S            root     ??     0.02 secs Sun Aug 20 00:15

ping6.pl                F            root     ??     0.02 secs Sun Aug 20 00:15

sh                                      root            0.02 secs Sun Aug 20 00:15

ping                                root                  1.34 secs Sun Aug 20 00:15

locate                                 root               ttyp0 1.34 secs Sun Aug 20 00:15

accton                            root       ttyp0 0.00 secs Sun Aug 20 00:15

进程统计的一个问题是pacct文件可能增长的十分迅速。这时需要交互式的或经过cron机制运行sa命令来保持日志数据在系统控制内。sa命令报告、清理并维护进程统计文件。它能把/var/log/pacct中的信息压缩到摘要文件/var/log/savacct/var/log/usracct中。这些摘要包含按命令名和用户名分类的系统统计数据。sa缺省情况下先读它们,然后读pacct文件,使报告能包含所有的可用信息。sa的输出有下面一些标记项:

         avio——每次执行的平均I/O操作次数

         cp——用户和系统时间总和,以分钟计

         cpu——cp一样

         k——内核使用的平均CPU时间,以1k为单位

         k*sec——CPU存储完整性,以1k-core

         re——实时时间,以分钟计

         s——系统时间,以分钟计

         tio——I/O操作的总数

         u——用户时间,以分钟计

例如:

842     173.26re        4.30cp 0avio 358k

2       10.98re         4.06cp 0avio 299k find

9       24.80re         0.05cp 0avio 291k ***other

105     30.44re         0.03cp 0avio 302k ping

104     30.55re         0.03cp 0avio 394k sh

162     0.11re          0.03cp 0avio 413k security.sh*

154     0.03re          0.02cp 0avio 273k ls

56      31.61re         0.02cp 0avio 823k ping6.pl*

2       3.23re          0.02cp 0avio 822k ping6.pl

35      0.02re          0.01cp 0avio 257k md5sum

97      0.02re          0.01cp 0avio 263k  initlog

12 0.19re 0.01cp 0avio 399k promisc_check.s

15 0.09re 0.00cp 0avio 288k  grep

11 0.08re  0.00cp 0avio 332k  awk

 

用户还可以根据用户而不是命令来提供一个摘要报告。例如sa -m显示如下:

885     173.28re        4.31cp 0avk

root    879     173.23re        4.31cp 0avk

alias   3       0.05re          0.00cp 0avk

qmailp  3       0.01re          0.00cp 0avk

 

15.2.3         错误日志

syslogd8)执行。各种系统守护进程、用户程序和内核通过syslog3)向文件/var/log/messages报告值得注意的事件。另外有许多Linux程序也会创建日志,如HTTPFTP这样提供网络服务的服务器也保持详细的日志。

syslog已被许多日志函数采纳,它用在许多保护措施中——任何程序都可以通过syslog 纪录事件。syslog可以纪录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能纪录本地事件或通过网络纪录另一个主机上的事件。

syslog设备依据两个重要的文件:/etc/syslogd(守护进程)和/etc/syslog.conf配置文件,习惯上,多数syslog信息被写到/var/adm/var/log目录下的信息文件中(messages.*)。一个典型的syslog纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围(但不在日志中出现)。

每个syslog消息被赋予下面的主要设备之一:

         LOG_AUTH——认证系统:loginsugetty

         LOG_AUTHPRIV——LOG_AUTH,但只登录到所选择的单个用户可读的文件中

         LOG_CRON——cron守护进程

         LOG_DAEMON——其他系统守护进程,如routed

         LOG_FTP——文件传输协议:ftpdtftpd

         LOG_KERN——内核产生的消息

         LOG_LPR——系统打印机缓冲池:lprlpd

         LOG_MAIL——电子邮件系统

         LOG_NEWS——网络新闻系统

         LOG_SYSLOG——syslogd8)产生的内部消息

         LOG_USER——随机用户进程产生的消息

         LOG_UUCP——UUCP子系统

         LOG_LOCAL0~LOG_LOCAL7——为本地使用保留

syslog为每个事件赋予几个不同的优先级:

         LOG_EMERG——紧急情况

         LOG_ALERT——应该被立即改正的问题,如系统数据库破坏

         LOG_CRIT——重要情况,如硬盘错误

         LOG_ERR——错误

         LOG_WARNING——警告信息

         LOG_NOTICE——不是错误情况,但是可能需要处理

         LOG_INFO——情报信息

         LOG_DEBUG——包含情报的信息,通常旨在调试一个程序时使用

syslog.conf文件指明syslogd程序纪录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。这些域由tab隔开:选择域指明消息的类型和优先级;动作域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时,syslogd将纪录一个拥有相同或更高优先级的消息。所以如果指明"crit",那所有标为critalertemerg的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪儿。例如,如果想把所有邮件消息纪录到一个文件中,如下:

#Log all the mail messages in one place

mail.* /var/log/maillog

其他设备也有自己的日志。UUCPnews设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为"err"或更高。例如:

# Save mail and news errors of level err and higher in aspecial file.

uucp,news.crit /var/log/spooler

 

当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。

#Everybody gets emergency messages plus log them on anther machine

*.emerg *

*.emerg @linuxaid.com.cn

alert消息应该写到roottiger的个人账号中:

#Root and Tiger get alert and higher messages

*.alert root,tiger

有时syslogd将产生大量的消息。例如内核(“kern”设备)可能很冗长。用户可能想把内核消息纪录到/dev/console中。下面的例子表明内核日志纪录被注释掉了:

#Log all kernel messages to the console

#Logging much else clutters up the screen

#kern.* /dev/console

 

用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log/messages,除了mail以外。级别“none”禁止一个设备:

#Log anythingexcept mailof level info or higher

#Don't log private authentication messages!

*.info:mail.none;authpriv.none /var/log/messages

 

在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志都没有用了。通常要广泛纪录日志。syslog设备是一个攻击者的显著目标。一个为其他主机维护日志的系统对于防范服务器攻击特别脆弱,因此要特别注意。

15.3  常用日志文件介绍

以上提到的三个日志子系统是Linux日志系统的基础,利用这些日志的常用方式就是查看阅读日志文件。日志文件一般者是纯文本的文件,每一行就是一个消息。只要是在Linux下能够处理纯文本的工具都能用来查看日志文件。如简单地用cat命名就能把“/var/log/messages”文件中的消息显示到屏幕上,但是如果这个文件不只一页,那么就会因为显示滚动得太快看不清文件的内容。

日志文件总是很大的,因为从你第一次启动Linux开始,消息都累积在日志文件中。请注意最好不要用cat显示日志文件的内容,最好也不要用文本编辑器打开日志文件,这是因为一方面很耗费内存,另一方面不允许随意改动日志文件。看日志文件的一个比较好的方法是用象moreless那样的分页显示程序,或者用grep查找特定的消息。我们先用less显示“/var/log/messages”。在图表二可以看到从日志文件中取出来的一些消息。每一行表示一个消息,而且都由四个域的固定格式组成:

         时间标签(timestamp),表示消息发出的日期和时间

         主机名(hostname)(在我们的例子中主机名为rd002),表示生成消息的计算机的名字。如果只有一台计算机,主机名就可能没有必要了。但是,如果在网络环境中使用syslog,那么就可能要把不同主机的消息发送到一台服务器上集中处理。

         生成消息的子系统的名字。可以是“kernel”,表示消息来自内核,或者是进程的名字,表示发出消息的程序的名字。在方括号里的是进程的PID

         消息(message),剩下的部分就是消息的内容了。

Sep 12 10:23:44 rd002 sendmail[85]: starting daemon (8.9.3): SMTP+queueing@00:15:00 ...

Sep 12 11:06:11 rd002 passwd[337]: password for `progs' changed by `root' ...

Sep 12 11:08:30 rd002 kernel: Disc change detected. ...

Sep 12 16:06:01 rd002 login[101]: ROOT LOGIN on `tty2' ...

Sep 18 10:53:26 rd002 identd[251]: Connection from betelgeuse.branzo.it

Sep 18 10:53:26 rd002 identd[251]: from: 192.168.9.4 ( betelgeuse.branzo.it ) for: 1024, 21 ...

Sep 18 10:54:26 rd002 su[262]: + ttyp0 branzo-progs ...

Sep 18 11:17:12 rd002 -- MARK --

Sep 18 11:37:12 rd002 -- MARK --

Figure 2: Some logs extracted from /var/log/messages

上面的例子中,第一行是sendmail发出的消息,sendmail守护进程(daemon)负责管理收到和发出的消息。这一行是守护进程正常启动的消息。第二行是来自passwd的消息,提醒我们用户“progs”的口令被“root”改变过。以后其它的消息,报告我们系统的运行情况。实际上在“/var/log/message”文件中的消息都不是特别重要或紧急的。有一个特殊的消息是“MARK”消息,在默认情况下每隔20分钟就会生成一次表示系统还在正常运行。“MARK”消息很象“心跳信号”(heartbeat),例如:“心跳信号”经常用来确认远程主机是否还在运行。“MARK”消息另外的一个用处是用作事后分析,能够帮助系统管理员确定系统死机发生的时间。

         access-log                  纪录HTTP/web的传输

         acct/pacct                  纪录用户命令

         aculog                      纪录MODEM的活动

         btmp                        纪录失败的纪录

         dmesg                 

         lastlog                     纪录最近几次成功登录的事件和最后一次不成功的登录

         messages                    syslog中记录信息(有的链接到syslog文件)

         sudolog                     纪录使用sudo发出的命令

         sulog                       纪录使用su命令的使用

         syslog                      syslog中记录信息(通常链接到messages文件)

         utmp                        纪录当前登录的每个用户

         wtmp                        一个用户每次登录进入和退出时间的永久纪录

         xferlog                     纪录FTP会话

我们在本节向大家介绍一下Linux中两个重要的和功能全面的日志文件/var/log/dmesg /var/log/messages

15.3.1         /var/log/dmesg

/var/log/dmesg文件保存内核启动的信息,在这个文件里,用户可以看到内核和各种驱动程序的加载,加载硬件驱动时系统也会显示出相应的信息。我们一般可以通过/var/log/dmesg查看某个硬件设备是否已经被系统识别,或是看它是否正常运行。如果某个驱动由于配置错误或硬件本身有问题时,用户就可以使用/var/log/dmesg文件来找原因。这个文件可以用文本编辑器来查看,也可以通过dmesg命令显示出来。

下面我们列出一个dmesg文件的例子:

1             Linux version 2.4.18-5.0 (root@porky.devel.redhat.com) (gcc version             egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)) #1 Tue Mar 7 20:53:41         EST 2000

2             Detected 300683434 Hz processor.

3             Console: colour VGA+ 80x25

4             Calibrating delay loop... 599.65 BogoMIPS

5             Memory: 63008k/65536k available (1084k kernel code, 412k reserved, 968k data, 64k init, 0k bigmem)

6             Dentry hash table entries: 262144 (order 9, 2048k)

7             Buffer cache hash table entries: 65536 (order 6, 256k)

8             Page cache hash table entries: 16384 (order 4, 64k)

9             VFS: Diskquotas version dquot_6.4.0 initialized

10           CPU: AMD AMD-K6(tm) 3D processor stepping 00

11           Checking 386/387 coupling... OK, FPU using exception 16 error reporting.

12           Checking 'hlt' instruction... OK.

13           POSIX conformance testing by UNIFIX

14           PCI: PCI BIOS revision 2.10 entry at 0xfb490

15           PCI: Using configuration type 1

16           PCI: Probing PCI hardware

17           PCI: 00:38 [1106/0586]: Work around ISA DMA hangs (00)

18           Activating ISA DMA hang workarounds.

19           Linux NET4.0 for Linux 2.2

20           Based upon Swansea University Computer Society NET3.039

21           NET4: Unix domain sockets 1.0 for Linux NET4.0.

22           NET4: Linux TCP/IP 1.0 for NET4.0

23           IP Protocols: ICMP, UDP, TCP, IGMP

24           TCP: Hash tables configured (ehash 65536 bhash 65536)

25           Initializing RT netlink socket

26           Starting kswapd v 1.5

27           Detected PS/2 Mouse Port.

28           Serial driver version 4.27 with MANY_PORTS MULTIPORT SHARE_IRQ         enabled

29           ttyS00 at 0x03f8 (irq = 4) is a 16550A

30           ttyS01 at 0x02f8 (irq = 3) is a 16550A

31           pty: 256 Unix98 ptys configured

32           apm: BIOS version 1.2 Flags 0x07 (Driver version 1.9)

33           Real Time Clock Driver v1.09

34           RAM disk driver initialized: 16 RAM disks of 4096K size

35           VP_IDE: IDE controller on PCI bus 00 dev 39

36           VP_IDE: not 100% native mode: will probe irqs later

37           ide0: BM-DMA at 0xe000-0xe007, BIOS settings: hda:DMA, hdb:DMA

38           ide1: BM-DMA at 0xe008-0xe00f, BIOS settings: hdc:DMA, hdd:DMA

39           hda: Maxtor 51369U3, ATA DISK drive

40           hdb: IDE/ATAPI CD-ROM 32X, ATAPI CDROM drive

41           ide0 at 0x1f0-0x1f7,0x3f6 on irq 14

42           hda: Maxtor 51369U3, 12949MB w/2048kB Cache, CHS=6577/64/63

43           hdb: ATAPI 16X CD-ROM drive, 128kB Cache

44           Uniform CDROM driver Revision: 2.56

45           Floppy drive(s): fd0 is 1.44M

46           FDC 0 is a post-1991 82077

47           md driver 0.90.0 MAX_MD_DEVS=256, MAX_REAL=12

48           raid5: measuring checksumming speed

49           raid5: MMX detected, trying high-speed MMX checksum routines

50           pII_mmx : 761.238 MB/sec

51           p5_mmx : 726.567 MB/sec

52           8regs : 447.675 MB/sec

53           32regs : 308.610 MB/sec

54           using fastest function: pII_mmx (761.238 MB/sec)

55           scsi : 0 hosts.

56           scsi : detected total.

57           md.c: sizeof(mdp_super_t) = 4096

58           Partition check:

59           hda: hda1 hda2 < hda5 hda6 >

60           autodetecting RAID arrays

61           autorun ...

62           ... autorun DONE.

63           VFS: Mounted root (ext2 filesystem) readonly.

64           Freeing unused kernel memory: 64k freed

65           Adding Swap: 66488k swap-space (priority -1)

66           ne2k-pci.c:vpre-1.00e 5/27/99 D. Becker/P. Gortmaker                http://cesdis.gsfc./linux/drivers/ne2k-pci.html

67           ne2k-pci.c: PCI NE2000 clone 'RealTek RTL-8029' at I/O 0xe800, IRQ 11.

68           eth0: RealTek RTL-8029 found at 0xe800, IRQ 11, 00:80:AD:41:22:10.

69           VFS: Disk change detected on device fd(2,0)

下面我们对一些重要的信息进行解释:

               Linux version 2.4.18-5.0 (root@porky.devel.redhat.com) (gcc version             egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)) #1 Tue Mar 7 20:53:41 EST 2000

首先显示的是内核的版本,2.4.18-build(5),然后是谁建立和编译和这个内核版本的,所用的编译器是什么,这里是gcc。这些信息有时候很重要,因为有的内核版本和gcc版本不完完全匹配。

   Detected 1700.327 MHz processor

CPUP4 1.7G的。

   Console: colour VGA+ 80x25

监视器是标准的PC监视器。

   Calibrating delay loop... 3374.09 BogoMIPS

BogoMIPSbenchmark数值。也是衡量CPU性能的一个参数。

   Memory: 503332k/516032k available (1326k kernel code, 10140k reserved, 999k data, 212k init, 0k highmem)

物理内存的大小,这里的内存是512MB

   Buffer cache hash table entries: 65536 (order 6, 256k)

缓冲区表的数目。缓冲区的作用是在把数据写入块设备之前进行缓存,后来又用来对文件系统的元数据进行缓存,如inode的信息。

   VFS: Diskquotas version dquot_6.4.0 initialized

内核支持磁盘限额。

   CPU: Intel(R) Celeron(R) CPU 1.70GHz stepping 03

CPU的信息,这是Intel赛扬1.7GCPU

   PCI: PCI BIOS revision 2.10 entry at 0xfb490

   PCI: Using configuration type 1

   PCI: Probing PCI hardware

   PCI: 00:38 [1106/0586]: Work around ISA DMA hangs (00)

这个信息显示系统正在进行PCI并行设备的探测。

   Linux NET4.0 for Linux 2.2

   Based upon Swansea University Computer Society NET3.039

   NET4: Unix domain sockets 1.0 for Linux NET4.0.

   NET4: Linux TCP/IP 1.0 for NET4.0

当前的内核支持net4网络编码库。

   IP Protocols: ICMP, UDP, TCP, IGMP

支持的IP协议有ICMP, UDP, TCP, IGMP

   Detected PS/2 Mouse Port.

找到了PS/2鼠标口一个。

   Serial driver version 4.27 with MANY_PORTS MULTIPORT SHARE_IRQ                enabled

   ttyS00 at 0x03f8 (irq = 4) is a 16550A

   ttyS01 at 0x02f8 (irq = 3) is a 16550A

这里显示了串口的信息。

   pty: 256 Unix98 ptys configured

   apm: BIOS version 1.2 Flags 0x07 (Driver version 1.9)

计算机主板支持APM标准模式的休眠。

   Real Time Clock Driver v1.09

时钟的驱动程序版本。

   RAM disk driver initialized: 16 RAM disks of 4096K size

内核支持带RAM缓存的硬盘。

   VP_IDE: IDE controller on PCI bus 00 dev 39

   VP_IDE: not 100% native mode: will probe irqs later

   ide0: BM-DMA at 0xe000-0xe007, BIOS settings: hda:DMA, hdb:DMA

   ide1: BM-DMA at 0xe008-0xe00f, BIOS settings: hdc:DMA, hdd:DMA

显示计算机IDE硬盘控制器的情况。

    hda: Maxtor 51369U3, ATA DISK drive

第一块物理硬盘的情况,是迈拓的牌子。

   hdb: IDE/ATAPI CD-ROM 32X, ATAPI CDROM drive

光驱的情况,这是一个32倍速的光驱。

   ide0 at 0x1f0-0x1f7,0x3f6 on irq 14

   hda: Maxtor 51369U3, 12949MB w/2048kB Cache, CHS=6577/64/63

   hdb: ATAPI 16X CD-ROM drive, 128kB Cache

硬盘和光驱的信息。

   Uniform CDROM driver Revision: 2.56

   Floppy drive(s): fd0 is 1.44M

   FDC 0 is a post-1991 82077

软盘控制器的信息。

   md driver 0.90.0 MAX_MD_DEVS=256, MAX_REAL=12

   raid5: measuring checksumming speed

   raid5: MMX detected, trying high-speed MMX checksum routines

   pII_mmx : 761.238 MB/sec

   p5_mmx : 726.567 MB/sec

   8regs : 447.675 MB/sec

   32regs : 308.610 MB/sec

   using fastest function: pII_mmx (761.238 MB/sec)

有关RAIDMD(多设备)的信息,在本机没有采用。

   scsi : 0 hosts.

   scsi : detected total

内核支持SCSI设备。在本机没有采用。

   md.c: sizeof(mdp_super_t) = 4096

   Partition check:

   hda: hda1 hda2 < hda5 hda6 >

硬盘分区的情况,可以看出第一个分区hda2是扩展分区,其中的空间又分给了2个逻辑分区hda5hda6

   autodetecting RAID arrays

   autorun ...

  ... autorun DONE.

正在自动检测RAID磁盘阵列,本机没有采用。

   VFS: Mounted root (ext2 filesystem) readonly.

虚拟文件系统已经把根分区挂接好。在这个时候内核已经基本上准备好来启动系统了。

   Freeing unused kernel memory: 125k freed

释放掉没有用的内存,有125K

   Adding Swap: 1020116k swap-space (priority -1)

加载swap分区。

   ne2k-pci.c:vpre-1.00e 5/27/99 D. Becker/P. Gortmaker http://cesdis.gsfc./linux/drivers/ne2k-pci.html

   ne2k-pci.c: PCI NE2000 clone 'RealTek RTL-8029' at I/O 0xe800, IRQ 11.

   eth0: RealTek RTL-8029 found at 0xe800, IRQ 11, 00:80:AD:41:22:10.

网卡是PCI NE2000系列芯片的网卡,很多计算机都使用这种网卡。

到这一步,内核已经完成启动,/sbin/init马上会运行。系统会启动rc.sysinit命令,进行通常的启动。

15.3.2         /var/log/messages

/var/log/messages文件是Linux系统中最全面的log文件,它记录了内核和应用程序发生错误时的信息和系统运行的一般信息。如果用户在/var/log/messages里面没有找到想要的信息,或者需要某些程序更为详细的信息,用户可以到/var/log目录下查找看是否有以此程序命名的文件。

下面是一个/var/log/messages文件的例子:

Sep 12 10:23:44 rd002 sendmail[85]: starting daemon (8.9.3): SMTP+queueing@00:15:00 ... 

Sep 12 11:06:11 rd002 passwd[337]: password for `progs' changed by `root' ... 

Sep 12 11:08:30 rd002 kernel: Disc change detected. ... 

Sep 12 16:06:01 rd002 login[101]: ROOT LOGIN on `tty2' ... 

Sep 18 10:53:26 rd002 identd[251]: Connection from betelgeuse.branzo.it 

Sep 18 10:53:26 rd002 identd[251]: from: 192.168.9.4 ( betelgeuse.branzo.it ) for: 1024, 21 ... 

Sep 18 10:54:26 rd002 su[262]: + ttyp0 branzo-progs ... Sep 18 11:17:12 rd002 -- MARK – 

Sep 18 11:37:12 rd002 -- MARK – 

可以看到从/var/log/messages文件中取出来的一些消息。每一行表示一个消息,而且都由四个域的固定格式组成: 

         时间戳(timestamp),表示消息发出的日期和时间 

         主机名(hostname)(在我们的例子中主机名为rd002),表示生成消息的计算机的名字。如果只有一台计算机,主机名就可能没有必要了。但是,如果在网络环境中使用syslog,那么就可能把不同主机的消息发送到一台服务器上集中处理。 

         生成消息的子系统的名字。可以是“kernel”,表示消息来自内核,或者是进程的名字,表示发出消息的程序的名字。在方括号里的是进程的PID 

         消息(message),剩下的部分就是消息的内容了,说明了。 

在我们的例子中,

第一行是sendmail发出的消息,sendmail守护进程负责管理收到和发出的消息。这一行是守护进程正常启动的消息。

第二行是来自passwd的消息,提醒我们用户“progs”的口令被“root”改变过。

第四行是说明root用户在终端tty2上面登录上来了。

以后其它的消息,报告我们系统的运行情况,如连接的情况。实际上在messages文件中的消息都不是特别重要或紧急的。有一个特殊的消息是“MARK”消息,在默认情况下每隔20分钟就会生成一次表示系统还在正常运行。“MARK”消息很象“心跳信号”(heartbeat),例如:“心跳信号”经常用来确认远程主机是否还在运行。“MARK”消息另外的一个用处是用作事后分析,能够帮助系统管理员确定系统死机发生的时间。 

我们在使用/var/log/messages文件的时候,注意该文件是不断变大的,而且在繁忙的系统中更是以非常快的速度增大。这为查看带来很多不便,我们在这里给出一些查看大日志文件的技巧。新的消息是加在日志文件的末尾的,因此最新的消息总是在文件的末尾出现。显示一个长文件末尾几行的一个方便的方法是使用带“-n”参数的tail命令。例如,为了显示messages日志文件的最后25行,可以用

 

  # tail –n 25 /var/log/messages

或者

# tail –25 /var/log/messages

还有一个比较方便的方法是使用less,用“G”命令可以到达文件的末尾

  # less /var/log/messages

在退出程序之前按下“G”。用less最大的好处就是可以很方便地上下滚动文件和查找特定的字符串。 

为了等待某个程序的某个特定的消息,可能要不断地查看日志文件。如果用不断地敲tail命令的方法直到消息出现为止,岂不是太麻烦了。在Linux系统中有一个很方便的方法,就是使用“tail –f /var/log/messages”命令。

  # tail –f /var/log/messages

这个“tail”命令会显示日志文件的最后几行,但是不会马上退出。它会一直等到其它程序在指定的日志文件中加入消息行,并且马上就会把这些消息显示出来。“less”命令一个可以用一个参数实现类似的功能,运行

  # less +F /var/log/messages

这样就可以让less象“tail –f”那样运行。而且,less更容易交互使用,因为你可以在任何时候按“CTRL-C”退出等待消息并回到less的正常模式,然后滚动文件,查找字符串。 

15.3.3    日志文件格式的处理

在保存日志文件的时候,我们同样会遇到Linux文件格式与Windows不兼容的问题,已经在第四章《Linux编辑器》中说明。日志文件的处理同样可以采用unix2dos命令转换,生成Windows平台可以阅读的格式。

例如:

# cp  /var/log/dmesg  /root/log/dmesg/dmesg.040322

# unix2dos  /root/log/dmesg/dmesg.040322

# unix2dos  -n  /var/log/messages  /root/log/messages/messages.040322

 

 

 

或者保存到文件。以上的命令都可以编制成脚本,利用crond定期执行,如每天运行一次,将最新的日志保存以Windows格式保存起来。

15.4  日志的用户行为审计

在任何一台服务器中,通常都会有多个用户帐户的存在。每个用户在系统中的行为就记录在这些帐户在系统中的日志中,在处理问题的时候(如www服务异常,smtp进程停止响应)对用户的行为进行分析是有效的方法之一。日志对用户行为的审计可以分为连接记录和进程记录两类。

15.4.1    连接记录

连接记录是跟踪当前用户当前对话、用户登录和退出的活动。我们可以使用前面提到的utmp wtmp工具来完成这一记录过程。Wtmp 工具同时维护重新引导和系统状态变化信息。各种程序对这些工具进行刷新和维护,因此无须进行特殊的后台进程或程序。然而,utmp wtmp 输出结果文件必须存在,如果这些文件不存在会关闭连接记录。与 utmp wtmp 有关的所有数据将分别保存在 /var/run/utmp /var/log/wtmp 中。这些文件归root用户所有。dump-utmp 可以转换连接记录数据为可读的 ASCII 格式数据。

ac 命令提供了有关用户连接的大概统计,我们可以使用带有标志 d p ac 命令。标志 d 显示了一天的总连接统计,标志 p 显示了每一个用户的连接时间。这种统计信息的方式对了解与探测入侵有关的用户情况及其他活动很有帮助。Last who 是出于安全角度定期使用的最常用命令。

last 命令提供每一个用户的登录时间,退出登录时间,登录位置,重新引导系统及运行级别变化的信息。last -10 表示 last 的最多输出结果为最近的 10 条信息。缺省时 last 将列出在 /var/log/wtmp 中记录的每一连接和运行级别的变化。从安全角度考虑,last 命令提供了迅速查看特定系统连接活动的一种方式。观察每天的输出结果是个好习惯,从中可以捕获异常输入项。Last 命令的 -x 选项可以通知系统运行级别的变化。

who 命令主要作用是报告目前正在登录的用户、登录设备、远程登录主机名或使用的 Xwindows X 显示值、会话闲置时间以及会话是否接受 write talk 信息。

例如: who -iwH 的输出结果:

USER     MESG    LINE   LOGIN-TIME      IDLE    FROM

Sam      -     tty1      Feb 18 08:42           old

这就表示用户 Sam 不能接受 write talk 信息,2188:42 tty1 登录。该命令的安全值提供了用户连接的大致情况,这也为监视可疑活动提供了条件。 其他的有关命令有 lastlog 命令,该命令报告了有关 /var/log/lastlog 中记录的最后一次登录的数据信息。

15.4.2    进程记录

进程记录是对进程活动的记录。原数据保存在 /var/log/pacct 文件中,其许可权限为 600。该文件的存在是进程记录有效的保障。与连接记录不同,进程记录必须处于打开状态,使用下面的命令设置打开状态.

#    accton  /var/log/pacct

可以使用自选文件代替 /var/log/pacct,但必须记住这一文件并且设置适当的许可权限。必须在每次引导的时候执行该命令,可以在 /etc/rc.d/rc.local 中输入以下脚本:

#  initiate  process account

if  [ -x  /sbin/accton  ]

then

/sbin/accton   /var/log/pacct

echo  "process  accounting  initiated"

fi

一旦在系统中配置进程记录后,将使用 3 个命令解释在 /var/log/pacct 中的非用户可读的原数据。这些命令分别为 dump-acct,该命令与 dump-utmp 完全相似,sa 命令用于统计系统进程记录的大致情况,最后一个是 lastcomm 命令列出了系统执行的命令。

15.4  日志文件的后台进程

Linux有多种方法把日志信息写到log文件中,有些程序只是简单地把信息写到对应的log文件,而大多数程序是使用内核提供的标准API接口程序syslog写的。syslogd后台进程从内核收取信息并处理信息。内核本身也有日志,后台进程klogd从内核中得到日志后,再传送给syslogd进程。logger命令能调用这种API发送信息。

15.4.1         syslogd

syslogdLinux的标准调用,用来管理应用程序向系统发送信息,应用程序使用的系统库已经加入了syslog功能,这样程序在运行时就会受系统的管理。syslogd后台进程监听这类信息,处理后放在/etc/syslog.conf文件所指定的目录或文件中。syslogd可以在很多Linux版本中自动启动、运行,缺省情况下就能使用,但是用户也能对它做一些改动。

syslogd从系统中获取新的消息,并把消息发送到合适的地方。每一个子系统发出日志消息的时候都会给消息指定一个类型,一个消息可以分成两个部分:“设备”和“优先级”。“设备”标识发出消息的子系统,“优先级”表示消息的重要性,其范围从7(最不重要)到0(最重要)。

15.4.2         klogd

klogd 守护进程获得并记录 Linux 内核产生的各种信息。通常,syslogd 会记录 klogd 传来的所有信息,然而,如果调用带有 -f filename 变量的 klogd 时,klogd 就在 filename 中记录所有信息,而不是传给 syslogd。当指定另外一个文件进行日志记录时,klogd 就向该文件中写入所有级别或优先权。Klogd 中没有和 /etc/syslog.conf 类似的配置文件。使用 klogd 而避免使用 syslogd 的好处在于可以查找大量错误。如果有人入侵了内核,使用 klogd 可以修改错误。

内核信息生成顺序如下:

1.         内核的某些模块产生一个系统调用,来创建一个log记录

2.         klogd守护进程从/proc/kmsg中取得该调用信息。/proc/kmsg文件可以从外部程序中获取信息。

3.         信息的优先级域做一次格式转换(内核中定义的是0-7数字),以便于syslogd进行下一步的处理。

4.         信息送给ssyslogd,经过组织、处理后就形成了系统的log

15.4.3         logger

logger命令可以为syslog3)系统日志文件提供一个shell命令接口,使用户能创建日志文件中的条目。用法:logger 例如:logger This is a test

它将产生一个如下的syslog纪录:Aug 19 22:22:34 tiger: This is a test!

logger程序把带有时间的信息写入/var/log/messages文件。

 15.5     logrotate

系统管理员可以使用logrotate 程序用来管理系统中的最新的事件。logrotate 还可以用来备份日志文件。它把旧的日志文件删除,并创建新的日志文件,我们把这种操作叫做“转储”。我们可以根据日志文件的大小和天数来转储,这个过程一般通过 crond程序来执行。logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail

15.5.1         logrotate的配置

15.5.1.1        logrotate 的配置文件

logrotate的配置文件是 /etc/logrotate.conf。主要参数如下表:

参数                                         功能

compress                                 通过gzip 压缩转储以后的日志

nocompress                                    不需要压缩时,用这个参数

copytruncate                            用于还在打开中的日志文件,把当前日志备份并截断

nocopytruncate                        备份日志文件但是不截断

create mode owner group               转储文件,使用指定的文件模式创建新的日志文件

nocreate                                  不建立新的日志文件

delaycompress                         compress 一起使用时,转储的日志文件到下一次转

                                                 储时才压缩

nodelaycompress                     覆盖 delaycompress 选项,转储同时压缩。

errors address                         转储时的错误信息发送到指定的Email 地址

ifempty                                     即使是空文件也转储,这个是 logrotate 的缺省选项。

notifempty                                如果是空文件的话,不转储

mail address                            把转储的日志文件发送到指定的E-mail 地址

nomail                                      转储时不发送日志文件

olddir directory                         转储后的日志文件放入指定的目录,必须和当前日志文

                                                 件在同一个文件系统

noolddir                                    转储后的日志文件和当前日志文件放在同一个目录下

prerotate/endscript                  在转储以前需要执行的命令可以放入这个对,这两个关

                                                 键字必须单独成行

postrotate/endscript                 在转储以后需要执行的命令可以放入这个对,这两个关键字

                                                 必须单独成行

daily                                         指定转储周期为每天

weekly                                      指定转储周期为每周

monthly                                    指定转储周期为每月

rotate count                                    指定日志文件删除之前转储的次数,0 指没有备份,5 指保                                                 5 个备份

tabootext [+] list                        logrotate 不转储指定扩展名的文件,缺省的扩展名

                                                 是:.rpm-orig, .rpmsave, v, ~

size SIZE                                  当日志文件到达指定的大小时才转储,Size 可以指定bytes                                                  (缺省)以及KB (sizek)或者MB (sizem).

 

二、缺省配置

我们以一个logrotate 缺省的配置文件来举例说明/etc/logrotate.conf

 

# see "man logrotate" for details

# rotate log files weekly

weekly

# keep 4 weeks worth of backlogs

rotate 4

# send errors to root

errors root

# create new (empty) log files after rotating old ones

create

# uncomment this if you want your log files compressed

#compress

1

# RPM packages drop log rotation information into this directory

include /etc/logrotate.d

# no packages own lastlog or wtmp --we'll rotate them here

/var/log/wtmp {

monthly

create 0664 root utmp

rotate 1

}

/var/log/lastlog {

monthly

rotate 1

}

# system-specific logs may be configured here

缺省的配置一般放在logrotate.conf 文件的最开始处,影响整个系统。在本例中就是前面12行。

3weekly 指定所有的日志文件每周转储一次。

5 rotate 4 指定转储文件的保留 4份。

7 errors root 指定错误信息发送给root

9create 指定 logrotate 自动建立新的日志文件,新的日志文件具有和原来的文件一样的权限。

11 #compress 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。

三、使用include 选项读取其他配置文件

include 选项允许系统管理员把分散到几个文件的转储信息,集中到一个主要的配置文件。当 logrotate logrotate.conf 读到include 选项时,会从指定文件读入配置信息,就好像他们已经在/etc/logrotate.conf 中一样。

include 选项十分重要,一些应用把日志转储参数存放在 /etc/logrotate.d

典型的应用有:apache, linuxconf, samba, cron 以及syslog

这样,系统管理员只要管理一个 /etc/logrotate.conf 文件就可以了。

四、使用include 选项覆盖缺省配置

/etc/logrotate.conf 读入文件时,include 指定的文件中的转储参数将覆盖缺省的参数,如下例:

# linuxconf 的参数

/var/log/htmlaccess.log

{ errors jim

notifempty

nocompress

weekly

prerotate

/usr/bin/chattr -a /var/log/htmlaccess.log

endscript

postrotate

/usr/bin/chattr +a /var/log/htmlaccess.log

endscript

}

/var/log/netconf.log

{ nocompress

monthly

}

  

在这个例子中,当 /etc/logrotate.d/linuxconf 文件被读入时,下面的参数将覆盖/etc/logrotate.conf中缺省的参数。

         Notifempty

         errors jim

五、为指定的文件配置转储参数

经常需要为指定文件配置参数,一个常见的例子就是每月转储/var/log/wtmp。为特定文件而使用的参数格式是:

# 注释

/full/path/to/file

{

option(s)

}

 

下面的例子就是每月转储 /var/log/wtmp 一次:

  #Use logrotate to rotate wtmp

/var/log/wtmp

{

monthly

rotate 1

}

15.6       log文件的分析工具

       用肉眼去一行一行地读系统日志文件是一件枯燥而且容易出错的事情,看累了之后,很可能忽略一些重要的信息。管理员需要一个好的工具来筛选出重要的系统日志信息。下面列举了一些日志管理工具,大家可以根据自己的需要来选用。

15.6.1    swatch

swatch是在实践中产生的,对计算机管理非常有用。它能浏览log文件,对找到的关键信息进行处理。

swatch使用perllog文件中寻找某种表达式,它有三个组成部分:一个控制程序,一个启动的库文件和一个配置文件。配置文件由以下的数据格式组成:

         匹配模式

         处理方式

         时间间隔

         时间戳域

时间间隔用于指明信息的出现频度,如果磁盘受到物理性的损坏,每隔数秒显示出一条坏扇区的记录,这些内容一样的记录用户不用详细地逐条来看,swatch会忽略这种内容相同的记录,直到时间到期为止。时间戳域与时间间隔一起使用,在存储log信息时去除其时间标记。

swatch7种预定义的处理方式:

         echo             把信息显示在控制台

         bell                向控制台发送control+g

         ignore           不做任何处理

         write              给用户发送信息

         mail               给用户发送电子邮件

         pipe                     给某些命令传送数据

         exec              提供参数运行某个命令

配置文件写好之后,swatch就根据它来创建一个perl脚本,启动一个守护进程,持续地监控logswatch能对标准信号作出反应,一个SIGHUP信号可以终止已启动的守护进程,并从配置文件重新产生一个进程。这样在修改配置文件的时候,仍能持续地监控系统。swatch能根据不同的配置文件为任何指定的用户启动很多个守护进程,每个用户在其根目录下都有一个.swatch文件,可以用swatch来得到一些系统事件,例如,某个文件被拷贝到某个目录下了。

15.6.2    其他工具

15.6.2.1 colorlogs

这个软件增加了ANSI escape字符,可以把log信息变成彩色的,便于查看。

15.6.2.2 pppsum

pppsum可以分析pppdlog,输出使用时间、接收和发送的字节数。

15.6.2.3 slogs

slogs可以从一个脚本文件中记录下suid、连接、suhttpd和系统日志。

15.6.2.4 space watcher

space watcher可以自动监控磁盘空间的使用情况,一旦发现情况立即发出警告。

15.6.2.5 weblog

weblog是一个基于python的分析工具,分析web server和防火墙记录。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多