当前位置:Linux教程 - Linux - Tcp_wrapper 介绍

Tcp_wrapper 介绍



        

       互联网的开放互连性使得每一台连在网上的服务器都逃脱不了被攻击的可能性,事实上我国从接入互联网以来这类事也从未停止过。那么,能不能对这些暴露在外的服务器做一些访问控制呢?我们今天就来介绍一个软件Tcp_wrapper。

      说起Tcp_wrapper,可算得上是大名鼎鼎了,互联网上, 无论采用何种unix操作系统,安装了这个软件的主机恐怕都是不在少数的,事实上它已经成为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的一个标准插件。通过它,管理员实现了对inetd提供的各种服务进行监控和过滤。

      我们知道,unix中各种服务的实现是基于inetd这个守护进程的,每当有网络服务请求时,无论是ftp,telnet,rlogin等等,这种请求都被送到处于侦听状态的inetd守护进程,inetd再根据请求启动相应服务。inetd的设置是根据/etc目录下inetd.conf决定的,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服务。对其它服务如ftp,rsh,rlogin等,方法一样,统一由tcpd来接管。

      先说一下访问控制吧,Tcp_wrapper访问控制的实现是依靠两个文件:hosts.allow,hosts.deny来实现的。这两个文件的基本语法就是:服务类型 :本服务有效ip范围 : 许可或拒绝。如我们看一个hosts.allow文件:
    In.telnetd : 10.68.32. allow
    In.ftpd : 10.68.32.3 : allow
    in.rshd : all :  /usr/local/sbin/safe_finger -l @%h | usr/ucb/mail [email protected]
    而hosts.deny为: all : all

      我们来解释一下这两个文件的意思,hosts.allow中第一行是指对telnet来讲,对telnetd的服务被许可在10.68.32这个c的范围。第二行意思是对ftp而言,允许10.68.32.3这个ip地址的连接。第三行in.rshd这一部分语法稍微复杂一些,它的意思是外界任何一个ip每次试图使用rsh连接本系统的时候系统会finger发起连接请求的远程用户,并立即将结果发mail到一个管理员的远程信箱[email protected],我们知道,管理员之所以这么做,是因为一般试图进行rsh的连接, 都是有很大的潜在危险性的,这说明也许系统已经被人入侵,并安插了.rhosts文件了,这很危险! 所以对管理员来说,这种连接需要引起极大的注意。 hosts.deny文件中的all : all表示除了这些以外,拒绝来自任何地方的任何服务。上面是对访问控制文件的一个简单说明,管理员可根据需要灵活运用,也可以参看Tcp_wrapper的相应说明定制更为复杂的控制策略。同时需要指出的是,如果需要象上例中设置对rsh的这种finger,mail功能,是需要在Makefile中打开language extension的。

    二、Tcp_wrapper的安装(8月15日)

      下面来讲讲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进程使改动生效。

       4:接着我们编辑/etc/syslog.conf文件,加入日志纪录功能,在此例中即


    #tcp wrapper log

    local3.info /var/log/tcplog


       编辑结束后,保存文件, 在/var/log下生成tcplog文件,注意这个文件的读写属性, 应该只对root有读写权限。然后ps -ef | grep syslogd,找出syslogd的进程号,kill -HUP 重启syslogd进程使改动生效。 在这里,我们可以预先看一看以后生成的tcplog文件内容,如下:


    Jul 31 22:00:52 secu.unix.org in.telnetd[4365]: connect from 10.68.32.1

    Jul 31 22:02:10 secu.unix.org in.telnetd[4389]: connect from 10.68.32.5

    Jul 31 22:04:58 secu.unix.org in.ftpd[4429]: connect from 10.68.32.3

    Aug 2 02:11:07 secu.unix.org in.rshd[13660]: connect from 10.68.32.5

    Aug 2 02:11:07 secu.unix.org in.rlogind[13659]: connect from 10.68.32.1


      从上面我们可以看到,在安装了Tcp_wrapper的secu.unix.org这台主机上,系统的每一次连接,Tcp_wrapper都做了纪录,它的内容包括时间,服务,状态,ip,对管理员而言,安全方面很有参考意义。

       5:最后一项工作是编辑hosts.deny和hosts.allow文件,按本文上面例子的语法模式编辑即可。至此所有工作完成,我们可以用上述两个文件的设置来试一试,假设主机refuse.unix.org(IP 11.22.33.44,这个ip不在hosts.allow的许可范围内)telnet本机,我们看一看,会有什么反应? refuse.unix.org#telnet secu.unix.org Trying secu.unix.org ... Connected to secu.unix.org Connection closed by foreign host. 我们看到,连接没有成功,被切断了,我们再看看本机Tcp_wrapper的日志,多了一条:

       Apr 2 13:56:20 secu.unix.org in.telnetd[1769]: refused connect from 11.22.33.44

      除以上功能外,Tcp_wrapper还可以用来设置欢迎标题,阻挡ip欺骗等,管理员不妨一试。你会发现,免费的软件一样优秀。
    发布人:netbull 来自:奥索网