原始连接:
http://www.iscraft.com/blog/?action=show&id=23
一年多以前整理的FreeBSD安全配置手册,有些许不同,但或者对一些新上手的兄弟还有些用。
FreeBSD安全配置手册v1.0
inburst@yahoo.com
http://xfocus.org/
目录
第一部份:目的
第二部份:内容
一、必选配置选项
1、取消控制台信任设置
2、配置telnetd服务器
3、配置ftpd服务器
4、对inetd超级服务器里的其它服务做审核
5、检查/etc/rc.conf及/etc/default/rc.conf文件
二、推荐配置选项
1、使用ssh替代telnet及ftp
2、使用ipfilter进行加固
3、加入hosts.allow及hosts.deny
4、安全日志记录
5、设置安全级别
6、限制用户所能使用的资源
7、保证suid,sgid可执行程序的安全
三、参考配置选项
1、控制能su成root的用户
2、删除不必要的预置用户和组
3、改变系统的核心变量达到对外屏闭服务器没有使用的端口
4、关闭对广播类型的响应
5、对udp包的校验和计算
6、设置取消ctrl-alt-del组合键重启系统
四、参考FreeBSD技巧
1、更改shell并在配置文件中做设置
2、更改telnet banner
3、更改ftp banner
五、参考安全工具
1、tripwire
2、john
3、nmap
第三部份:目前本系统的补丁情况
一、FreeBSD补丁方法
1、下载并检查完整性
2、patch源文件
3、编译安装
4、攻击测试
二、FreeBSD补丁下载地点
三、FreeBSD官方安全邮件列表
第四部份:系统应用程序可能存在的安全问题
第五部份:施工注意事项
一、配置
1、对极其重要,不能中止服务的主机
2、对可以暂时停止服务进行配置工作的主机
二、审核
1、如何发现入侵
2、紧急处理需知
3、如何进行审核
目的
尽管BSD系列的操作系统发行版比大多数的系统就安全性而言都相对强健,但默认安装仍然存在许多脆弱点,同时它仍然有许多可以进一步加强的安全特性,因此本篇配置文档旨在让对unix操作系统有一定了解的人员能够通过阅读文档对照操作,将一台FreeBSD的服务器配置成安全脆弱性最小化的主机。本文档有一配套文档FreeBSD security checklist v1.0。
内容
一、必选配置选项
1、取消控制台信任设置
系统的控制台是一个非常重要的安全弱点所在的位置,因为一个使用者能接触控制台,那么就表示他得到管理人员的特殊信任。系统缺省赋予了控制台终端以较大的安全信任。此外,接触控制台还能从物理上访问系统硬件,包括重新启动系统、将硬盘窃取分析其中的数据等等。然而,物理安全等措施不是在这里要讨论的内容。
设置单用户模式启动需要密码验证
为了避免偶然的非法访问控制台造成的安全问题,所需要设置的第一件任务就是取消控制台的信任设置,这个设置位于/etc/ttys中。
su-2.05# cat /etc/ttys
---------------------snip----------------------
29 # If console is marked "insecure", then init will ask for the root password
30 # when going to single-user mode.
31 console none unknown off secure <--------这行
32 #
33 ttyv0 "/usr/libexec/getty Pc" cons25 on secure
34 # Virtual terminals
35 ttyv1 "/usr/libexec/getty Pc" cons25 on secure
36 ttyv2 "/usr/libexec/getty Pc" cons25 on secure
---------------------snip----------------------
在这里我们需要把上面所指的第31行:
console none unknown off secure
改成
console none unknown off insecure
初始设置为secure表示系统重新启动之后,如果管理员要求进入单用户状态,将不询问root的口令进行验证,这是一个重要的安全漏洞。将secure更改为insecure可以使得进入单用户状态时首先验证root口令。当然它也有可能带来一定的问题,就是:一旦系统损坏了passwd文件(主要是master.passwd文件),root口令无法认证,就没有办法进入单用户状态进行修复工作。解决方法是需要使用安装盘启动fixit 系统进行才能进行修正。
2、配置telnetd服务器
a、/etc/inetd.conf文件修改
设置inetd中服务的原则是尽量不暴露系统本身的信息,而且有必要的记录。就telnetd 而言,可以在telnetd那行后面加个–h:
telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h
从telnetd的手册页可以知道:
-h 在登录成功之前不显示系统相关的信息。
b、telnetd服务器的问题及补丁
在当前FreeBSD所有版本中,也就是FreeBSD 5.0、FreeBSD 4.3、FreeBSD 4.2、FreeBSD 4.1.1、FreeBSD 4.1、FreeBSD 4.0、FreeBSD 3.x、FreeBSD 2.x的版本,其telnetd守护进程中存在一个致命的缓冲区溢出漏洞,该问题是由于telnetd在处理telnet协议选项的函数中没有进行有效的边界检查,当使用某些选项('AYT')时,可能发生缓冲区溢出。这会导致远程root级别的安全威胁。
因此,如果一定要使用telnet服务的话,必须为服务器打上最新的patch,该patch可以从以下链接获得:
(注:通常有两个版本的telnetd服务器,有crypto及无crypto的版本,因此需要判断主机使用的是哪种版本的telnetd,这通常可以通过察看src文件来判断,比如# ls /usr/src/crypto/telnet/telnetd,如果不存在,则说明使用的是无crypto的版本了,在判别清楚之后再分别下载相关补丁文件)
crypto版本补丁:
ftp://ftp.freebsd.org/pub/FreeBS ... elnetd-crypto.patch
ftp://ftp.freebsd.org/pub/FreeBS ... td-crypto.patch.asc
patch方法:
# cd /usr/src/
# patch -p < /path/to/patch
# cd /usr/src/secure/libexec/telnetd
# make depend && make all install
无crypto版本补丁:
ftp://ftp.freebsd.org/pub/FreeBS ... 01:49/telnetd.patch
ftp://ftp.freebsd.org/pub/FreeBS ... 9/telnetd.patch.asc
patch方法:
# cd /usr/src/
# patch -p < /path/to/patch
# cd /usr/src/libexec/telnetd
# make depend && make all install
3、配置ftpd服务器
a、/etc/inetd.conf文件的修改
如果需要启动ftp服务,虽然在inetd.conf中启动ftpd已经使用了-l参数,使ftpd将日志记录发送给syslogd,但是还需要配置syslogd才能接收ftpd发送的记录。如果/etc/syslog.conf文件中没有下面的设置行用于记录ftp的日志,请修改syslog.conf加入。
ftp.* /var/log/ftpd
然后还需要建立/var/log/ftpd文件并且重启syslogd才能使该选项生效:
# touch /var/log/ftpd
# killall -HUP syslogd
这样,每个成功或是失败的 ftp 登录尝试,都会以 LOG_FTP 机制纪录下来。如果-l这个选项被指定了两次,所有的下载 (get),上载(put),新增,删除,建立目录,及改名的操作和文件名都会被纪录下来。
ftp对访问进行了种种限制,这些限制对于网络安全都是非常重要的,当用户的shell不在/etc/shells 中的时候,ftp拒绝提供服务,当用户的用户名位于/etc/ftpusers文件中时,或者是/etc/ftpusers 中记录的组的成员,ftp同样也拒绝提供服务,这样就对使用ftp的用户进行了限制,尤其对于安全敏感的用户。如果/var/run/nologin文件存在时,ftp将拒绝一切用户访问。
ftp认证是通过标准认证过程进行的,因此也可以使用S/key等安全认证的方式。同样,/etc/ftphosts 可以设置对来自不同位置的主机访问ftp服务的限制。
很多情况下需要FreeBSD服务器提供匿名ftp服务功能,如果此时普通用户能通过更安全的方法访问系统,就应该屏蔽普通用户使用ftp服务的权力,而只允许匿名ftp,可以使用-A选项启动ftp服务器,此时ftp将拒绝正常用户登录,避免ftp服务器出现安全问题的可能性及减少安全问题的影响。当使用-S选项时,ftp将所有匿名访问的传输日志也记录在/var/log/ftpd文件中。这两个选项对于提供匿名ftp服务非常有用。对于提供匿名ftp 的服务器,还可以不再使用FreeBSD提供的ftpd服务器,而使用wuftpd或ncftpd等其他种类的ftp 服务器,同样也需要针对这些服务器设置其安全性。
b、ftpd服务器的问题及补丁
FTPD守护程序包含一个glob()函数,它实现文件名的模式匹配,它遵循与Unix shell同样的原则。FreeBSD系统的glob()实现其内部处理函数中包含一些缓冲区溢出漏洞。这些溢出通常可以通过请求一个可以扩展为超长路径名的模板来触发,也可以设法使FTP守护程序将用户输入的模板通过glob()两次来触发。允许本地和远程攻击者在受影响的系统上获取root权限。对于远程用户,如果他们可以在服务器上创建目录,就可以利用这些漏洞;在某些例外情况下,远程用户可以不需要有创建目录的权限。这一问题对FreeBSD 4.2、FreeBSD 4.1.1、FreeBSD 4.1、FreeBSD 4.0、FreeBSD 3.x都有影响,可能导致远程的root级别入侵。
因此如果一定要提供ftp服务的话,必须为服务器打上最新的patch,该patch可以从下面链接获得:
FreeBSD 4.x
# fetch
ftp://ftp.freebsd.org/pub/FreeBS ... 1:33/glob.4.x.patch
# fetch
ftp://ftp.freebsd.org/pub/FreeBS ... /glob.4.x.patch.asc
FreeBSD 3.x
# fetch
ftp://ftp.freebsd.org/pub/FreeBS ... 1:33/glob.3.x.patch
# fetch
ftp://ftp.freebsd.org/pub/FreeBS ... /glob.3.x.patch.asc
patch方法:
# cd /usr/src
# patch -p < /path/to/patch
# cp /usr/src/include/glob.h /usr/include/
# cd /usr/src/lib/libc
# make all install
# cd /usr/src/libexec/ftpd
# make all install
4、对inetd超级服务器里的其它服务做审核
Unix系统中绝大多数服务进程还是通过超级服务器进程inetd来启动的。它的设置文件为/etc/inetd.conf ,以下为这个文件的一部分。
bash-2.03# cat /etc/inetd.conf
---------------------snip----------------------
# $FreeBSD: src/etc/inetd.conf,v 1.44 2000/03/05 20:23:44 shin Exp $
#
# Internet server configuration database
#
# @(#)inetd.conf 5.4 (Berkeley) 6/30/90
#
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
telnet stream tcp nowait root /usr/libexec/telnetd telnetd
#shell stream tcp nowait root /usr/libexec/rshd rshd
#login stream tcp nowait root /usr/libexec/rlogind rlogind
#finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
#exec stream tcp nowait root /usr/libexec/rexecd rexecd
#uucpd stream tcp nowait root /usr/libexec/uucpd uucpd
#nntp stream tcp nowait usenet /usr/libexec/nntpd nntpd
# run comsat as root to be able to print partial mailbox contents w/ biff,
# or use the safer tty:tty to just print that new mail has been received.
#comsat dgram udp wait tty:tty /usr/libexec/comsat comsat
#ntalk dgram udp wait tty:tty /usr/libexec/ntalkd ntalkd
#tftp dgram udp wait nobody /usr/libexec/tftpd tftpd /tftpboot
#bootps dgram udp wait root /usr/libexec/bootpd bootpd
---------------------snip----------------------
在里面描述了每个服务怎么启动, 要以那个用户身份执行等信息。(man 5 inetd.conf)既然这个文件是许多网络服务的主要设置文件, 好好的设置它便一件十分重要的事。要关掉一个服务的话,只要在那一行前面加个 "#" 符号。基本的概念是, 关掉那些不熟悉的服务。理想状态下, 无须要所有的 service 都打开。例如, 系统只是要跑 web server。这种情况下,只要启动 ssh 和 httpd 就行了。如果什么服务都不想跑, 最直接的方法是关掉 inetd。
当需要启动某个守护进程的时候,inetd.conf中的第五列参数对安全性有重要影响,这个参数设置启动这个进程的用户标识,应该尽量不要使用root用户,以减少具备root身份的进程。如上例的finger服务是以nobody身份启动的。
5、检查/etc/rc.conf及/etc/default/rc.conf文件
一个普通常见的/etc/rc.conf文件如下:
su-2.05# cat /etc/rc.conf
---------------------snip----------------------
inetd_enable="YES"
kern_securelevel_enable="NO"
linux_enable="YES"
sendmail_enable="NO"
sshd_enable="NO"
usbd_enable="NO"
# -- sysinstall generated deltas -- #
ifconfig_ed0="inet 192.168.168.52 netmask 255.255.255.0"
defaultrouter="192.168.168.254"
portmap_enable="NO"
hostname="freebsd.netguard.com.cn"
---------------------snip----------------------
这里的配置选项需要灵活调整,具体可以参见/etc/defaults/rc.conf文件,并对其中的设置进行调整。
如果要关掉inetd的话,只需要编辑 /etc/rc.conf 并且把
inetd_enable="YES"
改成
inetd_enable="NO"
如果决定要启动inetd 的话,应该启动 log 选项, 并提高一个服务每分钟启动的上限数目。缺省值是256,建议提高到1024,因为上限值太低会容易受到拒绝服务攻击。攻击者可以简单的用一个 shell script 同时搞出超过 256 个连接,这样 inetd 会很可能崩溃。因此, 在这行:
inetd_enable="YES"
下面加上一条
inetd_flags="-l -R 1024"
这会将连接的情况都记录下来(-l 参数)而且将同时最大连接数从缺省的256 增加到1024。
二、推荐配置选项
1、使用ssh替代telnet及ftp
在FreeBSD中默认使用了openssh,并且打开的端口22,只是由于还有部份管理员对ssh不够熟悉,因为总是使用telnet及ftp,由于本文档主要集中于FreeBSD本身,因此不对应用程序做更多讨论,默认安装后的FreeBSD其sshd选项是打开的,在/etc/rc.conf中可以做设定,它的配置文档都在/etc/ssh/目录下,主要需要察看学习的有ssh_config及sshd_config两份文件。
当然FreeBSD默认安装自带的openssh也存在一些安全问题,在2001年2月以前的FreeBSD 4.x, 4.2-STABLE prior,其中使用的SSH1协议存在漏洞,远程用户可以利用它来执行命令及代码,解决方案有两种:
一是将SSH1协议从配置文件sshd_config中去除。
二是到FreeBSD网站下载升级补丁:
FreeBSD 4.2-RELEASE.
# fetch
ftp://ftp.freebsd.org/pub/FreeBS ... d-4.2-release.patch
# fetch
ftp://ftp.freebsd.org/pub/FreeBS ... 2-release.patch.asc
FreeBSD 4.2-STABLE which is running OpenSSH 2.3.0 (4.2-STABLE dated after 2000-12-05)
# fetch
ftp://ftp.freebsd.org/pub/FreeBS ... hd-4.2-stable.patch
# fetch
ftp://ftp.freebsd.org/pub/FreeBS ... .2-stable.patch.asc
patch方法:
# cd /usr/src/crypto/openssh
# patch -p < /path/to/patch
# cd /usr/src/secure/lib/libssh
# make all
# cd /usr/src/secure/usr.bin/ssh-agent
# make all install
# cd /usr/src/secure/usr.sbin/sshd
# make all install
2、使用ipfilter进行加固
a、重新编译内核
a-1.编辑/usr/src/sys/i386/conf/下的内核配置文件
[root@redhat conf]# cp GENERIC test
加入几行
---------------------snip----------------------
options IPFILTER
options IPFILTER_LOG
options IPFILTER_DEFAULT_BLOCK
---------------------snip----------------------
注意如果原来系统有ipfw的话,需要将其注释掉,因为IPFILTER与IPFW同为在内核级对IP数据包进行处理的系统,因此它们互相冲突,不能同时并存在一个内核内,否则内核的TCP/IP功能就不能正常执行。所以需要将:
---------------------snip----------------------
options IPFIREWALL
options IPDIVERT
---------------------snip----------------------
前加上#号注释掉。
a-2.编译内核并重新启动机器
[root@redhat conf]#config test
这样可以检查配置文件是否存在语法错误,如果一切如常,就可以:
[root@redhat conf]#cd ../../compile/test
[root@redhat conf]#make;make install
[root@redhat conf]#shutdown -r now
b、对/etc/rc.conf文件进行编辑,加入ipfilter的选项以便在启动时自运行,以下是我的/etc/rc.conf文件,其中与ipfilter及ipmon、ipnat有关的选项。
[root@redhat conf]# cat /etc/rc.conf
---------------------snip----------------------
ipfilter_enable="YES"
ipmon_enable="YES"
ipmon_flags="-Dsvn"
ipnat_enable="YES"
---------------------snip----------------------
c、对ipfilter及ipnat进行配置
c-1.创建log文件及更改syslog.conf
[root@redhat conf]#touch /var/log/firewall_logs
[root@redhat conf]#echo local0.* /var/log/firewall_logs>>/etc/syslog.conf
[root@redhat conf]#echo /var/log/firewall_logs 600 5 100 * Z>>/etc/newsyslog.conf
c-2.创建/etc/ipf.rule
[root@redhat /etc]# cat ipf.rules
---------------------snip----------------------
pass out quick on ed0 proto tcp from any to any keep state
pass out quick on ed0 proto udp from any to any keep state
pass out quick on ed0 proto icmp from any to any keep state
block out quick on ed0 all
pass in quick on ed0 proto udp from 192.168.168.130/32 to any port = 68 keep state
block return-rst in log quick on ed0 proto tcp from any to any
block return-icmp-as-dest(port-unr) in log quick on ed0 proto udp from any to any
block in log quick on ed0 all
---------------------snip----------------------
c-3.创建/etc/ipnat.rules
[root@redhat /etc]#cat ipnat.rules
map ed0 192.168.168.168.0/24 -> 0/32
3、加入hosts.allow及hosts.deny
FreeBSD缺省安装了TCP Wrappers,这是一个对网络服务访问进行控制很有用的工具。当inetd调用服务时,tcpd可以截获该调用并且对连接请求进行评价。在该过程中,tcpd把连接请求与各种规则相比。如果连接请求通过这些测试,tcpd启动申请的服务器,由服务器满足客户的请求。但如果连接不能通过tcpd的评价,连接被丢弃。要利用TCP Wrappers的连接评价能力,必须配置tcpd的配置文件/etc/hosts.deny与/etc/hosts.allow,下面是一个配置例子,具体细节看手册页。
第一步:编辑hosts.deny文件(vi /etc/hosts.deny)加入下面这些行:
Access is denied by default.
# Deny access to everyone.
ALL: ALL@ALL, PARANOID #Matches any host whose name does not match its address, see bellow.
这样做的意思是:所有的服务、访问位置,如果没有被明确地允许,也就是在“/etc/hosts.allow”中找不到匹配的项,就是被禁止的。
注意:加上“PARANOID”参数之后,如果要在服务器上使用telnet或ftp服务,就要在服务器的“/etc/hosts”文件中加入允许使用telnet和ftp服务的客户端计算机的名字和IP地址。否则,在显示登录提示之前,因为DNS的域名解析,可能要等上几分钟时间。
第二步:编辑“hosts.allow”文件(vi /etc/hosts.allow)。例如,可以加入下面这些行(被授权访问的计算机要被明确地列出来):
telnet: 202.106.147.50 test.netguard.net.cn
被授权访问的计算机的IP地址是:202.106.147.50,主机名是:test.netguard.net.cn,允许使用的服务是:telnet。
第三步:tcpdchk是检查TCP_WAPPERS配置的程序。它检查TCP_WAPPERS的配置,并报告它可以发现的问题或潜在的问题。在所有的配置都完成了之后,请运行tcpdchk程序:
bash-2.03# tcpdchk
4、安全日志记录
Unix系统使用Syslog记录应用软件发送的日志记录,日志记录对于安全管理非常重要,因为管理员可以从这些日志中发现系统遭受攻击的痕迹及证据。然而syslogd本身也是一个服务程序,能接收网络上的消息,因此其本身也存在安全问题。
这样,syslog就存在两个矛盾的问题,为了安全起见syslogd不应该接收网络上的其他计算机发送的日志记录。由于接收消息是通过UDP传送并且没有加密保护,因此syslog消息可能是伪造的,即便攻击者不使用伪造信息进行欺骗,仅仅使用服务阻塞的方法,就能导致正常的日志记录系统不能正常使用,此后攻击者就能放心进行入侵操作而无需担心留下踪迹。那么即使syslogd没有因为这种阻塞攻击而崩溃,大量无意义的syslog记录,也使得其他有用的日志记录被迅速淹没或清除(为了防止日志文件占用过多的磁盘空间,系统中缺省情况下会自动进行日志的清理工作)。
为了使得syslogd不理会其他计算机的记录,可以使用-s参数重新启动syslogd。在rc.conf 中更改syslogd_flags的值为"-s"。
FreeBSD系统中用于管理syslog日志文件的程序为newsyslog,它由crontab来启动,它检查由newsyslog.conf中指定的日志文件,当这些文件达到一定大小时,就截断原文件,重新启动syslogd ,并压缩保存原有记录。为了避免占用太多的磁盘空间,newsyslog保存的日志备份文件有数量的限制,因此就使得阻塞攻击清除日志的攻击方式成为了可能。可以增加newsyslog保存的日志备份文件的数量,和进行备份时文件的大小,增大系统日志文件的容量。
然而,当一台计算机仅仅使用自己硬盘来记录日志的话,那么一旦入侵者成功入侵这台计算机,他就能按照syslogd 的配置文件syslog.conf的设置,清除相关的日志记录,以便为以后继续潜伏在系统中做打算。甚至可以直接删除/var/log目录下文件以及其他syslog.conf中指明的文件,消灭入侵踪迹及证据。这样,将syslog 日志记录保留在其他计算机系统中也是一个有效增强安全审计的重要因素。
因此,可以设定一台用于记录日志的计算机,其syslogd屏蔽外部计算机的日志请求,只记录本地可信任的计算机系统的日志。这样,就需要在使用"-s"参数屏蔽任意计算机请求的同时,使用"-a"加上信任的计算机主机名,或者子网号,域名等,这样就只会记录这些计算机的日志记录。为了安全起见,这台计算机最好是专用于这一项服务,不执行任何服务程序,以避免遭受入侵。然而由于syslogd对系统要求不高,因此这台计算机可以不必使用很高的硬件配置,除了需要足够的硬盘空间以容纳大量日志记录。
此外,还可以通过将特别重要的syslog的记录直接发送到行式打印机的方式,避免入侵者清除日志记录。
由于日志记录会迅速增加,特别是在遭受攻击的时候更为显著,因此需要使用一些日志分析工具来帮助分析这些日志文件,以快速定位发生的安全问题,否则面临庞大的日志文件,很难找到有用的日志记录。logcheck或其他具备相似功能的程序就用来完成这个任务。
http://www.psionic.com/abacus/abacus_logcheck.html为logcheck的主页。
5、设置安全级别
FreeBSD内核有一个安全级别(securelevel)的概念,这是指系统内核运行使用的安全等级,不同的等级具备不同的保护和检查机制。因为这是内核的检查机制,因此相当严格,没有办法能绕过这个机制提供的保护,因此就对保护FreeBSD的安全性十分有用。
内核的安全级别按照提供安全保护的程度分为-1、0、1、2共分为四个级别,安全级别能提供的保护有:
系统文件:系统文件可以设置保护标志"不可更改"和 "只能附加" ,具有这些保护标志的文件在系统的文件属性之外,还受这些保护标志的保护。安全级别可以规定这些标志能否取消。
磁盘设备文件:磁盘设备文件具备两种访问方式,随机访问的方式对应的块设备文件和顺序访问方式对应的字符设备文件,其中字符设备文件可以直接读取硬件设备,因此对于安全至关重要。内核安全级别可以决定是否允许以直接读取硬件的方式操作硬盘设备文件。
直接内存访问:/dev/mem和/dev/kmem是系统内存的映射文件,访问它们就能直接访问系统内存,一些需要获取系统信息和需要进程间共享内存机制的程序需要访问这两个设备文件以直接访问内存,然而访问内存空间显然也影响系统的安全运行。内核安全级别可以决定是否允许访问系统内存。
安全级别-1为一种永久性的不安全级别,系统内核不提供任何额外的保护。系统缺省就处于这个级别,此时系统文件的保护标志能被root用户取消,所有的设备,包括磁盘设备和内存映射设备,均能按照其属性来访问。
安全级别0为不安全的级别,它和等级-1一样没有对系统提供额外的安全保护,但它影响到内核进程init的行为。当内核处于级别-1时,内核init程序不会自动更改运行级别,因此一直到进入能够登录的状态,系统安全级别仍然为-1。这是系统的缺省行为,没有打开安全级别保护机制。但如果安全级别不为-1,init在进入单用户状态时将改变为0级别,在进入多用户模式时改变为安全级别1。因此安全级别0为设置了安全级别保护之后,单用户状态下的安全级别。
安全级别1为安全的级别,提供了对系统的保护能力。此时系统文件的那两个保护标志不能被取消,已安装文件系统对应的磁盘设备,以及/dev/mem,/dev/kmem不可以用写入模式打开。
安全级别2与级别1类似,只是进一步增加了对磁盘设备低级操作的限制,不管该磁盘设备是否安装,都不允许直接以写入方式访问,这样就无法进行fdisk、disklabel以及newfs等操作。
可以使用sysctl来查看当前系统的安全级别,但如果没有经过特别设置,FreeBSD的缺省安全级别应该为-1:
bash-2.03# sysctl kern.securelevel
kern.securelevel: -1
安全级别中最重要的一点是,除了内核的init进程之外,即使是root用户,也只能不断提高安全级别,没有办法将安全级别降低。这样就基本上保证远程入侵者在没有重新启动计算机的情况下,无法降低系统运行级别。如果root 想提高系统运行的安全级别,也需要使用sysctl命令。
bash-2.03# sysctl -w kern.securelevel=0
kern.securelevel: -1 -> 0
安全级别的意义就在于对文件和设备的保护,如果要对文件提供保护,就需要对文件设置保护标志schg。设置这个标志需要使用chflags命令,系统文件如/kernel,系统安全的时候就具备这个保护标志。即使在非安全级别下要更改这些文件的时候,也要首先取消保护标志才能进行正常操作。
bash-2.03# mv /kernel /kernel.bak
mv: rename /kernel to /kernel.bak: Operation not permitted
bash-2.03# chflags noschg /kernel
bash-2.03# mv /kernel /kernel.bak
bash-2.03# mv /kernel.bak /kernel
bash-2.03# chflags schg /kernel
上面操作先取消了kernel文件的不可更改标志schg,显然这是在非安全级别下的操作。当安全级别处于 1或2时,就不能使用chflags改变文件的保护标志了。
bash-2.03# chflags noschg /kernel
chflags: /kernel: Operation not permitted
可以使用带-o参数的ls来查看文件具备的标志。
bash-2.03# ls -lo /kernel
-r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel
因此可以将系统安全相关的很多程序都设置保护标志,这样入侵者就不能轻易更改这些文件了。建议将/bin,/sbin下的文件都设置这个标志。
bash-2.03# chflags schg /bin
bash-2.03# chflags schg /bin/*
bash-2.03# chflags schg /sbin
bash-2.03# chflags schg /sbin/*
这里首先将相关目录本身设置保护标志,这样入侵者就不能通过将目录更改名字的方法创造一个新的/sbin或 /bin目录。
当文件具备了保护标志,并且安全级别高于1时,保护标志就无法取消,这些文件就不能更改,因此就带来一些必要的操作无法进行,例如重新生成内核的操作等。此时就必须再重新启动系统进入单用户状态执行这些操作。
通常情况下,如果FreeBSD系统只提供网络服务,那么使用安全级别1或2毫无问题。然而如果要运行X Server ,由于X Server使用了共享内存机制,需要访问/dev/mem和/dev/kmem,这样就会带来问题。这时的一种解决办法是在启动X Server之后(例如使用Xdm),再升高安全级别,以避开这个问题,但此时 X Server已经打开了/dev/mem和/dev/kmem,安全级别的保护就不再是完美无缺的了。
如果不使用X Server之类的程序,那么就可以将设置安全级别的命令直接放入系统的启动rc文件中,以便自动提高安全级别。这需要在rc.conf文件中设置两个变量:kern_securelevel_enable和kern_securelevel。
kern_securelevel_enable=”YES”
kern_securelevel=0
上面将安全级别设置为0,那么在启动之后将自动更改为1,这是一种标准的做法。
如果系统提供shell服务,系统管理员有时也不希望用户占用太多的系统资源,在有些Unix系统中入侵者能通过普通帐户,启动大量的进程或产生大量的文件,从而使系统死掉或不能提供正常操作,而FreeBSD下则不必有此担忧,因为可以通过login.conf 和用户的口令数据来设置用户类别,限制用户对系统资源的占用。
6、限制用户所能使用的资源
从 4.3 BSD Net/2开始,BSD Unix引入了登录类别这种分类机制来管理用户使用的资源、记账和环境设置。FreeBSD系统使用/etc/login.conf中描述的数据来将用户按照登录环境、强制性的资源限制以及记账管理等分为不同的登录类别,每个用户的登录类别记录在/etc/master.passwd中的该用户的设置中。以下是一个缺省安装的/etc/login.conf的部份内容。
bash-2.03# cat login.conf
---------------------snip----------------------
default:
:copyright=/etc/COPYRIGHT:
:welcome=/etc/motd:
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:
:path=~/bin /bin /usr/bin /usr/local/bin /usr/X11R6/bin:
:nologin=/var/run/nologin:
:cputime=unlimited:
:datasize=unlimited:
:stacksize=unlimited:
:memorylocked=unlimited:
:memoryuse=unlimited:
:filesize=unlimited:
:coredumpsize=unlimited:
:openfiles=unlimited:
:maxproc=unlimited:
:priority=0:
:ignoretime@:
:umask=022:
#
# A collection of common class names - forward them all to 'default'
# (login would normally do this anyway, but having a class name
# here suppresses the diagnostic)
#
standard:
:tc=default:
xuser:
:tc=default:
staff:
:tc=default:
daemon:
:tc=default:
news:
:tc=default:
dialer:
:tc=default:
#
# Root can always login
#
# N.B. login_getpwclass(3) will use this entry for the root account,
# in preference to 'default'.
root:
:ignorenologin:
:tc=default:
---------------------snip----------------------
利用login.conf可以方便地对用户的登录环境和资源许可进行设置,缺省的设置对用户所能使用的资源几乎没有限制,可以把login.conf改为如下内容:
---------------------snip----------------------
default:
:cputime=infinity:
:datasize-cur=64M:
:stacksize-cur=64M:
:memorylocked-cur=10M:
:memoryuse-cur=100M:
:filesize=infinity:
:coredumpsize=infinity:
:maxproc-cur=64:
:openfiles-cur=64:
:priority=0:
:requirehome@:
:umask=022:
:tc=auth-defaults:
---------------------snip----------------------
上面设置了default登录类别中的几个参数,如果没有在master.passwd文件中明确指定用户的登录类别,就使用这个缺省类别来作为用户的登录类别。
cputime设置了用户的每个进程可以使用的CPU时间,缺省是无限制(infinity)。如果加以限制,有些需要大量CPU时间进行运算的进程就不能正常执行到结束。
datasize-cur设置了用户使用的数据段最大为64M,但-cur设置不是强制的,用户实际使用的数据有可能超过这个值,但最大不能超过datasize-max设置的值(缺省没有设置)。如果没有-cur和-max 后缀,仅仅定义datasize,则表示datasize-cur和datasize-max同样都为datasize 设置的值。同样stacksize定义了对栈的限制。
memorylocked-cur设置了用户每进程可以锁定的最大内存。
memoryuse-cur设置了每进程使用的最大内存。
filesize-cur设置了用户产生的文件大小。
coredumpsize设置了在应用程序发生问题时产生的core dump文件的大小。
maxproc-cur设置了用户可以同时执行的最大进程数。
openfiles-cur设置了每进程最多打开的文件数。
priority设置用户进程的优先级。
requirehome设置用户登录时是否需要主目录,@符号表示不需要主目录。
umask项设置缺省的umask,用于用户创建文件的属性。
tc设置系统认证策略为使用缺省的认证策略。
如果要创建新类别,并不需要对每个值都重新设置,系统缺省先应用default类别的设置,然后再应用具体类别的设置,因此只需要设置与default类别不同的项就可以了。
---------------------snip----------------------
users:
:manpath=/usr/share/man /usr/X11R6/man /usr/local/man:
:cputime=4h:
:openfiles=32:
:maxproc=48:
:tc=default:
---------------------snip----------------------
上面是设置了一个新类users,可以看出它为用户设置了环境变量MANPATH,并重置了cputtime 、openfile、maxproc和tc的值。每次更改login.conf之后,都要进行更新登录类别数据库的操作。
bash-2.03# cap_mkdb /etc/login.conf
由于登录类别保存在master.passwd文件中,通常在使用adduser添加用户的时候设置用户的登录类别。如果要进行更改,必须使用vipw来修改/etc/master.passwd文件的第5个域。下面为master.passwd 中的一行,该行指定这个用户的登录类别为user:
缺省为:
bash-2.03# cat master.passwd
# $FreeBSD: src/etc/master.passwd,v 1.25 1999/09/13 17:09:07 peter Exp $
inburst:TioxhDpCtDaRE:1004:0::0:0:stardust:/home/stardust:/usr/local/bin/bash
改为:
inburst:TioxhDpCtDaRE:1004:0:users:0:0:stardust:/home/stardust:/usr/local/bin/bash
设定系统中用户的可用空间也是系统免受本地拒绝服务攻击重要的一方面,在未设定 quota 的系统上的用户可以随意的灌爆硬盘。要把 quota这项功能打开,可以修改 /etc/rc.conf 中的这项设定:
check_quotas="NO" # Check quotas (or NO).
改成
check_quotas="YES" # Check quotas (or NO).
请先看看以下的 man page,这些文件说明如何使用 quota 的各项设定,并且有一些设定的范例: quotaon, edquota, repquota, quota,要确定在 /etc/fstab 中有加入 "userquota" , 详见 man 5 fstab。
7、保证suid,sgid可执行程序的安全
在UNIX类操作系统中,当黑客取得了本地shell权限,绝大多数情况下,他们通过攻击有缺陷的suid,sgid程序来获得root或高一级的访问权限。因此有缺陷的suid,sgid程序构成了对本地安全的极大威胁。管理员有必要订阅相关的安全邮件列表,了解最新被发现的漏洞,在被攻击者利用之前及时修补,这样才有可能保证本地安全,如何订阅邮件列表将在以后的讨论中提到。作为预防,建议找出系统中所有的suid,sgid程序,了解它们的功能,对那些不常使用的程序一律去其suid,sgid位,只保留那些对系统正常运行所必须的程序的特权位。用如下命令找出那些特权程序:
bash-2.03# find / -type f (-perm -4000 -o -2000 ) -exec ls -l {} ;
---------------------snip----------------------
-r-sr-sr-x 1 uucp dialer 121640 Mar 20 2000 /usr/bin/cu
-r-sr-xr-x 1 uucp wheel 86552 Mar 20 2000 /usr/bin/uucp
-r-sr-xr-x 1 uucp wheel 36348 Mar 20 2000 /usr/bin/uuname
-r-sr-sr-x 1 uucp dialer 95100 Mar 20 2000 /usr/bin/uustat
-r-sr-xr-x 1 uucp wheel 87184 Mar 20 2000 /usr/bin/uux
-r-sr-xr-x 1 man wheel 28088 Mar 20 2000 /usr/bin/man
-r-s--x--x 2 root wheel 50356 Mar 20 2000 /usr/bin/suidperl
-r-s--x--x 2 root wheel 50356 Mar 20 2000 /usr/bin/sperl5.00503
-r-sr-xr-x 4 root wheel 19116 Mar 20 2000 /usr/bin/at
-r-sr-xr-x 4 root wheel 19116 Mar 20 2000 /usr/bin/atq
-r-sr-xr-x 4 root wheel 19116 Mar 20 2000 /usr/bin/atrm
-r-sr-xr-x 4 root wheel 19116 Mar 20 2000 /usr/bin/batch
-r-sr-xr-x 6 root wheel 31492 Dec 23 01:06 /usr/bin/chpass
-r-sr-xr-x 6 root wheel 31492 Dec 23 01:06 /usr/bin/chfn
-r-sr-xr-x 6 root wheel 31492 Dec 23 01:06 /usr/bin/chsh
-r-sr-xr-x 6 root wheel 31492 Dec 23 01:06 /usr/bin/ypchpass
-r-sr-xr-x 6 root wheel 31492 Dec 23 01:06 /usr/bin/ypchfn
-r-sr-xr-x 6 root wheel 31492 Dec 23 01:06 /usr/bin/ypchsh
-r-xr-sr-x 1 root kmem 11024 Mar 20 2000 /usr/bin/fstat
-r-xr-sr-x 1 root kmem 9680 Mar 20 2000 /usr/bin/ipcs
-r-sr-xr-x 1 root wheel 510 Mar 20 2000 /usr/bin/keyinfo
-r-sr-xr-x 1 root wheel 7056 Mar 20 2000 /usr/bin/keyinit
---------------------snip----------------------
上面的列表只是一部份,FreeBSD的缺省安装中有相当多的suid,sgid程序,其中的很多只是管理员应该使用的程序,比如一些系统管理工具,管理员完全可以su到root后使用。有些程序基本不会被用到,比如uucp类的程序。有些是针对特定服务的,而这些服务并不是系统所提供的,如果系统不运行SUN的NIS服务的话,yp系统命令就是无用的。因此可以也应该去掉所有这些程序的特权位,甚至取消它们的执行权限,这样既使在那些程序中有被发现安全漏洞,也不至于对系统安全构成威胁。
另外,在安装系统的时候,可以通过合理分区,把一般用户可写的分区分割开来,而这些分区就可以用 "nosuid" 的方式来 mount。 一般会有个分区给一般使用者使用:/home 或 /usr/home。可以另外开个分区给 /var/tmp 然后再把/tmp 指到这里:
bash-2.03# rm -rf /tmp
bash-2.03# ln -s /var/tmp /tmp
可以参考下面这个例子:
bash-2.03# cat /etc/fstab
---------------------snip----------------------
# Device Mountpoint FStype Options Dump Pass#
/dev/sd0s1b none swap sw 0 0
/dev/sd0s1a / ufs rw 1 1
/dev/sd0s1g /usr ufs rw 2 2
/dev/sd0s1h /usr/home ufs rw,nosuid 2 2
/dev/sd0s1f /var ufs rw 2 2
/dev/sd0s1e /var/tmp ufs rw,nosuid 2 2
proc /proc procfs rw 0 0
---------------------snip----------------------
现在一般用户可以写入的目录/usr/home和/var/tmp是以 "-nosuid" 的方式被 mount的,如此可以减少一些可能的安全风险。
当系统作为NFS服务器,设置共享出去的NFS文件系统时,应该使用maproot或mapall参数,以便隔离危险,使得即使在远程系统被侵入的情况下,防止从这个允许安装文件系统的客户上对本机的入侵。还可以考虑使用安全的NFS协议,使用DES算法进行服务器和客户机的认证。如果系统不使用NFS及其他RPC服务时,最好屏蔽相关的选项,如portmap_enable选项。
三、参考配置选项
1、控制能su成root的用户
在FreeBSD系统中,只有wheel组的成员,也就是说用户的组ID为0,才能su成为root。因为缺省加入用户时,用户被赋于组ID为0,所以几乎所有加入用户都能su成root,这在一般情况下是不需要的。应该严格控制可以su成root的用户,对于那些没有必要成为root的用户,用vipw把/etc/passwd和/etc/master,passwd,把他们的组ID,改到其他组对应的ID,组名和它的ID可以在/etc/group里找到:
bash-2.03# cat /etc/group
---------------------snip----------------------
wheel:*:0:root
daemon:*:1:daemon
kmem:*:2:root
sys:*:3:root
tty:*:4:root
operator:*:5:root
mail:*:6:
bin:*:7:
news:*:8:
man:*:9:
games:*:13:
staff:*:20:root
guest:*:31:root
bind:*:53:
uucp:*:66:
xten:*:67:xten
dialer:*:68:
network:*:69:
qnofiles:*:81:
qmail:*:82:
mysql:*:88:
casper:*:1001:
admin:*:1009:
nogroup:*:65533:
nobody:*:65534:
---------------------snip----------------------
2、删除不必要的预置用户和组
禁止操作系统中不必要的预置帐号(每次升级或安装完都要检查一下)。FreeBSD系统中就提供这样一些你可能不需要的预置帐号。如果确实不需要这些帐号,就把它们删掉。系统中有越多的帐号,就越容易受到攻击。
bash-2.03# cat passwd
---------------------snip----------------------
# $FreeBSD: src/etc/master.passwd,v 1.25 1999/09/13 17:09:07 peter Exp $
#
root:*:0:0:Charlie &:/root:/usr/local/bin/bash
toor:*:0:0:Bourne-again Superuser:/root:
daemon:*:1:1:Owner of many system processes:/root:/sbin/nologin
operator:*:2:5:System &:/:/sbin/nologin
bin:*:3:7:Binaries Commands and Source,,,:/:/sbin/nologin
tty:*:4:65533:Tty Sandbox:/:/sbin/nologin
kmem:*:5:65533:KMem Sandbox:/:/sbin/nologin
games:*:7:13:Games pseudo-user:/usr/games:/sbin/nologin
news:*:8:8:News Subsystem:/:/sbin/nologin
man:*:9:9:Mister Man Pages:/usr/share/man:/sbin/nologin
bind:*:53:53:Bind Sandbox:/:/sbin/nologin
uucp:*:66:66:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
xten:*:67:67:X-10 daemon:/usr/local/xten:/sbin/nologin
pop:*:68:6:Post Office Owner:/nonexistent:/sbin/nologin
nobody:*:65534:65534:Unprivileged user:/nonexistent:/sbin/nologin
---------------------snip----------------------
可以看到系统中预置了不少账户,其中如games账户并不是必要的,我们可以用rmuser命令删除它:
bash-2.03# rmuser –y games
对系统中的组也应该做相应处理,用vipw编辑/etc/group,删除不需要的组。
3、改变系统的核心变量达到对外屏闭服务器没有使用的端口
#sysctl -w net.inet.tcp.log_in_vain=1
#sysctl -w net.inet.udp.log_in_vain=1
这会把尝试向你的机器要求你没有的服务的连接请求记录起来。例如,如果在系统上没有跑 DNS server,而又有个人想要向你的机器要求 DNS 服务,这时候你就会看到
Connection attempt to UDP yourIP:53 from otherIP:X
(X 是某个 high port #)
你用 "dmesg" 命令就可以看到这一行。Dmesg 显示出的是系统的 kernel message buffer。然而,这个 buffer 的空间是有限的, 所以系统也会把这些信息写入到 /var/log/messages 里面去:
bash-2.03# tail -1 /var/log/messages
Jun 12 19:36:03 ugh /kernel: Connection attempt to UDP yourIP:53 from otherIP:X
这对发现可能的入侵企图是很有帮助的。
4、关闭对广播类型的响应
#sysctl -w net.inet.icmp.bmcastecho=0
过滤icmp响应这后,服务器无法ping通,这有助提高部份安全性能。
5、对udp包的校验和计算
#sysctl -w net.inet.udp.checksum=1
可以防止不正确的udp包的攻击。
6、设置取消ctrl-alt-del组合键重启系统
为了防止用户无意中重新启动系统,还需要取消Ctrl-Alt-Del热键的重新启动能力,这需要重新定制内核时使用以下选项。
bash-2.03# cd /usr/src/sys/i386/conf
bash-2.03# ls
GENERIC LINT NEWCARD
bash-2.03# grep SC_DISABLE_REBOOT LINT
options SC_DISABLE_REBOOT # disable reboot key sequence
可以把以上的内核选项加入到自己定制的内核配置文件中。
四、参考FreeBSD技巧
1、更改shell并在配置文件中做设置
a.用chsh或者vipw命令,将root所使用的shell改成bash,如:
[root@redhat /root]#chsh
---------------------snip----------------------
#Changing user database information for root.
Login: root
Password: U1fRnHvjHLdU6
Uid [#]: 0
Gid [# or name]: 0
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /root
Shell: /usr/local/bin/bash
---------------------snip----------------------
b.更改/root/.bashrc
[root@redhat /root]# cat .bashrc
---------------------snip----------------------
umask 077
PS1="[u@h W]\$ "
alias ls='ls -F'
alias ps='ps -auxf'
---------------------snip----------------------
c.建立/root/.bash_profile
---------------------snip----------------------
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin:$HOME/bin; export PATH
umask 077
PS1="[u@h W]\$ "
alias ls='ls -F'
---------------------snip----------------------
2、更改telnet banner
修改/etc/gettys中有default的行,改成如下:
default:
:cb:ce:ck:lc:fd#1000:im= Red Hat Linux release 6.2 (Zoot) Kernel 2.2.14-50 on an i686 :sp#1200
这是更改telnet的banner,令人telnet时看到的是:
---------------------snip----------------------
[root@redhat /etc]# telnet localhost
Trying 127.0.0.1...
Connected to localhost.netguard.com.cn.
Escape character is '^]'.
Red Hat Linux release 6.2 (Zoot)
Kernel 2.2.14-50 on an i686
login:
---------------------snip----------------------
3、更改ftp banner
修改/usr/src/libexec/ftpd/ftpd.c
将其中static char version[]的定义改为
static char version[] = "Version wu-2.6.0(1) Mon Feb 28 10:30:36 EST 2000";
然后
[root@redhat ftpd]# make;make install
我们来看看效果:
---------------------snip----------------------
[root@redhat ftpd]# ftp
ftp> o localhost
Connected to localhost.netguard.com.cn.
220 redhat.netguard.com.cn FTP server (Version wu-2.6.0(1) Mon Feb 28 10:30:36 EST 2000) ready.
Name (localhost:quack):
---------------------snip----------------------
五、参考安全工具
1、tripwire
作为一个优秀的完整性检查工具,tripwire可以对系统做一个快照,当怀疑系统遭受入侵的时候,系统管理员可以通过事前备份保存的快照文件与当前系统作比较,从而得出系统被更改文件列表。为事后审查做一个比较好的准备。
2、john
口令检查工具,由于部份帐号使用者可能使用简单帐号,john有几种模式,对简单密码很容易能够判断,这样可以一定程度上防止口令攻击。
3、nmap
nmap是一个端口扫描及操作系统堆栈判断工具,能够辅助系统管理员检查自己域内机器端口开放情况。
3,目前本系统的补丁情况
一、FreeBSD补丁方法
1、下载并检查完整性
比如:
ftp://ftp.freebsd.org/pub/FreeBS ... elnetd-crypto.patch
ftp://ftp.freebsd.org/pub/FreeBS ... td-crypto.patch.asc
使用自己的pgp工具对文件完整性进行检查
2、patch源文件
# cd /usr/src/
# patch -p < /path/to/patch
3、编译安装
# cd /usr/src/secure/libexec/telnetd
# make depend && make all install
4、攻击测试
# ./telnet_exploit -c localhost
7350854 - x86/bsd telnetd remote root
by zip, lorian, smiler and scut.
check: FAILED
aborting
二、FreeBSD补丁下载地点
http://www.freebsd.org/security/
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/
三、FreeBSD官方安全邮件列表
有两个FreeBSD的官方安全邮件列表
freebsd-security General security related discussion
freebsd-security-notifications Security notifications (moderated mailing list)
发送邮件到
majordomo@FreeBSD.ORG,主题是"subscribe freebsd-security"就可以了。
% echo "subscribe freebsd-security" | mail
majordomo@FreeBSD.org
4,系统应用程序可能存在的安全问题
从1996年至今(2001年8月),与FreeBSD操作系统相关的系统及应用程序漏洞共167条,全部可在FreeBSD官方网站上获得基本资料,根据这些情况分析,使用FreeBSD操作系统时,需要对运行于其上的应用程序做基本安全审核。这通常需要具体情况具体分析,对系统运行的所有进程及其程序的安全行做基本考察。比如所有版本的FreeBSD 4.x prior to 4.4中,tcpdump都存在一个format string的漏洞,入侵者可以通过构造特殊的字串来对系统进行攻击,导致tcpdump崩溃,甚至有可能可以执行任意代码。而tcpdump通常是由root身份运行的,因此远程用户可以通过这一漏洞获取系统最高权限。存在同样问题的应用程序或者服务在最近一段期间有licq、xinetd等等许多。有些会导致远程的root级别的威胁,有些则是suid程序,会导致本地用户有可能越权执行程序或任务。
同样情况,在FreeBSD上如果运行了Apache、php、Mysql等各种服务或者应用程序,用户需要对这些应用程序的安全性有一定程序的了解,而不仅依赖于操作系统的安全性。
5,施工注意事项
一、配置
1、对极其重要,不能中止服务的主机
必需要做的项目如下:
a. 设单用户模式需要密码
b. 关闭或者修补telnetd服务器
c. 关闭或者修补ftpd服务器
d. 在inetd.conf及rc.conf中去除不必要的服务
e. 强烈建议用ssh及scp替代telnet和ftp
2、对可以暂时停止服务进行配置工作的主机
除了以上选项之外
a. 建议重新编译内核加入ipfilter支持。
b. 建议使用sysctl对系统核心参数做进一步调整。
二、审核
1、如何发现入侵
如果的系统已经被入侵者控制,或者入侵者已经获得了一些权限,那么系统总会有一些症状反映出来,有些症状也往往暗示着有人正在打你系统的主意,你的系统将被入侵。
a.异常的访问日志
入侵者在入侵并控制系统之前,往往会先用自动或者手动扫描这个系统,以获取更多的信息,了解并入侵您的系统。
系统被扫描的征兆:
a-1.一个IP连续多次出现在系统的各种服务日志中,并试图访问越权访问管理程序,这很有可能是入侵者在试图寻找并尝试漏洞。
a-2.一个IP连续多次在同一系统多个服务建立了空连接,这很有可能是入侵者在搜集服务的版本信息。
a-3.有人访问了系统不必要的服务,或者系统不存在的但是有严重安全隐患的漏洞。
比如:finger、rpc.statd。
a-4.有人telnet、ftp、pop3、su等服务日志连续出现了大量的连续性失败登入日志,着很有可能是入侵者在尝试猜测系统的密码。
b.网络流量增大
如果一台服务器突然间流量大了许多,这就预示着你的系统有可能已经被入侵者控制,并用来扫描和攻击其它的服务器。事实证明,流量突然过大不容忽视,许多入侵者都用中间主机下载并提供扫描软件,对远程主机扫描、分析和测试漏洞,进而造成网络流量突然增大。
c.非法访问
如果你发现某个用户试图访问控制并修改/etc/shadow、系统日志和系统配置文件,那么很有可能这个用户已经被入侵者控制,并且试图夺取更高的权限。
d.正常服务终止
比如系统的日志服务突然奇怪的停掉了,你的syslogd程序突然终止,这暗示着入侵者试图停掉这些有威胁的服务,在系统上留下空日志来逃避管理员的追查。
e.可疑的进程,非法服务
系统中任何可疑的进程都应该仔细检查,比如以root启动的httpd服务,系统中本来关闭的服务重新被启动。这些可疑进程和服务,很有可能是入侵者启动的攻击进程、后门进程、sniffer进程。
f.系统文件或用户数据被更改
入侵者通常会更改系统中的配置文件来逃避追查,或者加载后门、攻击程序之类,比如修改syslog.conf文件去掉secure的条目来躲避login后门的审计;修改hosts.deny、hosts.allow来解除tcpwrapper对入侵者IP的过滤;增加一个条目在rc.d里面,以便系统启动的时候,同时启动后门程序;增加了一个用户、一个suid程序都意味着你的系统已经被入侵着控制了。
g.可疑的数据
系统中出现了诸如" "(空格空格)、".. "(点点空格)、"..^M"(点点ctrl+M)、"..."(点点点)这样可疑的目录,入侵者经常在这样的目录中使用和隐藏文件.系统命令被修改(比如安装了lrk,ps输出有变化),有些目录里面(特别是/tmp)出现了常用扫描器的产生的临时文件,攻击程序,磁盘空间突然变小,主页被修改,用户数据被修改。
h.系统被sniffer
系统入侵发生时,入侵者经常在UNIX系统上安装一个网络监视程序,通常称为sniffer,用于捕获用户账号和密码信息。是否有进程把任何网络设备置成混杂模式是判断sniffer存在的证据,如果任一网络设备处于混杂模式,那系统中就有sniffer程序在运行。传统的sniffer不能在交换环境成功使用,交换环境通过mac地置发送数据,这就产生了各种ARC欺骗工具,sniffer和snoop永远都是同时存在的。
2、紧急处理需知
a.立刻断开网络连接
入侵着控制了系统,往往得到的都是root权限,如果不把被入侵的主机从网络上断开,入侵者可能连入这台主机并撤销你所做的恢复工作。他们知道了管理员发现了自己,也可能会做出一些破坏性举动,诸如发出 rm -rf / &等指令来彻底清除自己的罪证,为了防止这种情况发生,请先断开网络连接,并且启用备份域服务器。紧急情况下可以直接拔掉自己的网线,关掉相关的网络设备,如交换机和路由器等。
b.制作遭受入侵的系统的镜象
如果你有一块备用的磁盘,大小和型号都与被入侵主机上的磁盘相同,可以使用UNIX的dd命令制作被入侵系统的一个额外拷贝。如果你有磁带机可用ufsdump为系统做一个0级备份。
例如,在一个有两个SCSI硬盘的Linux系统,以下命令将在相同大小和类型的备份硬盘(/dev/sdb)上复制被侵入系统(在/dev/sda盘上)的一个精确拷贝。
# dd if=/dev/sda of=/dev/sdb
建立一个备份非常重要,你可能会需要将系统恢复到侵入刚被发现时的状态。它对法律调查可能有帮助。记录下备份的卷标、标志和日期,然后保存到一个安全的地方以保持数据的完整性。
c.报案、通知cert
向当地公安局报案,使你的损失在以后能得到赔偿。通知cert,引起大家注意,以免internet上其他主机也收到同样的攻击。
3、如何进行审核
a.检查入侵者对系统软件和配置文件的修改
二进制文件,系统配置文件都是黑客喜欢更改的地方。
b.检查被修改的数据
比如web cgi程序,很可能会被植入后门。
c.检查入侵者留下的工具和数据
搜索主要可以集中于以下方向
检查UNIX系统/dev/、man目录下意外的ASCII文件。一些特洛伊木马二进制文件使用的配置文件通常在这些目录中。
仔细检查系统中的隐藏文件和隐藏目录。如果入侵者在系统中建立一个一个新的帐户,那么这个新帐户的起始目录以及他使用的文件可能是隐藏的。
检查一些名字非常奇怪的目录和文件,例如:...(三个点)、..(两个点)以及空白(在UNIX系统中)。入侵者通常会在这样的目录中隐藏文件。对于NT,应该检查那些名字和一些系统文件名非常接近的目录和文件。
d.审查系统日志文件
/etc/syslogd.conf下定义的日志文件。
e.检查网络嗅探器
判断系统是否被安装了嗅探器,首先要看当前是否有进程使你的网络接口处于混杂(Promiscuous)模式下。如果任何网络接口处于promiscuous模式下,就表示可能系统被安装了网络嗅探器。注意如果你重新启动了系统或者在单用户模式下操作,可能无法检测到Promiscuous模式。使用ifconfig命令就可以知道系统网络接口是否处于promoscuous模式下(注意一定使用没有被侵入者修改的ifconfig):
正常输出:
su-2.05# ifconfig ed0
ed0: flags=8843 mtu 1500
inet 192.168.168.52 netmask 0xffffff00 broadcast 192.168.168.255
inet 192.168.168.54 netmask 0xffffff00 broadcast 192.168.168.255
inet 192.168.168.55 netmask 0xffffff00 broadcast 192.168.168.255
ether 00:80:c8:f6:0d:61
处于混杂模式下的输出:
su-2.05# ifconfig ed0
ed0: flags=8943 mtu 1500
inet 192.168.168.52 netmask 0xffffff00 broadcast 192.168.168.255
inet 192.168.168.54 netmask 0xffffff00 broadcast 192.168.168.255
inet 192.168.168.55 netmask 0xffffff00 broadcast 192.168.168.255
ether 00:80:c8:f6:0d:61
f.检查是否有kld后门
http://www.s0ftpj.org/小组开发的ksec软件,可以部份地检查出FreeBSD系统中存在的kld后门。
g.检查网络上的其它系统
除了已知被侵入的系统外,你还应该对网络上所有的系统进行检查。主要检查和被侵入主机共享网络服务(例如:NIX、NFS)或者通过一些机制(例如:hosts.equiv、.rhosts文件,或者kerberos服务器)和被侵入主机相互信任的系统。
Submitted by iscraft on 2006, April 2, 3:21 PM