您现在的位置:e-works > 智造书屋 > 书籍列表 > Linux安全策略与实例 > 使用文件系统检查工具保证文件系统安全

第三章 Linux文件系统安全

第三节 使用文件系统检查工具保证文件系统安全

    Tripwire是一套有关数据和网络完整性保护的工具,主要是检测和报告系统中任意文件被改动、增加、删除的详细情况,可以用于入侵检测、损失的评估和恢复、证据保存等多个用途,目前广泛用于保护网络中关键的信息系统的数据完整性和一致性,如网站服务器的数据安全等。本节将对该软件的工作原理、安装及使用作详细介绍。

    3.3.1  Tripwire工具简介

    Tripwire是UNIX安全规范中最有用的工具之一,l992年由Eugene Spafford和Gene Kim在Purdue大学进行开发的,其软件包在1998年被商业化,现在由Tripwire Security Inc.来维护。该公司支持软件包的商业和免费两种版本,能在多数UNIX系统中运行。

    Tripwire使用了四种Hash算法,因此准确度非常高。Tripwire可检测多达10多种的UNIX文件系统属性和20多种的Windows NT文件系统(包括注册表)属性。Tripwire首先使用特定的特征码函数为需要监视的系统文件和目录建立一个特征数据库,所谓特征码函数就是使用任意的文件作为输入,产生一个固定大小的数据(特征码)的函数。入侵者如果对文件进行了修改,即使文件大小不变,也会破坏文件的特征码。利用这个数据库,Tripwire可以很容易地发现系统的细微变化。而且文件的特征码几乎是不可能伪造的,系统的任何变化都逃不过Tripwire的监视。

    Tripwire是一种优秀的安全工具,具有自保护性、平台间可移植性、可配置性、可扩展性和自包容性的特点。

    3.3.2  Tripwire工作原理

    1.工作流程

    该软件基于预编写的策略工作,在基线数据库生成时,会根据策略文件中的规则读取指定的文件,同时生成该文件的数字签名并存储在Tripwire自己的数据库中。为了达到最大限度的安全性,Tripwire提供了四种Hash算法——CRC32、MD5、SHA、HAVAL来生成签名。通常情况下采用前两种算法生成签名已经足够,当然也可全部采用。不过后两种算法对系统资源的耗费较大,使用时可根据文件的重要性灵活取舍。

    进行完整性检查时,Tripwire会根据策略文件中的规则对指定的文件重新生成一次数字签名,并将此签名与存储在数据库中的签名做对照。如果完全匹配,则说明文件没有被更改。如果不匹配,说明文件被改动了。然后在Tripwire生成的报告中查阅文件被改动的具体情况,如图3-1所示。

    由上文可知,Tripwire自身的基线数据库是非常重要的。如果基线数据库不可靠,那么完整性检查就没有意义。Tripwire软件安装完毕后,已经对配置文件、策略文件以及数据库文件均进行了高强度的加密。同时默认策略中也对自身文件进行了完整性检查。当然,使用者自己也要做好这些文件的备份,因为Tripwire软件是不能恢复受损文件的,它只能列出每一个受损文件的详细情况。

 Tripwire工作原理示意图

