用RPM校验文件
) S0 m4 I6 c' D: Z& h6 n8 L O
2006-06-01
5 p# `( Y6 t' s9 k4 u- `
5 X* z0 z1 ?) a! }
1 E! Z0 y& I, q v) C有些事情对我们
系统管理员来说至少发生过一次,就是你感觉到你的系统好像不对劲
' u6 T- J, h& p' B2 t7 E9 U; F
,开始怀疑有人已经突破了你的防御。确定此事是否发生的途径之一就是检查系统文
( a" l- b z3 X/ ]* E8 b# e件有没有变化,你需要安装TripWire或者其他审计工具来帮忙。
2 r4 ]# n7 Q0 Z+ y* Y% d! l# F0 }9 z% H; [
幸运的是,RedHat的
程序员们开发了一个工具,叫作RedHatPackage
Manager,简
2 p: L5 Z) F' E( X称为RPM。在RedHat的
Linux系统中是默认存在的。
. {0 Q* k O" A9 H0 c: ^* J6 s$ i" h7 [) N2 g4 v1 x
RPM能为我做些什么?
$ K; X; g8 v' ?3 z
RPM是一个强大的工具,用来安装、升级和校验RedHat系统上的
软件包。它的校验
功能可以用来确认文件是否被修改或覆盖,这正是本文所要讨论的。除了文件的大小和
时间戳,RPM还能检查文件的
信息文摘或MD5签名。
! U; O4 k T! ~* w$ O, e6 P$ Q
, n V: L9 Q" O3 `. ]1 M在RFC1321中有MD5的详细
描述。简单的说,MD5根据文件的内容用
算法产生一个唯一的128位签名,用任何方法改变文件都会导致签名改变。尽管人们一直在讨论修改文件后能保持签名不变的
理论可能性,但截止到目前还没有人能够做到。所以在文件使用前后各作一次MD5检查,能够99.9999%的保证文件没有改变。
8 R7 v) R( @2 l+ n) y ^
6 d' {& \* T1 \0 B O如何使用RPM来检查文件?
% K) }4 X0 w& ^
有一些RPM的参数你需要注意。第一个是“-V”,它检查与某一RPM包相关所有文件的
9 K( J/ k+ U; g/ d完整性。语法为:
4 k" Q$ ^9 E0 G' U' c6 `" G S$ E3 u$ [3 r
rpm-Vpackage_name_to_verify
M5 L. c' _" b% @& u
5 j: L* A. Y: d* h比如系统上运行了sendmail,通过以下命令检查所有相关文件的完整性:
u( u, F8 C; q, J! T/ h" v
5 B5 V0 D q: E% nrpm-Vsendmail
% x* G6 \- a% q9 ]9 K
0 f. V4 U6 {/ m( k. p' B, Q2 b: a
输出看来是这样的:
6 z8 F m( G2 q4 R9 b P; @2 ?' m+ }, }, ~
[root@fubar/root]#rpm-Vsendmail
& T3 E+ V. n- R% Q: F+ D( ^ LS.5....Tc/etc/aliases
& W. w9 k* U+ `missing/etc/mail/ip_allow
: P5 T ^- z& v; H
S.5....Tc/etc/mail/relay_allow
; C2 Q* m2 r8 L( c6 H% o
S.5....Tc/etc/sendmail.cf
& f* r, t8 t; L3 B7 D! gS.5....Tc/etc/sendmail.cw
2 U' ^: T5 S3 N
S.5....T/usr/sbin/sendmail
4 ~' F; n. T t* a( f2 j! u3 NS.5....T/var/log/sendmail.st
% q+ J: b7 M- }
[root@fubar/root]#
# U5 p+ r/ D J l5 o
' e$ l, a$ n1 V. f只有校验失败的文件才被列出,没有列出的文件应该是完好无损的。左边给出了为什
$ @2 }3 p) ^8 [, D8 [9 _么校验失败的原因,具体解释如下:
' D @( t) r! z( I- {. a& R# S* R7 e- i; D# |# ~4 O) J
S=大小改变
0 T" E3 Q) T% F4 U r0 v* G1 e
M=权限改变
. E" \% i& L& A1 ~5 ~' h1 R5 d5=MD5改变
3 J( x" u/ P, |6 ~" pL=连接改变
4 u8 x6 G: L% @9 nD=设备改变
. P: M; R& B: q7 y- P* s( G" tU=用户改变
& q8 c7 y+ u1 T/ e
G=组改变
- u7 N$ B8 n9 k
T=日期和时间改变
% p7 a: j/ }8 Rmissing=文件丢失
( U& y6 C% B' |' v" f/ ?7 C$ S
' s* d6 r7 J. b, Z% d! z, ?从上面的输出可见,文件aliases,relay_allow,sendmail.cf和sendmail.cw的大
( I2 R" H/ \/ C
小、时间日期和MD5发生了改变。由于它们是配置文件,应该没什么关系。但是/usr/
8 ~" k9 }) [0 j" M; Kbin/sendmail的改变就要引起注意了,它是一个监听在25端口的可执行文件,用来接
/ [: g% i- @: @$ q1 n
受信件。除非你升级了sendmail,否则它不应该校验失败,很明显有人修改或者覆盖
, t2 L- R$ k# r/ l4 }% z/ S
了原来的sendmail文件,可能带有木马或者后门。
: o! H7 ?; G$ P
& [ x+ n5 i) _# [" W) p输出还显示ip_allow文件被删除或者被改名。这是用来检查和控制SPAM的一个文件,
3 p+ Q( e. j) ], j# {. q Q
它的丢失某种程度上表明相关的二进制文件可能被修改。
5 `/ t8 ~; a+ {1 p7 ?9 n: z. B _# p& Q' Y
当观察RPM输出的时候,在检查日期时间和文件大小的同时,要特别注意MD5是否变化,入侵者经常修改或覆盖某些文件来隐藏他们的踪迹。
( z7 p$ }; @8 u
. S! F R8 m" R; F9 `5 ?挨个检查软件包很费时间,用“-a”选项可以一次性检查所有RPM包:
# V: V( W9 L% K, C9 P
- ^# ^' R; V' l: Q' Lrpm-Va%26gt;/root/rpm_chk.txt%26
: X9 }6 E, h; v
, s/ I. V/ k3 v. Z# ?! u这条命令让RPM检查
服务器上安装的RPM包,结果输出到rpm_chk.txt文件,最后的可选项“%26”表示命令在后台运行,给出shell提示符可以作其他事情。
$ B$ B( ]! a+ i) v
7 h& ]- Q) l* e+ x最后一个技巧,当你想要检查某个文件而不知道它属于哪个RPM包,可以用“-qf”选
3 Z. ]( n0 G: F8 U
项查看哪个软件包安装了此文件:
& m# [6 F6 s; _1 N! T9 l6 x* _% C' b0 J) l
[root@fubar/root]#rpm-qf/usr/sbin/sendmail
D9 b @- t3 R& f! Fsendmail-8.8.7-20
* @1 @) M+ X* |( [) @% E# _ L6 F) V& ]
[root@fubar/root]#
$ E# ~0 _6 @+ {8 d0 ~+ I/ M h; h/ E$ F& \; f2 ?5 _, K8 f, E
这表明此sendmail文件是sendmail-8.8.7-20RPM包的一部分。如果一个文件没有关联
" Y$ A8 K/ T& u
的RPM包,输出大概是这样的:
2 P4 F$ i: k4 K' w7 v+ M
+ h6 `; v1 c, ^6 E% N# H[root@fubar/root]#rpm-qf/sbin/.vile_stuff
9 I) A0 Q2 y) G# P& q6 A, `( `0 m9 f
file/sbin/.vile_stuffisnotownedbyanypackage
( q/ h& T3 A. I. N) V6 e# V
[root@fubar/root]#
: i5 V; H; D& a& ]& j* t9 W, l
% x5 S6 `5 ]4 U+ z
小心你系统上运行的不能被校验的程序!
+ l' R4 o: T# ]
( j) H1 n! p) D+ C如何开始?
# O2 F7 [+ X* s* W+ x& a* M3 h# S
首先,你必须有root权限来运行RPM。当以普通用户身份来运行RPM校验时,它的输出信息是不正确的,因为普通用户对某些文件可能都没有read权限。这意味着只有root才能检查整个系统文件的完整性。
4 b9 {6 H. j7 A* R7 {9 F
0 @0 r! u% F6 R x; y& c# RRPM二进制文件在/bin目录下,它的
数据库文件在/var/lib/rpm下。
% d8 D4 \8 ^4 r4 M# r2 i
0 C4 |6 M5 R7 n8 l" t' I$ S最安全的方法是在服务器连到Internet之前,把这些数据文件和RPM二进制文件保存到
8 i( j! L- P& L+ `+ A
软盘或CD上,这能够保证你的工具自身是安全的。
5 U+ m' }$ h7 [" L/ {3 c2 c
6 y/ x1 B, w* p, d第一件事是检查/var/lib/rpm,这些数据文件的日期和时间应该和安装系统当时的情
: O- r; t7 `9 B, n" a
况一样,如果你发现日期不对,就要小心了。
8 Q; L2 o7 a3 N' y! P
( o0 P. p8 o; c+ q) k3 m. |
其次,我们可以使用RPM来校验自身的完整性:
/ T2 L+ ]& p J. C$ B# x) ~$ g7 |6 L* j# E8 y
[root@fubar/root]#rpm-Vrpm
% p! t- }& Q( ?# ^5 E5 a% B% \9 n
[root@fubar/root]#
7 h( Z" a" ^7 ~- {+ J% P( }$ g {
0 t6 b3 |8 o/ M( K7 Q7 l0 Q没有输出表示RPM应该没有什么问题。但这不是绝对的,因为二进制文件如果本身可疑就很难说。所以要尽可能使用CD上的工具,如果你没有比较安全的工具,用RPM校验自身在一般情况下也足够了。
; f7 J& w' Q( |3 }- ~
0 o0 N3 X+ _ d @
现在我们知道RPM自身没有问题了,对整个系统作个检查:
@& h9 A" ?5 K- n/ Q5 }) G6 Q7 K: A& i2 d: E; B
rpm-Va%26gt;/root/rpm_chk.txt%26
& F2 p2 C, p. z7 j$ |) O' d
9 M# S( P) S* w" A* l" U4 N一个简单的技巧就是定期检查整个系统,然后比较不同时期的rpm_chk.txt,从而发现
$ w) l4 ^1 n2 {哪些不正常的文件改动。
( M5 {7 B* Q4 b* U: _; b+ j
0 Q8 k& g( u% ` Z+ N4 `/ P总结
1 ?" k& v1 w7 w( {尽管RPM不是专门设计用来审计文件的,但它可以帮你不少忙。目前RedHatLinux各
, G Y# U' u) u8 x" A& s
个版本中都默认自带RPM,这意味着你完成RedHatLinux安装以后,就可以使用RPM了,同时MD5提供了一种高精确度的文件校验方法。唯一注意的是要保证RPM自身和它所有数据文件的完整性,以防止入侵者修改它们来隐藏踪迹。