当前位置:Linux教程 - Linux - 数据完整性检测工具:Tripwire

数据完整性检测工具:Tripwire

作者:nixe0n

综述


作为一个系统管理员,你需要保护自己的系统不被攻击者的侵入,但是系统非常庞大,这对你来说恐怕有些勉为其难了。Tripwire能够为你提供帮助,它不是为了抵御攻击者设计的,然而它能够帮助你判断系统的一些重要文件是否被攻击者修改。1992年,还在Purdue大学COAST实验室的 Gene H.Kim和Eugene H. Spafford开发了tripwire。它们的目的是建立一个工具,通过这个工具监视一些重要的文件和目录发生的任何改变。1997年,Gene Kim和W.Wyatt Starnes发起成立了Tripwire公司。他们成立这个公司的目的之一是发布一个能够用于更多平台的商业升级版本。Tripwire3的商业版本非常昂贵(这客观上促使aide的诞生)。

但是,到了2001年3月,情况发生了变化。Tripwire公司发布了Linux下的开放源码版本Tripwire-2.3.1,这个版本使用GPL作为许可证,代码是基于商业版的Tripwire-2.x。这无疑是一个好消息,最新的Redhat 7.x就包含了Tripwire-2.3.1的RPM软件包。

在1992年,Tripwire开发之初,只有很少的UNIX安全工具。

COPS (Computer Oracle and Password System)是一个能够支持很多UNIX平台的安全工具集。自从1989年,就开始自由分发,它使用CRC(循环冗余校验)监视系统的文件。但是,COPS有很多不足,例如:它不能监视文件索引节点(inode)结构所有的域。

TAMU是一个脚本集,以和COPS相同的方式扫描UNIX系统的安全问题。TAMU通过一个操作系统的特征码数据库来判断文件是否被修改。不过,它不能扫描整个文件系统,而且每当操作系统升级和修补之后,需要升级自己的特征码数据库。

Hobgoblin使用一个模板来检验文件系统,Hobgoblin运行时,会把系统文件和自己的数据库进行对比,以此来判断系统文件是否被修改。然而,如果文件系统改变,却没有办法对它的数据库进行升级。

ATP能够做一个系统快照并建立一个文件属性的数据库。它使用32位CRC和MD校验文件,而且每当检测到文件被修改,它会自动把这个文件的所有权改为root。和COPS、TAMU以及Hobgoblin相比,这个特征是独一无二的。

但是,以上这些工具,都不能提供足够的能力和移植性用于完整性检查。



Tripwire配置


Tripwire从一个配置文件中读取你想要监视的文件和目录。其自由版本和商业版本的配置文件是不同的。旧版本的自由版配置文件叫作tw.conf;而商业版和新版自由版(2.3.1)的配置文件是twpol.txt。不过,不要依赖其原始的配置文件,因为它的原始配置文件适用于所有Tripwire支持的操作系统,不一定能够满足的的安全要求。例如,其默认的配置就不能监视系统中的SUID和SGID文件,而这对于你的系统安全是非常重要的,因此,你需要自己修改配置加入对这个项目的监视。使用如下命令可以找出系统中的所有SUID文件:


find / -type f -perm -4000 -print


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


find / -type f -perm -2000 -print


现在,你需要把以上命令找出的SUID和SGID文件加入到Tripwire的配置文件(自由版)/策略文件(商业版)。除此之外,最好把所有用户home目录下的初始文件也纳入监视的范畴。主要包括以下文件(这里是以笔者的Redhat Linux7.2为例):



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

bash、csh以及ksh登录之后的初始化命令或者脚本,根据自己的情况灵活决定。:)


.forward

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


.netrc

FTP初始化命令和宏,可能保存明文口令。


.rhosts

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


.xinitrc、.Xauthority、Xdefault等

X窗口系统的一些重要文件。


例如,你可以使用下面的命令找出系统中所有的.bashrc文件:


find / -name ``.bashrc'' -print


在找出所有帐户的重要文件之后,你就可以把它们加入到Tripwire的配置文件或者策略文件了(下面我们将以开放源码的Tripwire-2.3.1进行讨论)。在创建Tripwire的特征码数据库之前,还有一件事情要做,就是检查某些重要文件的权限是否恰当,比如:.netrc和.rhosts的权限应该是600,这样可以禁止其它用户对这些文件的访问。

下面在创建Tripwire特征码数据库之前,我们大体了解一下Tripwire支持的特征码函数。所谓特征码函数就是使用任意的文件作为输入,产生一个固定大小的数据(特征码)的函数。入侵者如果对文件进行了修改,即使文件大小不变,也会破坏文件的特征码。因此,这些函数可以用于数据完整性检测。而且这些特征码函数一般是单向的。Tripwire-2.3.1版本支持如下特征码例程:



MD5

RSA Data Security公司提出,产生128位特征码的消息(message)算法。


Snefru

Xerox安全散列函数


MD4

RSA Data Security公司提出。利用32位RISC架构的消息算法。


MD2

RSA Data Security公司提出。产生128位特征码的消息算法。


SHA

安全散列算法(Secure Hash Algorithm)


Haval

128位message-digest算法。


CRC-16

16位循环冗余校验码


CRC32

32为循环冗余校验码


