2004-06-20

Tcp_wrapper的安装和使用

Tcp_wrapper的安装和使用 
作者: Yiming Gong (2001-10-05 12:00:00)
      --------------
      Copyright 2000-2003 by 水银流动 Yiming Gong(yiming@security.zz.ha.cn)  
All rights reserved. This document may only be reproduced (whole or in  part) for non-commercial purposes. All reproductions must contain this  
copyright notice and must not be altered, except by permission of the author. 
      --------------    

      Internet的开放互连性使得每一台连在网上的服务器都逃脱不了被攻击的可能性,熟练的使用Unix操作系统尚是一个亟待解决的问题,网络安全,很难顾及。然而今天我们来介绍一个软件Tcp_wrapper,说起这个软件,可算得上是大名鼎鼎了,互联网上,无论采用何种unix操作系统,安装了这个软件的主机恐怕都是不计其数的,事实上它已经成为一种安全的标准配置。本文就以solaris作为操作环境对这个软件做一说明,在其它的Unix操作系统平台上是相通的,读者根据自己的操作系统的种类稍加变化即可。 

 Tcp_wrapper是Wietse  Venema开发的一个可用于各种Unix平台的免费软件,说起Tcp_wrapper的诞生,到有个小小的故事,大约在1990年,作者所在大学的服务器屡屡受到一个外来黑客侵入, 因为受害主机的硬盘数据屡次被rm –rf /  命令整个抹掉,所以找寻线索极为困难,直到有一天晚上Venema在工作的过程中无意中发现
      这个黑客在不断的finger 受害主机,偷窥受害者的工作,在那个时候一个想法诞生了:设计一个软件,使它可以截获发起finger请求的IP,用户名等资料,Venema 很快投入了工作,而Tcp_wrapper也由此出现!在这以后,Tcp_wrapper随着应用逐渐成为一种标准的Unix安全工具,成为unix守护程序inetd的一个插件。通过Tcp_wrapper,管理员可以设置对inetd提供的各种服务进行监控和过滤。 我们知道unix中各种服务的实现是基于inetd这个守护进程的,每当有网络服务请求时,无论是 ftp,telnet,rlogin等等,这种请求都被送到处于侦听状态的inetd守护进程,inetd再根据请求启动相应服务。inetd的设置是根据/etc目录下inetd.conf决定的.inetd.conf中标识了每种服务由什么进程来控制。我们抽取一行如下:
      telnet stream tcp nowait root /usr/sbin/in.telnted in.telned
      从上面这一行我们可以看到,telnet这个服务,是由/usr/sbin目录下的in.telnetd来控制的,每当有telnet的连接请求时,inetd就指导in.telnetd来启动telnet服务.这是unix默认的连接方式,在这个过程中,没有管理员可以控制的部分,也没有连接纪录. 而在安装了Tcp_wrapper的主机上,管理员可以对上述服务加以控制,当Tcp_wrapper编译安装成功后,会生成一个tcpd程序,它可以在inetd.conf这个控制文件中取代in.telnetd的位置,这样,每当有telnet的连接请求时,tcpd即会截获,先读取管理员所设置的访问控制文件,合乎要求,则会把这次连接原封不动的转给真正的in.telnetd程序,由in.telnetd完成以后的工作.如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供telnet服务.除in.telnetd以外,tcpd还可以替代其它各种tcp服务.
      Tcp_wrapper访问控制的实现是依靠两个文件:hosts.allow,hosts.deny来实现的.这两个文件的语法是比较简单的,基本语法就是:
服务类型:本服务有效ip范围 : 许可或拒绝。
如hosts.allow中为:
      In.telnetd : secu.unix.org : allow
      In.ftpd : 10.68.32. : allow
      in.rshd : all :  /usr/local/sbin/safe_finger -l @%h | 
      usr/ucb/mail yiming@371.net
      而hosts.deny为:
      all : all

