文档库 最新最全的文档下载
当前位置:文档库 › 第6章_Linux中的日志管理

第6章_Linux中的日志管理

第6章Linux中的日志管理

本章要点

Linux日志管理简介

Linux基本日志管理机制

使用syslog设备

Linux日志使用注意事项

Linux日志输出查看方式

Linux系统中的日志子系统对于系统安全来说非常重要,它记录了系统每天发生的各种各样的事情,包括哪些用户曾经或者正在使用系统,可以通过日志来检查错误发生的原因,更重要的是在系统受到黑客攻击后,日志可以记录攻击者留下的痕迹。通过查看这些痕迹,系统管理员可以发现黑客攻击的某些手段以及特点,从而能够进行处理工作,为抵御下一次攻击做好准备。本章主要讲述如何使用Linux系统中的日志子系统及其命令,从而更好地保护系统安全。

6.1 Linux日志管理简介

日志的主要功能是审计和监测。它还可以用于追踪入侵者等。在Linux系统中,有四类主要的日志:

(1)连接时间日志:由多个程序执行,把记录写入到/var/log/wtmp和

/var/run/utmp,login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。

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

(3)错误日志:由syslogd(8)守护程序执行。各种系统守护进程、用户程序和内核通过syslogd(3)守护程序向文件/var/log/messages报告值得注意的事件。另外有许多Linux程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。

(4)实用程序日志:许多程序通过维护日志来反映系统的安全状态。su命令允许用户获得另一个用户的权限,所以它的安全很重要,它的文件为sulog。同样重要的还有sudolog。另外,诸如Apache等Http服务器都有两个日志:access_log(客户端访问日志)以及error_log(服务出错日志)。FTP服务的日志记录在xferlog文件当中,Linux中邮件传送服务(sendmail)的日志一般存放在maillog文件当中。

上述四类日志中,常用的日志文件如表6-1所示。

表6-1 Linux系统中常用的日志文件

(续)

6.2 Linux基本日志管理机制

utmp、wtmp日志文件是多数Linux日志子系统的关键,它保存了用户登录和退出的记录。有关当前登录用户的信息记录在文件utmp中;登录和退出记录在文件wtmp中;数据交换、关机以及重启的机器信息也都记录在wtmp文件中。所有的记录都包含时间戳。时间戳对于日志来说非常重要,因为很多攻击行为都与时间有极大的关系。这些文件在具有大量用户的系统中增长十分迅速。例如wtmp

文件可以无限增长,除非定期截取。许多系统以一天或者一周为单位把wtmp配置成循环使用。它通常由cron运行的脚本来修改。这些脚本重新命名并循环使用wtmp文件。通常,wtmp在第一天结束后命名为wtmp.1;第二天后wtmp.1变为wtmp.2,等等,用户可以根据实际情况来对这些文件进行命名和配置使用。

utmp文件被各种命令文件使用,包括who、w、users和finger。而wtmp文件被程序last和ac使用。

wtmp和utmp文件都是二进制文件,它们不能被诸如tail、cat等命令剪贴或合并。用户需要使用who、w、users、last和ac来使用这两个文件包含的信息。

6.2.1 who命令

who命令查询utmp文件并报告当前登录的每个用户。who的缺省输出包括用户名、终端类型、登录日期及远程主机。使用该命令,系统管理员可以查看当前系统存在哪些非法用户,从而对其进行审计和处理。例如:运行who命令显示如下:

# who

root pts/0 May 9 21:11 (10.0.2.128)

root pts/1 May 9 21:16 (10.0.2.129)

lhwen pts/7 May 9 22:03 (10.0.2.27)

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

# who /var/log/wtmp

liujun pts/4 Sep 16 21:22 (10.0.2.231)

root pts/1 Sep 16 23:13 (10.0.2.246)

yzh pts/0 Sep 17 12:03 (eagle)

ltb pts/0 Sep 17 17:06 (10.0.2.148)

ltb pts/0 Sep 18 09:10 (10.0.2.148)

