以前的日志中也曾经提到,由于Linux服务器执行同样的配置,可使用不同的配置及启动方式,所以,我们应该尽可能按照标准的配置模式进行。但万一服务 器给***,***并不会考虑您运行的配置模式,并会通过修改系统的核心执行文件,如:ls、ps、top等方式尽可能的去隐含自己的行踪。此时,若未能及时 发现问题,我们将会处在很被动的位置。而解决该问题的其中一个方法,就是利用一些工具,定时对系统的核心文件进行跟踪,在发现文件被修改后,及时采取对应 的措施。Tripwire是其中一款常见的完整性检查工具 ,同时也是红旗上自带的工具之一。
一、原理
   Tripwire可以对要求校验的系统文件进行类似md5的运行,而生成一个唯一的标识,即“快照”snapshot。当这些系统文件的大小、inode号、权限、时间等任意属性被修改后,再次运行Tripwire,其会进行前后属性的对比,并生成相关的详细报告。
   Tripwire由下面部分组成:

引用
1、配置文件:定义数据库、策略文件和Tripwire可执行文件的位置:
/etc/tripwire/twcfg.txt
2、策略:定义检测的对象及违规时采取的行为:
/etc/tripwire/twpol.txt
3、数据库:用于存放生成的快照:
/var/lib/tripwire/$(HOSTNAME).twd


   另外,Tripwire为了自身的安全,防止自身被篡改,也会对自身进行加密和签名处理。其中,包括两个密钥:

引用
1、site密钥:用于保护策略文件和配置文件,只要使用相同的策略和配置的机器,都可以使用相同的site密钥:
/etc/tripwire/site.key
2、local密钥:用户保护数据库和分析报告,这肯定不会重复的:
/etc/tripwire/$(HOSTNAME)-local.key


二、安装及初始化
   以红旗DC 5.0 for x86为例,在系统安装完毕后,就会带有Tripwire:

# rpm -qa|grep tripwire
tripwire-2.3.1-18.2AX


1、安装
可以先使用twpol.txt默认的配置内容。然后运行:

cd /etc/tripwire
./twinstall.sh


twinstall脚本会执行下面的任务,也可用手工方式运行相应的命令实现:
a)创建site密钥,为安全起见,会提示输入口令(最少8位)

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


b)创建local密钥,同样的,也会提示输入口令

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


c)利用site密钥对twcfg.txt进行签名,并将签名后的文件存为tw.cfg

twadmin --create-cfgfile --cfgfile /etc/tripwire/tw.cfg \
--site-keyfile /etc/tripwire/site.key /etc/tripwire/twcfg.txt


会提示输入site.key的口令
d)利用site密钥对twpol.txt进行签名,并将签名后的文件存为tw.pol

twadmin --create-polfile --cfgfile /etc/tripwire/tw.cfg \
--site-keyfile /etc/tripwrie/site.key /etc/tripwire/twpol.txt


也会提示输入site.key的口令,请注意参数。
如果是手工创建上述密钥和签名的话,还需要设置权限:

cd /etc/tripwire
chown root:root site.key `hostname`-local.key tw.cfg tw.pol
chmod 600 site.key `hostname`-local.key tw.cfg tw.pol


2、初始化数据库
使用local密钥的口令初始化数据库:

tripwire --init


这个时间会比较长,而且对系统的资源占用也比较厉害。其中,如果出现类似下面的错误:

引用
### Warning: File system error.
### Filename: /dev/kmem
### No such file or directory
### Continuing...
### Warning: File system error.
### Filename: /proc/ksyms
### No such file or directory
### Continuing...


这不用担心,其原因是由于上面的目录或文件是默然配置文件中定义扫描,而他们并不存在当前的系统中。解决的方法就是在生成tw.pol前,修改twpol.txt文件,把不需要扫描的路径注释或删除即可。
最后生成的数据库文件会存放在:

引用
/var/lib/tripwire/mail.zoosoft.net.twd


