缓冲区溢出攻击是目前黑客最常用的攻击手段之一,为了应对不断涌现的缓冲区溢出攻击,我们研究了在Linux系统下防范缓冲区溢出的方法,通过研究,总结了在Linux平台下防范缓冲区溢出攻击的安全策略
启动系统的"rc"脚本
/etc/rc.d目录下"rc"开头的文件是用来启动系统的初始化文件的。rc系列文件与Ms- Dos系统下的autoexec.bat很类似。rc的意思是"runtime commands"。它们决定了init进程要启动哪些服务。redhat系统下,这些脚本在/etc/rc.d/rc3.d(如果系统以x为默认启动的话,就是/etc/rc.d/rc5.d)。要在启动时禁止某个服务,只需要把大写的S替换为小写的s,同时,redhat也提供一个工具来帮助你关闭服务,输入/usr/sbin/setup,然后选择"system services",就可以定制系统启动时运行哪些服务。另外一个选择是chkconfig命令,很多linux版本的系统都自带这个工具。脚本名字中的数字是启动的顺序,以大写的K开头的是用来杀死进程的。 如将S50snmpd(SNMP简单网络管理协议,远程用户能从中获得许多系统信息)改为s50snmpd,则系统启动时将不会启动这项服务。
用下列命令察看在关闭启动脚本之前有多少服务在运行:
suneagle# ps -eaf|wc -l
有两个非常有用的工具:ps -xau(输出大量的有关系统运行的信息)和netstat -vat(列出所有和网络相关的信息)。运行他们就可以知道系统在提供、运行哪些服务。
处理"services"文件
端口号和标准服务之间的对应关系在RFC1700"Assigned Numbers"中有详细的定义。"/etc/services"文件使得服务器和客户端的程序能够把服务的名字转成端口号,这张表在每一台主机上都存在,其文件名是"/etc/services"。只有"root"用户才有权限修改这个文件,而且在通常情况下这个文件是没有必要修改的,因为这个文件中已经包含了常用的服务所对应的端口号。为了提高安全性,我们可以给这个文件加上保护以避免没有经过授权的删除和改变。为了保护这个文件可以用下面的命令
[root@snow]# chattr +i /etc/services
改变"/etc/rc.d/init.d/"目录下脚本文件的访问许可
通过以下方式改变启动和停止daemon的脚本文件的权限。
[root@snow]# chmod -R 700 /etc/rc.d/init.d/*
这样只有root可以读、写和执行这一脚本,因为一般用户不需要知道脚本文件的内容。
使系统对ping没有反应
防止系统对ping请求做出反应,对于网络安全是很有好处的,因为没人能够ping你的服务器并得到任何反应。TCP/IP协议本身有很多的弱点,黑客可以利用一些技术,把传输正常数据包的通道用来偷偷地传送数据。使你的系统对ping请求没有反应,可以把这个危险减到最小。使用下面的命令:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
运行完这个命令后,系统对ping就没有反应了。可以把这一行加到"/etc/rc.d/rc.local"文件中去,这样当系统重新启动时,该命令就会自动运行。对ping命令没有反应,至少可以把绝大多数的黑客排除到系统之外,因为黑客不可能知道你的服务器在哪里。重新恢复对ping的响应,可以使用下面的命令:
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all"
用ssh代替telnet
SSH协议在开始设计时的目的就是提供尽可能安全的远程存取方式。它可以用来进行任何基于网络的信息传递,而且适应性很强。Linux、Unix、NT等系统都可以使用。由于在和远程交互时,传递的密钥、认证信息等都是加密的,所以安全性能很好。用ssh完全取代telnet/ftp,它能够确保数据在网络中的安全传输。
取消普通用户的控制台访问权限
应该取消普通用户的控制台访问权限,比如shutdown、reboot、halt等命令。
[root@kapil /]# rm -f /etc/security/console.apps/<servicename>
其中是要注销的程序名。
Shell logging
Bash shell在"~/.bash_history"("~/"表示用户目录)文件中保存了500条使用过的命令,这样可以使你输入使用过的长命令变得容易。每个在系统中拥有账号的用户在他的目录下都有一个".bash_history"文件。bash shell应该保存少量的命令,并且在每次用户注销时都把这些历史命令删除。具体操作步骤如下:
(1)"/etc/profile"文件中的"HISTFILESIZE"和"HISTSIZE"行确定所有用户的".bash_history"文件中可以保存的旧命令条数。建议把"/etc/profile"文件中的"HISTFILESIZE"和"HISTSIZE"行的值设为一个较小的数,比如30。编辑profile文件(vi /etc/profile),把下面这行改为:
HISTFILESIZE=30
HISTSIZE=30
这表示每个用户的".bash_history"文件只可以保存30条旧命令。
(2)网络管理员还应该在"/etc/skel/.bash_logout" 文件中添加一行"rm -f $HOME/.bash_history"。这样,当用户每次注销时,".bash_history"文件都会被删除。
编辑.bash_logout文件(vi /etc/skel/.bash_logout),添加下面这行:
rm -f $HOME/.bash_history
禁止Control-Alt-Delete键盘关闭命令
在"/etc/inittab" 文件中注释掉下面这行(使用#):
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
改为:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
为了使这项改动起作用,输入下面这个命令:
[root@kapil /]# /sbin/init q
带"s"位的程序
缓冲区溢出漏洞和suid/sgid程序的关系紧密,带"s"位的程序往往是系统不安全的根源。应该尽量将不必要的带"s"位的程序删除。
用ls -l命令列出来的文件,如果文件的权限位中出现"s",则这些文件的SUID(-rwsr-xr-x)或SGID(-r-xr-sr-x)位被设定了。因为这些程序给执行它的用户一些特权,所以如果不需要用到这些特权,最好把这些程序的"s"位移去。可以用下面的这个命令"chmod a -s <文件名>"移去相应文件的"s"位。
可以清除"s"位的程序包括:从来不用的程序;不希望非root用户运行的程序;偶尔用用,但是不介意先用su命令变为root后再运行的程序。
下面加了星号(*)的程序有必要移去"s"位。注意,系统可能需要一些SUID的程序才能正常运行,所以要小心。
用下面的命令查找所有带"s"位的程序:
[root@snow]# find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls -lg {};
*-rwsr-xr-x 1 root root 35168 Sep 22 23:35 /usr/bin/chage
*-rwsr-xr-x 1 root root 36756 Sep 22 23:35 /usr/bin/gpasswd
*-r-xr-sr-x 1 root tty 6788 Sep 6 18:17 /usr/bin/wall
-rwsr-xr-x 1 root root 33152 Aug 16 16:35 /usr/bin/at
-rwxr-sr-x 1 root man 34656 Sep 13 20:26 /usr/bin/man
-r-s--x--x 1 root root 22312 Sep 25 11:52 /usr/bin/passwd
-rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/suidperl
-rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/sperl5.00503
-rwxr-sr-x 1 root slocate 24744 Sep 20 10:29 /usr/bin/slocate
*-rws--x--x 1 root root 14024 Sep 9 01:01 /usr/bin/chfn
*-rws--x--x 1 root root 13768 Sep 9 01:01 /usr/bin/chsh
*-rws--x--x 1 root root 5576 Sep 9 01:01 /usr/bin/newgrp
*-rwxr-sr-x 1 root tty 8328 Sep 9 01:01 /usr/bin/write
-rwsr-xr-x 1 root root 21816 Sep 10 16:03 /usr/bin/crontab
*-rwsr-xr-x 1 root root 5896 Nov 23 21:59 /usr/sbin/usernetctl
*-rwsr-xr-x 1 root bin 16488 Jul 2 10:21 /usr/sbin/traceroute
-rwxr-sr-x 1 root utmp 6096 Sep 13 20:11 /usr/sbin/utempter
-rwsr-xr-x 1 root root 14124 Aug 17 22:31 /bin/su
*-rwsr-xr-x 1 root root 53620 Sep 13 20:26 /bin/mount
*-rwsr-xr-x 1 root root 26700 Sep 13 20:26 /bin/umount
*-rwsr-xr-x 1 root root 18228 Sep 10 16:04 /bin/ping
*-rwxr-sr-x 1 root root 3860 Nov 23 21:59 /sbin/netreport
-r-sr-xr-x 1 root root 26309 Oct 11 20:48 /sbin/pwdb_chkpwd
用下面的命令禁止上面选出来的SUID的程序:
[root@snow]# chmod a-s /usr/bin/chage
[root@snow]# chmod a-s /usr/bin/gpasswd
[root@snow]# chmod a-s /usr/bin/wall
[root@snow]# chmod a-s /usr/bin/chfn
[root@snow]# chmod a-s /usr/bin/chsh
[root@snow]# chmod a-s /usr/bin/newgrp
[root@snow]# chmod a-s /usr/bin/write
[root@snow]# chmod a-s /usr/sbin/usernetctl
[root@snow]# chmod a-s /usr/sbin/traceroute
[root@snow]# chmod a-s /bin/mount
[root@snow]# chmod a-s /bin/umount
[root@snow]# chmod a-s /bin/ping
[root@snow]# chmod a-s /sbin/netreport
创建FTP日志
对于FTP服务器,可以通过修改/etc/ftpaccess或者/etc/inetd.conf,来保证每一个ftp连接日志都能够记录下来。下面是一个修改inetd.conf的例子:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o
-l:每一个ftp连接都写到syslog
-L:记录用户的每一个命令
-I:文件received,记录到xferlog
-o:文件transmitted,记录到xferlog
以上就是我们通过研究总结出来的在Linux平台下防范缓冲区溢出攻击的一些安全策略,在实际使用中,我们发现通过这些安全策略的配置能够对缓冲区溢出攻击起到一定的防范措施。当然,这些安全措施还不够完善,还需要进一步的改进。