ltb pts/1 Sep 18 10:24 (10.0.2.148)

ltb pts/0 Sep 18 11:22 (10.0.2.148)

patterson pts/2 Sep 18 16:23 (10.0.2.211)

6.2.2 users命令

users命令用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,则他的用户名将显示相同的次数,即如果root用户登录了两次,运行该命令将如下所示(该显示结果表明只登录了一个root权限的用户):

# users

root root

6.2.3 last命令

last命令往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。系统管理员可以周期性地对这些用户的登录情况进行审计和考核,从而发现其中存在的问题,确定非法用户,并进行处理。运行该命令,如下所示:

# last

patterson pts/1 10.0.2.221 Mon Jul 21 15:08 - down (8+17:46) patterson pts/1 10.0.2.221 Mon Jul 21 14:42 - 14:53 (00:11) changyi pts/2 10.0.2.141 Mon Jul 21 14:12 - 14:12 (00:00) patterson pts/1 10.0.2.221 Mon Jul 21 12:51 - 14:40 (01:49) reboot system boot 2.4.18 Fri Jul 18 15:42 (11+17:13) reboot system boot 2.4.18 Fri Jul 18 15:34 (00:04) reboot system boot 2.4.18 Fri Jul 18 15:02 (00:36)

读者可以看到,使用上述命令显示的信息太多,区分度很小。所以,可以通过指明用户来显示其登录信息。例如:使用last patterson来显示patterson的历史登录信息,则如下所示:

# last patterson

patterson pts/1 10.0.2.221 Mon Jul 21 15:08 - down (8+17:46) patterson pts/1 10.0.2.221 Mon Jul 21 14:42 - 14:53 (00:11)

6.2.4 ac命令

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

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

6.2.5 lastlog命令

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

# lastlog

Username Port From Latest

root pts/1 10.0.2.129 二 5月 10 10:13:26 +0800 2005

opal pts/1 10.0.2.129 二 5月 10 10:13:26 +0800 2005

6.3 使用syslog设备

6.3.1 syslog简介

syslog已被许多日志函数采纳,它用在许多保护措施中,任何程序都可以通过syslog记录事件。syslog可以记录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能记录本地事件或通过网络记录另一个主机上的事件。syslog是一种工业标准的协议,可用来记录设备的日志。在Linux系统,路由器、交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件。管理者可以通过查看系统记录,随时掌握系统状况。Linux的系统日志是通过syslogd这个进程记录系统有关事件记录,也可以记录应用程序运作事件。通过适当的配置,用户还可以实现运行syslog协议的机器间通信,通过分析这些网络行为日志,追踪掌握与设备和网络有关的状况。

6.3.2 syslog配置文件

syslog设备依据两个重要的文件:/etc/syslogd守护进程和/etc/syslog.conf配置文件。通常情况下,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog记录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围。

通过使用syslog.conf文件,可以对生成的日志的位置及其相关信息进行灵活的配置,满足应用的需要。该配置文件指明了syslogd守护程序记录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。这些域由tab隔开:

●选择域指明消息的类型和优先级。

●动作域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动作。

syslog.conf行的基本语法是:

消息类型.优先级动作域

其中,每个选择域由消息类型和优先级组成。当指明一个优先级时,syslogd将记录一个拥有相同或更高优先级的消息。Linux中一些主要的消息类型如表6-2所示。表6-3列出了一些优先级信息。

表6-2 syslog消息类型

表6-3 syslog常用优先级

不同的服务类型有不同的优先级,数值较大的优先级涵盖数值较小的优先级。如果某个选择条件只给出了一个优先级而没有使用任何优先级限定符,对应于这个优先级的消息以及所有更紧急的消息类型都将包括在内。例如,某个选择条件里的优先级是“warning”,它实际上将把“warning”、“err”、“crit”、“alert“和“emerg”都包括在内。

syslog允许人们使用三种限定符对优先级进行修饰:星号(*)、等号(=)和叹号(!):

