本节书摘来自华章出版社《构建高可用Linux服务器 第3版》一 书中的第1章,第1.4节,作者:余洪春 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.4 Linux服务器的日志管理
从安全的角度来说,Linux服务器的日志非常重要,它记录了系统每天所发生的各种各样的事情,如果服务器受到攻击,就可以根据它来进行分析。同时,它更是很重要的排障依据,可以通过它来检查错误发生的原因,所以我们必须了解和熟悉其运作机制。
1.4.1 系统日志syslog.conf的配置详解
目前,Linux依旧使用syslog作为日志监控进程,对其进行必要的配置能减少很多麻烦,并且可更有效地从系统日志监控到系统的状态。理解并完善一个syslog的配置,对于系统管理员来说尤为重要。/etc/syslog.conf根据如下的格式定义规则:
facility.level action
即
设备.优先级 处理方案
facility.level字段也称为seletor(选择条件),选择条件和处理方案之间用空格或tab分隔。#开头的是隔,空白行会自动跳过。下面分别介绍。
(1)facility(设备)
facility定义了日志消息的范围,其可以使用的key如下所示。
auth:由pam_pwdb报告的认证活动。
authpriv:包括特权信息,如用户名在内的认证活动。
cron:与cron和at有关的计划任务信息。
daemon:与inetd守护进程有关的后台进程信息。
kern:内核信息,首先通过klogd传递。
lpr:与打印服务有关的信息。
mail:与电子邮件有关的信息。
mark:syslog的内部功能,用于生成时间戳。
news:来自新闻服务器的信息。
syslog:由syslog生成的信息。
user:由用户程序生成的信息。
uucp:由uucp生成的信息。
local0~local7:与自定义程序一起使用。
另外,*通配符代表除了mark以外的所有功能,还有security为一个旧的key定义,等同于auth,已经不建议使用。
(2)level(优先级)
level定义了消息的紧急程度。按严重程度由高到低顺序排列如下:
emerg:该系统不可用,等同于panic。
alert:需要立即被修改的条件。
crit:危急情况。
err:错误消息,等同于error。
warning:预警信息,等同于warn。
notice:具有重要性的普通条件。
info:提供信息的消息。
debug:不包含函数条件或问题的其他信息。
none:没有重要级,通常用于排错。
另外,*代表所有级别,除了none外,panic、error、warn均为旧的标识符,不建议使用。
在定义level级别的时候,需要注意两点:
优先级是由应用程序在编程的时候决定的,除非修改源码再编译,否则不能改变消息的优先级。
低优先级包含高优先级,例如,为某个应用程序定义info的日志导向,则涵盖notice、warning、err、crit、alert、emerg等消息。
(3)selector(选择条件)
通过小数点符号“.”把facility和level连接在一起则称为selector(选择条件)。
可以使用分号“;”同时定义多个选择条件。也支持如下三个修饰符:
:表示所有日志信息。
=:等于,即仅包含本优先级的日志信息。
!:不等于,本优先级日志信息除外。
(4)action(处理方案)
由前面选择条件定义的日志信息,可执行下面的动作:
file:指定日志文件的绝对路径。
terminal或print:发送到串行或并行设备的标志符,例如/dev/ttyS2 @host表示远程的日志服务器。
username:发送信息到本机的指定用户信息窗口中,但该用户必须已经登录系统。
named pipe:发送到预先使用mkfifo命令创建的FIFO文件的绝对路径中。
1.4.2 Linux下的日志维护技巧
1.系统日志
/var/log/messages不仅是服务器的系统日志,很多时候它也是许多服务的日志,所以它被称为“系统杂货铺”,建议重点关注。大家一般都喜欢用以下命令来看最后10条日志:
tail -n10 /var/log/messages
其实还可以将一段日志保存成文件(Xmanager3.0企业版的shell也有日志录像截取功能),或者直接用vim来处理。我以前配置主从复制的bind服务器时,有时会因为权限的原因报错,这时就可以在一台报错的服务器上用命令tail-f /var/log/messages实时查看服务器的日志变化情况,从而查找错误的蛛丝马迹,事实证明,效果很好,而且将此命令用于LVS+Keepalived的排错效果也不错,其他服务器配置排错依此类推,这个做法也推荐大家掌握。
2.系统安全日志
/var/log/secure记录登入系统存取数据的文件,例如POP3、SSH、Telnet、FTP等都会被记录,我们可以利用此文件找出不安全的登录IP。目前比较流行的SSH防暴力破解工具DenyHosts主要也是读此文件。另外,我写了一个类似原理的shell安全脚本,用于线上服务器,在后面的章节跟大家分享。
3.记录登录者的数据
/var/log/wtmp记录登入者的信息数据,由于此文件已经被编码过(为二进制文件),想用cat等命令直接查看是不行的,必须使用last命令来取出文件的内容,如下所示。
last
命令显示结果如下:
root pts/2 220.249.72.138 Wed Mar 30 08:33 still logged in
root pts/2 220.249.72.138Tue Mar 29 09:02 - 15:42 (06:39)
root pts/2 220.249.72.138Tue Mar 29 07:31 - 09:01 (01:30)
root pts/2 219.139.223.49Tue Mar 29 00:14 - 00:29 (00:15)
root pts/2 183.94.4.206Mon Mar 28 20:46 - 21:21 (00:34)
root pts/2 113.57.224.3Mon Mar 28 11:30 - 12:17 (00:46)
root pts/4 219.139.223.142Sun Mar 27 15:58 - 18:10 (02:11)
root pts/3 113.57.224.3Sun Mar 27 14:28 - 18:25 (03:57)
root pts/3 113.57.224.3Sun Mar 27 09:20 - 11:56 (02:35)
root pts/3 219.140.210.152Sun Mar 27 01:16 - 01:29 (00:12)
root pts/2 220.249.72.138Sat Mar 26 08:42 - 18:38 (1+09:55)
root pts/2 220.249.72.138Thu Mar 24 11:19 - 14:44 (1+03:25)
root pts/2 220.249.72.138Wed Mar 23 10:26 - 09:13 (22:47)
root pts/2 220.249.72.138Tue Mar 22 07:22 - 13:38 (06:16)
root pts/2 119.103.112.43Mon Mar 21 18:08 - 18:38 (00:29)
root pts/2 119.103.112.43Mon Mar 21 16:26 - 18:07 (01:41)
root pts/3 119.103.82.129Mon Mar 21 12:22 - 12:25 (00:02)
root pts/2 119.103.121.252Mon Mar 21 11:59 - 14:11 (02:12)
root pts/2 119.103.121.252Mon Mar 21 11:50 - 11:53 (00:02)
root pts/2 119.103.30.213Sun Mar 20 10:03 - 12:42 (02:39)
root pts/3 58.19.17.3Sat Mar 19 12:22 - 12:22 (00:00)
root pts/2 220.249.72.138Sat Mar 19 07:07 - 16:05 (08:58)
root pts/2 219.140.213.209Sat Mar 19 01:39 - 01:55 (00:16)
4.记录系统时间
/var/log/lastlog记录每个使用者最近登入系统的时间。因此当使用者登入时,就会显示其上次签入的时间,你应该注意一下这个时间,若此时间不是你上次签入的时间,表示账号可能被人盗用了。此可执行文件可用/usr/bin/lastlog命令读取(FreeBSD8.1下为/usr/sbin/lastlogin)。使用此命令后的记录如下所示:
lastlog
命令结果显示如下:
用户名 端口 来自 最后登录时间
root pts/2 220.249.72.138 三 3月 30 08:33:33 +0800 2011
bin 从未登录过
daemon从未登录过
adm从未登录过
lp从未登录过
sync从未登录过
shutdown从未登录过
halt从未登录过
mail从未登录过
news从未登录过
uucp从未登录过
operator从未登录过
games从未登录过
gopher从未登录过
ftp从未登录过
nobody从未登录过
nscd从未登录过
vcsa从未登录过
pcap从未登录过
rpc从未登录过
apache从未登录过
mailnull从未登录过
smmsp从未登录过
ntp从未登录过
hsqldb从未登录过
xfs从未登录过
rpcuser从未登录过
sshd从未登录过
dbus从未登录过
avahi从未登录过
haldaemon从未登录过
avahi-autoipd从未登录过
gdm从未登录过
longfei从未登录过
ldap从未登录过
www从未登录过
mysql从未登录过
5.服务器的邮件日志
服务器的邮件为/var/log/messages,如果要用专业的日志分析工具来分析,推荐使用Awstats;如果公司的开发对邮件的要求比较低,可以配置最简单的Sendmail或Postfix,通过看邮件日志里的status状态来判断邮件是否正确发送。在配置Nagios服务器时,我也习惯用此日志来判断报警邮件是否发送,如果对自己的shell水平足够有自信,也可以写脚本来收集邮件服务器的返回状态等,但专业的事情,建议还是由专业的Awstats工具来做,特别是邮件负载比较大时(比如,每天几百万条日志或上千万条日志),依靠人力完全不可取。
6.输出iptables日志到一个指定文件中
iptables的man参考页中提到:我们可以使用iptables在Linux内核中建立、维护和检查IP包过滤规则表,iptables自身的三个表可能已经创建,每一个表包含了很多内嵌的链,也可能包含用户自定义的链。iptables默认把日志信息输出到/var/log/messages文件中。不过有些情况下(比如你的Linux服务器是用来做防火墙或NAT路由器的),你可能需要修改日志输出的位置,通过修改或使用新的日志文件,可以帮你创建更好的统计信息,或者帮你分析网络攻击信息。下面向大家介绍如何建立一个新的日志文件/var/log/iptables.log。
输出iptables日志信息到一个指定文件的方法如下所示。
首先打开/etc/syslog.conf文件:
vim /etc/syslog.conf
然后在文件末尾加入下面这行信息:
kern.warning /var/log/iptables.log
最后保存和关闭文件,使用下面的命令重新启动syslogd:
service syslog restart
7.日志文件的专业工具
Linux系统的一些常见服务,比如Apache、Nginx、Squid等,都有自己特定的日志文件,不过由于其格式比较复杂,还是推荐使用专业工具(如Awstats、Webalizer)来分析。
8.用dmesg查看启动消息
dmesg提供了一个简单的方法查看系统启动信息。当Linux启动的时候,内核的信息被存入内核ring缓存当中,dmesg可以显示缓存中的内容。默认情况下,dmesg打印内容到屏幕上,当然,你可以重定向输出到一个文件中。如果硬件损坏,会显示在dmesg日志里,可用命令dmesggrep error来查看相关内容,其实看到的也就是/var/log/dmesg中的内容。
9.关于cron的日志
默认情况下,在crontab中执行的日志写在/var/log下,我们可以先看看/etc/syslog.conf里的配置,通过命令grep cron/etc/syslog.conf来查看,命令结果如下所示:
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# Log cron stuff
cron.* ```
接着看/var/log/下的cron日志,命令如下所示:
ls -lsart /var/log/cron*
命令结果显示如下所示:
80 -rw------- 1 root root 72378 03-20 04:02 /var/log/cron.2
812 -rw------- 1 root root 819861 03-27 04:02 /var/log/cron.1
524 -rw------- 1 root root 525442 03-31 13:59 /var/log/cron
当crond执行任务失败时,crontab的日志会向用户发送一封邮件。如果在服务器上发现一个任务没有正常执行,而crond的邮件发送也失败,那么检查一下mail的日志,看看是否因磁盘空间不够而造成的。
为了方便收集crond的日志信息,也可以将cornd错误输出和标准输出日志都指向自定义的日志文件:
0 6 * * * root /bin/bash /root/test_file.sh >>/data/log/mylog.log 2>&1
10.用Shell脚本分析日志
在维护线上服务器时,并不需要查看每台服务器的日志,可以偏重于我们有需求的服务器,如果不太喜欢用Awstats来分析Nginx负载均衡器的日志,可以编写一段分析日志的Shell脚本,下面分享一下我用Shell编写的分析Nginx日志的脚本,它可以快速得出排名最前的网站和IP等,内容如下所示:
!/bin/bash
if [$# -eq 0 ]; then
echo "Error: please specify logfile."
exit 0
else
LOG=$1
fi
if [! -f$1 ]; then
echo "Sorry, sir, I can't find this apache log file, pls try again!"
exit 0
fi
echo "Most of the ip:"
echo "-------------------------------------------"
awk '{ print$1 }'$LOG | sort | uniq -c | sort -nr | head -10
echo
echo
echo "Most of the time:"
echo "--------------------------------------------"
awk '{ print$4 }'$LOG | cut -c 14-18 | sort | uniq -c | sort -nr | head -10
echo
echo
echo "Most of the page:"
echo "--------------------------------------------"
awk '{print$11}'$LOG | sed 's/^.\(.cn\)\"/\1/g' | sort | uniq -c | sort -rn | head -10
echo
echo
echo "Most of the time / Most of the ip:"
echo "--------------------------------------------"
awk '{ print$4 }'$LOG | cut -c 14-18 | sort -n | uniq -c | sort -nr | head -10 > timelog
for i in 'awk '{ print$2 }' timelog'
do
num='grep$i timelog | awk '{ print$1 }''
echo "$i$num"
ip='grep$i$LOG | awk '{ print$1}' | sort -n | uniq -c | sort -nr | head -10'
echo "$ip"
echo
done
rm -f timelog
可以用此脚本分析文件名为www_tomcat_20110331.log的文件:
sh counter_nginx.sh www_tomcat_20110331.log
大家应该跟我一样比较关注脚本运行后的第一项和第二项结果,即访问我们网站次数最多的IP和哪个时间段IP访问次数比较多,如下所示:
Most of the ip:
-------------------------------------------
5440 117.34.91.54
9 119.97.226.226
4 210.164.156.66
4 173.19.0.240
4 109.230.251.35
2 96.247.52.15
2 85.91.140.124
2 74.168.71.253
2 71.98.41.114
2 70.61.253.194
Most of the time:
--------------------------------------------
12 15:31
11 09:45
10 23:55
10 21:45
10 21:37
10 20:29
10 19:54
10 19:44
10 19:32
10 19:13