Linux系统管理技术手册(第二版)部分章节快读-第10章
S"t2QX/H*L0
A;\u!M a:V9Z7]e0 申明:本著作版权归原书作者 LUPA开源社区5iG#@,k?#\as"c`$t2k
Evi Nemeth,Garth Snyder,Trent R.Hein所有
O Br5],TZ-J`[1y8?0 LUPA开源社区TnTt]1N
由人民邮电出版社出版发行,如果想看全书购买正版图书.LUPA开源社区XOn}5ICr2u
LUPA开源社区 p4Wr$T$B J
以下篇目尽供交流,不得用于其他商业用途,谢谢合作!LUPA开源社区,P'LB%| Y~k%_`b:? ^A
LUPA开源社区3|W1m6v1o3S)d9`5A!W N
LUPA开源社区"\r5KYFQ
第10章 系统日志与日志文件
v&NN|(a0
%zS,j L.H!Ap~0

/A~#[0p)G f0
系统守护进程、内核和各种工具都会产生一些数据,这些数据被记录下来,最终保存在容量有限的硬盘上。其中大部分数据有用的寿命都是有限的,因此需要对其它们进行汇总、压缩、存档并且最终扔掉。LUPA开源社区*U)C"h |f+c)X8F ~k
LUPA开源社区M&PaAC.j
10.1 日志记录的策略
#?7b3m Sg0
_K r2R0[0 日志记录的策略随站点不同而不同。常见的方案包括以下几种:
^U2|@i8X0 ·立刻扔掉所有数据;LUPA开源社区/Eq6Hs~)J.uGJqP
·定期重新设置日志文件;LUPA开源社区"bI d:H(K?KV!vu
·轮换日志文件,把该数据保留一定的时间;LUPA开源社区]1_%m7Y"@)Nr
·将日志压缩并保存到磁带或其他永久性介质上。LUPA开源社区Z*f6j+dB'L?o\s z
对于您的站点来说,正确的选择取决于磁盘空间有多大,您的安全意识有多强。即使具有充足的磁盘空间,还是不要让日志文件过快增长。LUPA开源社区Nl4_;pO}RM.s Bv$}
无论选择何种方案,都必须用cron自动维护日志文件。有关该守护进程的详细内容,请参考第8章。
@F8Z1U-UJT0LUPA开源社区FI$AIr;]b^
10.1.1 扔掉日志文件
`n+Kk+w3ObT,_,Y0LUPA开源社区:|!M |Y6d Ay@r6h
我们并不建议扔掉所有的日志信息。遭受到安全问题的站点常常会发现,日志文件提供了非法入侵的重要的证据。日志文件还有助于提醒您有关硬件和软件方面的问题。总而言之,如果磁盘空间足够的话,建议至少保存数据一个月,然后才可以丢弃。在实际生活中,您可能需要很长一段时间才会意识到站点已经被黑客攻破,这时就需要查看以前的日志。如果有必要回顾更远的过去所发生的事件,那么可以从备份磁带上恢复较早的日志文件。
.Wi!f/`.s3j e |9Z9x0 有些管理员听任日志文件任意增长,直到它们变成麻烦后才将其清除并从零开始。这种方案比一点儿数据都不保存要好,但这样做无法保证日志记录项能够存留任何特定的时间长度。磁盘的平均利用率也要比使用其他管理方案的利用率高。LUPA开源社区5nNF'lP$U SZb%v
在很个别的情况下,一个站点决定保留某些日志文件,可能不是为了任何有益的目的,而更多是为了应付传票。处于这种境地的一个站点可能会留着几周的日志数据,但是它或许要保证这些文件一定不能被存到永久性的介质上。有一个这样的案例:微软已经不止一次受到指控,其管理日志文件和电子邮件的政策破坏性过强。原告称,微软的数据保留政策无异于毁掉证据,尽管删除行动(或者至少是删除策略)是在法律诉讼之前就已经有了。遗憾的是,目前断定法庭将最终如何回应这些诉讼还为时过早[1]。在美国,Sarbanes-Oxley法案最近规定了保留记录的新要求,参考30.12.8节。LUPA开源社区 Q#?'E#D6yT+~
e*o&t1`Zg0[1] 值得一提的是,在出现官司苗头的时候(或者更为恶劣一些,在诉讼过程期间)就删除相关的电子邮件或者日志文件的做法注定不会占理。只有正在执行的明确不保留数据的策略才会有望得到法律保护。LUPA开源社区^\Wt H!L
LUPA开源社区.p8`z.H5~Q+P
10.1.2 轮换日志文件
LUPA开源社区Er.@H%f6i@"s6LG
把每周或者每月的日志信息保存在一个单独的文件里,这是一种通常(但不是通行)的做法。这些周期性的文件都会保留特定一段时间,然后被删除。我们专门在一台中央日志主机上划了一个硬盘分区(/var/log)给日志文件。LUPA开源社区\tm#i_3CJ
在每个轮换周期结束的时候,有一个脚本或者工具程序更改每个文件的名字,然后把较早的数据向文件链的结尾推。例如,假设某个日志文件的名字叫做logfile,则它的备份文件可能叫做logfile.1、logfile.2,依此类推。如果每周轮换一次,并且保存8周的数据,那么就会有一个logfile.8文件但没有logfile.9文件。每周随着logfile.7文件覆盖logfile.8文件,logfile.8中原来的数据就没了。
o_Ba,}]6EZ0 稍微麻烦一点,压缩一下数据就能延长保存的时间。您可以运行zgrep,不必解压压缩文件,就能搜索压缩文件。
O]"p#Bp~ L B;?-z)Nf0 假定每周都要留意某个文件,而且(为了简化例子)假定希望存档该文件三周的内容。下面的脚本就可以实现一个适当的轮换策略:
G,[3bD{]7j0 #!/bin/shLUPA开源社区&Nn9p2SEZ/[
cd /var/logLUPA开源社区"Bu ujE
mv logfile.2 logfile.3
6DJ:S-VyH1xRU0 mv logfile.1 logfile.2
e F8{7s{![U V*l,I0 mv logfile logfile.1
z:F2Ou#H6RJ7q0 cat /dev/null > logfile
H#[.RX @1C0 chmod 600 logfileLUPA开源社区rX'|)e,y9u,a
qx.FvUi(}9}0 对于某些日志文件来说,权属信息很重要。您可能需要以日志文件属主的身份,而不是以root的身份从cron运行自己的轮换脚本,或者要在这些命令中加上chown命令。LUPA开源社区YG4z#i?*x+|e4o
大多数Linux发行版本(包括我们全部的示例版本)都支持一种叫做logrotate的很不错的日志轮换工具,我们将从10.3节开始介绍它。比起编写您自己的脚本来说,它要容易得多(也可靠得多),如果您的发行版本没有包含它,那么还是值得找到并安装它的。LUPA开源社区 sE1}5k{F9D:L2H
某些站点用日期而不是序列号来标识日志文件,例如logfile.tues或logfile.2005.04.01。这种系统实现起来稍微困难一点儿,但如果需要频繁用到旧的日志文件,那么还是值得这么做的。在Perl里设置用日期给文件起名字要比在sh中容易得多。一种不需要任何编程技巧的习惯用法是:LUPA开源社区x+[?tn x6B
mv logfile logfile.`date +%Y.%m.%d`
8o|`#F t _0 这种方法也有能让ls命令对日志文件按时间顺序进行排序这一优点。(ls的-t选项让它把任何目录下的文件按修改时间排序,但是如果这些文件没有要求就这样自行安排也挺不错。)LUPA开源社区4kf+e6G-ZO
有些守护进程的日志文件自始至终都处于打开状态。由于文件系统工作方式的缘故,我们举例的脚本不能用于这样的守护进程。日志记录数据不会保存到再次创建的logfile中,而是继续保存到logfile.1里;即使在将文件重新命名之后,对原来文件的活动引用仍然存在。若想安装一个新的日志文件,则必须向守护进程发信号或者杀死并重启它。参考本书的相关章节(或者您的手册)确定在每种情况必须采取什么样的步骤。
`4W `RCfV-Be0 下面的例子在上述例子的基础上进行了修改,它同时使用了压缩和信号:LUPA开源社区0C%`"}+cp2j4IC
#!/bin/shLUPA开源社区n/x$y8FR:wh+R g?:^h
cd /var/log
2B5f*n^'v0 mv logfile.2.gz logfile.3.gzLUPA开源社区S1R MV'e f x!U'c9h*h@
mv logfile.1.gz logfile.2.gzLUPA开源社区|{0O~*j.Uk
mv logfile logfile.1
`*aUy.|e?(n0 cat /dev/null > logfile
G&qV"FM5r)o w,Va0 chmod 600 logfile
A(SSe,C'Q D0 kill -signal pidLUPA开源社区jw2r1v^rt@*a x
gzip logfile.1LUPA开源社区3N ~g-e@
+p\~ b&g0 其中的signal代表向程序发出的写日志文件的适当信号,pid是它的进程ID。该信号可以直接写入脚本,但必须动态判断守护进程的PID,这可以通过读取该守护进程留下的文件(比如/var/run/syslogd.pid,这将在下面给予介绍)或是使用kill的变体killall来实现,killall能够在进程表中查找PID。例如,下面的命令
p2]RTU1[rMlT~m0LUPA开源社区 ow@)Z:z8y
killall -e -HUP syslogdLUPA开源社区u'O l'E,E-AzIaU
LUPA开源社区)o`H?e+zL)\
等价于LUPA开源社区k#T-U Wzl^'Y
'U:{ v2Hqn0 kill -HUP `cat /var/run/syslogd.pid` LUPA开源社区B/el5}/cN u[!B
LUPA开源社区vS"P ? z'OYf
10.1.3 存档日志文件
W1izzRa;V,l8cf0
r6?#V1e*e:GDko0 除非您就是希望避免留下书面记录,否则应该在常规的系列备份中包含有日志文件。因为它们包含的信息对于调查安全事故来说至关重要,所以在您的转储频度允许的情况下,要以最高频度备份它们。日志文件变化很频繁,所以它们能够代表要保存在增量备份上的系统信息的重要部分。在设计您的日志政策和您的备份策略时要记得它们两者之间的相互作用关系。有关备份的更多信息,可参见第9章。
7^x}*Z,a,l0Q/fRL0 除了作为例行备份的一部分之外,日志也可以存档到另一套单独的磁带上。相比之下,单独的一套磁带使用起来不方便,但它们带来的建档负担要轻,同时又不影响您循环使用转储磁带的能力。在使用单独的磁带时,我们建议您采用tar格式,并编写一个脚本来自动执行备份方案。LUPA开源社区&Q9^P@7`7}
Ze/O6X^_@BUg@/F010.2 Linux的日志文件
$JT[-PtU'o8SlUg0LUPA开源社区-Q^Iv0}?q xC
传统的UNIX系统往往因为它们做日志的方法不一致,甚至还有点儿怪异而受到批评。幸运的是,虽然Linux系统的每一种发行版本都有自己的一套给日志文件命名和分类的方法,但是一般而言Linux要好一点儿。Linux的软件包大多将它们的日志信息记录到/var/log目录下的文件里。在有些发行版本上,个别日志也保存在/var/adm里。
+WlU7CH,Y0 现如今,大多数程序都把它们的日志项发送到一个称为syslog的中央清理系统,syslog将在本章后面予以介绍。默认的syslog配置一般将这些信息的大部分转储到/var/log中的某个地方。请检查系统日志的配置文件/etc/syslog.conf,找出这些信息究竟存在什么地方。有关syslog.conf文件的格式,请参考10.4节。
~;B4i0LZ1JYSa0 表10.1总结了一些在我们举例的系统中较为常见的日志文件的有关信息。具体有如下几项:LUPA开源社区`E\mk#U#T
·存档、汇总或截断的日志文件;LUPA开源社区)VqT;|.i9D
·创建各个日志文件的程序;
&xW ^M+@0 ·有关如何指定每个文件名的指示;
p{?,w&^xeL0 ·我们认为留意或者清理的合理频率;
U_9nPz;A0 ·使用日志文件的发行版本(在我们的例子中出现过);
(vvesH0 ·文件内容的说明。LUPA开源社区9G-\.B)Y/jC d1H`$I#g
除非特别说明,否则文件名都是相对于var/log而言的。LUPA开源社区(E8Lha:XK0LK QvK
“出处”一列中的字符说明了日志文件的指定方法:S代表使用syslog的程序, F代表使用一个配置文件的程序,而H则代表文件名是否直接包含在代码中。“频率”一列表明了我们建议的清理频率。“发行版本”一列给出了该项适用的发行版本。
lr2I w%L4O8O#B0 虽然各个发行版本上日志文件的所属关系和模式都有不同,但日志文件一般由root所有。就我们看来,大多数日志的模式都应该是600(只有属主有读写权限),因为它们的内容对于黑客来说可能有帮助。如果用户的水平相当高,那么能够查看日志对用户会有好处。在这种情况下,放开日志文件的部分权限也是合理的。LUPA开源社区/p BK/S4e"o
专为日志建立一个用户组,把日志文件的属组设为这个用户组,让这个用户组的成员都能读取日志文件,这是另一种合理的做法。您可以把本地的系统管理员加入到这个用户组里,让他们不必使用sudo命令就能看到日志文件的内容。如果站点有一个初级系统管理员,他没有完全的sudo特权,这样的安排就特有用。
*x X%|:}D'a0?0 至少,应该限制用户对secure、auth.log和sudo.log文件不经意地查看。绝对不要把任何日志文件的写权限交给属主之外的任何人。
7uqMD'`'Y,Z l0 值得说明的一点是,表10.1中给出的日志文件大多数都是由syslog维护的,但是syslog的默认配置则随系统的不同而变化很大。采用了比较一致的/etc/syslog.conf文件后,各Linux发行版本上的日志文件看上去就相当相似了。
/d&Ys_2C.@"F a0LUPA开源社区.A\Y[d,F&]v
表10.1 日志文件列表
|
文 件 |
程 序 |
出 处a |
频 率a |
发行版本a |
内 容 |
|
auth.log |
su等b |
S |
M |
DU |
授权 |
|
apache2/* |
httpd第2版 |
F |
D |
SDU |
Apache
HTTP服务器的日志(第2版) |
|
boot.log |
rc脚本 |
Fc |
M |
RF |
系统启动脚本的输出 |
|
boot.msg |
内核 |
H |
- |
S |
内核消息缓冲的转储 |
|
cron |
cron |
S |
W |
RF |
cron的执行情况和出错信息 |
|
cups/* |
CUPS |
F |
W |
所有 |
与打印有关的消息(CUPS) |
|
daemon.log |
许多 |
S |
W |
DU |
所有守护进程功能的消息 |
|
debug |
许多 |
S |
D |
DU |
调试输出 |
|
dmesg |
内核 |
H |
- |
RFDU |
内核消息缓冲的转储 |
|
dpkg.log |
dkpg |
F |
M |
DU |
软件包管理日志 |
|
faillog |
login |
H |
W |
SDU |
不成功的登录企图 |
|
httpd/logs/* |
httpd |
F |
D |
RF |
Apache
HTTP服务器的日志(在/etc下) |
续表
|
文 件 |