首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第15期->技术专题
期刊号: 类型: 关键词:
Solaris针对安全的网络设置(上)

作者:deepin (deepin@nsfocus.com)
主页:http://www.nsfocus.com
日期:2000-11-04

Solaris针对安全的网络设置

没有前言,让我们直接开始。

一.Solaris ndd命令
    Ndd命令能容易的在不重新配置系统内核和重起系统的情况下,修改核心和TCP/IP的设备的一些参数。使用如下命令可看到相应的帮助。

[root@ /]> ndd /dev/arp \?
?                             (read only)
arp_cache_report              (read only)
arp_debug                     (read and write)
arp_cleanup_interval          (read and write)
[root@ /]> ndd /dev/icmp  \?
?                             (read only)
icmp_wroff_extra              (read and write)
icmp_def_ttl                  (read and write)
icmp_bsd_compat               (read and write)
icmp_xmit_hiwat               (read and write)
icmp_xmit_lowat               (read and write)
icmp_recv_hiwat               (read and write)
icmp_max_buf                  (read and write)
icmp_status                   (read only)
[root@ /]> ndd /dev/ip  \?
?                             (read only)
ip_forwarding                 (read and write)
ip_respond_to_address_mask_broadcast(read and write)
ip_respond_to_echo_broadcast  (read and write)
ip_respond_to_timestamp       (read and write)
ip_respond_to_timestamp_broadcast(read and write)
ip_send_redirects             (read and write)
ip_forward_directed_broadcasts(read and write)
ip_debug                      (read and write)
ip_mrtdebug                   (read and write)
ip_ire_cleanup_interval       (read and write)
ip_ire_flush_interval         (read and write)
ip_ire_redirect_interval      (read and write)
ip_def_ttl                    (read and write)
ip_forward_src_routed         (read and write)
ip_wroff_extra                (read and write)
ip_ire_pathmtu_interval       (read and write)
ip_icmp_return_data_bytes     (read and write)
ip_send_source_quench         (read and write)
ip_path_mtu_discovery         (read and write)
ip_ignore_delete_time         (read and write)
ip_ignore_redirect            (read and write)
ip_output_queue               (read and write)
ip_broadcast_ttl              (read and write)
ip_icmp_err_interval          (read and write)
ip_reass_queue_bytes          (read and write)
ip_strict_dst_multihoming     (read and write)
ip_addrs_per_if               (read and write)
ip_ill_status                 (read only)
ip_ipif_status                (read only)
ip_ire_status                 (read only)
ip_ipc_status                 (read only)
ip_rput_pullups               (read and write)
ip_enable_group_ifs           (read and write)
[root@ /]> ndd /dev/tcp  \?
?                             (read only)
tcp_close_wait_interval       (read and write)
tcp_conn_req_max_q            (read and write)
tcp_conn_req_max_q0           (read and write)
tcp_conn_req_min              (read and write)
tcp_conn_grace_period         (read and write)
tcp_cwnd_max                  (read and write)
tcp_debug                     (read and write)
tcp_smallest_nonpriv_port     (read and write)
tcp_ip_abort_cinterval        (read and write)
tcp_ip_abort_linterval        (read and write)
tcp_ip_abort_interval         (read and write)
tcp_ip_notify_cinterval       (read and write)
tcp_ip_notify_interval        (read and write)
tcp_ip_ttl                    (read and write)
tcp_keepalive_interval        (read and write)
tcp_maxpsz_multiplier         (read and write)
tcp_mss_def                   (read and write)
tcp_mss_max                   (read and write)
tcp_mss_min                   (read and write)
tcp_naglim_def                (read and write)
tcp_rexmit_interval_initial   (read and write)
tcp_rexmit_interval_max       (read and write)
tcp_rexmit_interval_min       (read and write)
tcp_wroff_xtra                (read and write)
tcp_deferred_ack_interval     (read and write)
tcp_snd_lowat_fraction        (read and write)
tcp_sth_rcv_hiwat             (read and write)
tcp_sth_rcv_lowat             (read and write)
tcp_dupack_fast_retransmit    (read and write)
tcp_ignore_path_mtu           (read and write)
tcp_rcv_push_wait             (read and write)
tcp_smallest_anon_port        (read and write)
tcp_largest_anon_port         (read and write)
tcp_xmit_hiwat                (read and write)
tcp_xmit_lowat                (read and write)
tcp_recv_hiwat                (read and write)
tcp_recv_hiwat_minmss         (read and write)
tcp_fin_wait_2_flush_interval (read and write)
tcp_co_min                    (read and write)
tcp_max_buf                   (read and write)
tcp_zero_win_probesize        (read and write)
tcp_strong_iss                (read and write)
tcp_rtt_updates               (read and write)
tcp_wscale_always             (read and write)
tcp_tstamp_always             (read and write)
tcp_tstamp_if_wscale          (read and write)
tcp_rexmit_interval_extra     (read and write)
tcp_deferred_acks_max         (read and write)
tcp_slow_start_after_idle     (read and write)
tcp_slow_start_initial        (read and write)
tcp_co_timer_interval         (read and write)
tcp_extra_priv_ports          (read only)
tcp_extra_priv_ports_add      (write only)
tcp_extra_priv_ports_del      (write only)
tcp_status                    (read only)
tcp_bind_hash                 (read only)
tcp_listen_hash               (read only)
tcp_conn_hash                 (read only)
tcp_queue_hash                (read only)
tcp_host_param                (read and write)
tcp_1948_phrase               (write only)

