分类: BSD
2010-08-21 00:49:26
目录
第一部份:目的
第二部份:内容
一、必选配置选项
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/FreeBSD/CERT/patches/SA-01:49/telnetd-crypto.patch
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-01:49/telnetd-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/FreeBSD/CERT/patches/SA-01:49/telnetd.patch
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-01:49/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加入。
*/ /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/FreeBSD/CERT/patches/SA-01:33/glob.4.x.patch
# fetch ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-01:33/glob.4.x.patch.asc
FreeBSD 3.x
# fetch ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-01:33/glob.3.x.patch
# fetch ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-01:33/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/FreeBSD/CERT/patches/SA-01:24/sshd-4.2-release.patch
# fetch ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-01:24/sshd-4.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/FreeBSD/CERT/patches/SA-01:24/sshd-4.2-stable.patch
# fetch ftp://ftp.freebsd.org/pub/FreeBSD/CERT/patches/SA-01:24/sshd-4.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的主 页。