原文地址:
以前的日志中也曾经提到,由于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文件中:
改为
保存后,运行:
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、参考文章: