自由论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1084|回复: 0
打印 上一主题 下一主题

【学习笔记】入侵检测

[复制链接]

85

主题

97

帖子

9829

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9829
跳转到指定楼层
楼主
发表于 2016-3-13 16:18:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
入侵检测
(入侵后检测)
(入侵中检测)



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,内核参数优化 (不是内核编译,是内核参数修改)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Prostar Inc.

GMT+8, 2024-11-22 19:13 , Processed in 0.032767 second(s), 9 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表