site密钥、local密钥以及tripwire可执行文件之所以要加以保护,是因为它们极为重要并且可能受到攻击。Tripwire的其他文件,如数据库、策略和配置等需要用这两个密钥和程序来签名,如果site密钥、local密钥以及tripwire可执行文件是安全的,那么用它们签过名的文件发生的任何变化都能被发现。另外,将/usr/sbin/tripwire拷贝到光盘之前,一定要确保它是静态链接的,也就是说该程序的执行不依赖任何动态共享库,因为应用动态共享库时,动态库调用更容易被攻击者所劫持。
除了上面的方法外,我们还可以利用远程进行完整性检验来提高安全强度。
为了提高检验的安全性,关键的Tripwire文件最好不要存放在被检验的机器上面。为此,我们在此引入两台机器untrusty和trusty。前者是一台想要用Tripwire来检查其完整性的"不可信"机器;后者是一台安全的机器,理想的情况下只能由它访问网络,而其他机器这不能访问它。此外,为了使其他机器不能访问存放site密钥、local密钥以及tripwire可执行文件的远程机器,通常使用rsync(SSH下的安全隧道技术)来验证原件和拷贝的一致性从而触发完整性检验。远程机器trusty上的原始配置如下所示:
在检验本地机器之前,需要首先将site密钥、local密钥以及tripwire可执行文件与它们在远程机器上的拷贝比较一番,以确定这三个文件的完整性。然后在trusty上运行下列代码(需要注意,这里的各个变量如REMOTE_MACHINE要与前面脚本中的保持一致):
rsync是一个常用来同步两台机器上的文件的实用程序。它实际上通过SSH建立了一条安全隧道,来为我们在两台机器之间提供安全的鉴别功能,并为两者之间的通信提供加密服务,但前提是您已经在两台机器之间设置了SSH设施,否则,rsync就不能提供上述的安全功能。
这里有几个常用的选项需要介绍一下:-progress通知rsync只有当本地和远程文件不同时才产生输出;-n选项的作用在于让rsync不拷贝文件。
对于fgrep命令,主要用于删除所有输出,但可疑的文件名除外。它的特点是用固定的字符串而非正则表达式进行匹配,而文件名中恰恰又包含常见于正则表达式的一些特殊字符,如"."等。fgrep -x对整行(即文件名)进行匹配,因此,当且仅当本地文件和远程文件完全一致时,log文件才为空,从而触发完整性检验。
那么是否要远程存储数据库呢?实际上是没有必要的,因为数据库是用local密钥来签名的,而该密钥又是"离机的",因此如果数据库发生意外变化的话,Tripwire就会发出警报。
Trusty不仅要检查这些重要的Tripwire文件,同时还必须赶在untrusty进行完整性检查之前将他们拷贝给untrusty:
高强度完整性检测
上面介绍的是常规强度的完整性检测,但我们还可以继续提高检验强度,但天下没有免费的午餐,这需要付出速度与方便性为代价的。
因此,我们可以创建一个可引导的CD-ROM,并在其中放上一个微型的Linux系统、Tripwire程序以及您的local和site密钥。然后,将您的机器与所有网络断开,从上面制作的可引导光盘引导系统,接着利用光盘上的(而不是硬盘上的)可执行程序来检查机器磁盘的完整性。之后还要经常备份您的Tripwire的数据库、配置和策略,以备万一它们被攻击者删除时之用。
这种方法至少需要两台机器,其中一个必须是安全可信的机器(称为trusty),另一个是被检测的机器(称为untrusty)。我们的目的是为后者进行安全的Tripwire检测。
第一步是安全创建可引导CD-ROM,这要求:
在trusty上创建CD-ROM,trusty必须是一个洁净的Linux系统,它可以是由可信的源或二进制软件包构建而成,从来没有连入网络或被第三方访问过,此外还要为其打上最新的安全补丁。
配置CD-ROM的启动脚本使其禁用所有网络。
直接用可信的源或二进制软件包来烧制光盘。
在trusty上建立site和local密钥。
然后,从CD-ROM引导untrusty,装上本地磁盘并利用CD-ROM上的程序和密钥来创建untrusty的Tripwire数据库。因为数据库、策略和配置文件已经用CD-ROM的密钥签过了名,所以这些文件在untrusty上的安全性是可信的。接着,您就可以在执行完整性检查之前从光盘上引导untrusty。另外,若只是从untrusty上加载光盘并从光盘上运行untrusty的话,则会出现以下情况:
如果untrusty是动态链接的话,很难保证共享库的安全性;
难以保证系统内核的安全性;
难以保证untrusty上挂载点的正确性;
虽然这种方法提供了非常高的安全级别,但做起来非常麻烦,所以只有有特殊安全需求的情况下才采取该措施。为方便起见,我们可以安排一个cron任务,使其在每晚规定的时间从光盘上重引导untrusty,来进行Tripwire检验,之后再重引导untrusty。然而,不要让untrusty本身来执行该任务,因为untrusty是不安全的,所以在其上运行的cron也是不可靠的;相反,应将其安排给trusty来执行,如利用SSH批处理任务来触发重引导,因为这样作更为合理一些。
六、完整性检测的自动化
如果您想让Tripwire在特定的时刻或每隔一段时间就自动进行检测的话,可以按照下列提示来完成。例如我们要他每天的下午2点进行一次检测,那该如何做呢?我们可以利用cron来来协助我们完成此项任务。我们可以在root用户的 crontab文件中添加以下一项:
0 2 * * * /usr/sbin/tripwire --check
需要注意的是,cron本身也可能受到攻击,因而可能出现不执行等意外情况。所以我们最好在一个可信的远程机器上来执行cron任务。在trusty上的crontab中添加如下一个远程检测项:
0 2 * * * ssh -n -l root untrusty /usr/sbin/tripwire --check
但是如果入侵者攻破了untrusty上的sshd的话,那么覆巢之下,焉有完卵--您的安全性也必将受到威胁!此外,某些rootkits能够颠覆对Tripwire的远程exec调用。为了获取最大的安全性,只是执行cron任务是远远不够的,还得在可信机器上进行完整性检验。
Red Hat Linux预配置情况下,会在每晚通过cron任务/etc/cron.daily/tripwire-check来运行Tripwire程序。但是,Tripwire数据库不是由操作系统来提供的,而是由用户自己来提供一个原件,否则,cron只是定时向超级用户发送一封Tripwire调用失败的的电子邮件。
七、生成Tripwire报告
上面介绍了如何配置Tripwire来进行完整性检测。但这并不是使用Tripwire的目的所在,我们需要的是完整性检测的结果,换句话说还得要Tripwire将结果以报告的形式提交给管理人员,这样我们才能以此判断系统是否遭到破。具体操作如下所示:
一般情况下,Tripwire报告存放在什么地方是由Tripwire配置文件中的REPORTFILE变量来决定,其常见值为:
REPORTFILE = /var/lib/tripwire/report/$(HOSTNAME)-$(DATE).twr
变量HOSTNAME存放的是机器的主机名,变量DATE存放的是时间戳,如。所以,主机untrusty的报告文件名应当为:
/var/lib/tripwire/report/untrusty-20040130-030518.twr
虽然tripwire可以通过电子邮件发送报告,但不要太信赖电子邮件,因为它很可能被截获并被篡改后重发。所以,最好由您直接检查报告为上,要Twprin打印报告,可以按如下操作进行:
八、Tripwire数据库的维护
对于Tripwire数据库的维护工作,主要包括数据库的更新、添加和删除操作,下面我们将分别介绍。
更新数据库
有时候,我们会对程序作一些正常的修改,这些改动也会反映在最新的Tripwire报告中,但问题是,我们使用Tripwire很大程度上只想让它报告那些"非法的"修改。那么,这时我们就需要利用最新的报告来更新一下我们的Tripwier数据库,具体操作如下所示:
这里有一点必须注意,那就是如果你已经修改了某些文件的话,您不能只是简单的运行更新就算了事:您必须在此之前首先进行完整性检验。进行更新的好处是它比初始化数据库要快得多!
向数据库中添加文件
为了向Tripwire的数据库中添加文件和目录,请执行以下操作:
向有效策略文件中添加指定的文件,如/bin/ls:
/bin/ls
--
$(SEC_BIN) ;
向有效策略文件中添加整个目录树,比如/etc:
/etc
--
$(SEC_BIN) ;
向有效策略文件中添加目录如/etc及其下的文件,但不包括其子目录:
/etc
--
$(SEC_BIN) (recurse=1) ;
向有效策略文件中添加目录如/etc,但不包括其下的文件以及其子目录:
/etc
--
$(SEC_BIN) (recurse=0);
然后初始化数据库。
策略实际上就是存放在策略文件中的规则表,规则的一般形式如下所示:
filename - rule ;
它的基本含义就是,如果给定的规则被违反的话,那么对应的文件或目录就被认为是到了安全侵害。例如:
/bin/login - +pisug ;
上面这条规则的含义是:如果自从上次快照之