全部博文(7)
分类: LINUX
2008-04-09 10:53:08
Tripwire
当Tripwire运行在数据库生成模式时,会根据管理员设置的一个配置文件对指定要监控的文件进行读取,对每个文件生成相应数字签名,并将这些结果保存在自己的数据库中,在缺省状态下,MD5和SNCFRN (Xerox的安全哈希函数)加密手段被结合用来生成文件的数字签名。当怀疑系统被入侵时,可由Tripwire根据先前生成的,数据库文件来做一次数字签名的对照,如果文件被替换,则与Tripwire数据库内相应数字签名不匹配,这时Tripwire会报告相应文件被更动,管理员就很清楚了。这样如果数据库是不可靠的,则一切工作都丧失意义。除了妥善保管数据库外,用PGP等工具对上述关键文件进行签名也是一个很好的选择。
当管理员对某些文件更动时,Tripwire的数据库必然是需要随之更新的,Tripwire考虑到了这一点,它有四种工作模式:数据库生成,完整性检查,数据库更新,交互更新。当管理员更动文件后,可运行数据库更新模式来产生新的数据库文件。
###编译安装之后配置
# cd /etc/tripwire
# ./twinstall.sh 脚本的作用有:
1,创建site和local密钥,这时会要求输入口令,site密钥为site.key,local密钥为$HOSTNAME-local.key
2,利用site.key对配置twcfg.txt,twpol.txt进行签名,并分别存放于tw.cfg tw.pol中.
如果没有 twinstall.sh 脚本就的手工修改以上两个txt文件,设置常见的变量:
ROOT =/usr/sbin
POLFILE =/etc/tripwire/tw.pol
DBFILE =/etc/tripwire/db/$(HOSTNAME).twd
REPORTFILE =/etc/tripwire/report/$(HOSTNAME)-$(DATE).twr
SITEKEYFILE =/etc/tripwire/site.key
LOCALKEYFILE =/etc/tripwire/$(HOSTNAME)-local.key
EDITOR =/bin/vi
修改 twpol.txt 去掉系统中并不曾在的文件或目录;然后:
创建site密钥
# twadmin --generate-keys --site-keyfile $SITE_KEY
生成local密钥
# twadmin --generate-keys --local-keyfile $LOCAL_KEY
为配置文件签名
# twadmin --create-cfgfile --cfgfile $DIR/tw.cfg \
--site-keyfile $SITE_KEY $DIR/twcfg.txt
为策略文件签名
# twadmin --create-polfile --cfgfile $DIR/tw.pol \
--site-keyfile $SITE_KEY $DIR/twpol.txt
设置权限
# cd $DIR
# chown root:root $SITE_KEY $LOCAL_KEY tw.cfg tw.pol
# chmod 600 $SITE_KEY $LOCAL_KEY tw.cfg tw.pol
# tripwire --init
为tripwire建立数据库并用local进行签名.
# rm twcfg.txt twpol.txt
为安全起见,需删除明文形式的策略和配置文件.
维护策略文件和配置文件
如何查看策略和配置
如果您想浏览一下Tripwire的策略和配置情况,但他们是以二进制的形式加密后存放的,可请用下列命令生成有效配置文件
#twadmin --print-cfgfile
#twadmin --print-polfile
###修改策略文件和配置文件
当系统新安装了软件或者添加了配置文件,就需要改变Tripwire所检查文件,或者想改变Tripwire的默认行为,需要按如下所示来进行:首先,提取出明文的策略和配置、修改之后,对他们重新签名:
# twadmin --create-cfgfile --cfgfile /etc/tripwire/tw.cfg \
--site-keyfile /etc/tripwire site.key /etc/tripwire/twcfg.txt
# twadmin --create-polfile --cfgfile /etc/tripwire/tw.pol \
--site-keyfile site.key /etc/tripwire/twpol.txt
然后,需重新初始化数据库,删除明文的配置文件:
###基本的完整性检测配置
完整性检验的目的在于检查一下自从上次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报告
上面介绍了如何配置Tripwire来进行完整性检测。还得要Tripwire将结果以报告的形式提交给管理人员。具体操作如下所示:
#!/bin/sh
DIR=/var/lib/tripwire/report
HOST=`hostname -s`
LAST_REPORT=`ls -1t $DIR/$HOST-*.twr | head -1`
twprint --print-report --twrfile "$LAST_REPORT"
一般情况下,Tripwire报告存放在什么地方是由Tripwire配置文件中的REPORTFILE变量来决定,其常见值为:
REPORTFILE = /var/lib/tripwire/report/$(HOSTNAME)-$(DATE).twr
变量HOSTNAME存放的是机器的主机名,变量DATE存放的是时间戳,如。所以,主机untrusty的报告文件名应当为:
/var/lib/tripwire/report/untrusty-20040130-030518.twr
虽然tripwire可以通过电子邮件发送报告,但不要太信赖电子邮件,因为它很可能被截获并被篡改后重发。所以,最好由您直接检查报告为上,要Twprin打印报告,可以按如下操作进行:
# twprint --print-dbfile --dbfile /var/lib/tripwire/`hostname -s`.twd
Tripwire(R) 4.0 Database
Database generated by: root
Database generated on: Mon Jan 1 22:33:55 2004
Database last updated on: Never
... contents follow ...
###Tripwire数据库的维护
对于Tripwire数据库的维护工作,除了安全维护外,还包括数据库的更新、添加和删除操作,下面我们将分别介绍。
更新数据库
有时候,我们会对程序作一些正常的修改,这些改动也会反映在最新的Tripwire报告中,但问题是,我们使用Tripwire很大程度上只想让它报告那些"非法的"修改。那么,这时我们就需要利用最新的报告来更新一下我们的Tripwier数据库,具体操作如下所示:
#!/bin/sh
DIR=/var/lib/tripwire/report
HOST=`hostname -s`
LAST_REPORT=`ls -1t $DIR/$HOST-*.twr | head -1`
tripwire --update --twrfile "$LAST_REPORT"
这里有一点必须注意,那就是如果你已经修改了某些文件的话,您不能只是简单的运行更新就算了事:您必须在此之前首先进行完整性检验。进行更新的好处是它比初始化数据库要快得多。
向数据库中添加文件
向有效策略文件中添加指定的文件,如/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 ;
上面这条规则的含义是:如果自从上次快照之后,如果/bin/login的文件权限(p)、inode号(i)、 尺寸 (s),、用户(u)或组 (g)发生了变化的话,那么就应当引起我们的关注。如果想全面深入的了解Tripwire语法的话,请参阅Tripwire手册。在这里,我们使用了一个预定义的全局变量SEC_BIN来指出二进制文件不得修改。recurse= n的作用在于通知Tripwire在文件系统中的递归深度;当n为零时,其含义为只测试到目录文件本身这一层次。很多时候我们需要修改默认策略文件,因为它们所提供的策略未必完全适合我们的系统,所以我们需要针对不同的Linux类型和版本,对Tripwire所提供的默认策略进行适当的剪裁,从而满足我们的要求。
从数据库中删减文件
我们不仅根据需要向数据库中添加文件,有时我们还需要对数据库中的文件加以删减。具体操作如下所示:
例如首先向数据库中添加一个目录:
/etc -> rule
然后排除掉其中的一些文件:
!/etc/not.me
!/etc/not.me.either
如果我们想去掉一个子目录的话:
!/etc/dirname
这里,感叹号!的作用在于将给定的文件或子目录排除掉。
Tripwire是现实中最为常见的一种开源完整性检测工具,如果想更深入的了解软件,请参阅其使用手册。