显示当前值
#ndd /dev/arp arp_debug
0
0:代表特性禁止
ndd –set /dev/arp arp_debug 1
1:允许

由于这些参数一般是经过优化过的,而且一旦改变失误,可能导致系统的不正常工作。所以sun不提供文档供人随意调节。

二.ARP
    有关ARP协议的细节,请自己参阅相关文档。对于sun的系统,核心默认的ARP表过期的时间是5分钟,并且可以调节.另外一张表是ip层的路由表,它和arp表配合记录动态路由信息,20分钟过期,最后一个特性是”无偿ARP” ,即系统广播自己的硬件地址。这个特性用来诊断是否存在相同的硬件地址,另外也用来生成硬件地址的变动通知。
   1、ARP攻击
   针对ARP的攻击主要有两种,一种是DOS,一种是Spoof。
   ARP欺骗往往应用于一个内部网络,我们可以用它来扩大一个已经存在的网络安全漏洞。
   如果你可以入侵一个子网内的机器,其它的机器安全也将受到ARP欺骗的威胁。同样,利用APR的DOS甚至能使整个子网瘫痪。

   2、对ARP攻击的防护
   防止ARP攻击是比较困难的,修改协议也是不大可能。但是有一些工作是可以提高本地网络的安全性。
   首先,你要知道,如果一个错误的记录被插入ARP或者IP route表,可以用两种方式来删除。
   a.    使用arp –d host_entry
   b.    自动过期,由系统删除

   这样,可以采用以下的一些方法:
     1).    减少过期时间
#ndd  –set /dev/arp  arp_cleanup_interval 60000
#ndd  -set /dev/ip ip_ire_flush_interval 60000
60000=60000毫秒  默认是300000
    加快过期时间,并不能避免攻击,但是使得攻击更加困难,带来的影响是在网络中会大量的出现ARP请求和回复,请不要在繁忙的网络上使用。
     2).    建立静态ARP表
    这是一种很有效的方法,而且对系统影响不大。缺点是破坏了动态ARP协议。可以建立如下的文件。
      test.nsfocus.com  08:00:20:ba:a1:f2
      user. nsfocus.com  08:00:20:ee:de:1f
    使用arp –f filename加载进去,这样的ARP映射将不会过期和被新的ARP数据刷新,除非使用arp –d才能删除。但是一旦合法主机的网卡硬件地址改变,就必须手工刷新这个arp文件。这个方法,不适合于经常变动的网络环境。
     3).禁止ARP
     可以通过ifconfig interface –arp 完全禁止ARP,这样,网卡不会发送ARP和接受ARP包。但是使用前提是使用静态的ARP表,如果不在apr表中的计算机 ,将不能通信。这个方法不适用与大多数网络环境,因为这增加了网络管理的成本。但是对小规模的安全网络来说,还是有效和可行的。

   3、IP
      IP是用来传输数据的底层协议。

   4、IP Forwarding (IP转发) :
      IP 转发是在不同网卡之间路由包数据的过程。一般是用路由器来实现,但是拥有多网络接口的主机也可以实现。当有两个网络接口的时候,Solairs系统默认打开ip转发。

      关闭IP转发
       对于多宿主主机,存在可能的安全问题是,攻击者可能通过ip转发的方式访问到私有网络。在solaisr系统中,包转发能很的容易关闭。简单的生成一个文件 /etc/notrouter,就能在下次启动的时候关闭ip转发。
