- 论坛徽章:
- 0
|
已为solaris8操作环境更新
翻译:田大海,杨云
Solaris™ 操作环境是一个通用操作系统,它有很多可配置的适用于安全性的低层网络选项。其中有一些选项需要加以调节来加强Solaris 操作环境的安全状况。本文包括了对多种已知的攻击方法的解释,这可不是要给攻击者做个攻击指南,而是为了解释为什么系统管理员需要设置或者修改一些特定的网络选项。
在加强Solaris操作环境的安全性时必须做一些取舍,以在系统的可管理性和安全性之间需要取得一个平衡。本文讨论这些取舍问题。
本文中所提到的各种网络安全配置方法不是在所有环境下都可以使用的。对特殊的网络设置的修改会对默认的系统操作造成不利影响,对这些副作用也在这里加以讨论。本文不讨论上层网络安全问题.上层网络安全包括配置inetd, NFS, NIS/NIS+, RPC, DNS, 和其他一些应用级的服务。该主题(上层网络安全)已经在2000年一月在Sun BluePrints™ OnLine上发表于《Solaris Operating Environment Security》一文中。
本文中的信息适用于Solaris 操作环境 2.5.1,2.6.7和8版本。其他Solaris 操作环境也可能有一些相似的设置。在Solaris 的其他版本中使用本文中说明的设置方法之前需要先进行相应的研究。
ndd命令
本文讨论到的网络设置中的一部分是使用ndd命令来配置的。这个命令用来检查和设置内核(kernel) 模块参数,也就是传输控制协议/internet协议(TCP/IP)驱动程序的参数。大部分能通过ndd命令访问到的核心参数修改后是不需要重启动系统的。要想知道有那些参数可以设置,可以使用以下的ndd命令:
# ndd /dev/arp \?
# ndd /dev/icmp \?
# ndd /dev/ip \?
# ndd /dev/tcp \?
# ndd /dev/udp \?
这些命令可以列出地址解析协议(ARP),internet控制消息协议(ICMP),IP,TCP,和用户数据报协议(UDP)驱动程序的参数列表。在这篇更新了的BluePrint OnLine 文章中,这些不同驱动程序以字母顺序排列。
Solaris 8操作环境支持下一版的Internet协议集,他们有一些额外的驱动程序。这些驱动程序的参数列表可以用以下命令来查找。
# ndd /dev/ip6 \?
# ndd /dev/icmp6 \?
# ndd /dev/tcp6 \?
# ndd /dev/udp6 \?
# ndd /dev/ipsecesp \?
# ndd /dev/ipsecah \?
ICMP, IP, TCP, 和 UDP 驱动程序的IPv6版参数也列在标准(IPv4)参数列表里。本文不讨论IPsec,但出于完整性的考虑,这些参数也被列在这里。目前还没有计划在Solaris 操作环境 8.0之前的版本加入对IPv6 或IPsec 的支持。
有些网络接口设备的驱动程序还可以通过ndd命令来调节参数。以下命令可以列出hme(快速以太网FastEthernet)设备驱动程序的参数列表:
# ndd /dev/hme \?
?需要写成“\?”字符串以避免操作系统(shell)将”?”当成特殊字符来处理.用”\?”会列出该驱动程序的参数并指出该参数是只读,只写,还是可读写的.当前的参数值和状态信息可以通过指定设备驱动程序和参数名字来读取.
以下例子演示使用ndd命令来查看ARP驱动程序的”debugging”状态.(输出0表示当前状态为未激活[disabled])
# ndd /dev/arp arp_debug
0
ndd 使用整数来指定参数值,”0”表示未激活,”1”表示激活,或者用大整数来设置时间或者大小的值.设置参数值需要使用”-set”选项以及驱动程序名称,参数名称和新的值。比如,要激活ARP驱动程序的debugging模式,使用这个ndd命令:
# ndd -set /dev/arp arp_debug 1
修改参数时须注意的事项
在此之前,只有一部分参数文档可以从sun公司得到.这是一个已知的问题.随着Solaris 8 操作环境的发行,一些选定的TCP/IP参数现在已经有了文档.那书名叫《Solaris Tunable Parameters Reference Manual》,可以在docs.sun.com访问到.大部分Solaris 8操作环境的参数信息也可用于以前的版本.
设置驱动程序的参数也意味着做出取舍.大部分参数会造成对Solaris默认配置的修改.而默认配置是为大部分情况做了优化的.调整参数可能影响普通的系统操作,因此SUN公司不鼓励修改参数.
本文对所有涉及到的ndd参数都在相应的地方讨论了修改参数的优缺点和可能造成的影响。有些设置修改了系统的正常操作,这些地方都做了注释.那些推荐的参数修改大部分都正的在用户的生产系统(production system)中良好运作.
Sun公司有时候在不同的版本间会修改参数名或者增加额外参数.本文中讨论的IPv4参数可以在2.5.1, 2.6,和 7版本下可靠的使用,除了一个例外,这个例外已经被写在文档中了. Solaris8操作环境下还引入了IPv6, ,如果IPv6被激活的话,有一些额外的参数可能需要设置.除了那些IPv6选项, Solaris8 IPv4 也有一些新的参数.本文中的一个设置大部分ndd选项的初始化脚本在”附录A”中有具体描述.最终,你必须判断哪些设置适合给定的计算环境.
ARP
地址解析协议(ARP)用于将32位IPv4地址映射成数据链路层(data-link layer)地址.数据链路层,或称为网络链路(network link layer)层,由操作系统设备驱动程序和对应的网络接口卡组成.这一层负责处理物理传输媒介.SUN网络设备使用一个系统范围(system-wide)的 硬件地址,或称为媒介访问控制(MAC)地址.这意味着一个装了多个以太网接口的sun系统,默认情况下,为每一个不同接口使用相同的硬件地址.
一块Sun Quad FastEthernet™ 高速以太网卡将一个唯一硬件地址赋值给它的四个单独的接口.配置该卡使用其可编程只读内存(PROM)里的硬件地址也是可以的.更多信息请参考sun四倍速高速以太网卡文档.
需要注意的是,许多操作系统,包括Solaris操作环境,允许通过软件定义网络接口的硬件或MAC地址.
通过在软件中明确的设置网络接口的硬件地址,厂家定义的硬件地址可以被覆盖掉.
ARP经常被称为动态协议.这是由于它的操作是自动发生的.这个协议在后台起作用,不被应用程序的用户甚或系统管理员所关心.而正是ARP的动态性造成安全问题
为便于讨论,我们以以太网为例.令牌环(Token ring)和光纤分布式数据接口(FDDI)也与之类似.
ARP通过广播一个地址请求然后获取响应来生成其地址映射(表).只有局域网里的主机才需要硬件地址.在最底层以太网驱动程序需要远程系统的硬件地址,以便发送数据报(packet).当它缺少该地址时,他广播对该不明地址的请求.这个请求,称为ARP请求,包含那个问题主机的ip地址,并且被发给局域网里的所有系统.一个系统可能会用一个响应来回应,称为一个ARP响应,该响应包含主机ip地址和硬件地址.收到的回应被用来建立一张ip地址和硬件地址对应表.
在Solaris操作环境内核,有两张表维护这些地址.一张表,由ARP层维护,称为ARP缓存.它为协议提供了一个高效率层.具体来说,当一个硬件地址被IP层请求时,ARP缓存先被查找.如果该地址信息不存在于本地缓存中,一个ARP请求就被发出,然后对应的响应就被处理. Solaris操作环境同时把未请求的地址信息放进ARP缓存中.这些未请求的地址入口是比较特殊的,因为她们并未直接请求.这些未请求的地址被保存起来以备IP层请求.经过一段时间,这些未请求地址入口被从缓存中删除.默认过期时间为5分钟,这是可以被调整的.
另一张主机地址映射表由IP层维护.它包含通过向ARP层请求而获得的信息.默认情况下,一个入口(entry)会在加入表里20分钟后被删除.
这个协议的另一个特性称为免费(gratuitous)ARP.这发生在一个主机广播一个ARP请求,查找它自己的硬件地址时. 一个Solaris操作环境会在启动(boot)的时候这样做.这被用于检测是否有另一个系统使用相同的IP地址,以指出一个未正确配置的系统.免费ARP的另一个用途是发送更新了的硬件地址信息.收到免费ARP请求的系统会自动更新硬件地址信息.
ARP 攻击
有几个ARP问题会影响系统的正常操作(expected operation).TCP/IP网络协议集需要正确的硬件地址信息来确保数据的正确提交.一个带着不正确的硬件地址的以太网桢(Ethernet frame)不会被期望的系统处理.所有的硬件地址信息都是由ARP层来收集的.当需要的时候,它就收集这些信息,并且也接受发送给它的信息.这个协议同时也是无状态的.问题出在这个协议允许任何主机提供其地址信息(不管正确与否).一个系统可能为代替另一个系统提供信息.ARP层收到的地址信息都会被处理,而不管是不是直接请求到的.另外,很重要的一点是,一个系统收到的所有地址信息都被相信是准确的.
有两种可能的基本的ARP攻击类型:拒绝服务攻击和欺骗攻击.
这些攻击可以阻止正常操作并且可以损害局域网里的其他系统.拒绝服务攻击可以组织一个系统和其他系统交换数据报.这使得该系统看上去不在线.而欺骗攻击时,一个系统伪装成另一个系统.
这些攻击得益于ARP协议的动态性.最简单的攻击方式是拒绝服务攻击.这种攻击有两种形式:本地和远程.在局域网系统里,一个拥有系统的管理员控制权限的攻击者能够向ARP缓存中插入伪造地址信息.向伪造地址发送的数据报无法被目标系统收到.攻击者也可以提供不正确的远程系统地址信息.这也称为缓存中毒.由于ARP总是信任收到的信息,错误的信息就可以被插入,而当前的ARP地址入口就会被破坏.攻击者可以使用ARP层的发布功能来广播其他系统的不正确信息.如果两个ARP响应被收到,至少其中一个会被使用,它有可能是正确的,也可能是不正确的.这种情况可能无规律的在整个局域网里散播,使得问题难以诊断.
ARP 欺骗攻击则更为严重,因为他们被用来攻击局域网里的远程系统.通过伪装成另一个系统,攻击者有可能取得一个信任关系,并获取其他系统的入口.这种攻击包括发送错误的硬件地址信息给目标系统,而目标系统会用该信息来更新其ARP表.一旦错误信息被植入,发动攻击的系统就修改其ip地址,并尝试与目标建立连接.比如说,主机A信任主机B.一个在主机C上的攻击者想要登录到主机A上.首先攻击者必须禁止掉主机B,使它无法响应ARP请求.然后攻击者配置主机C的一个逻辑网络接口的IP地址,并且发送一个ARP响应给主机A,该响应包含主机B的ip地址和主机C的硬件地址.前面已经讨论过,主机A会用ARP响应来更新地址信息.于是主机C现在就假装成了主机B,而攻击者现在就可以登录到主机A了.
(译者注:这里的系统(system)可以被理解成一台主机)
ARP防御
防御ARP攻击很困难.对协议做很大的修改会破坏它与网络上所有基于TCP/IP的系统的兼容性.而消除这个协议的动态性则意味着系统管理的噩梦.不过,还是有一些措施可以采取来提高网络的安全性。如果错误信息被插入了ARP和IP路由表,有两种方法来加以删除:
1、入口可以用arp -d host_entry 命令来手工删除.
2、入口会超时而被系统删除.
RFC826,ARP的定义中,规定ARP 缓存入口应当在经过一段恰当的时间后被自动删除.未请求(unsolicited)的ARP缓存入口的默认超时时间在所有Solaris操作环境里都是5分钟,IP路由入口表在20分钟后超时.在Solaris2.5.1到7版本里,以下超时间隔可以被修改
# ndd -set /dev/arp arp_cleanup_interval 60000
# ndd -set /dev/ip ip_ire_flush_interval 60000
在Solaris8操作环境下, ip_ire_flush_interval参数被更名为ip_ire_arp_interval.
超时间隔以毫秒为单位.一分钟等于60000毫秒.这个两个命令都减少了ARP缓存和IP路由表的超时期间.入口会以较快的频率被删除.这有可能减慢ARP攻击,因为错误的入口无法维持很长时间.这些在命令在系统初始化脚本中提供,参见”附录A”..这个改动的主要副作用是大大增加的ARP请求和响应数量.这可能不适用于一个已经拥挤的网络.
另一个办法是在ARP缓存中生成一个静态的硬件地址入口表.这个方案能抵御大部分ARP攻击,但它破坏了ARP的动态天性,会增加维护成本,而且可能在大部分环境下效率不高.ARP缓存里的静态入口是一个固定的IP到硬件地址的映射表.这些入口可以在系统启动的时候载入.生成一个包含IP地址和对应硬件地址的文件,类似如下
gort.eng.sun.com 08:00:20:ba:a3:c5
olympics.eng.sun.com 08:00:20:4d:6d:30
switchblade.eng.sun.com 08:00:20:b3:48:57
用”arp -f file”命令载入文件内容,文件包含一张主机名和硬件地址的表.这些入口现在在缓存里被表示为持久入口,而不会由于超时或是被未请求信息(unsolicited information) 覆盖.使用‘arp -d host_entry’ 命令还是可以把他们删除,其中host_entry参数是要删除的主机名.这个方案可能不适用于频繁更换硬件的环境.
完全禁用一个接口的ARP也是有可能的.这意味着这个网络接口不会再发送ARP请求也不会再处理ARP响应.要禁用ARP处理,使用‘ifconfig interface -arp’命令.任何禁用了ARP的系统必须有静态ARP入口,同时任何需要和禁用了ARP的系统通讯的系统也需要有静态ARP入口(比如路由器).由于其高昂的管理成本,大部分环境下都不推荐使用这个方案.这可能适用于少量机器需要互相通讯,同时不需要和局域网中其他系统交互的情况.
ICMP(internet控制消息协议)
Internet控制消息协议(ICMP)提供了一个机制来报告错误和请求信息.这里讨论的配置参数由IP驱动程序管理.ICMP广播有时候是很麻烦的.一个网络里所有系统对一个ICMP广播发出的大量响应可能造成网络速度明显降低.一个攻击者可以使用ICMP广播请求来发动一次拒绝服务攻击.最好是禁止对ICMP广播进行响应的能力.内部ICMP规则通过控制不该产生的错误消息来防止出现广播风暴
Solaris操作环境有一些ICMP广播参数,在以下章节说明:
Echo Request Broadcast
ping命令生成的一次普通的网络检验就是一次Echo Request Broadcast.Echo Request会被发送到广播地址.所有配置为对Echo Request Broadcast进行响应的系统都会发送一个Echo Reply.那有可能是大量的数据报.更具破坏性的是可以增加包尺寸.收到广播的系统会发回包里的所有数据.极大的包会被拆分成几个数据报,这样进一步增加了网络流量.用以下ndd命令来禁用对静默请求广播的响应.
# ndd -set /dev/ip ip_respond_to_echo_broadcast 0
把这个命令加到系统启动脚本里.它也包括在附录A里的初始化脚本里
Echo Request Multicast
IPv6没有广播数据报.它使用Multicast数据报来替代.这相当于IPv4的Echo request broadcast.攻击方法也是一样. Solaris8操作环境可以使用以下命令来指示系统忽略Echo Request Multicast:
# ndd -set /dev/ip ip6_respond_to_echo_multicast 0
把这个命令加到系统启动脚本里.它也包括在附录A里的初始化脚本里
时间戳请求广播
时间戳请求经常用来同步两个系统的时间.单个的时间戳请求是正常的,但系统一般不需要响应广播式的请求.使用这个ndd命令来禁用它.
# ndd -set /dev/ip ip_respond_to_timestamp_broadcast 0
把这个命令加到系统启动脚本里.它也包括在附录A里的初始化脚本里
Address Mask Broadcast
地址掩码请求用来判断网络掩码.它可能被无盘设备,如打印机,X终端在启动时发送.这种类型的请求通常是广播.这些请求默认是忽略的,可以用以下ndd命令来检查:
# ndd /dev/ip ip_respond_to_address_mask_broadcast
0
把这个命令加到系统启动脚本里.它也包括在附录A里的初始化脚本里
重定向错误
路由器使用重定向错误来通知一个发送数据的主机,把数据报转发到另一个路由器.两个关系到重定向的路由器必须连接到同一个子网.发送的主机随后会插入一个新得到目的主机的路由到自己的路由表里.与ARP入口不同,这些入口不会超时而被删除.大部分系统在修改路由表前会检查重定向信息来找出错误和潜在问题。
收取重定向错误
攻击者可能伪造重定向错误来安装错误路由.这有可能发动一次拒绝服务攻击,如果新指定的路由器根本就不是一个路由器.有一些判定合法重定向错误的规则,但都很很容易欺骗.用这个ndd命令来忽略IPv4 ICMP重定向错误:
# ndd -set /dev/ip ip_ignore_redirect 1
与之类似,对于IPv6,可以用以下命令指示系统忽略重定向:
# ndd -set /dev/ip ip6_ignore_redirect 1
大多数每个子网只有一个默认路由器的环境都不需要接受重定向. 把这个命令加到系统启动脚本里.它也包括在附录A里的初始化脚本里
发送重定向错误
只有路由器需要发送重定向错误,主机或跨网段(multihomed)系统都是不需要的.
用这个ndd命令来禁止发送IPv4重定向错误:
# ndd -set /dev/ip ip_send_redirects 0
与之类似, 对于IPv6,也同样可以禁止产生重定向错误,使用以下ndd命令:
# ndd -set /dev/ip ip6_send_redirects 0
把这个命令加到系统启动脚本里.它也包括在附录A里的初始化脚本里
时间戳请求
前面已经提过, ICMP时间戳广播在大部分环境里都是不必要的. Solaris操作环境有能力禁止单向时间戳请求.禁用这个设置禁止系统回应时间戳请求.一些UNIX系统将无法使用rdate命令来远程获取时间. Solaris操作环境的rdate命令使用的是由inetd提供的TCP时间服务,因此受远程系统不响应ICMP时间戳请求的影响.以下ndd命令禁止Solaris操作环境系统响应单向时间戳请求:
# ndd -set /dev/ip ip_respond_to_timestamp 0
把这个命令加到系统启动脚本里.它也包括在附录A里的初始化脚本里
Solaris2.6, 7, 和 8操作环境版本,包括一个更好的跨多系统进行时间同步的方法,使用网络时间协议(NTP)系统.参阅xntpd 手册(man) 页获取更多细节.
IP
IP协议是低层提供批量数据传输的协议。它是无连接的,并且不提供可靠传输的机制。本文提供的配置参数受控于Solaris OE IP 驱动程序(driver)。
IP 转发
IP 转发(forwarding)是在一个系统的网络接口间路由、转发IP包(packet)的过程。如果到达一个网络接口的IP包被发觉它的目的地址是另一个网络时,它会被转发到另一个合适的网络接口。IP转发主要是由路由器完成的,具有多个网络接口的主机也可以进行IP转发的工作。配置一个以上网络接口的Solaris OE系统能在不同的网络接口间转发IP数据报(datagram)。这种类似路由器的功能是Solaris OE的缺省行为。
具有多个接口的系统可以配置成多宿(multihomed)服务器。一个多宿系统具有多个网络接口,每个接口具有单独的IP地址。 这种系统不是用来路由或转发IP包,而是用来处理来自多个和它直接相连网络的请求。一个大型的NFS服务器能为多个不同网络的客户端(client)提供服务。当NFS服务器和它的客户端所在的网络直接相连时,服务器响应速度更快,系统吞吐量更大。因为提供了到达其他网络和系统的路径,允许IP包转发的系统就成了攻击者的目标。一些这样的系统可能不能由路由器通过正常的方式路由到。多宿服务器可以连接到私有的、非路由的(non-routed)网络。如果多宿服务器允许IP转发,它所在的私有网络就提供了公开的可达路径。内部网放火墙可以被绕过去,方法是通过和被保护的内部网直接连接的多宿服务器来转发IP包。
在Solaris OE系统中,通过简单创建名为/etc/notrouter文件就可以在系统启动时关闭IP转发功能。IP转发功能也可以在系统运行时利用ndd命令开启或关闭。用这个命令关闭Ipv4的IP转发功能示例如下:
类似地,下面的命令用来关闭Ipv6的IP转发功能:
攻击者可能会使一个系统具有IP包转发功能来危及系统的安全,因为原来不能通过正常途径访问的系统现在有了访问的途径。这也是要保证所有服务器安全性的原因之一。
Solaris 8 OE 增加了基于网络接口来控制Ipv4转发的功能。这就可以灵活地决定哪个网络接口能转发IP包,哪个不能转发IP包。下面的ndd命令将开启hme1和hme2接口的IP转发功能,关闭hme0接口的IP转发功能:
严格目的地址多宿
严格的目的地址多宿能够在非路由的多宿系统中防止包欺骗(packet spoofing)。对一个关闭了IP转发并开启了严格目的地址多宿的Solaris OE系统,它将忽略那些发送到指定的网络接口并且该接口不是目的地址的IP包。这就防止了攻击者生成相应的IP包,这些包去往那些与关闭了IP转发功能的多宿服务器直接相连的网络。系统知道IP包要到达哪个接口,并且如果IP包来自另一个接口连接的网络,该包将被丢弃。
在Solaris OE 中能够启用这个特性,缺省是不启用。针对IPv4,用下面的ndd命令启用它:
类似地,针对Ipv6,用下面的ndd命令启用它:
把这个命令加到系统的启动脚本里面,或者按照“附录A”配置init脚本。
转发定向广播
定向广播是来自远程网络的某个系统到另一个网络的所有系统的单播数据报(unicast datagram)。一旦该数据报到达和目的网络相连的路由器,它被转发到目的网络的所有系统,就象数据链路层的广播一样。
由于广播造成的网络流量的增加,并且要把每一个包传送到网络的所有系统,定向广播可能会带来一些问题。攻击者能够利用转发的定向广播来攻击和探测系统。CERT Advisory CA-98.01描述了一个名为smurf攻击的拒绝服务攻击类型。它利用伪造的ICMP echo请求包发送到广播地址。伪造包的源地址被设置为另一个目标的地址,结果是被设置的目标和中间路由系统转发定向广播造成网络拥塞。推荐的解决方法是关闭所有路由器的定向广播功能。另外,攻击者也可以通过发送定向广播来探测网络,从而发现有可利用弱点的系统。
允许IP转发的Solaris OE系统缺省允许转发定向广播。
用下面的ndd命令来关闭转发定向广播功能。
可以把这个命令加到系统的启动脚本里,或者参照”附录A”加到init脚本里面。
路由
路由过程包括检查路由表的信息,依照数据报的目的IP地址决定从哪个网络接口发送该数据报。路由表集中了每个网络主机的相关地址信息,决定了IP包的路由去向。即使一个简单的桌面应用系统(desktop system)也必须决定目的地是本地子网(直接路由)还是通过本地路由器可达(间接路由)。
路由表是周期性更新的。存在着多个路由信息协议在系统和路由器之间传送路由信息。Solaris OE系统利用in.routed 和 in.rdisc两个daemon进程来动态管理路由信息。其中in.routed实现了路由信息协议(RIP v1),in.rdisc实现ICMP路由发现。当Solaris OE系统配置成能转发包的路由器(开启了IP转发的功能)时,这些daemon进程向它的客户端(clients)和其他路由器发布路由信息,并且侦听来自其他路由器的路由信息。当接收到新的路由信息时,这些daemon进程更新路由表。这种管理路由信息的方式称作动态路由。
动态路由存在一些问题。攻击者可以利用它发起拒绝服务的攻击,查看来自不可达系统的IP包数据。首先路由信息能够被伪造。路由信息一般是通过广播或多播包的形式来发送。攻击者能产生声称来自某个路由器的路由信息包,并把它发送给其它的主机和路由器。这些路由信息包能够引导主机给一个不是路由器的系统发送包,或者给一个繁忙的、不能处理流量增加的路由器发包。配置不当的路由器会自己产生拒绝服务的问题。一个更加复杂的攻击包括引导IP包经过一个多宿系统,当这些包通过时象路由器那样检查包的数据。攻击者还可以伪造路由信息给一个路由器,声称到他不能到达的网络有一个较低的跳数(hop count)。这样目标路由器就会通过危及安全的系统(允许攻击者来检查网络流量)来路由包。
缺省情况下,Solaris OE系统利用系统daemon进程动态管理路由信息。静态路由能用来防止恶意的远程路由信息的变化。基于存在于/etc/defaultrouter本地子网路由器的IP地址,Solaris OE系统在启动时定义了一个缺省路由。查看route的man信息页能得到更多的信息。静态路由适用于每个子网一个路由器的环境。具有冗余多路由器的网络可能会使用动态路由,这样当其中的一个出现故障时,可以切换到另一个继续工作。用作网络路由的Solaris OE系统应当继续采用动态路由。
转发源路由包
源路由包包含了到目的地的路由信息。正常情况下,路由的决定是由路由器来完成的。路由器维护可用的路由信息,当接收到新的路由信息时进行动态的更新。源路由包定义了它们自己的路由路径,不再依靠路由器进行路由的选择。
大部分的网络不需要源路由。合理配置的路由器能进行更优的路由选择。源路由包经常是恶意行为的征兆。攻击者可能试图利用源路由包来绕过特定的路由器、内部放火墙;或者试图避开某个已知网络入侵检测系统。源路由包是非常少见的,简单地删除它们会影响到极少的合法应用(如果有的话)。
一个配置了IP转发功能Solaris OE系统缺省能进行源路由包的转发。对于Ipv4,能用下面的ndd命令关闭源路由包的转发功能:
类似地,对于Ipv6, 源路由包转发功能用下面的ndd命令来关闭:
可以把这个命令加到系统的启动脚本里,或者参照”附录A”加到init脚本里面。
TCP
传输控制协议(TCP)提供了面向连接的可靠的数据传输。它利用较低层的协议-IP来管理数据报的传输。TCP处理连接的管理和数据传输的可靠性。这里描述的网络配置选项在Solaris OE系统的TCP驱动程序中进行管理。
SYN淹没攻击
1996年发行号为48的电子杂志Phrack发表了一篇名为Project Neptune的文章,该文章描述了一个针对TCP的网络拒绝服务攻击,称作SYN淹没。这种攻击使得系统对到来的网络连接请求响应很慢(或者根本不响应)。一个这样的Web站点看上去就象宕掉一样,因为它不能对到来的浏览器的请求建立连接。这篇文章还包含了对远程系统发起SYN淹没攻击的程序源码。文章发表不久,一些大型的ISP和Web站点就成了这种攻击的牺牲品。攻击者通过modem拨号连接到Internet发起攻击,在很短的连接时间内破坏相应的站点。经常很难追查到攻击的源头。
TCP是TCP/IP协议族的一部分,它是面向连接的。在用TCP交换数据之前,两个系统必须建立一个连接。连接的建立分三步进行,通常称为三次握手。在握手过程中,目的端口信息被交换,并且双方要同步序列号。(名称SYN就指这种同步步骤。)
握手以下列的方式进行:
1. 客户端给服务器发送一个TCP段,段的头含有SYN标志,段中还包含初始序列号(ISN)和端口号。
2. 服务器返回给客户端一个段,段中设置了SYN标志、确认标志(ACK 标志)、原始的ISN+1、自己的ISN。
3. 客户端发送一个设置了ACK标志和服务器ISN+1的段
一个连接现在就建立起来了,双方就可以从协议好的序列号开始进行数据的交换。
序列号为TCP协议提供了可靠性。序列号是递增的并随着每个包发送出去,远程系统可以对到达的包按正确的顺序排列起来。如果一个包从序列中丢失,就可以被发现并要求重传该包。
SYN淹没攻击正是利用了以下TCP握手中的弱点。当服务器收到第一个SYN段时,它按照SYN段中的地址给客户端发送一个SYN/ACK段。然而,如果客户端不可达,服务器端会在一定的时限内重发SYN/ACK段(IP层返回的ICMP差错信息被TCP层忽略)。如果一个攻击主机发送了大量的、地址为不可达主机的SYN段,服务器将花费大量的时间和系统资源试图来建立连接。最终服务器会达到部分打开连接(partially open connections)的最大值。这些处在握手状态的接入连接是某个特定端口上待处理队列(backlog queue)的一部分。以前的Solaris OE版本中,待处理队列是很小的。队列满了以后,随后到达的SYN段便不能被处理。结果是要么系统不再对某一端口做出响应,要么是最初的响应变得非常缓慢。由于待处理队列中存在大量未完成的连接,具有多个网络服务的系统可能会耗尽内存资源。为了应付这种攻击,Solaris 2.5.1 OE内核改变了TCP连接队列的大小,并发布了相应的补丁程序。现在系统中有两个队列。已建立连接的队列依然存在。另一个新队列保存握手过程未完成的、尚未建立的连接。SYN淹没攻击则影响这个新队列。当攻击发生时这个未建立连接的队列被添满,可以用一个算法将最早的SYN段删除并允许完成合法连接的建立。Patch 103582-11(包括以后的补丁)把这个新的 队列加到Solaris 2.5.1 OE中。Solaris 2.6,7,8 OE 中则集成了这个队列。当一个系统遭到攻击时,以下的信息将被写到日志中:
这个信息表示系统正在按设计的那样处理攻击。
新队列的大小是可调节的。繁忙的Web服务器可能需要增加未建立连接队列的大小。这个队列的缺省大小是1024,如下用ndd命令把它增加到4096:
可以把这个命令加到系统的启动脚本里,或者用”附录A”中描述的脚本。每次内核队列的大小增加时,必须保证有足够的系统内存来确保这种增加。
连接耗尽攻击
SYN淹没攻击TCP的三次握手,连接耗尽攻击则针对已建立的连接。这种攻击并不常见,因为大多数情况下网络连接能被追溯到它的源头,而SYN淹没攻击则不然。大多数的操作系统对能建立的连接数目有一个界限,要么由一个内核参数设定,要么受可用内存的限制。连接数目达到这个界限时新的连接就不能再建立。在新的连接建立之前,当前的活动连接必须已完成且被关闭。对于多数Web服务器来说这个界限永远达不到,因为HTTP连接是短时的(short-lived)。攻击者能够对一个服务器打开多个连接,长时间保持这种连接,从而有效地把服务器推到它连接界限的边沿。一般Web服务器将关闭已经完成的连接同时接受新的连接请求。当攻击者持续地快速请求新连接,他们最终将拥有所有可用的连接。正常的Web用户将收到Web服务器不响应的信息。这是另一种拒绝服务攻击。
一种防范这种攻击的措施是通过调整内核和应用的参数来实现。这不是一个完整的解决方案。因为它主要是一场争夺资源的战争。谁拥有最多的资源(系统、内存等)谁将赢得这场战争。攻击者可能会扩散连接攻击到外部多个系统以提高连接请求的总数。然而可以通过调整内核和应用来减少这种攻击的有效性。多数的Web服务器有一个设置连接超时的参数。例如,Apache 1.3.9 web server有一个配置参数Timeout(在Solaris 8 OE的/etc/apache/http.conf文件中)来设置连接建立的最大时间。把较低的值赋给这个参数将缩短超时的时间。另外,Solaris OE releases 2.5.1 (加上Patch 103582-11或以后的版本),2.6,7,8有一个共同的参数来调整可建网络连接数的最大值。缺省值是128,用下面的ndd命令增加缺省值到1024:
通过减少连接的时间和增加最大可建立连接数可以解决大多数连接耗尽攻击。尽管有这种变化,仍然可能产生有效的拒绝服务攻击。然而,攻击者必须投入大量的资源才能得逞。
IP欺骗攻击
可预测的ISNs使得攻击者利用它危及某些系统的安全成为可能。上面讨论的TCP三次握手涉及数据交换之前的两个同步序列号。对每一个新的连接,多数系统采用的ISN具有固定的可预测的计数器增量值。攻击者能利用这一点预测到需要的ISN,进而通过三次握手建立一个连接来执行有关的命令。
这是一个涉及到利用两个系统间的信任关系进行的高级攻击行为。典型地,由于在.rhosts文件中配置了信任关系,远程Shell命令(rsh)可能被试图运行。这种攻击是在攻击者不能查看到从攻击目标返回的IP包情况下进行的。因为攻击者不和攻击目标在同一个局域网内,而且包将去往被欺骗主机。例如,假定主机A信任主机B,攻击者在主机C(在不同的网上)想执行主机A的命令。攻击的第一步是使主机B丧失能力。这可以通过前面描述的SYN淹没攻击来实现。然后攻击者建立一个到目标主机的连接(或多个连接来判断网络延迟)来采样使用的ISN。它能够用来预测下一个ISN。
攻击者用下列步骤进行TCP的三次握手:
1. 攻击者创建一个TCP段,内含SYN标志和任意的ISN。源地址设置成被信任的主机,然后发送到目标系统。
2. 目标系统向被信任的系统发回一个段,内含SYN和ACK标志、攻击者的ISN+1、目标系统自己的ISN。攻击者看不到这个包。
3. 攻击者等待一段时间以允许SYN/ACK段被发送出,然后发送一个段,内有ACK标志和预测的ISN+1。
如果攻击者能够精确地预测出目标系统的ISN,远程shell的daemon进程(in.rshd)就会相信它有一个和信任主机的有效连接。攻击者就可以在远程主机中执行命令。
RFC 1498中定义了一种更好地产生ISN的方法来防止IP欺骗攻击。用该RFC中定义的过程,每个连接有一个唯一的表面上看来随机的ISN。对于使用这种技术的系统,攻击者想预测到ISN已相当困难。
Solaris OE系统有几个设置选项:可预测的方法(0),改进的、采用随机递增值的方法(1),RFC 1498方法(2)。所有Solaris OE修订版缺省采用方法1,2.6,7,8版包含所有这些方法。Solaris 2.5.1 OE 只有方法0和1。Solaris 2.6,7,8 OE可以被改进后采用方法2。
有两种机制可以实现这种变化。第一个机制是修改文件/etc/default/inetinit把下面一行:
变成
修改完这个参数后重启系统。
当系统运行时,用下面的命令进行转变:
不幸的是,Solaris 2.5.1 OE没有提供RFC 1948方法,并且还没有以后支持它的计划。采用RFC 1948方法可能会有一些性能上的损失。
TCP反向源路由
正如上面讨论的那样,源路由包定义了特定的路由路径,而不是靠网络路由器进行路由的决定。即使开启了IP转发功能的系统也应该配置成拒绝转发源路由包。
另外,可以配置Solaris OE,忽略那些基于到达的TCP源路由包的反向路由。正常情况下,反向路由路径被复制到去往某个接收系统的所有包中。关闭了TCP反向源路由功能情况下,除了反向路由信息从所有响应包中删除外,源路由包被正常处理。只有Solaris 8 OE有这种功能。缺省情况下这种功能被关闭,可以用ndd命令验证它的配置:
忽略反向路由可以防止攻击者在TCP握手过程中欺骗其它的系统。它同样包含在“附录A”的init脚本中。
TCP和UDP的公有参数
有一些参数对TCP和UDP驱动程序来说是公有的。这些参数的实现概念类似且独立于协议。
Solaris OE和其它的UNIX变种对端口号小于1024的网络端口限制存取。端口号在1-1023的端口被认为是保留的,只有超级用户才有权得到他们。这些特权端口的范围可以被扩大,某一个特定的端口也可以被加入到特权端口队列中。
Solaris OE提供了一种定义动态分配端口范围的机制。这些端口通常被认为是短命(ephemeral的,因为它们的生存期很短,主要存在于向外的(outbound)网络连接中。端口范围的上下界限都可以被调节。
增加特权端口
Solaris 2.5.1,2.6,7,8 OE提供一种从1023以上的端口中扩充特权端口的方法,该方法适用于TCP和UDP驱动程序。另外,Solaris 2.6,7,8 OE有一个添加附加的、某个特定特权端口的机制。
对某些需要超级用户特权运行的服务来说,它们需要的端口号却在特权端口范围之外。如NFS服务器进程(nfsd)就是绑定到2049端口上。不幸的是,没有超级用户特权的攻击者可以启动系统中一个服务器进程,该进程通常不作为NFS服务器,这个非特权的进程向无疑虑的客户端提供了一个假的NFS服务。除此之外,还有其它多个服务和应用绑定在非标准的特权端口上。
对于TCP和UDP驱动程序来说,可以用tcp_smallest_nonpriv_port参数来扩展特权端口的范围。它用来声明最小的非特权端口号。用下面的ndd命令扩展特权端口的范围到4097:
把这个命令添加到系统的init脚本中,就可以在系统启动时使设置生效。
我们也可以声明附加的特权端口。可以用ndd命令查看当前特权端口的列表:
命令的输出表明:NFS服务器端口(2094)和NFS锁管理器端口(4045)已经作为特权端口被保护起来。这两个端口是Solaris 2.6,7,8 OE的缺省附加特权端口。
添加特权的TCP或UDP端口使用类似的、独立的参数名字。为TCP驱动程序添加特权端口用参数tcp_extra_priv_ports_add ,为UDP驱动程序添加特权端口用参数udp_extra_priv_ports_add 。例如,用ndd命令向特权列表里添加TCP和UDP端口号:
TCP端口7007和UDP端口7009现在就成了附加特权端口。
我们也可以删除已定义的附加特权端口。用tcp_extra_priv_ports_del或udp_extra_priv_ports_del参数来删除为上述特定驱动程序定义的端口。
扩展特权端口的范围可能会破坏某些应用程序的执行。在配置附加特权端口之前,要清楚哪些服务器进程需要超级用户的特权来运行,并且这些服务器绑定的端口在特权端口范围之外。需要注意的是一些服务作为普通用户进程来运行的。扩展端口的范围或添加一个不适当的端口可能会阻止该服务器获得正常运行所需要的端口。所以我们尽可能地用添加特定端口到特权端口列表的方式,而不是改变特权端口的范围。
改变临时端口的范围
Solaris 2.5.1,2.6,7,8 OE提供了一个为TCP和UDP驱动程序改变临时端口范围的方法。范围的上下界限都可以被改变。
下面的ndd命令显示了TCP和UDP驱动程序参数的范围值:
为TCP和UDP驱动程序改变临时端口范围是通过声明最大和最小的端口号来实现的。
调整这些值是非常有用的,特别是对有放火墙保护的环境。定义较小的范围能简化特定应用的放火墙设置规则。当对外建立网络连接的能力有限时,定义小的范围时应特别小心!
总结
这些网络安全设置的应用大部分都需要规划和测试,但应该能适用于大部分计算环境。对已知的网络攻击的认识有望提供所需的手段来进行有益的修改。
有一个免费而且公开的安全工具,叫做JumpStart架构和安全脚本“JASS”工具包能够帮助你配置这些网络修改和其他关于安全的处理。很多sun的客户站点使用这个工具在他们的sun系统上进行安全配置。这个工具包的下载地址是
http://www.sun.com/blueprints/tools/
.
参考文献
Bellovin, Steven. Defending Against Sequence Number Attacks, RFC 1948, AT&T
Research, Murray Hill, NJ, May 1996.
CERT. IP Spoofing Attacks and Hijacked Terminal Connections, CERT Advisory CA-95.01
http://www.cert.org/advisories/CA-1995-01.html
CERT. “smurf” IP Denial-of-Service Attacks, CERT Advisory CA-98.01
http://www.cert.org/advisories/CA-1998-01.html
CERT. TCP SYN Flooding and IP Spoofing Attacks, CERT Advisory CA-96.21
http://www.cert.org/advisories/CA-1996-21.html
daemon9. IP-spoofing Demystified, Phrack 48, file 14
daemon9. Project Neptune, Phrack 48, file 13
Graff, Mark. Sun Microsystems Security Bulletin: #00136, 1996.
http://sunsolve.Sun.COM/pubcgi/
retrieve.pl?doctype=coll&doc=secbull/136&type=0&nav=sec.sba
Noordergraaf, Alex, Jumpstart Architecture and Security Scripts Toolkit - Part 1 -
Updated for version 0.2, Sun BluePrints OnLine, November 2000.
http://www.sun.com/blueprints/1100/jssec-updt1.pdf
Noordergraaf, Alex, Jumpstart Architecture and Security Scripts Toolkit - Part 2 -
Updated for version 0.2, Sun BluePrints OnLine, November 2000.
http://www.sun.com/blueprints/1100/jssec2-updt1.pdf
24 Solaris™ Operating Environment Network Settings for Security - Updated for Solaris 8 • December 2000
Noordergraaf, Alex, Jumpstart Architecture and Security Scripts Toolkit - Part 3 -
Updated for version 0.2, Sun BluePrints OnLine, November 2000.
http://www.sun.com/blueprints/1100/jssec3-updt1.pdf
Noordergraaf, Alex, Solaris Operating Environment Minimization for Security - Updated
for Solaris 8, Sun BluePrints OnLine, November 2000.
http://www.sun.com/blueprints/1100/minimization-updt1.pdf
Noordergraaf, Alex and Watson, Keith, Solaris Operating Environment Network
Settings for Security, Sun BluePrints OnLine, December 1999.
http://www.sun.com/blueprints/1299/network.pdf
Noordergraaf, Alex and Watson, Keith, Solaris Operating Environment Security, Sun
BluePrints OnLine, January 2000.
http://www.sun.com/blueprints/0100/security.pdf
Morris, R. T. A Weakness in the 4.2BSD UNIX TCP/IP Software, CSTR 117, 1985, AT&T
Bell Laboratories.
Plummer, Dave. An Ethernet Address Resolution Protocol, RFC 826, Network
Information Center, SRI International, Menlo Park, CA., November 1982.
Powell, Brad, et. al. Titan Toolkit.
http://www.fish.com/titan
Stevens, W. Richard. TCP/IP Illustrated, Volume 1, 1995. Addison-Wesley.
Sun Microsystems, Solaris Tunable Parameters Reference Manual, July 2000.
附录A
以下外壳脚本实现了本文中提到的绝大部分ndd命令。使用前对变量做适当调整。根据脚本中的注释说明来安装它。
在以下地址下载这个ndd配置外壳脚本:
http://www.sun.com/blueprints/tools/
作者背景:KeithWatson
Keith Watson过去三年在sun 公司开发一个叫做 SUN 企业网络安全服务(Sun Enterprise™ Network Security Service)的企业网络安全监控工具套件,
(参见
http://www.sun.com/software/communitysource/senss/
). 他现在为SunPS SM
Global Enterprise Security Service (GESS) 咨询服务工作。在加入sun公司前,他是Purdue大学的计算机操作,监控和安全技术(Computer Operations, Audit, and Security Technologies (COAST) )实验室的成员。
作者背景:Alex Noordergraaf
Alex Noordergraaf在计算机和网络安全领域有超过9年的经验。作为sun微系统公司的企业工程组的高级工程师,他正通过sun BluePrints OnLine 程序来开发、归档和发布最佳安全实践。最近,他发布了自由软件“JASS”安全工具包,这个工具包可以在以下地址下载:
http://www.sun.com/blueprints/tools
.
在进入企业工程(Enterprise Engineering )从事现在工作之前,他曾经是Sun SM
Professional Services的高级安全架构师,在那里,他与很多财富500强(fortune500)公司的项目合作,参与安全评估、架构开发、架构评审和策略/过程(policy/procedure)评审和开发。除了为客户提供可靠的服务外,他还开发和提交了一套企业安全评估方法学和培训教程,被SunPS在全球使用。他的客户包括主流电信公司,金融机构,ISP服务商和ASP服务商等。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/11445/showart_122912.html |
|