可用下面的命令查看数据库内容:

twprint --print-dbfile --dbfile /var/lib/tripwire/mail.zoosoft.net.twd|more


自此,tripwire安装及初始化完成。为安全起见,可删除明文形式的twcfg.txt和twpol.txt文件:

rm twcfg.txt twpol.txt


三、检查完整性
在生成原始数据库完毕,以后就可以根据该数据库对配置文件中定义的系统文件及目录进行完整性检查。默然情况下,每天会进行一次例行检查:

# ls /etc/cron.daily/tripwire-check
/etc/cron.daily/tripwire-check


当然,您也可以根据实际的情况,手工运行全面检查的命令:

tripwire --check


※如果其中发现类似下面的错误:

引用
1.   File system error.
    Filename: /dev/kmem
    No such file or directory
2.   File system error.
    Filename: /proc/ksyms
    No such file or directory


那通常的原因都是和前面生成初始化数据库的使用相同的,不是严重的问题,只是因为这些文件或目录不存在而已。 解决的方法就是把这些目录和文件在twpol.txt中排除后,再生成tw.pol,最后再初始化数据库即可。
当然,如果您已经把前面的工作都做完了,也可以参考下面的方式更新数据库的内容。
检查生成的报告会放在:

ls /var/lib/tripwire/report/
mail.zoosoft.net-20070615-040442.twr


四、更新数据库
1、查看报告

twprint --print-report --twrfile /var/lib/tripwire/report/mail.zoosoft.net-20070615-040442.twr


报告是加密的,并且以生成时间排序。
2、更新数据库
更新数据库的原因有很多,通常都是因为我们已知系统中某些文件被正确的修改,所以需要反应到数据库中,以便今后排除这些文件。
要更新数据库,必须依赖最新的检测报告:

# ls -lt /var/lib/tripwire/report/`hostname`-*.twr|head -1
-rw-r--r--  1 root root 14646 Jun 15 04:08 /var/lib/tripwire/report/mail.zoosoft.net-20070615-040442.twr


更新:

tripwire --update --twrfile /var/lib/tripwire/report/mail.zoosoft.net-20070615-040442.twr


※更新前会先把使用到的报告列举一次,可用vi的方式(:q!)退出,并自动执行更新。
Tripwire 的使用和维护都比较简单。但要实现对系统的监控,关键还是需要依靠管理员定制完整的策略和检查周期,以便及时发现问题。另外,Tripwire只能告诉您 那些文件被修改,以及修改的属性。但判断和维护是依赖管理员操作的,Tripwire是一个“事后诸葛亮”的工具。

 

 


五、事例
假设我已经初始化了数据库,现在,我把/etc/security/limits.conf文件中:

引用
*               hard    nproc   16384


改为

引用
*               hard    nproc   65536


保存后,运行:

tripwire --check


并查看结果:

twprint --print-report --twrfile mail.linuxfly.org-20070614-155313.twr |more


其中显示:
点击在新窗口中浏览此图片
以及:
点击在新窗口中浏览此图片
被修改的文件前后属性可清楚的分辨出来。

 

 


六、其他
1、参数简写
在一些技术资料里面会提到tripwire的一些简单参数,大概包括:
tripwire:

引用
Database Initialization:  tripwire [-m i|--init] [options]
Integrity Checking:  tripwire [-m c|--check] [object1 [object2...]]
Database Update:  tripwire [-m u|--update]
Policy Update:  tripwire [-m p|--update-policy] policyfile.txt


twadmin:

引用
Create Configuration File: twadmin [-m F|--create-cfgfile][options] cfgfile.txt
Print Configuration File: twadmin [-m f|--print-cfgfile] [options]
Create Policy File: twadmin [-m P|--create-polfile] [options] polfile.txt
Print Policy File: twadmin [-m p|--print-polfile] [options]
Remove Encryption: twadmin [-m R|--remove-encryption] [options] [file1...]
Encryption: twadmin [-m E|--encrypt] [options] [file1...]
Examine Encryption: twadmin [-m e|--examine] [options] [file1...]
Generate Keys: twadmin [-m G|--generate-keys] [options]


