首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第17期->技术专题
期刊号: 类型: 关键词:
调整内核参数改进Solaris安全

作者:Ido Dubrawsky (idubraws@cisco.com)
整理:Warning3 (mailto:warning3@nsfocus.com)
日期:2001-01-10

概述:
=====

对于系统TCP/IP栈,Solaris内核提供了相当多的控制参数,用户可以方便地进
行配置。从缓存表的生存周期到系统能处理的TCP连接数目,几乎一切都是可以
控制的。然而,由于不知道调整这些内核参数的潜在意义,很多系统管理员选择
忽略它们,这使他们的系统在一个足智多谋的攻击者眼中显得有机可乘。

Solaris 内核工具:
=================

对于Solaris 系统管理员来说,调整内核参数的唯一工具就是ndd.目前,ndd只
支持TCP/IP内核驱动。它可以显示和设置这些驱动的参数值。

Solaris 内核参数:
=================

通常显示一个特定参数的ndd命令格式如下:

     # ndd /dev/<driver> <parameter>

这里<driver>是下列选项之一: ARP, IP, TCP, UDP.为了查看某个驱动的所有
参数,命令格式如下:

    # ndd /dev/<driver> \?

使用ndd设置一个内核参数的命令格式是:

     # ndd -set /dev/<driver> <parameter> <value>

不幸的是,使用ndd对Solaris内核参数的改变并不是永久性的。在系统重启动
时这些参数又将恢复成缺省值。为了让这些改变更持久,系统管理需要将这些
改变放到一个系统启动时运行的shell脚本中去(一个可能的文件是
/etc/init.d/inetinit或者一个单独的shell脚本)。在一个shell脚本中设置
这些参数的主要问题是,这些参数依赖于系统实现,不同的Solaris版本参数
可能会有所不同。

ARP
====

ARP (地址解析协议)用来动态地将第三层网络地址转换成数据链路地址。当一
个系统与在同一网络中的另外一个系统通信时,它会首先向广播地址(FF:FF:FF:
FF:FF:FF)发送一个ARP报文.这个报文问了一个简单的问题:"谁使用网络地址A
?...请告诉网络地址B".既然同一网络中的所有主机均收到了这些广播报文,系
统A收到了这个ARP报文后将发送一个回应报文。源主机使用这个回复报文来建立
一个表(缓存),将32位的IP地址映射到第二层硬件(MAC)地址。另一个表由网络
层管理。这个表由数据链路层提供的信息建立,并包含针对活动连接的网络路由
信息。网络层从数据链路层获取MAC地址,然后将这些地址插入一个网络路由表。
网络路由表项在20分钟后过期。

当一个网络主机准备与另外一个主机通信时,IP层首先检查ARP缓存。如果缓存
中没有对方的表项,主机将广播一个ARP请求报文。ARP缓存表项在5分钟后过期。

ARP缓存易受到两种类型的攻击:ARP缓存"中毒"和ARP欺骗。ARP缓存"中毒"包括
将一个不存在的或是错误的ARP地址插入到系统ARP缓存中。这导致一个拒绝服务
攻击,因为尽管目标系统会把报文发送给对方的IP地址,但是通信对方的MAC地址
却是错误的。

ARP欺骗可以导致系统入侵。象IP欺骗一样,ARP欺骗首先要求禁止网络中的某台
主机,以便它不会回复任何地ARP广播请求。一旦这一步完成,攻击者就可以在发
起攻击的主机上设置被禁主机的IP地址。当受害主机试图与被禁止的主机通信时,
攻击者的主机将回复一个ARP请求,将它自己的MAC地址插入受害主机的ARP缓存中。
在两个主机之间的通信就可以正常进行了。

防御ARP攻击是很困难的。一种对付ARP攻击的方法是减少缓存表项的生存时间。
缓存生存时间由内核参数arp_cleanup_interval决定。IP路由表项的生存时间
由内核参数ip_ire_flush_interval控制。

    # ndd -set /dev/arp arp_cleanup_interval <time>
    # ndd -set /dev/ip ip_ire_flush_interval <time>