(1)星号(*)的含义是把本项服务生成的所有日志消息都发送到操作动作指定的地点。就像它在规则表达式里的作用一样,星号代表“任何东西”。在前面给出的例子里,“mail.*”将把所有优先级的消息都发送到操作动作指定的

/var/log/mail文件里。使用“*”限定符与使用“debug”优先级的效果完全一样,后者也将把所有类型的消息发送到指定地点。

(2)等号(=)的含义是只把本项服务生成的本优先级的日志消息都发送到操作动作指定的地点。例如,可以用“=”限定符只发送调试消息而不发送其他更紧急的消息(这将为应用程序减轻很多负担)。当用户只需要发送特定优先级别的消息时,就要使用等号限定符。

(3)叹号(!)的含义是把本项服务生成的所有日志消息都发送到操作动作指定的地点,但本优先级的消息不包括在内。

所以,根据上面介绍的相关知识,给出如下例子作为示范:

(1)如果指明\"crit\",则所有标为crit、alert和emerg的消息将被记录。每行的行动域指明当选择域选择了一个给定消息后应该把它发送到哪儿。例如,把所有邮件消息记录到一个文件中,如下所示:

#Log all the mail messages in one place

mail.* /var/log/maillog

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

# Save news errors of level crit and higher in a special file.

uucp,news.crit /var/log/spooler

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

#Everybody gets emergency messages, plus log them on anther machine

*.emerg *

*.emerg @https://www.wendangku.net/doc/0116279279.html,

