四、维护策略文件和配置文件
如何查看策略和配置
如果您想浏览一下Tripwire的策略和配置情况,但他们是以二进制的形式存放或当前缺失,请用下列命令:
生成有效配置文件
引用:# cd /etc/tripwire
# twadmin --print-cfgfile > twcfg.txt
生成有效策略文件
引用:# cd /etc/tripwire
# twadmin --print-polfile > twpol.txt
因为有效配置文件和策略文件已经加密和签名,所以他们是以密文的形式存放。如果想浏览他们的话,需要先解密:将其转换成明文的形式。为安全起见,一般建议在对他们重新进行签名之后将明文形式的配置和策略文件删除。
需要注意的是,尽管我们可以将twadmin的输出重定向到任何文件当中,但安装脚本twinstall.sh却要求明文形式的策略和配置文件名为twcfg.txt和twpol.txt。
修改策略文件和配置文件
如果想改变Tripwire所检查文件和目录的话,或者想改变Tripwire的默认行为,那该怎么办呢?请按如下所示来进行:
首先,从明文文件中提取出策略和配置:
引用:# cd /etc/tripwire
# twadmin --print-polfile > twpol.txt
# twadmin --print-cfgfile > twcfg.txt
策略文件twpol.txt和配置文件twcfg.txt的修改可以利用常见的文本编辑器来完成。对于修改过的策略文件twpol.txt和配置文件twcfg.txt文件,需要对他们进行再次签名:
引用:# twadmin --create-cfgfile --cfgfile /etc/tripwire/tw.cfg \
--site-keyfile site_key etc/tripwire/twcfg.txt
# twadmin --create-polfile --cfgfile /etc/tripwire/tw.cfg \
--site-keyfile site_key etc/tripwire/twpol.txt
然后,我们需要重新初始化数据库:
# tripwire --init
# rm twcfg.txt twpol.txt
需要注意的是,我们只能对明文形式的策略和配置文件进行编辑,所以除非已有明文文件,否则必须先将加密签名的策略和配置文件转换成明文形式。另外,当在修改文件时,可能会遇到以下消息:
### Error: File could not be opened
这说明Tripwire没有找到目标文件,如果是该文件的确不存在的话,我们就需要从策略和配置文件中去掉对该文件的引用(或将其注释出来也可以),并对策略文件重新签名。如果只是在完整性检查之后简单地更新一下数据库的话,那完全没必要严格按上述步骤来处理;但是对策略或配置文件作了修改后却必须这样处理。
五、配置完整性检测
基本的完整性检测配置
完整性检验的目的在于检查一下自从上次Tripwire对文件作了快照以后,我们的文件是否发生了变动,我们可以简单通过以下命令来达到此目的:
引用:# tripwire -check
这是一条最基本的命令,它能告诉我们系统是否被修改了。它根据在策略文件中规定的规则,利用Tripwire数据库跟文件系统当前状态加以对比,之后将比较结果写入标准输出,并将其加盖时间戳、签名,然后作为一份Tripwire报告存放起来。另外,我们还可以针对数据库中的单个或多个文件进行完整性检查。若Tripwire的策略中包括以下规则:
引用:(
rulename = "My funky files",
severity = 50
)
{
/sbin/e2fsck -> $(SEC_CRIT) ;
/bin/cp -> $(SEC_CRIT) ;
/usr/tmp -> $(SEC_INVARIANT) ;
/etc/csh.cshrc -> $(SEC_CONFIG) ;
}
那么您就可以用以下命令来查看选中的文件和目录:
# tripwire --check /bin/cp /usr/tmp
若要查看一条规则所对应的所有文件,用以下命令:
# tripwire --check --rule-name "My funky files"
也可以查看严重性大于等于特定值的所有规则,如下所示:
引用:# tripwire --check --severity 40
关于策略文件的有关语法,请参阅有关手册或查看联机帮助:
$ tripwire --check --help
更高安全级别的完整性检测
为了获得更高的安全性,我们可以将Tripwire最关键的文件存放到诸如CD-ROM之类的只读介质或有写保护的上磁盘上,这样能防止它们被篡改。步骤如下:
1.把 site密钥、local密钥以及tripwire可执行文件本身复制到合适的磁盘上,打开写保护后再装载,比如将其安装在目录/mnt/cdrom。
引用:# mount /mnt/cdrom
# ls -l /mnt/cdrom
total 2564
-r--r----- 1 root root 931 Jan 21 10:20 site.key
-r--r----- 1 root root 931 Jan 21 10:20 myhost-local.key
-r-xr-xr-x 1 root root 2612200 Jan 21 10:19 tripwire
2.生成明文形式的配置文件
# DIR=/etc/tripwire
# cd $DIR
# twadmin --print-cfgfile > twcfg.txt
3.编辑配置文件以使之指向这些拷贝
/etc/tripwire/twcfg.txt:
ROOT=/mnt/cdrom
SITEKEYFILE=/mnt/cdrom/site.key
LOCALKEYFILE=/mnt/cdrom/myhost-local.key
4.对修改后的配置文件进行签名
引用:# SITE_KEY=/mnt/cdrom/site.key
# twadmin --create-cfgfile --cfgfile $DIR/tw.cfg \
--site-keyfile $SITE_KEY $DIR/twcfg.txt
5.更新数据库并卸载CD-ROM
# /mnt/cdrom/tripwire --init
# umount /mnt/cdrom
现在,已经万事具备,如果要进行完整性检验的话,只要插入光盘并输入命令就可以了:
# mount /mnt/cdrom
# /mnt/cdrom/tripwire --check
# umount /mnt/cdrom
site密钥、local密钥以及tripwire可执行文件之所以要加以保护,是因为它们极为重要并且可能受到攻击。Tripwire的其他文件,如数据库、策略和配置等需要用这两个密钥和程序来签名,如果site密钥、local密钥以及tripwire可执行文件是安全的,那么用它们签过名的文件发生的任何变化都能被发现。另外,将/usr/sbin/tripwire拷贝到光盘之前,一定要确保它是静态链接的,也就是说该程序的执行不依赖任何动态共享库,因为应用动态共享库时,动态库调用更容易被攻击者所劫持。
$ ldd /usr/sbin/tripwire
not a dynamic executable
除了上面的方法外,我们还可以利用远程进行完整性检验来提高安全强度。
为了提高检验的安全性,关键的Tripwire文件最好不要存放在被检验的机器上面。为此,我们在此引入两台机器untrusty和trusty。前者是一台想要用Tripwire来检查其完整性的"不可信"机器;后者是一台安全的机器,理想的情况下只能由它访问网络,而其他机器这不能访问它。此外,为了使其他机器不能访问存放site密钥、local密钥以及tripwire可执行文件的远程机器,通常使用rsync(SSH下的安全隧道技术)来验证原件和拷贝的一致性从而触发完整性检验。远程机器trusty上的原始配置如下所示:
引用:#!/bin/sh
REMOTE_MACHINE=untrusty
RSYNC='/usr/bin/rsync -a --progress --rsh=/usr/bin/ssh'
SAFE_DIR=/usr/local/tripwire/${REMOTE_MACHINE}
VITAL_FILES="/usr/sbin/tripwire
/etc/tripwire/site.key
/etc/tripwire/${REMOTE_MACHINE}-local.key"
mkdir $SAFE_DIR
for file in $VITAL_FILES
do
$RSYNC ${REMOTE_MACHINE}:$file $SAFE_DIR/
done
在检验本地机器之前,需要首先将site密钥、local密钥以及tripwire可执行文件与它们在远程机器上的拷贝比较一番,以确定这三个文件的完整性。然后在trusty上运行下列代码(需要注意,这里的各个变量如REMOTE_MACHINE要与前面脚本中的保持一致):
#!/bin/sh
cd $SAFE_DIR
rm -f log
for file in $VITAL_FILES
do
base=`basename $file`
$RSYNC -n ${REMOTE_MACHINE}:$file . | fgrep -x "$base" >> log
done
if [ -s log ] ; then
echo 'Security alert!'
else
ssh ${REMOTE_MACHINE} -l root /usr/sbin/tripwire --check
fi
rsync是一个常用来同步两台机器上的文件的实用程序。它实际上通过SSH建立了一条安全隧道,来为我们在两台机器之间提供安全的鉴别功能,并为两者之间的通信提供加密服务,但前提是您已经在两台机器之间设置了SSH设施,否则,rsync就不能提供上述的安全功能。
这里有几个常用的选项需要介绍一下:-progress通知rsync只有当本地和远程文件不同时才产生输出;-n选项的作用在于让rsync不拷贝文件。
对于fgrep命令,主要用于删除所有输出,但可疑的文件名除外。它的特点是用固定的字符串而非正则表达式进行匹配,而文件名中恰恰又包含常见于正则表达式的一些特殊字符,如"."等。fgrep -x对整行(即文件名)进行匹配,因此,当且仅当本地文件和远程文件完全一致时,log文件才为空,从而触发完整性检验。
那么是否要远程存储数据库呢?实际上是没有必要的,因为数据库是用local密钥来签名的,而该密钥又是"离机的",因此如果数据库发生意外变化的话,Tripwire就会发出警报。
Trusty不仅要检查这些重要的Tripwire文件,同时还必须赶在untrusty进行完整性检查之前将他们拷贝给untrusty:
# scp -p tripwire untrusty:/usr/sbin/tripwire
# scp -p site.key untrusty-local.key untrusty:/etc/tripwire/
# ssh untrusty -l root /usr/sbin/tripwire --check
高强度完整性检测
上面介绍的是常规强度的完整性检测,但我们还可以继续提高检验强度,但天下没有免费的午餐,这需要付出速度与方便性为代价的。
因此,我们可以创建一个可引导的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检测系统完整性(3)