发新话题
打印

[转载]些FreeBSD相关的安全问题

[转载]些FreeBSD相关的安全问题

本文出自:http://xfocus.org
文章作者: xundi(xundi@xfocus.org )

FreeBSD的日志安全  
--------------------  
I)如果你安装了sshd(也强烈建议安装sshd,因为默认的telnetd程序存在严重  
的安全问题)。请编辑你的/etc/syslog.conf文件,一般修改  
security.* /var/log/security条目内容如下:  

security.*;auth.info           /var/log/security  

原因很简单,这样syslogd就把连接到sshd的日志信息记录下来。  

当然如果你愿意,也可以建立其他的日志文件,不过如果你建立新的日志文件,  
你必须检查更新/etc/newsyslog.conf是否建立相关条目,如:  

/var/log/auth           600  10   100  *    Z  

其中/var/log/auth表示日志文件名,600是日志文件指定的属性,10表示包括  
要归档的文件数,100表示文件字节大小,以K为单位,*表示间隔时间或者指定  
时间,其中*表示日志归档是以字节(size)来判断的。最后一个Z表示指定归档  
要处理的格式,Z表示使用gzip(1)来压缩归档日志来节约空间,具体更多信息  
你可以使用man newsyslog来获得。  

这里建立你修改newsyslog.conf中的一些全局可读属性,如maillog和messages  
log,一般把它们的属性设置为600。如下所示:  

/var/log/messages        600  5     100  *    Z  
/var/log/maillog        600  7    *   @T00  Z  

当然如果你要把信息记录到其他主机上更好,你可以修改/etc/syslog.conf中的  
如下条目,把其中的注释去掉,并修改loghost为要记录的机器名字:  

#*.*   @loghost  

最后你防止任意用户读取这些文件,你使用下面命令修改文件属性:  

# chmod 600 /etc/syslog.conf  
# chmod 600 /etc/newsyslog.conf  

=========================================================================  

关于SSH配置  
-------------  

就象上面所说的,telnetd守护程序存在严重的缓冲溢出可以导致远程ROOT SHELL  
的获得,这里强烈建议你如果需要远程控制的话,就使用SSH工具,并且保证是最  
新的版本,至少目前为止还没有很严重的漏洞出现(当然也有几个漏洞大家可以参考  
一些安全资料)。  

sshd控制文件是/etc/ssh/sshd_config,如果你没有使用SSH protocol 1的机会,  
这里建议你关闭protocol 1的使用,因为ssh protocol 1不如protocol 2安全,  
还可以有效的阻止攻击者通过修改包携带的版本banner来劫持(hijacking)启动  
会话进程并降级你到protocol 1,理论上可以迫使使用ssh 1 协议来通信。你  
必须注释掉Protocol 2,1而使用下面的一行来代替:  

Protocol 2  

第二,SSH在运行的时候消耗比较多的内存,是个"耗粮"大户,这也是cisco产品  
近来发现有关SSH存在拒绝服务攻击的原因。每一个连接使用一大块可观的内存,  
FreeBSD默认使用"MaxStartups"来管理,默认的值是一个比较健康的值,如:  

MaxStartups 5:50:10  

因为一个系统你除非有很多人管理系统或者提供SHELL服务,一般情况下这个值  
是足够了,MaxStartups不是意味着总的连接数,只是指还没有认证的连接数,  
这意味着,在任一(意)时刻, 多达5人可以(能)同时唤起登陆进程。  

默认情况下,FreeBSD的OpenSSH配置关闭了远程ROOT登陆和空密码登陆,这里还  
建议里关闭X11Forwarding,你可以把X11Forwarding 这行改为:  

X11Forwarding no  

如果你的机器作为服务器在运行,就不需要安装X服务程序,因为使用了  
X11Forwarding on,就可能被受控制了的远程主机发送进程把自己attach你的  
X11会话进程,从而可以记录击键记录,显示一些杂乱信息和捕获你的显示内容。  

