|
入侵检测
(入侵后检测)
(入侵中检测)
tripwire
你下载一个软件,会有md5值或数据签名等方法来让你验证这个软件是否被人恶意修改过.这也是一种完整性检测。
你的操作系统里有很多重要的文件(如/etc/passwd,/etc/shadow,各种命令等),也不能被人恶意修改,如果你怀疑有人入侵了你的操作系统,如何检测出哪些文件被修改过内容或属性等?
tripwire软件就可以帮你解决。
完整性检测
md5或者rpm等都可以对单个文件做完整性检测
rpm -Vf
缺点1:只针对安装的rpm包里的文件做完整性检测,无法对自建的文件做检测
缺点2:只能检测单个文件,你需要写脚本循环去检测多个文件
# rpm -Vf /etc/php.ini --这个文件是rpm版的php的配置文件,第一次使用这个命令,没有任何显示,表示此文件没有做过任何的改变
# rpm -Vf /etc/php.ini --对这个文件做微小的改变后,再执行此命令就会有信息了
S.5....T. c /etc/php.ini
man rpm
--有下面的命令帮助
S file Size differs
M Mode differs (includes permissions and file type)
5 MD5 sum differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
1,安装
软件包路径
笔记目录/arch/tripwire_soft/
clearpol.pl
tripwire-2.4.1.2-11.el6.x86_64.rpm
# rpm -ivh tripwire-2.4.1.2-11.el6.x86_64.rpm
# ls /etc/tripwire/
twcfg.txt --定义tripwire各个相关文件的路径
twpol.txt --定义检测的对象文件,及违规时采取的行为
# cat /etc/tripwire/twcfg.txt --查看此文件,有以下相关的文件定义
/var/lib/tripwire/$(hostname).twd --用于存放生成的快照
/var/lib/tripwire/report/ --存放检测的报告
tripwire为了自身的安全,设定了两个密码文件
/etc/tripwire/site.key --用于保护策略文件和配置文件
/etc/tripwire/$(HOSTNAME)-local.key --用于保护数据库和分析报告
2,建立两个密码文件
# tripwire-setup-keyfiles
Enter the site keyfile passphrase:
Verify the site keyfile passphrase: --输入你设定的site密码两次
Generating key (this may take several minutes)...Key generation complete.
Enter the local keyfile passphrase:
Verify the local keyfile passphrase: --输入你设定的local密码两次
Generating key (this may take several minutes)...Key generation complete.
Signing configuration file... --签名配置文件
Please enter your site passphrase: --输入刚设定好的site密码
Wrote configuration file: /etc/tripwire/tw.cfg
Signing policy file... --签名策略文件
Please enter your site passphrase: --输入刚设定好的site密码
Wrote policy file: /etc/tripwire/tw.pol
# ls /etc/tripwire/ --做完后,就会多产生几个配置文件了
li.cluter.com-local.key site.key tw.cfg twcfg.txt tw.pol twpol.txt
3,修改默认配置文件
rpm版
# man twpolicy --可以查看策略帮助
# - ignore the following properties
# + check the following properties
#
# a access timestamp (mutually exclusive with +CMSH)
# b number of blocks allocated
# c inode creation/modification timestamp
# d ID of device on which inode resides
# g group id of owner
# i inode number
# l growing files (logfiles for example)
# m modification timestamp
# n number of links
# p permission and file mode bits
# r ID of device pointed to by inode (valid only for device objects)
# s file size
# t file type
# u user id of owner
#
# C CRC-32 hash
# H HAVAL hash
# M MD5 hash
# S SHA hash
Device = +pugsdr-intlbamcCMSH ;
Dynamic = +pinugtd-srlbamcCMSH ;
Growing = +pinugtdl-srbamcCMSH ;
IgnoreAll = -pinugtsdrlbamcCMSH ;
IgnoreNone = +pinugtsdrbamcCMSH-l ;
ReadOnly = +pinugtsdbmCM-rlacSH ;
Temporary = +pugt ;
===============================================================
--以twpol.txt下面这一段为例来说明它这个默认策略文件定义的意思
(
rulename = "Tripwire Binaries",
severity = $(SIG_HI)
)
{
$(TWBIN)/siggen -> $(SEC_BIN) ;
$(TWBIN)/tripwire -> $(SEC_BIN) ;
$(TWBIN)/twadmin -> $(SEC_BIN) ;
$(TWBIN)/twprint -> $(SEC_BIN) ; --这四个文件都要被以SEC_BIN的检测等级来检测
}
--然后又找到有这句变量定义
SEC_BIN = $(ReadOnly) ;
--又有下面这句的定义(rpm版里要man twpolicy去找,source版里有)
ReadOnly = +pinugtsdbmCM-rlacSH ;
==================================================================
现在/etc/tripwire/twpol.txt已经默认定义了非常多的文件,如果我们系统有一部分文件没有,则初始化是会有相当多的警告。
1,你可以忽略这些警告
2,用一个perl脚本,先去帮你对照一下它默认定义的文件在你的系统是否存在
--关于这一步,也可以尝试使用shell脚本去写一下
# vim 笔记目录/arch/tripwire_soft/clearpol.pl
while (<> ) {
CASE:{
( m|(^\s*)(/[/\w\.\_\-]+)(\s+->.*)| ) and do {
print $1;
print "#" unless (-e $2);
print "$2$3\n";
last;
};
print $_;
}
};
# cp 笔记目录/tripwire_soft/clearpol.pl /etc/tripwire/
# cd /etc/tripwire/
# perl clearpol.pl twpol.txt > newtwpol.txt --使用perl命令去运行这个脚本,把twpol.txt里定义的文件和你系统实际存在的文件比较,不存在就把它注释掉,然后保存为一个叫newtwpol.txt文件
# diff twpol.txt newtwpol.txt --你可以diff命令对比验证一下,然后ls检测一下它注释的文件确实是你的系统不存在的
--新生成的newtwpol.txt文件,你可以按照实际情况改一改(不要的注释,还想加的手动加上去等);如:
注释:
#/var/run/
#/var/log
#/dev/tty1
#/dev/tty2
#/dev/tty3
#/dev/tty4
#/dev/tty5
#/dev/tty6
如何自定义要检测的目录,
我在newtwpol.txt里的最后加上下面一段
(
rulename = "notes",
severity = $(SIG_HI)
)
{
/share/weekend2 -> $(SEC_BIN);
!/share/weekend2/shell ; --此目录内的变化不检测
}
4,把修改好的文件,定入policy文件
# twadmin -m P newtwpol.txt --将修改完毕的文件,编码写入policy file
Please enter your site passphrase:
Wrote policy file: /etc/tripwire/tw.pol
# file /etc/tripwire/tw.pol --把你修改好的策略都写入了这个数据文件里
/etc/tripwire/tw.pol: data
5,初始化
# tripwire --init --通过上一步的数据文件来初始化数据库文件(就相当于是对你所有的配置做了数字签名)
Please enter your local passphrase:
Parsing policy file: /etc/tripwire/tw.pol
Generating the database...
*** Processing Unix File System *** --在这里时间较长,几分钟左右
Wrote database file: /var/lib/tripwire/li.cluter.com.twd --数据库文件路径
The database was successfully generated.
6,
# tripwire --check --对所有定义的文件进行一次检测,速度较慢
Wrote report file: /var/lib/tripwire/report/li.cluter.com-20141105-164717.twr --检测完的报告,时间格式为系统的年月日-时分秒
--你可以把命令每天或每一个周期用crontab周期性执行,就可以知道这一个周期内哪些文件变动过
# tripwire --check --rule-name notes --指定只检测的定义的规则名
查看历史报告,可以看到更详细的信息
# twprint --print-report --twrfile /var/lib/tripwire/report/li.cluter.com-20141105-164717.twr
一般为了安全性,在写入数据库之后,把明文的twpol.txt文件给删除
# rm /etc/tripwire/twpol.txt -rf
# rm /etc/tripwire/newtwpol.txt -rf
7,策略如何更新?
a),导出正在使用的策略
# twadmin -m p >/etc/tripwire/twpol.txt
b),按照需求对其进行修改
c),再导进去
# twadmin -m P /etc/tripwire/twpol.txt
d),重新生成数据文件
#tripwire --init
=================================================================
IDS 入侵检测系统
snort
软件包路径
笔记目录/arch/snort_soft/
安装PDF文档
笔记目录/arch/pdf/snort-centos6x-7x-rev1.pdf
安装过程
第一步:安装snort
# yum groupinstall "Development tools" -y
# yum install pcre-devel
# rpm -ivh libpcap-1.4.0-1.20130826git2dbcaa1.el6.x86_64.rpm
# rpm -ivh libpcap-devel-1.4.0-1.20130826git2dbcaa1.el6.x86_64.rpm
# tar xf libdnet-1.11.tar.gz -C /usr/src/
# cd /usr/src/libdnet-1.11/
# ./configure --with-pic
# make
# make install
# echo /usr/local/lib > /etc/ld.so.conf.d/snort.conf
# ldconfig
# tar xf daq-2.0.4.tar.gz -C /usr/src/
# cd /usr/src/daq-2.0.4/
# ./configure
# make
# make install
# echo /usr/local/lib/daq >> /etc/ld.so.conf.d/snort.conf
# ldconfig
# tar xf snort-2.9.7.2.tar.gz -C /usr/src/
# cd /usr/src/snort-2.9.7.2/
#./configure --enable-sourcefire
# make
# make install
# ldconfig
第二步:
建立配置文件目录,拷贝相应的配置文件和规则文件;并建立启动daemon的用户
# mkdir /etc/snort
# cp /usr/src/snort-2.9.7.2/etc/* /etc/snort/
# tar xf 笔记目录/arch/snort_soft/snortrules-snapshot-2972.tar.gz -C /etc/snort/
# cp /etc/snort/etc/* /etc/snort/
cp: overwrite `/etc/snort/classification.config'? y
cp: overwrite `/etc/snort/reference.config'? y
cp: overwrite `/etc/snort/sid-msg.map'? y
cp: overwrite `/etc/snort/snort.conf'? y
cp: overwrite `/etc/snort/threshold.conf'? y
cp: overwrite `/etc/snort/unicode.map'? y
# touch /etc/snort/rules/{white_list.rules,black_list.rules}
# useradd -s /sbin/nologin snort
# chown -R snort.snort /etc/snort/
# mkdir /var/log/snort
# chown snort.snort /var/log/snort
第三步:
配置主配置文件
# vim /etc/snort/snort.conf
45 ipvar HOME_NET 10.1.1.0/24 --监控的内网网段
48 ipvar EXTERNAL_NET !$HOME_NET --外网网段为非内网
104 var RULE_PATH /etc/snort/rules --这几句必须改成绝对路径,如果用默认的相对路径,其它参数在调用时,相对的目录就不一样了
105 var SO_RULE_PATH /etc/snort/so_rules
106 var PREPROC_RULE_PATH /etc/snort/preproc_rules
109 var WHITE_LIST_PATH /etc/snort/rules
110 var BLACK_LIST_PATH /etc/snort/rules
183 config logdir: /var/log/snort --设置log目录
518 output unified2: filename merged.log, limit 128 --配置输出插件,只要第一个limit 128
第四步:
拷贝服务启动脚本和全局配置文件
# cp /usr/src/snort-2.9.7.2/rpm/snortd /etc/init.d/
# chmod 755 /etc/init.d/snortd
# vim /etc/init.d/snortd
47 INTERFACE="-i br0" --我这里试验机网卡是br0,所以把eth0改成了br0
# cp /usr/src/snort-2.9.7.2/rpm/snort.sysconfig /etc/sysconfig/snort
# vim /etc/sysconfig/snort
15 INTERFACE=br0 --我这里试验机网卡是br0,所以把eth0改成了br0
第五步:
sort自我检测
# snort -T -i br0 -u snort -g snort -c /etc/snort/snort.conf --让snort做自我检测
报错1:
snort: error while loading shared libraries: libdnet.1: cannot open shared object file: No such file or directory
解决方法:
# ln -s /usr/local/lib/libdnet.1 /lib64/libdnet.1
报错2:
ERROR: /etc/snort/snort.conf(249) Could not stat dynamic module path "/usr/local/lib/snort_dynamicrules": No such file or directory.
Fatal Error, Quitting..
解决方法:
# mkdir /usr/local/lib/snort_dynamicrules/
# chmod 700 /usr/local/lib/snort_dynamicrules/
# chown snort.snort /usr/local/lib/snort_dynamicrules/
# cp /etc/snort/so_rules/precompiled/RHEL-6-0/x86-64/2.9.7.2/* /usr/local/lib/snort_dynamicrules/
# snort -T -i br0 -u snort -g snort -c /etc/snort/snort.conf --再让snort做自我检测,最后报如下两句,则表示成功
......
......
......
Snort successfully validated the configuration!
Snort exiting
第六步:
启动snortd服务
# /etc/init.d/snortd start --启动服务
报错:
Starting snort: /bin/bash: /usr/sbin/snort: No such file or directory
[FAILED]
解决方法:
因为脚本里写的snort命令路径为/usr/sbin/snort,而我们安装在/usr/local/bin/snort
# ln -s /usr/local/bin/snort /usr/sbin/snort
# /etc/init.d/snortd start --再次启动,就成功了
Starting snort: Spawning daemon child...
My daemon child 27533 lives...
Daemon parent exiting (0)
[ OK ]
# ps -ef |grep -i snort |grep -v grep --查到相关进程
snort 11594 1 0 15:40 ? 00:00:00 /usr/sbin/snort -A fast -b -d -D -i br0 -u snort -g snort -c /etc/snort/snort.conf -l /var/log/snort
# /usr/sbin/snort -A fast -b -d -D -i br0 -u snort -g snort -c /etc/snort/snort.conf -l /var/log/snort --或者不用服务脚本启动,直接用此命令启动也可以
第七步:测试snort
# vim /etc/snort/rules/local.rules --这是/etc/snort/snort.conf里读取的N条规则中的其中一条,是个空文件,以它做测试,写上下面一条规则(表示任何icmp包都会警告)
alert icmp any any -> any any (msg:"ICMP Testing Rule"; sid:1000001;)
# /etc/init.d/snortd restart
然后使用任意IPping本机,会发现/var/log/snort/alert里有警告信息
# snort -A console -i br0 -u snort -g snort -c /etc/snort/snort.conf --或者使用-A console指令启动snort让所有警告信息都直接显示到终端
关于snort规则的编写这里不再详细讨论,可以自行写几个规则加到local.rules里去测试
alert tcp any any -> 10.1.1.35/24 80 (msg:"http access warnings"; sid:1000002;)
总结:
snort安装后,就已经安装了一些常见的规则库(由snortrules-snapshot提供),如果你有能力,可以自己定制规则
扩展:
有兴趣可以去尝试下面的方案
snort+barnyard2+base+adobe
=====================================================================
安全有关的回顾:
iptables
加密(磁盘加密,文件加密,网络传输加密VPN)
pam
selinux
sudo
tripwire
snort
===================================================================
linux系统优化,调优
(微调)
1,系统安装前规则
a,分区:不同环境不同分法,按自己的需求来。
以教学环境500G硬盘为例
/boot 100M-200M (只存放grub和启动有关文件,不存放其它)
/ 80G-100G(因为很多人默认会把各种东西放到根目录下,没有单独挂载的分区都属于根);
swap 内存小就一般分2倍,内存大(现在的服务器16G以上内存很常见)就最大4G或8G
/var 50-100G (主要存放日志,邮件,ftp,httpd等家目录,kvm的磁盘文件等)
/vm 50-100G (主要存放vmware虚拟机)
/data 50G左右 (主要存放你的个人数据)
因为教学需要,还需要留一点空间用于以后分区用。
如果你的系统出了严重问题,能排错就排错,不能或很麻烦在重装时只格式化根分区就可以了,重装完后,改写/etc/fstab
根分区分得太小,满了怎么办?如果是lvm可以在线扩容,没用lvm没办法(除非用新一代文件系统如btrfs这种)
b,软件包的选择:你需要啥就安装啥(如果你非常在意系统瘦身,那么选择最小化安装,再安装应用时少啥就装啥)
2,关闭不用的服务 (service xxx stop 或 chkconfig xxx off或 ntsysv --level 2345)
有几个服务记录不要关闭了:haldaemon,messagebus这两个服务关闭任意一个,就造成开机鼠标键盘无法用
常见的不关闭服务:network,sshd等
(如果你也非常在意运行的服务的优化,你可以考虑更细一些,比如:updatedb是每天会执行一次更新locate命令数据库的指令,如果你不用locate命令,可以把/etc/cron.daily/mlocate.cron脚本给注释掉)
3,主机名配置和绑定
4,静态IP
5,yum配置
一般不可能所有服务器都用公网的yum源。建议把本地iso和第三方下载的rpm包都在其中一台服务器做成yum仓库,其他服务器就直接使用这台的yum源就可以了
如何下载
a),先配置远程公网yum源路径
如下
[puppet]
name=puppet
baseurl=http://yum.puppetlabs.com/el/6.5/products/x86_64/
enabled=1
gpgcheck=0
b)使用reposync命令
reposync --repoid=puppet
都会下载到本地当前目录
c)因为下载后,没有repodata目录,所以需要手动生成
yum install createrepo -y
createrepo 下载的目录路径/
d)通过服务如httpd做成其它服务器能使用的yum源
6,pam,iptables或selinux的配置
7,用户有关的:
a,创建要用的普通用户(如果一个用户只用于跑服务daemon,可以指定家目录为/dev/null,uid小于500,登录环境为/sbin/nologin等,如useradd -r -d /dev/null -s /sbin/nologin xxx)
b,做完后,保证/etc/passwd,/etc/shadow等文件的安全(如,不需要修改就chattr +i /etc/passwd,chattr +i /etc/shadow)
c,对相应的普通用户做sudo授权
8,重要的文件权限的配置;比如一些自己的很重要的文件,chmod 700 xxx 或 chmod 600 xxx
9, 如果有必要,并且技术水平成熟的情况下,可以重新编译升级内核
问题:OS自带的内核非常稳定,什么情况下需要自己编译内核?
答案:内核如果不支持你所需要的一个功能,可以重编内核来加上这个功能。但是一般来说,没有内核不支持的功能,但redhat自带的内核不一定给你加上了这个功能。
比如,要在linux下支持ntfs格式挂载,方法有:
一,重编内核,加上ntfs挂载功能(因为redhat默认没有加到内核里,但内核是支持的)
二,用第三方软件,把功能做成模块加到内核上,让其支持
还有一个情况需要自己编译内核,就是内核编译优化,简单来说就是把内核里自己用不到的功能都去掉,只留下自己用得到的功能。
注意:生产环境不建议你真的去编译内核,因为你很难编译出一个稳定且正符合你所用的内核。
重编译内核或新内核的步骤:
a)下载新内核源码,解压;OS自带内核源码在(/usr/src/kernels/`uname -r`/,如果此内核源码目录不存在,可以通过yum install kernel-devel -y安装)
b)cd 内核源码目录/
c)make menuconfig
按你需求来选择功能
* 代表编进内核
M 代表编译成模块 需要modprobe xxx装载才能使用
空 代表不需要这个功能
d) 选择好功能后,保存,会把你所有的选择保存到一个.config文件里
e) make
f) make modules_install --把编译后的模块复制到/lib/modules/内核新版本/ 以后就可以用modprobe insmod来装载使用
g) make install
h) reboot 重启你的系统,在grub菜单选择新的内核登录你的OS
10,文件系统
ext2,ext3,ext4,fat32,ntfs,xfs,reiserfs,zfs,btrfs,jfs,nfs,gfs2,ocfs......
下面以rhel6默认ext4为例简单讨论ext4的优化
a,单个文件可以chattr +A xxx 让这个文件的atime不变化(因为atime是文件的访问时间,基本没什么实用价值,所以让其不变化,就是一种优化)
b,只优化单个文件肯定不行,所以需要优化整个文件系统让所有文件atime都不变化
在rhel5里cat一次,atime就会变一次
在rhel6里只有当atime时间早于或等于mtime或ctime之一时,cat这个文件,atime才会变(因为rhel6已经做了相对的优化,主要实现的方法是在mount时加了relatime)
但我们想优化更彻底,那么让atime在任何情况下都不会变,做法为:
# mount -o defaults,noatime /dev/sda7 /test/ --这样做后,/dev/sda7这个分区里的所有文件都不变改变atime了
所有分区都要这样做,就在/etc/fstab里把所有分区的defaults参数后加,noatime就可以了
c,Ext4 提供三种数据日志记录方式: data=writeback 、 data=ordered (默认) data=journal。
data=writeback 速度最快,但不记录文件系统日志,只记录基本元数据,数据安全性低
data=journal 速度最慢。但记录完整文件系统日志,数据安全性高
data=ordered 居中
如果要修改,在mount时用-o data=writeback来挂载就可以.或者在/etc/fstab里defaults,data=writeback就可以了
小实验:
用一个实验分区,分三种日志记录方式去挂载,然后使用dd命令写文件来测试比较速度
mount -o defaults,data=writeback /dev/sda7 /test/
cd /test
dd if=/dev/zero of=test
--最快
mount -o defaults,data=journal /dev/sda7 /test
cd /test
dd if=/dev/zero of=test
--最慢
mount -o defaults,data=ordered /dev/sda7 /test
cd /test
dd if=/dev/zero of=test
--居中
11,内核参数优化 (不是内核编译,是内核参数修改)
|
|