这里<time>是以毫秒为单位的。减小ARP缓存和IP路由表的超时时间将会拖延攻
击者,但并不能阻止他们。

另外一个办法是可以为某些系统创建静态ARP地址。静态ARP缓存是永久的因此不会
过期。这些表项可以通过命令"arp -d"来删除。第三个办法是在网络接口上禁止ARP
处理并增加静态ARP表项。

IP参数
======

Solaris 内核也提供了针对IP网络协议的多种特性的控制。这个功能通过下列几
个参数来完成:

ip_forwarding
ip_strict_dst_multihoming
ip_forward_directed_broadcasts
ip_forward_src_routed

IP转发包括在同一系统的两个接口间路由IP报文。这本来是一个路由器的工作,
然而,一个Solaris系统同样可以完成这项任务。缺省安装Solaris的系统将会打
开IP转发选项。可以通过将内核参数ip_forwarding的值设为0来禁止IP转发:

       # ndd -set /dev/ip ip_forwarding 0

另外一种攻击途径是入侵者会创建发往某个网络的报文,而这个网络与一个多宿
主服务器(禁止IP报文转发)相连。将ip_strict_dst_multihoming参数设为0,系
统就将丢弃任何来源于另一接口网络的报文。

       # ndd -set /dev/ip ip_strict_dst_multihoming 0

直接广播是指那些从外部网络中的某一主机发到另一个网络的所有主机的报文。
直接广播是"smurf"攻击的基础,它伪造一些从某一主机发往一个远程网络广播
地址的ICMP报文。ICMP报文的源地址被伪装成受害主机的地址。远程网络中的
系统收到ICMP报文后将回复给受害主机,这可能对其造成flooding攻击。任何
打开了IP转发的Solaris系统都会转发直接广播。为了禁止直接广播的转发,
将ip_forward_directed_broadcasts设为0:

       # ndd -set /dev/ip ip_forward_directed_broadcasts 0

当报文在一台主机与外网主机之间传输时,路径是由路由器或者提供路由服务
的主机决定的。然而,IP也可以指定源地址和目的地址之间的路由。这种能力
可以有两种方式:严格方式和宽松方式。使用严格源路由方式,发送者必须指
定它与目标之间每一个中间跳跃点的地址。使用宽松源路由方式,发送至可以
只指定几个中间跳跃点,其他的让路由器自己去选择。源路由可以被用来绕过
网络拓扑中的安全措施。网络中没有理由看到源路由报文。任何允许IP转发的
主机都应当丢弃源路由报文,这可以通过设置Solaris 内核参数ip_forward_src_routed
来完成:

       # ndd -set /dev/ip ip_forward_src_routed 0

TCP 参数
========

1996年9月,Phrack杂志上刊登了一片名为"Project Neptune"的文章。这篇文章
描述了一种名为SYN Flood的拒绝服务攻击。这种攻击的目的是不必进入系统就使
得主机不管从internet还是intranet来看都不可用。这种攻击针对的是TCP连接的
工作原理。当一个系统试图通过TCP连接一个服务器时,发送者将首先发一个设置
了SYN位的报文给目标地址。目标地址使用设置了SYN和ACK位的报文来确认SYN报
文。发送者然后回复一个ACK报文来完成"三次握手":