强烈建议不使用静态密码,而使用DSA或者RSA KEY,你修改如下内容就可以关闭  
使用密码认证:  

PasswordAuthentication no  

因为使用密码验证毕竟不是一种安全的方法,存在着社会工程,猜测,窃取  
的可能性。  

对于sshd,你可以通过下面的方法来限制组用户或者光是单独用户来访问SHELL:  

AllowGroups shellusers  
或者  
AllowGroups wheel  
或者  
AllowUsers xundi  

当然你如果要改变原来的用户访问SHELL属性,如要把用户改变成/sbin/nologin  
而不让它访问shell,你可以使用下面的命令直接改变:  

chsh -s /sbin/nologin user  

最后你最好使用tcpwrappers来限制一些访问,你修改/etc/hosts.allow文件,注释  
掉"ALL : ALL : allow", 去掉其他无关控制访问,增加如下内容:  

sshd : localhost : allow  
sshd : friendlycomputer : allow  
sshd : all : deny  

FreeBSD默认情况下不把ssh登陆失败的内容记录下来,你需要对/etc/security  
进行修改,下面的补丁只检测密码无效的登陆并记录下来,你可以增加对dsa/rsa  
key登陆失败或者不合法用户登陆的检测:  

--- /etc/security   Mon Jun 11 15:45:02 2001  
+++ /etc/security   Mon Jun 11 15:48:29 2001  
@@ -44,6 +44,7 @@  
      sort -t. -r -n +1 -2 |  
      xargs zcat -f  
   [ -f $LOG/messages ] && cat $LOG/messages  
+   [ -f $LOG/security ] && cat $LOG/security  
}  

sflag=FALSE ignore=  
@@ -188,6 +189,12 @@  
separator  
echo "${host} login failures:"  
n=$(catmsgs | grep -i "^$yesterday.*login failure" | tee /dev/stderr | wc -l)  
+[ $n -gt 0 -a $rc -lt 1 ] && rc=1  
+  
+# Show "${host} SSH login failures:"  
+separator  
+echo "${host} login failures:"  
+n=$(catmsgs | grep -i "^$yesterday.*failed password" | tee /dev/stderr | wc -l)  
[ $n -gt 0 -a $rc -lt 1 ] && rc=1  

# Show tcp_wrapper warning messages  

====================================================================  

网络部分  

---------  

默认情况下FreeBSD和许多操作系统在关闭的端口上接受到TCP SYN段的时候,会  
发送RST信息包,也就是告诉攻击者这个端口关闭了,导致攻击者继续扫描下一个  
端口,一般情况下我们都不愿意使端口扫描简单化,和不想浪费过多的CPU时间  
在DoS攻击上。因此我们可以使用FreeBSD系统中叫blackhole的特征,blackhole  
sysctl(8) MIB用来控制当对一些没有socket监听的TCP或者UDP端口接收到连接  
请求时所操作的行为,你可以使用man blackhole获得详细的信息,当设置这个  
选项后,对那些连接没有socket监听的TCP或者UDP端口的连接,系统将马上丢弃  
这个包而不发RST包。连接端将看到"Connection reset by peer".下面的操作  
将激活这个特征:  

sysctl -w net.inet.tcp.blackhole=2  
sysctl -w net.inet.udp.blackhole=1  

你可以通过下面的操作马上启动实现这个特征:  

# /bin/sh /etc/rc.sysctl  

当然这个特征不能作为ipfw(8)工具的替代品来防卫系统,要建立更高安全的  
系统,你当然需要使用Ipfw(8)或者Ipfilter工具实现。  

修改/etc/rc.conf,把不需要的服务关闭,i)portmap服务,如果你没有NFS, NIS  
等需要。再/etc/rc.conf中加入:  

portmap_enable="NO"  

你可能经常发现有人讨厌的扫描你整个网络,目标端口为111的信息,这是有人  
想查找是否有rpc服务漏洞的扫描,你可以在你的边缘路由器中丢弃dstport为  
111的信息包。  