另外通过ndd命令也能在系统运行的时候关闭ip转发。
#ndd –set /dev/ip ip_forwarding 0

      严格限定多主宿主机
       如果是多宿主机,还可以加上更严格的限定防止ip spoof的攻击
#ndd –set /dev/ip ip_strict_dst_multihoning 1
默认是关闭的(值为0)

      转发包广播
       由于在转发状态下默认是允许的,为了防止被用来实施smurf攻击,关闭这一特性。 (参见cert-98.01)
#ndd –set /dev/ip ip-forward_directed_broadcasts 0

   5、路由
    路由的过程就是检查路由信息,从而决定如何从哪个接口传输数据包的过程。即使一个桌面系统,也要有路由设置。路由表需要实时的升级。现在有多种路由协议可以用来路由数据。Solaris系统使用in.routed守护程序支持RIP version 1,使用in.rdisc守护进程支持ICMP路由更新。当solairs系统配置成为一个路由设备来转发数据包的时候,它通过上面的两种方式动态更新路由信息。

   6、攻击
    有多种方法能威胁动态路由协议。攻击者能伪造虚假的路由更新信息发送过来,从而达到DOS的效果;同样的方法,还能使数据报文转发到其他的网络上,使攻击者能监听数据。
    默认的solairs系统使用系统守护程序动态管理路由信息。静态路由很好的防止路由信息被远程动态改变。使用/etc/defaultrouter来设置本地子网的路由。使用route命令来设置其他路由信息。
但是对于一个简单网络来说,使用静态路由是合适的,一旦网络中有较多的路由设备,必须使用动态路由。Solairs系统将来也会继续支持动态路由协议。

转发源路由包。
    源路由包中包含了了指定数据如何路由的信息。因此攻击者可能使用源路由包绕过某些特定的路由器和防火墙设备,也可能用来避开一个已知的IDS系统的监控范围。在大多数solairs的应用系统上,是不需要这个特性的。由于solairs在打开ip转发以后默认支持源路由转发,所以我们必须手动关闭它
#ndd –set /dev/ip ip_forward_src_routed 0

   7、ICMP
     ICMP:网络控制信息协议。下面讨论在IP驱动上配置solaris的ICMP特性。

   8、广播:
     ICMP广播经常会带来麻烦,这里有一条原则来防止广播风暴-控制ICMP的错误信息不被生成。为来防止攻击者利用ICMP实施DOS攻击,最好禁止本地网络对ICMP广播的响应。Solairs系统能调节三种ICMP广播的参数。

    响应Echo广播:
    Echo广播通常用来诊断网络主机的存活情况,一旦主机收到一个对广播地址的echo请求,默认情况下所有系统会回复这个广播要求。当有人恶意定制过量的echo包,系统中的流量将大为增加。因此我们可以关闭对echo广播的响应
#ndd –set /dev/ip ip_respond_to_echo_boadcast 0

    响应时间戳广播
    时间戳通常用来同步两个不同系统的时钟,但是系统没有必要回复对广播地址发送的时间戳请求,所以我们可以关闭这种回应。
#ndd –set /dev/ip ip_respond_to_timestamp_broadcast 0

    地址掩码广播
    地址掩码请求被用来确定本地掩码,通常是网络中无盘工作站在启动的时候发送。用下面的命令能禁止对这样请求的应答
#ndd –set /dev/ip ip_respind_to_address_mask_broadcast 0


9、重定向错误
    重定向错误:通常是路由器用来通知主机使用另一个路由器来传输数据的指示报文。报文重指定的路由器必须和发送路由器一样连接同一个子网,而收到报文的主机必须在自己的路由表里新增一条到那个子网的路由。不像ARP的包,这个路由不会过期也不会自动删除。很多系统检测这样的报文用来发现错误和潜在的问题,从而优先更改自己的路由表。

    接受重定向错误
    一个攻击者能伪造重定向错误的报文从而给目标主机装载一个新的路由,而这个路由也许更本就是错误的,这样主机就不会和一些特定的主机或网络通信,这是一种DOS攻击。虽然重定向报文本身有一些校验规则,但是这些规则能很容易的被欺骗。而且目前存在大量的工具来达到这个目的。大多数只有一条默认路由主机系统是不需要理会这种报文的,因此我们可以使用ndd命令忽略ICMP重定向错误报文。(solairs默认是不忽略的)