(3)有时syslogd将产生大量的消息。例如内核(\"kern\"设备)消息可能很冗长,用户很难看得清楚明了,那么用户可能想把内核消息记录到/dev/console 中。下面的例子表明内核日志记录被注释掉了:

#Log all kernel messages to the console

#Logging much else clutters up the screen

kern.* /dev/console

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

#Log anything(except mail)of level info or higher

#Don\'t log private authentication messages!

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

6.3.3 syslog进程

syslogd守护程序是由/etc/rc.d/init.d/syslog脚本在运行级2下被调用的,缺省不使用选项。但有两个选项-r和-h很有用:

(1)如果将要使用一个日志服务器,必须调用syslogd -r。缺省情况下syslogd 不接受来自远程系统的信息。当指定-r选项,syslogd将会监听从514端口上进来的UDP包。

(2)如果还希望日志服务器能传送日志信息,可以使用-h标志。缺省时,syslogd 将忽略使其从一个远程系统传送日志信息到另一个系统的syslogd。

另外,如果需要重新启动syslog守护进程(/etc/syslog.conf的修改只有在syslog 守护进程重新启动后才会生效),并且只想重新启动syslog守护进程而不是整个系统,在Red Hat Linux中,执行以下两条命令之一即可:

/etc/rc.d/init.d/syslogstop;/etc/rc.d/init.d/syslogstart

/etc/rc.d/init.d/syslogrestart

6.3.4 实际应用中的syslog调用接口

在实际的使用过程中,用户可以根据6.3节中的介绍通过配置文件和查看相应的日志文件来使用syslog。然而,在许多应用场景中,用户往往需要通过程序产生输出信息并进行记录,也就是说要把一些信息写成日志文件,正常情况下运行程序的人不用关心日志里的内容,只有在出现问题的时候才会查看日志文件里的内容以确定问题所在。因此,本节将介绍如何通过syslog日志系统提供的API调用接口,来使用程序实现对syslog的使用。

1.主要的函数

在Linux中,提供了四个有关syslog日志系统的系统调用,供用户使用:

●openlog:打开日志设备,以供读取和写入,与文件系统调用的open类似。

●syslog:写入日志,与文件系统调用的write类似。

●closelog:关闭日志设备,与文件系统调用的close类似。

●vsyslog:它和syslog功能一样,负责写入日志,只是参数格式不同。

(1)openlog函数。该函数的声明如下:

void openlog(const char *ident, int option, int facility);

此函数用来打开一个到系统日志记录程序的连接,打开之后就可以用syslog或

vsyslog函数向系统日志里添加信息了。而closelog函数就是用来关闭此连接的。openlog的第一个参数ident是一个标记,ident所表示的字符串将固定地加在每

行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。第二个参数option一般是下列选项值取“与”运算(使用“|”表示,如“LOG_CONS | LOG_PID”)的结果:

●LOG_CONS:如果送到system logger时发生问题,直接写入系统终端。

●LOG_NDELAY:立即开启连接,通常连接是在第一次写入消息时才打开的。

●LOG_PERROR:将消息也同时送到stderr设备。

●LOG_PID:将进程PID含入所有消息中。

第三个参数facility指明记录日志的程序的类型,它主要具有如下几类日志类型:●LOG_AUTH :安全/授权消息。

●LOG_AUTHPRIV:安全/授权消息。

●LOG_CRON:时间守护进程(cron和at)专用。

●LOG_DAEMON:其他系统守护进程。

●LOG_KERN:核心消息。

●LOG_LOCAL0到LOG_LOCAL7:系统保留。

●LOG_LPR:printer子系统。

●LOG_MAIL:mail子系统。

●LOG_NEWS:USENET新闻子系统。

●LOG_SYSLOG:syslogd进程内部所产生的消息。

●LOG_USER(缺省):一般使用者缺省使用消息。

●LOG_UUCP:UUCP子系统。

●LOG_FTP:FTP子系统使用。

(2)syslog函数。syslog函数的声明如下:

void syslog(int priority, const char * message, ...);

第一个参数是消息的紧急级别priority,第二个参数是消息及其格式,之后是格式对应的参数,如同C语言里面printf输出函数一样使用,具体的格式这里就不再详述,它不是本书介绍的重点。

这里还需要详细介绍一下第一个参数priority,它是由severity level和facility 组成的。Facility已经在上面介绍了,下面介绍一下severity level,也就是消息的重要级别,它主要包括:

●LOG_EMERG:紧急状况。

●LOG_ALERT:高优先级问题,比如说数据库崩溃等,必须要立即采取反应行动。

●LOG_CRIT:重要状况发生,比如硬件故障。

●LOG_ERR:错误发生。

●LOG_WARNING:警告发生。

●LOG_NOTICE:一般状况,需要引起注意。

●LOG_INFO:信息状况。

●LOG_DEBUG:调试消息。

在实际使用中,如果用户的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接syslogd程序,后面随时用syslog函数写日志就行了。

(3)closelog函数。相对上述2个函数来说,该函数非常简单,其声明如下:

void closelog(void);

值得注意的是,虽然该函数的使用和调用情况非常简单,但是是必不可少的,因为在Linux系统中,打开的日志也是资源,如果只使用openlog函数打开日志,而忘记使用closelog关闭日志的话,当打开的日志数量累积到一定程度,便会造成内存不足,从而引起系统问题。所以,提醒用户在使用中特别注意。

2.一个实际的程序调用例子

下面给出一个使用上述几个函数写日志的例子,以供大家参考:

#include

#include

#include

int main(void)

{

int log_test;

/*打开日志*/

openlog("log_test ", LOG_PID|LOG_CONS, LOG_USER);

/*写日志*/

syslog(LOG_INFO, "PID information, pid=%d", getpid());

syslog(LOG_DEBUG,"debug message ");

/*关闭日志*/

closelog();

}

6.4 Linux日志使用注意事项

系统管理人员要应该提高警惕,随时注意各种可疑状况,并且按时和随机地检查各种系统日志文件,包括一般信息日志、网络连接日志、文件传输日志以及用户登录日志等。在检查这些日志时,要注意是否有不合常理的时间记载。例如:

●用户在非常规的时间登录。

●不正常的日志记录,比如日志的残缺不全或者是诸如wtmp这样的日志文件无故地缺少了中间的记录文件。

●用户登录系统的IP地址和以往的不一样。

●用户登录失败的日志记录,尤其是那些一再连续尝试进入失败的日志记录。

●非法使用或不正当使用超级用户权限su的指令。

●无故或者非法重新启动各项网络服务的记录。

特别提醒管理人员注意的是:日志并不是完全可靠的。高明的黑客在入侵系统后,经常会“打扫”现场。所以需要综合运用以上的系统命令,全面、综合地进行审查和检测,切忌断章取义,否则很难发现入侵或者做出错误的判断。

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

6.5 Linux日志输出查看方式

Linux下面提供了许多文本工具来查看和处理日志文件,下面给读者提供一些比较常见和有用的工具。

6.5.1 dmesg

使用dmesg命令可以快速查看最后一次系统引导的引导日志。如下所示:

# dmesg

Linux version 2.4.20-8 (bhcompile@https://www.wendangku.net/doc/0116279279.html,) (gcc version 3.2.2 200

30222 (Red Hat Linux 3.2.2-5)) #1 Thu Mar 13 17:54:28 EST 2003

BIOS-provided physical RAM map:

BIOS-e820: 0000000000000000 - 000000000009f800 (usable)

BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)