ii)除非你运行mail服务器或者mail网关,这里建议你把sendmail置于queueing only  
模式,如果你确实需要SMTP网关,建议你安装postfix.  

sendmail_flags="-q1m"  

iii)建议你丢弃icmp重定向,可以防止Dos攻击或劫持进程(hijack sessions),  
你也可以记录icmp重定向,不过这里你要区分一些信息,因为有的时候Cisco  
路由器也会产生重定向而不是攻击信息,要记录这些信息,使用如下条目:  

icmp_log_redirect="YES"  

当然你要完全去掉不确定信息记录,你可以在你的CISCO路由器上关闭重定向:  

"no ip send-redirects"  

(IV)你可以设置系统丢弃SYNFIN信息包,不过这个你可以更好的通过IPFW来过滤  
这种信息包,但是你也可以在/etc/rc.conf中增加如下条目来激活这种选项:  

tcp_drop_synfin="YES"  

当然你需要在kernel配置中增加如下配置:  

options    TCP_DROP_SYNFIN  

v)关闭对广播类型的响应  

#sysctl -w net.inet.icmp.bmcastecho=0  

过滤icmp响应这后,服务器无法ping通,这有助提高部份安全性能。  

vi)对udp包的校验和计算  

#sysctl -w net.inet.udp.checksum=1  

可以防止不正确的udp包的攻击。  

vii)设置rc.sysctl, rc.conf 和 sysctl.conf 权限:  

# chmod 600 /etc/rc.sysctl  
# chmod 600 /etc/rc.conf  
# chmod 600 /etc/sysctl.conf  

===================================================================  

Crontab和at问题  

----------------  

crontab是一个比较强大的服务,有不少漏洞在cron发现过,普通用户最起码  
也可以浪费资源等操作,这里建议'www', 'nobody' 和 'bind' 不能使用crontab.  

建立一/etc/cron/allow文件并把需要使用的用户放进去,如:  

# echo root > /var/cron/allow  
# chmod 600 /var/cron/allow  

并设置权限crontab不能由其他用户任意访问:  

# chmod 600 /etc/crontab  

不过你如果不需要使用'at'命令,就关闭这个服务,因为安全的原则始终是"  
你不许它,丢掉它",在/etc/crontab文件中注释掉下面一行:  

# */5   *   *   *   *   root   /usr/libexec/atrun  

===================================================================  

inetd和rate限制问题  
---------------------  

Inetd默认情况下是启用的,它控制了不少不安全的服务,如:telnet, ntalk  
和finger。检查你所有/etc/inetd.conf中的服务,关闭任何你不需要的服务。  
如果没有一个用户需要,请在/etc/rc.conf中关闭inetd启动:  

inetd_enable="NO"  

如果你要使用FreeBSD的inetd.你可以通过inent请求来控制rate的资源,如:  

auth   stream   tcp   nowait/10/10   root   internal   auth -r -f -n -o UNKNOWN -t 30  

第一个10表示我们允许的最大子进程数量,第二个值是每一个IP每一分钟连接的  
最大数量,一般10/10的值是健康的,不过你一般不要使用这个ident,我们一般也只在IRC里看到这个服务。  

=======================================================================、  

Securelevel 问题  
=================  

FreeBSD内核有一个安全级别(securelevel)的概念,这是指系统内核运行使用  
的安全等级,不同的等级具备不同的保护和检查机制。一般工作站运行在securelevel  
0级别,因为他们可能需要运行X11,而服务器一般运行在2或者1级别上,关于  
内核安全级别的详细资料中文你可以参看王波的"FreeBSD使用大全连载 "。  

如果你要改变级别系统为2,你可以在/etc/rc.conf中增加如下条目:  

kern_securelevel_enable="YES"  
kern_securelevel="2"  

你可以重新去启动,或者使用  

# sysctl -w kern.securelevel=2  

来激活。  

=====================================================================  

一些本地安全tip  
---------------  