图3-1  Tripwire工作原理示意图

    Tripwire在UNIX系统中的属性监控包括如下:

    文件增加、删除、修改。

    文件访问许可属性。

    i结点及Link数量。

    uid及gid。

    文件类型和大小。

    i结点存储的磁盘设备号。

    i结点指向的设备的设备号(适用于设备文件)。

    分配的区块。

    修改时间戳。

    i结点创建和修改的时间戳。

    访问时间戳。

    增大的文件。

    缩小的文件。

    HASH检查。

    2.Tripwire的几个核心散列函数

    如上所述,Tripwire能够全面、精确地扫描出文件的任何微小的变化,与它所采用的多种高强度的散列算法是分不开的。散列(Hash)函数也称消息摘要(Message Digest)、哈希函数或杂凑函数等,其输入为一可变长输入x,返回一固定长度串,该串h被称为输入x的Hash值(消息摘要),记作h=H(x)。

    Hash函数H一般满足以下几个基本要求:

    (1)输入x可以为任意长度。单向散列函数能够处理任意长度的明文(至少是在实际应用中可能碰到的长度的明文),其生成的消息摘要数据块长度具有固定的大小,而且对同一个消息反复执行该函数总是得到相同的信息摘要。

    (2)输出数据串长度固定。即使使用的算法不同,但所有的散列值都拥有很多相同的属性。散列值的长度由算法的类型决定,与被散列的消息大小无关,一般为128位或160位。

    (3)易计算,给定任何x,容易算出H(x)。

    (4)单向函数,即给出一Hash值h,很难反向计算出一特定输入x,使h=H(x)。所有的散列算法都是单向的,也就是说不能从散列值来获取原始消息,即使是原始消息的很少一部分信息都不可能获得。所以,有时候对一个数据的散列也叫做该数据的摘要,它可以作为一个消息的唯一标识,来保护消息的完整性。发送者发送数据的同时,也把该数据的散列值发送过去。接收者接收到消息以后,首先根据接收到的数据计算其散列值,然后和发送过来的散列值进行比较,就可以判断数据在发送过程中是否遭到修改。

    (5)唯一性,又叫冲突性,可分为弱冲突和强冲突两种。弱冲突是指给出一消息x,找出一消息y同x相似且H(x)=H(y)是计算不可行的,而强冲突是指找出任意两条消息x、y,使H(x)=H(y)也是计算不可行的。即使两个消息差别很小,如差别一两个比特,其散列值也完全不同。利用现在的算法技术,几乎不可能找到两个具有相同散列值的不同消息。用同一个算法对某一消息进行散列计算只能获取唯一确定的散列值。单向散列函数生成的信息摘要是不可预见的,消息摘要看起来和原始的数据没有任何关系。而且,原始数据的任何微小变化都会对生成的信息摘要产生很大的影响。

    下面详细介绍Tripwire的核心散列函数。

    (1)Snefru算法。Snefru是Ralph Merkle设计的一种单向散列函数,它将任意长度的消息散列成128位或者256位的值。

    算法首先将消息分成512-m的分组(m是散列值的长度)。若输出是128-位散列值,则每分组384位长;若输出是256-位散列值,则每分组256位长。

    算法的核心是函数H,它将512-位值散列成m-位值。H输出的前m位是这一分组的散列,余下的则舍弃掉。下一分组附在上一分组的散列后面,然后又进行散列(初始分组附在一串零之后)。在最后一个分组散列之后,将最先的m位附在消息长度的二进制表示之后并进行最后一次散列。

    函数H基于另一个作用于512-位分组的可逆分组密码函数E。H是E输出的最后m位与E输入的最先m位相异或的结果。

    Snefru的安全性取决于函数E,它用几轮运算使数据随机化。每轮由64个随机化的子轮组成。在每一个子轮中用不同的子节作为S-盒的输入,S-盒输出的一个字与消息相邻的两个字相异或。

    (2)HAVAL算法。HAVAL是一种长度可变的单向散列函数,它是MD5的改进版本。HAVAL以1024-位分组处理消息,是MD5的两倍。它有八个32-位链接变量,也是MD5的两倍。它的轮数可在三到五轮中变化,其中每一轮为16步,并且它能产生长度为128,160,192,224或者256位的散列值。

    HAVAL用高非线性的7-变量函数取代了MD5的简单非线性函数,而且每一个函数都能够满足严格的雪崩规则的要求。每轮采用单个函数,但在每一步对输入进行了不同的置换。该算法有一个新的消息次序,并且每一步(第一轮除外)使用了不同的加法常数。该算法有两种环移方式。

    该算法的核心为:

    TEMP = (f(j,A,B,C,D,E,F,G) <<< 7) + (H <<< 11) + M[i][r(j)] + K(j)

    H = G; G = F; F = E; E = D; D = C; C = B; B = A; A = TEMP;

    其中,可变的轮数和可变的输出长度意味着该算法有15种不同的形式。

    (3)MD5算法。MD5算法是MD4的改进版本,它比MD4更为复杂,但是设计思想相似,并且也是产生128-位散列,在此,笔者对该算法的实现流程做一个详细的分析。

    1)MD5算法是对输入的数据进行补位,使得如果数据位长度LEN对512求余的结果是448,则数据扩展至K 512+448位,即K 64+56个字节(K为整数)。具体补位操作:补一个1,然后补0,直至满足上述要求。

    2)补数据长度:用一个64位的数字表示数据的原始长度B,把B用两个32位数表示。这时,数据就被填补成长度为512位的倍数。

    3)初始化MD5参数:四个32位整数(A,B,C,D)用来计算信息摘要,初始化使用的是十六进制表示的数字。

    A = 0x01234567

    B = 0x89abcdef

    C = 0xfedcba98

    D = 0x76543210

    4)处理位操作函数,X,Y,Z为32位整数。

    F(X,Y,Z) = X&Y|not(X)&Z

    G(X,Y,Z) = X&Z|Ynot(Z)

    H(X,Y,Z) = XxorYxorZ

    I(X,Y,Z) = Yxor(X|not(Z))

    5)主要变换过程:使用常数组T[1...64],T[i]为32位整数,用16进制表示,数据用16个32位的整数数组M[]表示。

    具体过程如下:

    /*处理数据原文*/

    For I = 0 to N/16-1 do

    /*每一次,把数据原文存放在16个元素的数组X中. */ 

    For j = 0 to 15 do 

    Set X[j] to M[i*16+j].

    end/结束对J的循环

    /*Save A as AA, B as BB, C as CC, and D as DD. */

    AA = A

    BB = B

    CC = C

    DD = D

    /*第1轮*/

    /*以[a b c d k s i]表示如下操作

    a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s).*/

    /* Do the following 16operations.*/

    [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]

    [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]

    [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]

    [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]

    /*第2轮*/

    /*以[a b c d k s i]表示如下操作

    a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s).*/

    /* Do the following 16 operations. */ 

    [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20] 

    [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]

    [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28] 

    [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32] 

    /* 第3轮*/ 

    /* 以[a b c d k s i]表示如下操作

    a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ 

    /* Do the following 16 operations. */

    [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]

    [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40] 

    [ABCD 13 4 41][DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]

    [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]

    /* 第4轮*/

    /* 以[a b c d k s i]表示如下操作

    a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ 

    /* Do the following 16 operations. */

    [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]

    [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]

    [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]

    [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]

    /*然后进行如下操作*/

    A = A + AA

    B = B + BB

    C = C + CC

    D = D + DD

    end/*结束对I的循环*/

    6)输出结果。

    综上所述,MD5算法是从MD4算法改进而来的,它在以下方面作了较大的改进:

    增加了第四轮变换。

    每一步都有唯一的加法常数。

    为了减弱第二轮中函数G的对称性,从((X^Y) V (X^Z) V (Y^Z)) 变为 ((X^Z) V (Y^¬Z))。

    每一步加上了上一步的结果,这将引起更快的雪崩效应。

    改变了第二轮和第三轮中访问消息子分组的次序,使其形式更不相似。

    近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应。各轮的位移量互不相同。

    (4)SHA算法。该算法首先将消息填充为512位的整数倍。填充方法与MD5完全一样:先添加一个1,然后填充尽量多的0使其长度为512的倍数并余448位,最后64位表示消息填充前的长度。该算法有五个32-位变量(与此相对应的是,MD5算法仅有四个变量),这几个变量初始化为:

    A = 0x67452301

    B = 0xefcdab89

    C = 0x98badcfe

    D = 0x10325476

    E = 0xc3d2e1f0

    然后开始算法的主循环。它一次处理512位消息,循环的次数是消息中512-位分组的数目。先把这五个变量复制到另外的临时变量中:A到a,B到b,C到c,D到d,E到e。

    主循环有四轮,每轮20次操作(MD5有四轮循环,每轮16次操作)。每次操作对abcde中的三个进行一次非线性运算,然后进行与MD5中类似的移位运算和加运算。

    在算法中,SHA的非线性函数集如下(^表示与,V表示或,¬表示反,⊕表示异或):

    Ft(X,Y,Z) = (X^Y) V ((¬X)^Z),其中,t=0至19

    Ft(X,Y,Z) = X⊕Y⊕Z,其中,t=20至39

    Ft(X,Y,Z) = (X^Y) V (X^Z) V (Y^Z),其中,t=40至59

    Ft(X,Y,Z) = X⊕Y⊕Z,其中,t=60至79

    该算法采用了四个常数:

    Kt = 0x5a827999,其中,t=0至19

    Kt = 0x6ed9eba1,其中,t=20至39

    Kt = 0x8f1bbcdc,其中,t=40至59

    Kt = 0xca62c1d6,其中,t=60至79

    从对该算法的分析和描述可以看出,SHA与MD5非常类似,但是它有160-位散列值。主要的改变是添加了扩展转换,并且为产生更快的雪崩效应而将上一轮的输出送至下一轮。从当前的情况来看,对SHA还没有已知的密码攻击,并且由于它产生160-位散列,所以它比其他128-位散列函数更能有效地抵抗穷举攻击(包括生日攻击)。然而,任何事情都是一分为二的,安全性得到提高,其所消耗的机器时间会随之增长。

    3.操作模式

    Tripwire有四种操作模式:数据库生成、完整性检查、数据库更新和交互式更新。

    数据库生成模式产生一个基线数据库,为未来的比较打下基础。

    完整性检查是Tripwire的主要模式,把当前文件签名和基线数据库进行比较来进行检查。

    另外两种更新模式允许用户调整Tripwire数据库以消除不感兴趣的结果以及应付正常的系统变化。例如,当用户账号正常增加或删除时,不希望Tripwire重复报告/etc/passwd文件被改动了。

    3.3.3 安装Tripwire

    下面给出该软件的安装以及使用步骤,要得到该软件可以从网站http://sourceforge.net/ projects/tripwire/直接获得tripwire-2.4.1.2-src.tar.bz2。

    (1)解压缩安装文件到/usr/local目录。

    //切换工作路径

    #cd /usr/local/

    //解压缩

    #tar –xzvfj tripwire-2.4.1.2-src.tar.bz2

    (2)执行make命令,进行安装。

    //进入已经解压的文件夹

    #cd tripwire-2.4.1.2-src

    //生成makefile文件

    #./configure

    //执行make命令

    #make

    //执行make install命令

    #make install

    (3)生成基线数据库。成功编译Tripwire后,就可以对需要监控的文件进行扫描,以生成Tripwire数据库。在Tripwire的src目录下执行如下操作:

    #./tripwire –init

    (4)测试。数据库生成后,下面进行测试。对/etc/group文件以及/etc/passwd文件进行细小的修改,删除用户、用户组或者添加用户、用户组。

    (5)运行Tripwire,扫描系统。

    #./tripwire

    3.3.4 配置和使用Tripwire

    当第一次运行Tripwire时,需要进行一些准备工作,主要有编辑config文件、检查邮件报告是否正常、根据需要配置策略文件和初始化数据库文件,即创建一个签名的基线数据库。下一次运行时,它使用twpol.txt文件产生一个新的签名数据库。然后,比较两个数据库,实施用户定义的任何选项屏蔽(排除正常更改的文件),最后通过电子邮件或显示器来为用户在终端上输出一个可读的报告。

    为了保证Tripwire正确地运行,要特别注意其安装和配置的过程。具体步骤如下:

    1.执行twinstall.sh脚本

    在安装Tripwire之后,可以使用如下命令进行设置:

    #./twinstall.sh

    脚本twinstall.sh的作用在于执行下列任务:

    (1)创建site和local密钥,这时会要求输入口令;如果这两个密钥业已存在,则可以跳过此步骤。其中,site密钥存放在site.key文件中,而local密钥则存放在hostname-local.key(这里的hostname是指该机器的主机名)文件之中。

    (2)利用site密钥对默认配置文件twcfg.txt进行签名,并将签名(而非被签名的文件twcfg.txt)存放于文件tw.cfg之中。

    (3)利用site密钥对默认策略文件twcfg.txt进行签名,并将签名(而非被签名的文件twcfg.txt)存放于文件tw.pol之中。

    2.编辑配置文件

    首先打开文本格式的配置文件twcfg.txt。然后根据需要修改配置文件,修改后存盘。最后使用twadmin命令根据已编辑的文本文件生成一个加密的配置文件。

    #twadmin --create-cfgfile --site-keyfile /etc/tripwire/site.key twcfg.txt

    安装完毕,该文件已存在,因此不必重新创建。通常情况下,配置文件的内容不会发生变化,因此没有必要去修改它,使用Tripwire默认的就可以了。此时用户应该测试一下Email报告功能是否起作用,以防以后遇到麻烦,输入以下命令进行测试。

    #tripwire --test --mail user@domain.com

    3.编辑策略文件

    首先打开文本格式的策略文件twpol.txt。Tripwire在安装时已经在策略文件中写入了默认的检查规则。这些默认的规则主要检查重要的系统文件和Tripwire自身文件的完整性。

    由于默认的配置不能监视系统中的SUID和SGID文件,而这对于用户的系统安全是非常重要的,因此,用户需要修改配置加入对这两个项目的监视。使用如下命令可以找出系统中的所有SUID文件:

    #find / -type f -perm -4000 –print

    以下命令可以找出系统中的所有SGID文件:

    #find / -type f -perm -2000 –print

    现在,用户需要把以上命令找出的SUID和SGID文件加入到Tripwire的/策略文件中去。除此之外,用户还要把所有用户home目录下的初始文件也纳入监视的范围。主要包括以下文件:

    .bashrc、.profile、.bash_profile、.cshrc、kshrc、.login等。

    bash、csh以及ksh登录之后的初始化命令或者脚本。

    .forward:告诉/usr/lib/sendmail把邮件转发到某些地址。

    .rhosts:可以使用rsh登录到本帐户的远程主机名。

    .xinitrc、.Xauthority、Xdefault等X窗口系统的一些重要文件。

    在创建Tripwire的特征码数据库之前,还有一件事情要做,就是检查.netrc和.rhosts文件的权限是不是600。修改完策略文件后存盘。最后使用twadmin命令根据已编辑的文本文件生成一个加密的策略文件。最后,策略文件的文本文件要删除,否则该文件的内容易被察看。

    #twadmin --create-profile twpol.txt

    安装完毕,该文件已存在,因此不必重新创建。

    4.生成基线数据库

    配置文件和策略文件都编辑和生成之后,就应该根据配置文件的规则生成基线数据库。基线数据库在Tripwire安装后生成一次即可。使用Tripwire命令来生成基线数据库。

    #tripwire --init

    基线数据库生成时,Tripwire会提示输入local key,对其进行高强度的加密,以防止对文件内容的非法改变。

    5.运行完整性检查

    基线数据库生成完毕之后,用户可以使用tripwire命令随时进行完整性检查了。

    #tripwire --check

    检查时可以指定检查报告的保存位置。其命令为:

    #tripwire --check --twfile/var/lib/report/report.twr

    进行检查时也可发送Email报告结果。其命令为:

    #tripwire --check --email-report

    进行检查时指定使用Email进行发送的报告等级。其命令为:

    #tripwire --check --email-report --email-report-level 2

    使用指定严重性等级的规则进行检查。其命令为:

    #tripwire --check --severity 80

    使用指定的规则名进行检查。 其命令为:

    #tripwire --check --rule-name rulename

    只检查指定的文件或目录。其命令为:

    #tripwire --check object1 object2 object3 …

    进行检查时忽略某些属性(因为有些属性的检查比较耗费系统资源,比如Hash算法)。 命令为:

    #tripwire --check --ignore "property, property, property, property"

    如果完整性检查结束后,发现Email报告功能未生效,可以检查两个方面:一个是策略文件中规则的emailto属性必须填写妥当,另一个是运行tripwire命令时,必须包含--email-report选项。

    6.查阅报告

    完整性检查结束后,用户就可以查阅报告以发现有哪些文件遭到了改动,改动了什么。使用twprint命令可以输出报告,它有多种使用方式。

    如下命令将加密的报告内容输出到显示器:

    #twprint --print-report --twrfile /var/lib/report/report.twr

    如下命令将加密的报告内容输出到一个文本文件:

    #twprint --print-report --twrfile /var/lib/report/report.twr - >myreport.txt

    如下命令输出报告时指定输出的报告等级:

    #twprint --print-report --report-level 4 --twrfile /var/lib/report/report.twr

    7.升级基线数据库文件

    如果在报告中发现了一些违反策略的错误,而这些错误又被认为正常的,那就要使用tripwire命令更新基线数据库:

    #tripwire --update --twrfile /var/lib/report/report.twr

    也可以在进行完整性检查之后立即自动进行更新,命令如下。

    #tripwire --check --interactive

    8.升级策略文件

    随着系统的变化,原来的策略文件可能不再满足需要,因此必须不断更新策略文件中的规则。更新和创建新的策略文件不同,因为如果为Tripwire创建了新的策略文件,那么就必须重新生成基线数据库。更新时首先打开策略文件的文本文件:

    #twadmin --print-profile > twpol.txt

    然后编辑该文件并存盘。最后使用Tripwire命令进行策略更新。

    #tripwire --update-policy twpol.txt

    在此步骤中,Tripwire会要求输入site key。

    9.改变site key和local key

    sitekey和localkey是在安装时生成的,但是也可以随时修改。注意,如果已经用来加密的密钥文件被删除了或是被覆盖了,那么Tripwire加密过的文件就都不能访问了。因此,用户要对这两个文件做备份。很多时候会发现用户的口令可能不太安全,因此要改变口令。执行以下命令即可:

    #twadmin --generate-keys --local-keyfile /etc/tripwire/site.key

    #twadmin --generate-keys --local-keyfile /etc/tripwire/local.key

    但是这么做的话,会造成使用以前密钥进行加密的文件无法打开的情况。因此用户要使用以前的策略文件、配置文件、数据库文件、报告文件的话,在改变口令之前,必须使用以下的命令把这些已加密的文件解密:

    #twadmin --remove-encryption file1 file2 ...

    在生成新的密钥文件之后,用户还应该用新密钥对这些文件进行加密。配置文件和策略文件只能用site key加密,而数据库文件和报告文件只能用local key加密。

    #twadmin --encrypt --site-keyfile /etc/tripwire/site.key file1 file2 file3 ...

    #twadmin --encrypt --local-keyfile /etc/tripwire/local.key file1 file2 file3 ...

    3.3.5使用Tripwire进行文件监控

    为了介绍如何使用Tripwire来对文件进行监控,笔者首先对/tmp/test1和/tmp/test2两个文件进行了细微的修改。然后,将根据预先生成的基线数据库来对文件进行完整性检验。完整性检验的目的在于检查一下自从上次Tripwire对文件作了快照以后,文件是否发生了变动,用户可以通过以下命令来达到此目的:

    # tripwire –check

    这是一条最基本的命令,它能告诉用户系统是否被修改了。它根据在策略文件中规定的规则,利用Tripwire数据库跟文件系统当前状态加以对比,之后将比较结果写入标准输出,并将其加盖时间戳、签名,然后作为一份Tripwire报告存放起来。

    表3-1和表3-2是Tripwire在上述例子中对Linux系统进行完整性检查后产生输出的示例。Tripwire首先报告文件被改动了,而不定位具体的差别。在本例中,自从上次运行Tripwire后用户对文件进行了改写,所以/tmp/test1和/tmp/test2文件不再保持原样了。然后,Tripwire指出每个文件有哪些属性发生了变化,并给出哪些是观察到的,哪些是所期望的。

 Tripwire有关的改动报告