在Redhat7.2中包含了Tripwire-2.3.1的RPM包,其默认的策略文件是针对Redhat的缺省安装的。如果你使用的其它发布或者非缺省设置,就需要修改Tripwire的默认策略文件(/etc/tripwire/twpol.txt)。一个策略文件大体可以分为:全局变量定义和规则定义两个部分。Redhat7.2中默认的策略文件还把策略规则分成了更小的部分:文件系统和磁盘管理程序(File System and Disk Administration Programs)、内核管理程序(Kernel Administration Programs)、网络程序(Networking Programs)、系统管理程序(System Administration Programs)、硬件设备控制程序( Hardware and Device Control Programs)、系统信息程序(System Information Programs)、应用程序信息程序(Application Information Programs)、shell相关程序(Shell Related Programs)、操作系统工具(OS Utilities )、工具符号连接(Critical Utility Sym-Links)、临时目录(Temporary directories)、局部文件(Local files)、系统启动文件(Critical System Boot Files)、配置文件(Critical configuration files)和设备(Critical devices)。用户可以根据自己实际情况进行适当的剪辑。下面我们使用一个简单的策略文件,来介绍Tripwire的配置:


# Critical configuration files
(
# rulename = ""Critical configuration files"",
severity = 100
)

{
/etc -> $(ReadOnly) (rulename=""/etc - critical config files"") ;
/etc/default -> $(ReadOnly) (rulename=""/etc/default - critical config files"") ;
/etc/inittab -> $(ReadOnly) (rulename=""/etc/inittab - critical config files"") ;
/etc/hosts -> $(ReadOnly) (rulename=""/etc/hosts - critical config files"") ;
/etc/xinetd.conf -> $(ReadOnly) (rulename=""/etc/xinetd.conf - critical config files"");
/etc/protocols -> $(ReadOnly) (rulename=""/etc/protocols - critical config files"") ;
/etc/services -> $(ReadOnly) (rulename=""/etc/services - critical config files"") ;
/etc/xinet.d -> $(ReadOnly) (rulename=""/etc/xinet.d - critical config files"") ;


下面详细解释一下第一条规则。ReadOnly变量是这个软件的一个预定义变量。这个变量会向Tripwire传达以下信息:



检查文件(这里的文件是广义的)的如下属性

权限、索引节点号、连接数、拥有者的用户ID、拥有者的组ID、大小、类型、修改时间戳、索引节点的设备号、分配的块数、CRC-32特征码、MD5特征码。


忽略文件的如下属性

设备的设备号、访问时间戳、索引节点的创建/修改时间戳、文件的增长、SHA特征码、Haval特征码、


rulename(规则名)关键词定义的是本规则的的名字,每条规则的名字都是唯一的。这个关键词定义的信息会在报告文件中作为描述显示出来。



使用


初始化

了解了上面的知识,下面你可以根据自己的系统情况编辑/etc/tripwire/twpol.txt文件。然后运行/etc/tripwire/twinstall.sh(这个脚本是RedHat7.2,Tripwire-2.3.1RPM包自带的一个安装脚本)进行第一步的设置:


#cd /etc/tripwire/
#./twinstall.sh
....

Creating key files...

....

Enter the site keyfile passphrase:<--设置读取配置和策略文件(默认是/etc/tripwire/tw.pol和/etc/tripwire/tw.cfg)的密码
Verify the site keyfile passphrase:<--确认一次

....

Enter the local keyfile passphrase:<--设置写新数据库的密码
Verify the local keyfile passphrase:<--确认一次

这两个密码被加密后,保存在/etc/tripwire/localhost-local.key和/etc/tripwire/site.key文件中。这两个密码分别用来限制用户对tripwire配置文件读取以及改写特征码数据库文件。注意:Tripwire的配置文件、策略文件和特征码数据库文件是以二进制方式保存的无法阅读。如果要改变策略,只能编辑/etc/tripwire/twpol.txt文件,然后通过Tripwire的策略升级模式升级策略。
....

Please enter your site passphrase: <--输入密码

....



准备工作完成之后,可以运行如下命令产生特征码数据库:


#tripwire --init
Please enter your local passphrase: <--输入密码
Parsing policy file: /etc/tripwire/tw.pol
Generating the database...
*** Processing Unix File System ***


这个命令将根据策略/配置文件的内容产生一个系统快照,特征码数据库文件一般保存在/var/lib/tripwire/目录下。到这里初始化工作完成。注意:在初始化过程中,可能产生大量的错误信息,例如:


Waring:File System error.
Filename:/proc/driver/rtc
No such file or derectory.
Continuing..


这些错误信息一般是由于策略文件编写不当造成的,可以忽略。为了减少这些错误信息的出现,应该根据自己的系统仔细编辑你的策略文件。


使用Tripwire检查文件的变动

初始化工作完成之后,你就可以使用Tripwire来监视系统内文件的变动情况了。使用如下命令将启动Tripwire的检查模式:


#./tripwire --check --interactive -V vi


其中参数--check使Tripwire进入检查模式,而--interactive使Tripwire包检查报告输入一个编辑器vi中;-V指定使用的编辑器。从报告中,你可以看到系统被改变的文件。不过,系统中某些文件的改变是合理的,可以忽略。检查完成之后,如果系统没有异常情况,使用Tripwire的升级模式(tripwire -m u)对特征码数据库进行升级就可以了,不过每次的产生的报告都被保存在/var/lib/tripwire/report/目录中。

最后,要强调的是,Tripwire安装完成之后,要把其配置文件、特征码数据库文件的多余权限去掉,以更好地对其进行保护。



总结


本文讨论了如何在Redhat7.2中使用数据完整性检测工具Tripwire,如果想对Tripwire进行更深入的了解请参考Tripwire的手册页,或者到它的官方网站http://www.tripwire.ort查看相关技术资料。