i)编辑/etc/ttys,把下面的一行的secure改为insecure:  

console none        unknown off secure  

这样用户进入单用户模式时会要求输入ROOT密码,当然这样也使你忘记ROOT密码  
时恢复存在一定难度了。  

ii)修改一些计算机相关设置,如BIOS,不允许软盘启动,CDROM启动等,即在装载  
硬盘驱动以前不允许其他媒介启动。设置BIOS密码,保护机器物理安全(如果人家  
带着榔头,炸弹,一盆水来那就没办法了)。  

iii)关于虚拟终端和虚拟终端缓冲,虚拟终端缓冲中的内容在你logoff以后并  
不刷新,所有你在机器来操作的活动可以被复查。你可以重新配置内核参数如:  

SC_NO_HISTORY      #取消历史记录  

SC_DISABLE_DDBKEY   # 取消debug键  
SC_DISABLE_REBOOT   # 取消clt-alt-del 键  

iv)对/bin,/sbin进行安全保护。  

#chflags schg /bin/*  
#chflags schg /sbin/*  
    

======================================================================  

信息过滤问题  
--------------  

FreeBSD的包过滤工具具有强大的规则设置来过滤你想阻塞的信息,你可以使用  
ipfw来实现,不过你需要在内核中有一定的选项设置,如:  

需要在编译内核时打开下面选项重新定制内核。  

options IPFIREWALL  
options IPFIREWALL_VERBOSE  
options “IPFIREWALL_VERBOSE_LIMIT=100”  
options IPFIREWALL_DEFAULT_TO_ACCEPT  

options IPDIVERT  

其中第一项设置IPFIREWALL是用于打开基本的包过滤支持的,只有使用它才能  
在内核中支持包过滤。IPFIREWALL_VERBOSE 和IPFIREWALL_VERBOSE_LIMIT设  
置记录过滤日志,及日志记录的限制。IPFIREWALL_DEFAULT_TO_ACCEPT是设置  
IPFIREWALL的缺省行为,在数据包不符合所有的过滤规则的情况下进行转发,  
显然这是一种宽松的限制,此时系统主要用于屏蔽特定地址和特定服务,而提  
供其他的缺省网络能力。如果没有定义这个选项,系统就只能允许符合已定义  
规则的数据包通过,而屏蔽其他任何数据包,这样在没有定义过滤规则的情况  
下,系统不能和其他计算机相互通信。最后一个选项IPDIVERT是用于定义  
IPFIREWALL与natd的接口(摘自王波-FreeBSD使用大全连载)。  

你可以建立/etc/firewall.rules建立自己的规则,并把文件设置为600属性,  
下面的规则仅供参考:  

ipfw -q -f flush  
ipfw -q add 00100 allow ip from any to any via lo0  
ipfw -q add 00220 deny log ip from me to any in  
#syn fin组合的包一般来说是nmap和queso扫描器使用,所以过滤  
ipfw -q add 00225 deny log tcp from any to any in tcpflags syn,fin  

# 检查通信状态  
ipfw -q add 00230 check-state  
ipfw -q add 00235 deny tcp from any to any in established  
ipfw -q add 00240 allow ip from any to any out keep-state  

# 控制icmp包,只能通过icmp类型来限制  
ipfw -q add 00300 allow icmp from any to any icmptype 3  
ipfw -q add 00301 allow icmp from any to any icmptype 4  
ipfw -q add 00302 allow icmp from any to any icmptype 11  

# 允许DHCP通过  
ipfw -q add 00401 allow udp from 192.168.2.1 67 to any 68  
ipfw -q add 00402 allow udp from 192.168.1.1 67 to any 68  

# allow ident requests  
ipfw -q add 00500 allow tcp from any to any 113 keep-state setup  

# log anything that falls through  
ipfw -q add 09000 deny log ip from any to any  

其实关于规则有很多文章可以参考,这里就不在叙述。  

你可以使用下面命令马上激活规则:  