#ndd –set /dev/ip ip_ignore_redirect 1

    发送重定向错误报文
    只有路由器才需要重定向错误,任何主机即使是多宿主主机也不需要发送这种报文,因此我们可以使用ndd来禁止本机发送错误重定向报文。
Ndd –set /dev/ip ip_send_redirects 0

    时间戳响应
    就像前面提到的,时间戳广播报文在大多数环境下是不需要的。而solaris系统还能够完全不接受这种报文。
#ndd –set /dev/ip ip_respond_to_timestamp 0
关闭这个特性以后,有些使用rdate系统命令的unix主机将不能再同步时钟。但是solaris 2.6和7使用更好的时钟同步方式-NTP(网络时间协议),请参见xntpd的帮助。

   10、TCP
     TCP:传输控制协议

   11、SYN_flood攻击
     TCP-SYN flood又称半开式连接攻击,每当我们进行一次标准的TCP连接(如WWW浏览,下载文件等)会有一个一个三次握手的过程,首先是请求方向服务方发送一个SYN消息,服务方收到SYN后,会向请求方回送一个SYN-ACK表示确认,当请求方收到SYN-ACK后则再次向服务方发送一个ACK消息,一次成功的TCP连接由此就建立,可以进行后续工作了,如图所示:
                请求方                服务方
                --------------------->   SYN
                SYN-ACK   <----------------
                ---------------------->  ACK

  而TCP-SYN flood在它的实现过程中只有前两个步骤,当服务方收到请求方的SYN并回送SYN-ACK确认消息后, 请求方由于采用源地址欺骗等手段,致使服务方得不到ACK回应,这样,服务方会在一定时间处于等待接收请求方ACK消息的状态,一台服务器可用的TCP连接是有限的,如果恶意攻击方快速连续的发送此类连接请求,则服务器可用TCP连接队列很快将会阻塞,系统可用资源,网络可用带宽急剧下降,无法向用户提供正常的网络服务。
    对于solaris 2.5.1,只有安装了patch 103582-1(或以上)才能防止syn_flood.在synflood没有流行以前,连接队列和backlog队列是相同的,solairs 2.6/7和安装了patch以后的2.5.1系统,现在存在两条队列,一个是已连接的队列,一条是未连接完成的队列。SYN攻击时只能填充后一条队列,而且,一旦队列满,将随机丢弃老的syn包。系统还会监控这个队列被短时间填充的情况,一旦怀疑是syn_flood,将在系统的messages中记录下来。

  Mar 8 19:24:01 example unix: WARNING: High TCP connect timeout rate!   System (port 80) may be under a SYN flood attack!
    新队列的大小也是可以调节的,繁忙的web服务器需要提高未连接队列的大小。默认的大小是1024,我们可以提高到4096。
ndd –set /dev/tcp tcp_conn_req_max_q0 4096
    当然,一般情况下,核心的队列增大,系统的内存最好也应有相应的增加。

   12、连接耗尽攻击
    和SYN flood攻击不同,连接耗尽攻击不太常见。因为这种攻击必须使用真实IP,攻击的目标是已连接队列。许多系统有一个同时连接的上限,取决于核心参数和系统内存情况。作为通常的web服务器,这个上限值很难达到,因为http的连接是典型的短时连接。但是一个攻击者可能快速发送大量的连接请求,同时保持连接,这样正常访问者的连接就可能被服务器拒绝。
    我们可以通过优化系统核心和增加内存来缓解,但不是根本的方法。因为攻击者可能同时调动多台机器同时攻击。当然,我们可以在发现攻击以后,在防火墙或路由器上拒绝这些IP来源的连接。
    如果不通过网络设备,仅仅通过调节系统参数来缓解攻击。一方面,可以调节web server,如apache的timeout参数,减短连接保持时间,另一方面,我们可以将核心以连接队列参数增大(默认是128)。
    #ndd –set /dev/tcp tcp_conn_req_max_q 1024
    以上的方法能阻止大多数连接耗尽的攻击企图,除非攻击者调动更多的资源,发动大规模的DDOS,但这样会使攻击者更容易暴露。

   13、IP 欺骗
    IP欺骗基本原理:
    TCP连接的建立 :为了利用TCP连接交换数据,主机间首先必须建立一个连接。TCP建立连接时可以分为3个 步骤,称为三步握手法。如果主机A运行rlogin客户程序,并且希望连接到主机B上的rlogin daemon 服务器程序上,连接过程如图二所示。