这两个文件的意思是对telnet来讲,只允许来自secu.unix.org的连接,对ftp而言,允许10.68.32这个c类地址的连接.in.rshd这一部分语法稍微复杂一些,它的意思是外界任何一个ip每次试图使用rsh连接本系统的时候系统会finger发起连接请求的远程用户,并立即将结果发mail到一个管理员的远程信箱yiming@371.net,我们知道,管理员之所以这么做,是因为一般试图进行rsh的连接,都是有很大的潜在危险性的,这说明也许系统已经被人入侵,并安插了.rhosts文件了,这很危险! 所以对管理员来说,这种连接需要引起极大的注意。 
      hosts.deny文件中的all : 
      all表示除了这些以外,拒绝来自任何地方的任何服务。以上只是对访问控制文件的一个简单说明, 管理员可以参看Tcp_wrapper的相应说明定制更为复杂的控制策略.同时需要说明的是,如果需要象上例中设置对rsh的这种finger,mail功能,是需要在Makefile中打开language extension的。 
      下面来讲讲Tcp_wrapper的安装
      首先,我们从可信站点下载tcp_wrappers,如 ftp://ftp.porcupine.org/pub/security/tcp_wrappers_7.6.tar.gz(目前最新的版本是7.6)
      我们假设你的主机已有了各种所需的编译工具,cc(或gcc),make(或gmake),gzip等,如果使用solaris的读者主机上没有这些工具,可到sunfreeware.com下载它们,使用其它Unix系统亦可到相关站点下载。我们在得到Tcp_wrapper包后,用gzip和tar将压缩包解开,会生成Tcp_wrapper目录,进入目录,我们需要编辑Makefile文件,使它合乎我们的工作要求。编辑的基本工作可以分为3步。
      1:在Makefile的头一部分我们可以看到REAL_DAEMON_DIR的描述,它表明了Unix系统中真正的守护程序所在位置,即上面提到的第六个分隔段的守护进程所在目录,solaris中这些守护程序的目录是/usr/sbin,所以我们将SysV.4 Solaris 2.x OSF AIX前的#注释号去掉,即下面的形式:
      # Ultrix 4.x SunOS 4.x ConvexOS 10.x Dynix/ptx
      #REAL_DAEMON_DIR=/usr/etc
      #
      # SysV.4 Solaris 2.x OSF AIX
      REAL_DAEMON_DIR=/usr/sbin
      #
      # BSD 4.4
      #REAL_DAEMON_DIR=/usr/libexec
      #
      # HP-UX SCO Unicos
      #REAL_DAEMON_DIR=/etc 
      2:在Makefile 中查找FACILITY= LOG_MAIL这几个关键字,Tcp_wrapper的纪录功能就是由这里实现的,系统默认是使用solaris的MAIL精灵来做连接纪录的,但这样会造成Tcp_wrapper的连接纪录和系统的mail日志混杂在一起,不利于管理员分辨.所以建议还是选用一个solaris中未使用的local精灵.我们在这里使用LOCAL3,
      即FACILITY= LOG_ LOCAL3 ,SEVERITY级别保持INFO级别不变。在读者的机器上可视情况而定用何种精灵。修改后即下面的形式:
      # The LOG_XXX names below are taken from the /usr/include/syslog.h file.
      FACILITY= LOG_LOCAL3 #LOG_MAIL is what most sendmail daemons use
      # The syslog priority at which successful connections are logged。
      SEVERITY= LOG_INFO # LOG_INFO is normally not logged to the console 
      3:接着查找/etc/hosts.allow,/etc/hosts.deny,也就是上文提到的访问控制文件,建议将默认的/etc替换为其它路径。
      由此Makefile编辑完成,退出vi,执行make  sunos5(sunos5这个参数是由Makefile开始描述部分得到,采用其它操作系统的将sunos5替换为相应参数即可)。我们可以看到系统在编译,成功后,在当前目录下会生成tcpd,tcpdmatch,   safe_finger等5个可执行文件。建议选一个目录如/usr/local/sbin,将上述5个文件拷贝到这个目录中,至此Tcp_wrapper本身的编译工作就此结束。
      下一步,编辑/etc/inetd.conf,将原  telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd中的/usr/sbin/in.telnetd替换为tcpd及其所在路径,在此例中即telnet stream tcp nowait root /usr/local/sbin/tcpd in.telnetd其它ftp, tftp, rsh, rlogin等同样操作即可,建议至少替换telnet,ftp,rsh,rlogin 这几个守护程序。编辑结束后,保存文件,ps –ef | grep inetd找出inetd的进程号,kill –HUP 重启inetd进程使改动生效。接着我们编辑/etc/syslog.conf文件,加入日志纪录功能,在此例中即
      #tcp wrapper log
      local3.info /var/log/tcplog
      编辑结束后,保存文件,在/var/log下生成tcplog文件,注意这个文件的读写属性,应该只对root有读写权限。然后ps –ef | grep syslogd,找出syslogd的进程号,kill –HUP 重启syslogd进程使改动生效。最后一项工作是编辑hosts.deny和hosts.allow文件,按上面的语法编辑即可。至此所有工作完成,
      我们可以用上述两个文件的设置来试一试,假设主机refuse(IP 11.22.33.44)telnet本机,我们看一看,会有什么反应?
      refuse#telnet www.yiming.com
      Trying www.yiming.com ...
      Connected to www.yiming.com Connection closed by foreign host.
      我们再看看本机Tcp_wrapper的日志,多了一条:
      Apr 2 13:56:20 yiming in.telnetd[1769]: refused connect from 11.22.33.44 实际上这种测试可用Tcp_wrapper自带的测试文件tcpdmatch,使用很简单,格式tcpdmatch 守护 程序 假定IP 即可,这里也不介绍了。

没有评论:

发表评论