BIOS-e820: 00000000000ca000 - 00000000000cc000 (reserved)

BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved)

BIOS-e820: 0000000000100000 - 00000000322f0000 (usable)

BIOS-e820: 00000000322f0000 - 00000000322fc000 (ACPI data)

BIOS-e820: 00000000322fc000 - 0000000032300000 (ACPI NVS)

BIOS-e820: 0000000032300000 - 0000000032400000 (usable)

BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)

BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)

BIOS-e820: 00000000fffe0000 - 0000000100000000 (reserved)

0MB HIGHMEM available.

804MB LOWMEM available.

On node 0 totalpages: 205824

zone(0): 4096 pages.

zone(1): 201728 pages.

zone(2): 0 pages.

Kernel command line: ro root=LABEL=/ hdc=ide-scsi

ide_setup: hdc=ide-scsi

Initializing CPU#0

Detected 1795.379 MHz processor.

Console: colour VGA+ 80x25

Calibrating delay loop... 3578.26 BogoMIPS

Memory: 806148k/823296k available (1347k kernel code, 14520k reserved, 999k data

, 132k init, 0k highmem)

Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)

如上所示,通常它的内容会很多,所以用户往往使用如下命令以分页的方式显示引导信息,如下所示:

# dmesg | more

6.5.2 tail

tail命令设计用于显示文本文件的最后几行。使用-f开关,当日志增加新的内容时,tail将继续显示新的输出。如下所示:

# tail -f /var/log/messages

tar: You must specify one of the `-Acdtrux' options

Try `tar --help' for more information.

# tail -f /var/log/messages

Mar 11 10:07:22 localhost anacron: anacron startup succeeded

Mar 11 10:07:22 localhost atd: atd startup succeeded

Mar 11 10:07:22 localhost xfs: ignoring font path element

/usr/X11R6/lib/X11/fonts/cyrillic (unreadable)

Mar 11 10:07:30 localhost kernel: mtrr: your processor doesn't support write-combining

上面的命令将显示/var/log/messages文件的最后6行,然后继续监控该文件,并输出新的行为。要停止tail -f命令,可使用[Ctrl + C]来中止进程。

6.5.3 more和less

more的工作方式与DOS版本相同。您可以将它指向一个文件,或者通过它以管道输出信息,以分页的方式来查看信息。例如,以分页方式显示maillog日志文件的内容:

# more maillog

然后,可以使用q或者[Ctrl+C]来停止查看文件。

less是另一个文本阅读器,不过它还允许在文件中滚动浏览以及检索信息。如下所示:

# less /var/log/XFree86.1.log

上面的命令将显示/var/log/XFree86.1.log文件的内容,可以使用q来停止查看文件。

6.5.4 其他方式

Linux中的日志文件对于系统的故障诊断和维护来说至关重要。许多诸如WWW、FTP、SMTP等网络应用服务的Linux日志记录都是记录到文本文件中,所以不需要专门的工具来查看这些文件。用户可以选择vi、gEdit等简单的文本编辑工具查看使用。对于一些网络应用服务的文件以及查看方式,本书还将在相应的章节进行介绍。

相关文档