1    A     ---SYN--->      B
2    A     <--SYN/ACK---   B
3    A     ---ACK--->      B
          图二

    需要提醒读者的是,主机A和B的TCP模块分别使用自己的序列编号。在时刻1时,客户端 通过设置标志位SYN=1告诉服务器它需要建立连接。同时,客户端在其TCP头中的序列号 域SEQ放置了它的初始序列号(ISN),并且告诉服务器序列号标示域是有效的,应该 被检查。在时刻2时,服务器端在接收了上面的SYN后,作出的反应是将自己的ISN和对客 户端的ACKA发向客户端并且千知下一个期待获得的数据序列号是(ISN+1)。客户端在第一流时刻,对服务器的ISN进行确认。这时,数据传输就可以进行了。ISN与序列号的递增 了解序数编号如何选择初始序列号和如何根据时间变化是很重要的。似乎应该有这种情 况,当主机启动后序列编号初始化为1,但实际上并非如此。初始序列号是由tcp_init函 数确定的。ISN每秒增加工厂128000,如果有连接出现,每次连接将反计数器的数值增加 64000。很显然,这使得用于表示ISN的32位计数器在没有连接的情况下每9.32小时复位 一次。之所以这样,是因为这样有利于最大限度地减少旧有连接的信息干扰当前连接的 机会。这里运用了望2MSL等待时间的概念(不在本文讨论的范围之内。)如果初始序列 号是随意选择的,那么不能保证现有序列号是不同于先前的。假设有这样一种情况,在 一个路由回路中的数据包最终跳出了循环,回到了“旧有”的连接(此时其实是不同于 前者的现有连接(,显然会发生对现有连接的干扰。 端口号 为了提供对TCP模块的并行访问,TCP提供了叫做端口的用户接口。端口被操作系统内核 利用来标示不同的网络进程,也就是严格区分传输层入口的标示(就是说,IP不关心他 们的存在)。TCP端口与IP地址一起提供网络端到端的通信。事实上,在任何时刻任何I nternet连接都能由4个要素来措述:源IP地址、源地址端口号、目的IP地址和目的地址。采样目标主机发出的TCP序列号,猜测出它的数据序列号。然后,伪装成被信任的主机, 同时建立起与目标主机基于地址验证的应用连接。如果成功,黑客可以使用一种简单的命令放置一个系统后门,以进行非授权操作。
    目前,RFC 1498定义了更好的随机ISN生成方法,使得这种攻击很难成功。对于solaris系统ISN生成有三种方式。
    0: 可预测的ISN
    1: 增强的ISN 随机生成
    2: RFC 1948描述的ISN生成方式
    所有版本的solaris默认生成方式值是1。2.5.1只有 0,1两种方式,2.6/7拥有0,1,2三种ISN 生成方式。
    我们可以修改/etc/default/inetinit文件来提高ISN的生成强度。
    将 TCP_STRONG_ISS=1改为 TCP_STRONG_ISS=2
    重起系统使他生效。对于solair 2.5.1,此方法无效。

   14、增加私有端口
    一般的情况下,1-1024端口被称为私有端口,只允许具有根权限的进程连接。但是有些大于1024的端口,即使需要这样的限制,却无法定义,如NFS的服务器端口2049,当然还有一些其他定义的高于1024的私有端口。
    在solairs2.5.1/2.6/7下使用如下方式,可以自定义最小的非私有端口
     ndd –set /dev/tcp tcp_smallest_nonpriv_port 2050
    这样以来,0-2049都被定义为私有端口。
    在solaris 2.6/7下,还能使用另一个参数单独指定私有端口。
     #ndd /dev/tcp tcp_extra_priv_ports
       2049
       4045
    用来显示已经定义的扩展私有端口
    #ndd –set /dev/tcp tcp_extra_priv_ports_add 6112
    来增加新的私有端口定义。
    使用 ndd –set /dev/tcp tcp_extra_priv_ports_del 来删除定义。
    要注意的是,不要随便定义私有端口,因为有些非根权限的进程会使用这些端口。特别是改变最小非私有端口这个参数,经常会引起问题。应仔细分析你的需求再用扩展私有端口定义的方式单独增加。

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