-- 入侵检测 (入侵后检测) (入侵中检测) 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,内核参数优化 (不是内核编译,是内核参数修改)