twprint:

引用
Print Database:  twprint [-m d|--print-dbfile] [options] [object1 [object2...]]
Print Report:  twprint [-m r|--print-report] [options]


那类似下面的命令:

tripwire --init


就可以写成:

tripwire -m i


或者

twprint --print-report --twrfile mail.linuxfly.org-20070614-155313.twr


写成:

twprint -m r --twrfile mail.linuxfly.org-20070614-155313.twr


2、维护策略文件和配置文件
在使用site.key对策略文件和配置文件加密和签名后,为安全起见,都会把明文的twcfg.txt和twpol.txt删掉。但如果您需要修改策略和配置文件,这还是必须要用到这两个文件的。
所以,可以使用下面的命令恢复:

cd /etc/tripwire
twadmin --print-cfgfile > twcfg.txt
twadmin --print-polfile > twpol.txt


在修改完毕上述两个文件后,再签名并初始化数据库即可。
3、配置策略
增加策略:

引用

#定义规则的名称及级别
(rulename = "My check files",
severity = 50
)
{
#添加/etc整个目录树及子目录及其下的文件
/etc -> $(SEC_CRIT)
#添加/etc目录及其下的文件,但不包括其子目录
#/etc -> $(SEC_CRIT) (recurse=1)
#添加/etc目录,但不包括其下的文件及子目录
#/etc -> $(SEC_CRIT) (recurse=0)
#排除一个文件或目录
!/etc/dhcpd.conf

/sbin/e2fsck -> $(SEC_CRIT) ;
/bin/cp -> $(SEC_CRIT) ;
/opt/oracle -> $(SEC_INVARIANT) ;
/etc/csh.cshrc -> $(SEC_CONFIG) ;
}


可以看到,规则的一般形式就是:
filename -> rule ;
其中rule有很多不同的定义,例如默认的:

引用
SEC_CRIT      = $(IgnoreNone)-SHa ;  # Critical files that cannot change
SEC_SUID      = $(IgnoreNone)-SHa ;  # Binaries with the SUID or SGID flags set
SEC_BIN       = $(ReadOnly) ;        # Binaries that should not change
SEC_CONFIG    = $(Dynamic) ;         # Config files that are changed infrequently but accessed often
SEC_LOG       = $(Growing) ;         # Files that grow, but that should never change ownership
SEC_INVARIANT = +tpug ;              # Directories that should never change permission or ownership
SIG_LOW       = 33 ;                 # Non-critical files that are of minimal security impact
SIG_MED       = 66 ;                 # Non-critical files that are of significant security impact
SIG_HI        = 100 ;                # Critical files that are significant points of vulnerability


而recurse=n就是定义递归深度,0为目录本身这一层。
根据这些定义,我们就可以按照不同的操作系统版本或应用,对策略文件进行裁减和增加,以满足我们的要求。(要知道,全部文件都验证是非常耗费资源和时间的,也是不必要的)
这些命令可以对指定的文件或目录检测:

tripwire -m c /bin/cp /etc


也可以对某一规则检测:

tripwire -m c --rule-name "My check files"


还可以对某一等级检测:

tripwire --check --severity 50


4、提高安全性
从前面的介绍可以看到,tripwire对系统完整性的检查,关键是依赖于数据库的情况。而数据库也是可以被重新初始化的。因此,如果数据库和被验证的机器一同存放,则万一机器被***,是无法判断数据库是否就是正常的“原始”状态。
所以,对于重要的系统,可以把数据库备份到只读的介质上(例如光盘),或备份到远端安全机器中,然后通过ssh等远程协议进行校验的工作。(本机校验也可能因crond给修改而带来问题)
当然,这种方式需要注意两点:

引用
a)定时更新数据库,并备份;
b)只有重要的系统需要这样做,而一般crond的计划工作都是可以信任的。