发送方(客户端)                目标(服务器)

    SYN ------------------------------->
        (序列号 #: X)
        <------------------------------  SYN-ACK
          (序列号 #: X+1, 序列号 #: Y)
    ACK ------------------------------->
        (序列号 #: Y+1)


当目标主机已经响应了发送者的SYN报文但并没有收到发送主机返回的ACK报文
时,就可能发生滥用。这将使目标主机的连接处在"半开状态"。源主机然后打开
对目标主机的一个新TCP连接,并重复此过程。这种过程持续到目标主机所能处
理的所有可能的TCP socket套接字都处在半开状态。这时,后续的TCP SYN报文
将直到半开连接被从TCP连接队列中删除才能被处理。

一种决定是否一个Solaris系统处在TCP SYN攻击的方法是检查处在SYN_RCVD状态
的TCP连接数目:


       # netstat -an -f inet | grep SYN_RCVD | wc -l

可以将这个值与系统在正常状态下的值为基准进行比较。Solaris也提供了另外
一种方法来确定是否主机处在TCP SYN攻击之下。通过运行下列命令:

       # netstat -s -P tcp

然后检查tcpTimRetransDrop和tcpListenDrop参数的值就可以确定是否存在一个
TCP SYN攻击。tcpTimRetransDrop显示自从系统启动以来放弃连接的次数。

参数tcpListenDrop显示根据TCP 队列backlog,自从系统启动以来拒绝的SYN请求
的数目。如果tcpListenDrop与tcpTimRetransDrop的值一道迅速增大,那么系统
就很有可能正处在TCP SYN攻击之下。

为了抵抗这种攻击,管理员必须做下列两件事情:

a) 缩短放弃时间
b) 增大TCP连接队列

为了缩短超时放弃时间,可以使用内核参数:tcp_ip_abort_cinterval。这个参
数的值也是以毫秒为单位。缺省这个时间是180秒。为了设置超时时间为60秒,
管理员可以使用下列命令:

       # ndd -set /dev/tcp tcp_ip_abort_cinterval 60000

在Solaris 2.6以及以上版本(Solaris 2.5.1中需要打补丁103581-11)中,内核
参数tcp_conn_req_max_q0控制未建立连接的队列大小。缺省值是1024.为了增
加队列大小,可以使用下列命令:

       # ndd -set /dev/tcp tcp_conn_req_max_q0 2048

另外一种类型的SYN攻击是耗尽TCP连接队列攻击。这种攻击不像上面提到的TCP
SYN攻击,因为这种攻击可以被追踪到源地址。然而,它仍然是一个安全问题。
在Solaris 2.6以及以上版本(Solaris 2.5.1中需要打补丁103581-11)中,内核
参数tcp_conn_req_max_q用来对已建立的TCP连接队列进行控制。缺省为128.
为了增加建立连接队列的大小,可使用如下命令:

       # ndd -set /dev/tcp tcp_conn_req_max_q <size>

这里<size>是允许到此主机的活动/建立连接的总数。增加未建立连接和已建立
连接队列的大小将要求更多的内存。如果没有足够的内存,系统性能将受到显
著影响。这些措施可以减轻TCP SYN攻击和连接耗尽攻击的威胁。这些类型的攻
击也依赖于哪一方拥有更多的资源。如果攻击者能创造比服务器所能处理的还
要多的连接,就会造成持续的拒绝服务攻击。

结论
=====

Solaris内核有很多与安全相关的可以配置的参数。这些参数可以北调整,以
增强系统的安全性。这些参数包括ARP超时,IP报文转发,IP源路由,TCP连接
队列大小以及其他一些控制网络连接的因素。通过争取得调整这些内核参数,
一个系统管理员甚至可以阻止使用queso或nmap等工具对Solaris系统进行系统
"指纹"探测。

相关连接:
=========

[1.] Solaris[tm] Operating Environment Network Settings for Security,
      Alex Noordergraf and Keith Watson
      http://www.sun.com/blueprints/1200/network-updt1.html
[2.] Solaris inetd.conf Pt. 1, Hal Flynn
     http://www.securityfocus.com/focus/sun/articles/inetd1.html
[3.] Solaris inetd.conf Pt. 2, Hal Flynn
     http://www.securityfocus.com/focus/sun/articles/inetd2.html


<完>
版权所有,未经许可,不得转载