# sh /etc/firewall.rules  

如果你要在你日志里查看有关丢弃包的记录,你需要如下设置:  

# sysctl -w net.inet.ip.fw.verbose=1  

如果你要所有这些设置在机器启动时候激活,编辑/etc/rc.conf增加如下条目:  

firewall_enable="YES"  
firewall_logging="YES"  
firewall_script="/etc/firewall.rules"  

最好你如果要记录这些信息进行调试,不要忘了在/etc/syslog.conf中增加如下  
条目:  

!ipfw  
*.*                /var/log/ipfw.log  

记得在/etc/newsyslog.conf中设置如下选项:  

/var/log/ipfw.log        600  3     100  *    Z  

=========================================================================  

用户资源限制问题  
---------------  

从 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。--感谢QUACK  

=========================================================================  

一些管理员日常操作  
------------------  

i)经常查看http://www.freebsd.org/security/index.html的安全公告  

ii)订阅security bugtraq和FreeBSD官方安全邮件列表了解安全动态。  

iii)每天检查系统日志,关于检查系统日志,你可以通过其他工具增加多信息的捕获,  
如snort可以比较完全的记录信息。  

iv)如果你硬盘够大,信息处理够快,定时使用netstat -an >> /.../.../netstat.log来  
记录信息,当然你也可以建立更详细的脚本,因为netstat能记录连接信息,所以如有些  
后门日志不能记录,但netstat却在一定时间里总有连接记录。  

v)如果你对你的文件系统有原始的记录,你可以定时使用一些系统完整性检查工具进行  
检验。  

vi)如果你有防火墙,那更好,经常查看防火墙信息。  

===============================================================================  

FreeBSD近来比较严重的一些安全漏洞  
-------------------------------------  

远程漏洞  
--------  

i)目前出现的最严重的漏洞,telnetd守护程序存在远程溢出漏洞,可以让攻击者远程  
获得Root shell,目前已经有telnetd exploit code推出,包括windows。详细资料  
请查看:  

ftp://ftp.freebsd.org/pub/FreeBS ... 49.telnetd.v1.1.asc  

ii)FreeBSD的ftp也存在远程溢出,可以让攻击者最终获得Root shell.详细资料请看:  

ftp://ftp.freebsd.org/pub/FreeBS ... .ftpd-glob.v1.1.asc  

iii)FreeBSD如果使用BIND服务(操作系统附带),如果BIND服务版本小于8.2.3-RELEASE,  
在处理TSIG问题上存在单字节溢出问题,可以获得远程的ROOT SHELL。详细资料请查看:  

ftp://ftp.freebsd.org/pub/FreeBS ... D-SA-01:18.bind.asc  

另外关于应用程序的还有wu-ftp,qmail中的vcheckpasswd也存在远程缓冲溢出,还有其他  
其他的。不在详举。  


本地漏洞  
--------  

i)FreeBSD的内核对信号处理不正确,可以导致本地用户获得ROOT SHELL。详细信息请看:  

ftp://ftp.freebsd.org/pub/FreeBS ... SA-01:42.signal.asc  

ii)FreeBSD的procfs文件系统存在漏洞,可以导致本地用户获得超级管理  
员权限。具体信息可以查看:  

ftp://ftp.freebsd.org/pub/FreeBS ... :77.procfs.v1.1.asc  

iii)因为好多FreeBSD安装了Mysql数据库,而低于3.23.22版本的mysql都有  
一个漏洞可以写信息到敏感文件,如写信息到/etc/passwd或者/etc/shadow中,  
也可以说是一个比较严重的漏洞  

上面几个本人认为必须重视的几个漏洞,然后你需要打上补丁,或者使用最新的  
程序,然后相关的应用程序看你是否安装,你可以在如下地址找到相应漏洞信息:  

http://www.freebsd.org/security/index.html  

===================================================================================  

有错误难免,以后有关安全tip也会不断整理加上,谢谢!

TOP

发新话题