5、参考文章:
http://www.xsec.org/index.php?module=archives&act=view&type=3&id=14
ppt教程文件:

 
--------------------------------------------------------------------------------------------------------------------------------------------------
 
 
.配置文件:定义数据库、策略文件和Tripwire可执行文件的位置:
/usr/local/tripwire/etc/twcfg.txt
.策略:定义检测的对象及违规时采取的行为:
/usr/local/tripwire/etc/twpol.txt
.数据库:用于存放生成的快照:
/usr/local/tripwire/lib/tripwire/$(HOSTNAME).twd
   另外,Tripwire为了自身的安全,防止自身被篡改,也会对自身进行加密和签名处理。其中,包括两个密钥:
.site密钥:用于保护策略文件和配置文件,只要使用相同的策略和配置的机器,都可以使用相同的site密钥:
/usr/local/tripwire/etcsite.key
.local密钥:用户保护数据库和分析报告,这肯定不会重复的:
/usr/local/tripwire/etc/$(HOSTNAME)-local.key
2.设置tripwire
vi /etc/tripwire/twcfg.txt  ← 修改文本格式的Tripwire配置文件
LOOSEDIRECTORYCHECKING =false  ← 找到这一个行,将false的值变为true(不监测所属目录的数据完整性)

LOOSEDIRECTORYCHECKING =true   ← 变为此状态
REPORTLEVEL =3  ← 找到这一行,将3变为4(改变监测结果报告的等级)

REPORTLEVEL =4  ← 变为此状态
#/usr/local/tripwire/sbin/twadmin --create-cfgfile -S site.key twcfg.txt ← 从文本配置文件建立加密格式配置文件
Please enter your site passphrase: ← 输入“site keyfile”口令
Wrote configuration file: /usr/local/tripwire/etc/tw.cfg
编辑twpol.txt来控制对哪些目录进行检查,把不需要扫描的路径注释或删除即可.
修改完成后保存twpool.txt文件。
3.初始化数据库
#/usr/local/tripwire/sbin/tripwire --init
Please enter your local passphrase: ← 输入“local keyfile”口令
Parsing policy file: /usr/local/tripwire/etc/tw.pol
Generating the database...
*** Processing Unix File System ***
The object: "/sys" is on a different file system...ignoring.
-------------------
------过程---------
------省略---------
-------------------
Wrote database file: /usr/local/tripwire/lib/tripwire/localhost.localdomain.twd
The database was successfully generated.
4.更新数据库
当你更新了twpol.txt后需用此命令更新数据库
cd /usr/local/tripwire
#./sbin/tripwire --update-policy --secure-mode low /usr/local/tripwire/etc/twpol.txt
Parsing policy file: /usr/local/tripwire/etc/twpol.txt
Please enter your local passphrase: ← 输入“local keyfile”口令
Please enter your site passphrase: ← 输入“site keyfile”口令
======== Policy Update: Processing section Unix File System.
======== Step 1: Gathering information for the new policy.
The object: "/sys" is on a different file system...ignoring.
-------------------
------过程---------
------省略---------
-------------------
Wrote policy file: /usr/local/tripwire/etc/tw.pol
Wrote database file: /usr/local/tripwire/lib/tripwire/localhost.localdomain.twd
5.检查文件异动
安装完tripwire后你可以定期检查文件是否存在异动
加上interactive在当前显示结果
./sbin/tripwire --check --interactive
Parsing policy file: /usr/local/tripwire/etc/tw.pol
*** Processing Unix File System ***
-------------------
------过程---------
------省略---------
-------------------
6.查看报告
所有tripwire的报告以.twr后缀保存在lib/tripwire目录下,需要使用twprint命令来转化成文本格式
#./sbin/twprint --print-report --twrfile./lib/tripwire/report/localhost.localdomain-20100225-164220.twr>/tmp/tripwire_readable.txt
#cat /tmp/tripwire_readable.txt