表3-1 Tripwire有关的改动报告

 Tripwire对属性的实际和期望值进行比较

表3-2  Tripwire对属性的实际和期望值进行比较

    通过上面的表格可以看出,一些重要文件(/tmp/test1和/tmp/test2)被修改了,用户则可以根据这些具体的状况采取相应的动作,比如恢复修改的文件、删除某些磁盘上不应该出现的文件(可能是黑客留下的破坏文件)等,这些都依赖于具体的应用背景。最重要的一点是:Tripwire已经将这些细小的变化都记录了下来,使得诸如Web服务、电子商务等网络管理员能够有的放矢地进行维护工作,从而可以高效、方便地进行网络管理,适时地对重要网络系统的文件进行恢复。这正是Tripwire在网络安全日益热门的今天,能够高频率地出现在服务器应用中的最重要原因。

    3.3.6 使用Tripwire的技巧

    在使用Tripwire时有许多经验、技巧可以借鉴,特总结出如下几条供读者参考:

    (1)安装Tripwire最好的时机是在刚刚建立好系统之后,不论是新建的还是升级的。一个已经运行了一段时间的系统可能已经被破坏了,这之后运行Tripwire将几乎没有任何价值。如果不可能在系统刚安装或更新的时候安装Tripwire,可考虑以单用户模式重新安装系统文件。这是保证系统干净的唯一方法。

    (2)Tripwire要求一个先进的存储规划。用户需要把基线数据库同程序文件一起保存在一个安全的地方,以免攻击者更改文件而使该程序达不到监控的目的。最优的安排是把这些文件保存在一个移动的只读介质中,比如写保护的软盘、光盘或潜在攻击者不能访问的CD-ROM。还可以把文件放在一个安全的远程计算机分区中并以只读方式输出。记住用mount命令使一个硬盘只读是不够的,因为有root权限的攻击者很容易把硬盘改为可写。

    (3)考虑安全性和Tripwire性能之间的均衡是很重要的。用户可以选择运行程序的6个签名算法和两个校验和中的任一个来保护文件,但这些算法中有些开销是很昂贵的。特别是Snefru运行很慢。只有那些有极大危险性的系统才需要为每个文件和目录运行所有的算法。Tripwire默认使用MD5和Snefru。两者一起提供强大的保护但会消耗大量的CPU周期。用户要平衡需求和可用的时间。

    (4)将需要监控的关键和核心文件进行整理和分类,以方便Tripwire的实时监控。并且,由于默认的Tripwire的监控文件数量巨大(具体可以参见/usr/local/etc/twcfg.txt文件),如果按照默认的文件及目录进行扫描和监控,会大量消耗CPU时间以及用户时间。所以,建议读者在实际使用过程中修改和缩减/usr/local/etc/twcfg.txt中的Tripwire扫描及监控范围,从而高效地使用Tripwire。