六、完整性检测的自动化
, J, ?% V# T5 H/ P' o: m
4 k/ ~0 k' B( {" X9 @8 p如果您想让Tripwire在特定的时刻或每隔一段
时间就自动进行检测的话,可以按照下列提示来完成。例如我们要他每天的下午2点进行一次检测,那该如何做呢?我们可以利用cron来来协助我们完成此项任务。我们可以在root用户的crontab文件中添加以下一项:
: `$ ?3 t! R6 ?* b8 K; N1 w4 [: ?% [! Z; c _7 u" c# ^! a! w
. c) U, T8 ^% m+ z0 M8 l+ z
N8 H0 T% T- P9 E/ H
3 {' H# H4 X4 h: ~$ c
/ Y0 |( q4 R. p {; K
02***/usr/sbin/tripwire--check
- u4 s; o, P3 v. q) R
[color=#FFFFFF']
% _ X e9 A3 [9 [, t2 c
, T/ L, ] }3 Q H% k) @" T
. o/ q$ f; ~* p3 b
需要注意的是,cron本身也可能受到攻击,因而可能出现不执行等意外情况。所以我们最好在一个可信的远程
机器上来执行cron任务。在trusty上的crontab中添加如下一个远程检测项:
7 t, Y# n4 t# e( S# a1 E5 f7 g1 e8 H# R+ n" g/ g1 b
% f$ g9 T4 O5 w/ t$ n
# I2 ?% ~" t: B1 V: @
, ] N2 a8 z' i
; W! g# a' Q$ {2 X: x; K& F) i02***ssh-n-lrootuntrusty/usr/sbin/tripwire--check
. {) `- X8 y% e3 |4 S2 _$ L[color=#FFFFFF']
1 a1 I/ P3 S* e, U
4 A/ I2 O) R8 [8 t* ~- q5 s' z: b1 M- B( V
但是如果入侵者攻破了untrusty上的sshd的话,那么覆巢之下,焉有完卵--您的
安全性也必将受到威胁!此外,某些rootkits能够颠覆对Tripwire的远程exec调用。为了获取最大的安全性,只是执行cron任务是远远不够的,还得在可信机器上进行完整性检验。
: P) k* A; G( `1 Q
1 V0 S9 k% ?/ H7 |% H
RedHat
Linux预配置情况下,会在每晚通过cron任务/etc/cron.daily/tripwire-check来运行Tripwire
程序。但是,Tripwire
数据库不是由操作
系统来提供的,而是由用户自己来提供一个原件,否则,cron只是定时向超级用户发送一封Tripwire调用失败的的
电子邮件。
9 s" r, x, {# C1 _ H
* \. r" s! W! G七、生成Tripwire报告
/ r8 H' ~# A* O3 d
& F1 l# d" F* U上面介绍了如何配置Tripwire来进行完整性检测。但这并不是使用Tripwire的目的所在,我们需要的是完整性检测的结果,换句话说还得要Tripwire将结果以报告的形式提交给
管理人员,这样我们才能以此判断系统是否遭到破。具体操作如下所示:
) k C/ R+ K8 c- m p. D! K
- f! U3 w- s! N& \
2 l M- _! r- _+ N. ^; }( Q, @% } B2 {. o* K( ^8 D$ B6 ]2 {
6 o2 u1 `7 g7 a5 v* e
" k$ h- u' Q0 y2 s( \0 U
#!/bin/sh
( A, p, m6 W! ~! y6 IDIR=/var/lib/tripwire/report
* T% O' e. A: E1 r/ k
HOST=`hostname-s`
# m' d; X7 i0 s G* a; `' dLAST_REPORT=`ls-1t$DIR/$HOST-*.twr│head-1`
3 V/ P8 m! [" s9 m+ w' z0 q2 ?twprint--print-report--twrfile"$LAST_REPORT"
( ~5 ^4 \- S* C q$ v' e
[color=#FFFFFF']
: z8 C0 ?* D/ c- W8 h1 Q
+ q: {: S; ~- W; p) w% T
+ @; r. M8 K' `9 ? z% L一般情况下,Tripwire报告存放在什么地方是由Tripwire配置文件中的REPORTFILE变量来决定,其常见值为:
& V; c3 r- x9 h1 T7 F# U# B, W; z: l) ]( m
REPORTFILE=/var/lib/tripwire/report/$(HOSTNAME)-$(DATE).twr
# I' z6 h, k# z( S3 d
. v2 x) W# R; i8 E; ~, `$ B$ {变量HOSTNAME存放的是机器的主机名,变量DATE存放的是时间戳,如。所以,主机untrusty的报告文件名应当为:
/ ~7 A. ?! [6 q4 G' ?
. _8 W3 y2 U z" N( U5 l
/var/lib/tripwire/report/untrusty-20040130-030518.twr
4 v. {* e! o/ Q$ X3 S/ I) S% S& e! e3 c, J
虽然tripwire可以通过
电子邮件发送报告,但不要太信赖电子邮件,因为它很可能被截获并被篡改后重发。所以,最好由您直接检查报告为上,要Twprin打印报告,可以按如下操作进行:
' O# {% x. J! q/ \
5 h9 l! \( ~" j" {$ I! R$ O# D5 n
. ^. r) f6 r9 [4 \$ z: U; a/ I/ @# s" K
! W$ I# W W' |8 [; K0 K% r4 H ]+ ]+ U
#twprint--print-dbfile--dbfile/var/lib/tripwire/`hostname-s`.twd
6 \- U2 ~+ T5 i
Tripwire(R)4.0Database
4 u# |3 X7 @% t$ `; ~
Databasegeneratedby:root
/ [! n% X- X# w2 n% R! JDatabasegeneratedon:MonJan122:33:552004
; J$ b: R, I* {2 x1 `, t U7 s3 cDatabaselastupdatedon:Never
. |+ |6 m/ D: _" J...contentsfollow...
: @; [6 Q4 L. Z# H& T
$ n! Y5 Y. j- { V: X) l6 k八、Tripwire数据库的维护/ q# G9 A# J& I( p
/ k9 |" o# k9 P& q7 {# S8 Q, p4 S对于Tripwire数据库的维护工作,主要包括数据库的更新、添加和删除操作,下面我们将分别介绍。
" b2 U- y% [# n) e
4 @& o* G/ U7 }7 Y; i( v更新数据库2 d, [7 O2 e* s; e0 V$ q" v
# p, _0 P$ x* s4 @4 ]
有时候,我们会对程序作一些正常的修改,这些改动也会反映在最新的Tripwire报告中,但问题是,我们使用Tripwire很大程度上只想让它报告那些"非法的"修改。那么,这时我们就需要利用最新的报告来更新一下我们的Tripwier数据库,具体操作如下所示:
O7 C2 v! H7 B1 k, a
: S2 v* s; U" y( l& D" V$ D
( X, f. o# L8 i" Q+ T
, a- _7 w& U" `- D& ~
+ r% ?0 w v' t* F$ e
[! F% t" ~ p2 ^' V: w#!/bin/sh
$ k) u& k; H+ S4 p9 _
DIR=/var/lib/tripwire/report
# A+ q5 N3 o- E i1 I( H+ J3 b. S# W" m
HOST=`hostname-s`
4 z% l% p8 n. `3 B/ P
LAST_REPORT=`ls-1t$DIR/$HOST-*.twr│head-1`
, M; F7 `6 m" \6 B4 F7 s% }) g! _tripwire--update--twrfile"$LAST_REPORT"
& ^' }3 o4 i# Q[color=#FFFFFF']
' Y3 L7 u! V9 l0 a; S0 k: t
P$ d; v7 Y S5 O# z: Y- i! B! r% d. T& P- G, w
这里有一点必须注意,那就是如果你已经修改了某些文件的话,您不能只是简单的运行更新就算了事:您必须在此之前首先进行完整性检验。进行更新的好处是它比初始化数据库要快得多!
0 l% ^' K- M) N m8 o
0 ^& `* N) [ E向数据库中添加文件) c4 T. t) Y% m, I& j
6 C. f9 i# m& z& `7 _0 h% \
为了向Tripwire的数据库中添加文件和目录,请执行以下操作:
& G" n q- w: g) ~* s: ~
9 u* w5 ]! N, @3 L6 `! A6 |2 P: V: x向有效策略文件中添加指定的文件,如/bin/ls:
; \0 K- |- m/ C% f' V. j- z6 z
* C+ w: x: j6 A9 `' `! V$ w
- y4 B/ n) x$ b# z, W
0 {4 S' \3 S' x0 f) d3 R% W' G9 I
5 ?& E& {$ X& W8 ]& x; q! F/ w, y
0 a# s) Q4 X# C6 G A/bin/ls--%26gt;$(SEC_BIN);
# |# N, ^- |2 N2 r2 K8 Q* n) Q4 e. r5 V* m$ Y3 K7 C Z3 v
向有效策略文件中添加整个目录树,比如/etc:
$ V* E$ }2 B- j
: w9 P* s3 m& `' N& F9 `' v9 {; T/ z7 Y" Q+ v* ]7 d: I
" ^) y4 p# m6 r
2 J+ e6 `$ B% h& V* _( K
3 C4 o* W- _3 q- _; k
/etc--%26gt;$(SEC_BIN);
. j+ V3 I/ @5 _8 L
* Q0 @/ `% e9 C+ f: L向有效策略文件中添加目录如/etc及其下的文件,但不包括其子目录:
6 e, ]. X1 P' S4 [
/ i# z4 y+ u4 d# B) o- Z5 w3 O1 o; P# g
; r& U; C" t3 u& }9 ^& o, n9 U/ ?3 P- t% F( F& A5 W
' F7 ^ d! e, Z3 x M' g/etc--%26gt;$(SEC_BIN)(recurse=1);
2 H8 n5 J9 L2 h; c' E- d& d) i5 s[color=#FFFFFF']
% {: y0 t' Z& W0 a k1 n9 K' k
% v3 \. o# T/ @4 [! @! w+ D1 R) q. ^( ~# g
向有效策略文件中添加目录如/etc,但不包括其下的文件以及其子目录:
- j# X" H- Q9 N6 j3 [( {7 d( L* Q" z+ D0 p, W5 ^7 g/ K
- Y N3 m# v. j) Q) \4 G# o& T' M& z
" [8 {. X$ z8 R/ R2 r% _, x3 ?3 s3 Q, H6 t
) s3 m5 N$ {- |9 m9 d+ J# H9 z: u; I. L4 I3 Y3 I
/etc--%26gt;$(SEC_BIN)(recurse=0);
( f0 H# _* S1 z& U' o& U* a9 f% `+ c( h2 n& {* R+ `) X
然后初始化数据库。
, \3 P1 d; V4 {! h; u9 `) J
l d# i, A- r$ _
策略实际上就是存放在策略文件中的规则表,规则的一般形式如下所示:
1 y0 H' o- ~8 f, n: f$ e4 J* z
# R; l' B& z8 P; b+ H( d e$ D4 R+ l r9 N$ Q
/ G' p% ^: J Q& c9 C. g
7 Q& G# ]0 O5 ]" l
% J9 z! l, B- i% y: {+ wfilename-%26gt;rule;
+ J& D" M1 U' n
& b9 s. z Q9 V& P7 H/ y它的基本含义就是,如果给定的规则被违反的话,那么对应的文件或目录就被认为是到了安全侵害。例如:
1 w9 H" p2 V2 C/ h+ l* { x) I1 x1 p& j( [0 ]% v' s, C2 V
4 J8 U9 Z \0 ]" ?" \' m/ l: }5 q; f/ c* l
9 x/ U! t$ L' T6 [% O; Q% P, E/ o
/bin/login-%26gt;pisug;
) h' U2 Y; i" `+ \9 v1 J, N @[color=#FFFFFF']
L3 y; R7 j& |8 H: r! u: `" _# _# k, `, t: a, M C* `
1 n0 D, H" r7 G! n. o5 ~
上面这条规则的含义是:如果自从上次快照之后,如果/bin/login的文件权限(p)、inode号(i)、尺寸(s),、用户(u)或组(g)发生了变化的话,那么就应当引起我们的关注。如果想全面深入的了解Tripwire语法的话,请参阅Tripwire手册。在这里,我们使用了一个预定义的全局变量SEC_BIN来指出二进制文件不得修改。recurse=n的作用在于通知Tripwire在文件系统中的递归深度;当n为零时,其含义为只
测试到目录文件本身这一层次。
W6 \% A9 t+ s0 ^6 j4 {
/ E9 G3 t: G6 j4 y3 Y
很多时候我们需要修改默认策略文件,因为它们所提供的策略未必完全适合我们的系统,所以我们需要针对不同的Linux
类型和版本,对Tripwire所提供的默认策略进行适当的剪裁,从而满足我们的要求。
% |. r+ K( y2 U2 }+ N从数据库中删减文件
* j, c& d& }& }3 i4 o
4 Y' z- s/ ~; s, X7 K* L f, a" v我们不仅根据需要向数据库中添加文件,有时我们还需要对数据库中的文件加以删减。具体操作如下所示:
9 B( S t; u- d" {- a
/ h/ C2 o, g/ t Y& j例如首先向数据库中添加一个目录:
) l) y: A: p/ c5 d+ L5 C
1 Q2 e4 @+ h) S2 U, L
; c' y; o3 d" o2 [+ H: ^: D/ ^5 _" f. H' N
' z8 ]5 S( @# U6 N# X9 O7 x
) U( F7 N+ |. J* G! h* O! A( v
/etc-%26gt;rule
: Z3 S& e+ g3 |% P. w
' c: u0 ~1 y l: u然后排除掉其中的一些文件:
7 o2 m0 S$ `( H) \; M) b; |" }. @ q
6 ~( T6 B1 p+ r/ {& ^# Z: z, i% t0 G' U$ Q
0 p* M7 S. B" h) F2 }6 q' d
& R" S6 A% e9 j/ w5 G
2 r# F. D* C8 G: }' h, ~' V4 H- [
!/etc/not.me
" G% q4 h. I0 s+ U) e
!/etc/not.me.either
& Z: M" E, f" m8 q
+ _9 U0 N7 b4 r9 P* M$ t2 K) f+ Y( v如果我们想去掉一个子目录的话:
, z2 h2 z; S7 m* F A
1 R9 u1 @5 Q7 o0 S0 Z, Q7 {% J- I4 {# @- d
7 r. _( r0 m, ]& o4 g% R7 G
# B! S2 o5 \- Y. [! D8 ~5 P i( c4 e2 O4 ]0 j5 W7 _% d7 P
!/etc/dirname
5 N" z- b/ S/ K
/ P% h) y8 Q; D2 R; ]
这里,感叹号!的作用在于将给定的文件或子目录排除掉。
7 s- e. B7 q& @: B$ S* D
% T1 q+ S6 Y3 d. |% A% g, B2 U九、小结
7 {- i" S6 E! x1 c! {/ E1 l# l! Y1 Q% O
Tripwire是现实中最为常见的一种
开源完整性检测工具,我们对实际工作中的一些常见操作进行了较为全面而不失侧重的介绍,如果读者要想更深入的了解本
软件的话,请参阅其使用手册。
1 k4 B6 F7 \/ r! h, {
0 {+ c$ ~: Z5 n1 `; j1 ^* K
需要注意的是,Tripwire是进行
周期性检测的,因此在两次检测间隔内的修改对它来说就显得有些鞭长莫及了,但我们还可以缩短其周期间隔,使其几乎以实时的方式运行,但这时的开销将明显增加,所以我们要在安全性和系统开销之间加以权衡,实际工作中可以视具体情况来加以定夺。