tcpwrapper的使用方法

  • 2019 年 10 月 4 日
  • 筆記

tcpwrapper:工作在第四层(传输层),能够对有状态连接的服务进行安全检测并实现访问控制的工具。部分功能上跟iptables重叠。

     对于进出本主机访问某特定服务的连接基于规则进行检查的一个访问控制工具,这个访问控制工具以库文件形式实现;某进程是否接受libwrap的控制取决于发起此进程的程序编译是否针对libwrap进行编译的。

        tcpwrapper的作用是对基于tcp的程序进行安全控制。它通过使用/usr/sbin/tcpd这样一个进程来代为监听任何一个使用了tcpwrapper的发起连接的tcp请求。假设sshd接受tcpwrapper的验证,当有一个连接发起ssh连接时先有tcpwrapper进行身份验证,如果通过了验证,则将连接转向sshd,否则直接拒绝连接。

        tcpwrapper只能为tcp的连接进行验证。它实际是通过库文件libwrap.so来实现控制的,并不是所有的tcp连接都接受其控制。其次,主要针对基于tcp并且在编译(两种编译方式:静态和动态)时链接到libwrap库上的程序才能生效。

所以tcpwrapper的功能并没有iptables强大。

一、如何判断一个程序是否可以tcpwrapper控制:

判断一个二进制程序是否接受tcpwrapper的控制,只需检查二进制程序在编译的时候是否依赖libwrap.so库

[root@station39 ~]# ldd `which sshd` | grep libwrap

        libwrap.so.0 => /lib/libwrap.so.0 (0x00c5a000)

某些二进制文件在编译时直接以静态的方式将对libwrap库的依赖性编译到文件中去,此时需要使用string来检查

[root@station39 ~]# strings `which sshd` | grep hosts

[root@station39 ~]# strings `which portmap` | grep hosts     //**提供RPC服务的进程

hosts_access_verbose

hosts_allow_table

hosts_deny_table

/etc/hosts.allow

/etc/hosts.deny

链接到libwrap.so的独立进程有:sendmail,slapd,sshd,stunnel,xinetd,gdm,gnome-session,vsftpd,

portmap等等。

二、配置文件介绍

1.TCP Wrappers配置文件

   要决定一个客户是否被允许连接一项服务,TCP Wrappers会参考以下两个文件,这两个文件通常被称为主机访问文件:                 /etc/hosts.allow                 /etc/hosts.deny    当一个TCP Wrappers接收到一个客户请求时,它会运行以下几个步骤:        A.检查/etc/hosts.allow.TCP会绕服务会循序地解释/etc/hosts.allow文件并应用第一个为这个服务所指定的规则.如果找到了一个匹配的规则,则允许连接.如果找不到匹配的规则,就会进行下一个步骤.        B.检查/etc/hosts.deny.TCP会绕的服务会循序地来解释/etc/hosts.deny文件.如果找到一个匹配的规则,则拒绝这个连接.如果找不到匹配的规则,则允许连接到这个服务.      在使用TCP Wrappers保护网络服务时应该考虑以下几个要点:        A.因为hosts.allow中的规则会首先被应用,所以比hosts.deny中指定的规则有优先权.因此,如果访问一项服务在hosts.allow中设置为允许,那么在hosts.deny中同一项服务的拒绝访问设置则被忽略.        B.每个文件中的各项规则是由上到下被读取的,第一个匹配的规则是唯一被应用的规则.因此,规则的排列顺序极其重要.        C.如果在这两个文件中都没有找到匹配的规则,或这两个文件都不存在,那么就授予访问这项服务的权限.        D.TCP会绕的服务并不缓存主机访问文件中的规则,因此对hosts.allow或hosts.deny的配置改变都无需重新启动网络服务便会马上起作用.    2.格式化访问规则    /etc/hosts.allow和/etc/hosts.deny文件的格式是完全相同的.每个规则都必须位于其正确的行位.空行或以井字号(#)开始的行会被忽略.    每条规则都使用以下基本格式来对网络服务的访问进行控制:          <daemon list>: <client list> [: <option>: <option>: …]    字段解释如下:       <daemon list>,一个由逗号分隔的进程名(不是服务名)列表,或ALL通配符.守护进程列表也接受运算符来提供更大的灵活性.       <client list>,一个由逗号分隔的主机名,主机IP地址,特殊模式或通配符列表,该列表用来识别受这项规则影响的主机.客户列表也接受运算符来允许更大的灵活性.        <option>,这项规则被触发时要运行一个动作选项或由冒号分隔开动作列表.选项领域支持扩展式,发布shell命令,允许或拒绝访问以及修改日志记录.    下面是一个基本的主机访问规则示例:         vsftpd : .example.com    这条规则指示TCP Wrappers监测在example.com域内的任何主机向FTP守护进程(vsftpd)发出的连接.如果这条规则出现在hosts.allow 中,连接则被接受.如果这条规则出现在hosts.deny中,连接则被拒绝.    下面的主机访问规则比较复杂,而且使用两个选项领域:         sshd : .example.com  :spawn /bin/echo `/bin/date` access denied>>/var/log/sshd.log :deny    请注意每个选项领域前面都有反斜线().使用反斜线可以防止由于规则太长而造成失败.    这个范例规定如果example.com中的某个主机试图向SSH守护进程(sshd)发出连接请求,那么执行echo命令来将这次尝试添加到一个专用日志文件里,并且拒绝该连接.因为使用了命令选项 deny,这一行拒绝访问,即使它出现在 hosts.allow 文件里.   3.通配符   通配符使TCP Wrappers更容易匹配各种守护进程或主机.使用通配符最频繁的是在访问规则的客户列表领域内.   以下是可以被使用的通配符:          ALL,完全匹配,可以用在守护进程列表和客户列表中.          LOCAL,与任何不包括圆点(.)的主机匹配,如localhost.          KNOWN,与任何带有已知主机名和主机地址或已知用户的主机匹配.          UNKNOWN,与任何带有未知主机名和主机地址或未知用户的主机匹配.          PARANOID,与任何带有主机名和主机地址不相匹配的主机匹配.   4.模式   模式可以用在访问规则的客户领域里,从而更准确地给客户主机指定分组.   下面是一个常用模式列表:        A.主机名以圆点(.)开始,如果在一个主机名的开始放置一个圆点,那么就与所有共享这个主机名中列出的相同组成部分的主机匹配.如:.example.com适用于example.com域内的任何主机.        B.IP地址以圆点(.)结束,如果在一个IP地址的末尾放置一个圆点,那么就与所有共享一个IP地址的起始数值组的主机匹配.如:192.168.适用于192.168.x.x网络内的任何主机.        C.IP地址/网络掩码对,网络掩码表达式也可以作为一个模式用来控制对某一组特定的IP地址的访问.如:192.168.0.0 /255.255.254.0适用于地址区间从192.168.0.0到192.168.1.255的任何主机.        D.[IPv6地址]/前缀长度对,[网]/前缀长度对也可以作为一种模式用来控制对某一组特定的IPv6地址的访问.如: [3ffe:505:2:1::]/64适用于地址区间从3ffe:505:2:1::到 3ffe:505:2:1:ffff:ffff:ffff:ffff的任何主机.        E.星号(*),星号可以用来匹配整个不同组别的主机名或IP地址,只要在含有其它模式类型的客户列表中这些组不混杂在一起的话.如:*.example.com适用于example.com域内的任何主机.        F.斜线(/),如果一个客户列表以斜线开始,这个列表就被当作一个文件名对待.若是需要指定很大数量主机的各种规则的话,这一点就很有用处.    更多TCP Wrappers所接受的其它用到的模式.可参阅hosts_access man 5 page.  5.Portmap(端口映射器)和TCP Wrappers     实施TCP Wrappers的Portmap不支持主机查找,也就是说portmap命令不能用主机名来识别相应的主机.因此,在hosts.allow或 hosts.deny中对portmap的访问控制规则必须使用IP地址来特指某主机,或用关键词ALL.     对portmap访问控制规则的修改可能不会立即起作用.可能得重新启动portmap服务.     像NIS和NFS一样的被广泛使用的服务都有赖于portmap来进行运作,所以要了解这些局限性.    6.算子(Operators)     目前,访问控制规则接受一个算子EXCEPT,这个算子可以用在一个规则的守护程序列表中,也可以用在客户列表中.     这个EXCEPT算子允许特定的例外以用来在同一个规则中拓宽匹配的范围.     下面的例子来自一个hosts.allow文件,除cracker.example.com之外,允许所有example.com主机连接所有的服务         ALL: .example.com EXCEPT cracker.example.com     hosts.allow文件内的另一个例子中,来自192.168.0.x网络的所有客户都可以使用除FTP之外的所有服务         ALL EXCEPT vsftpd: 192.168.0.     从组织结构上来说,避免使用EXCEPT算子更简易一些.因为这样可以让其他的系统管理员能很快地扫描相关的文件以便查看哪些主机被允许或被拒绝访问服务,而无须通过EXCEPT算子来进行排序.    同样, EXCEPT可以进行嵌套,    ‘a EXCEPT b EXCEPT c′ would parse as ‘(a EXCEPT (b EXCEPT c))′    7.记录日志     通过使用severity命令,其选项领域让系统管理员能够很容易地改变一个规则的日志设施和优先级别.     在下面的例子中,example.com域内的任何主机向SSH守护进程发出的各种连接会登录到默认的authprivsyslog设施内(因为没有具体指明设施参数值),并且以emerg优先:           sshd : .example.com : severity emerg     使用severity选项也可以指定某个设施.下面的例子将来自example.com 主机的任何SSH连接意图登录到local0设施,并以alert优先.                 sshd : .example.com : severity local0.alert         实际操作中,这个例子直到syslog守护进程(syslogd)被配置为登录到local0设施才会起作用.     8.访问控制     选项领域也允许系统管理员通过添加allow或deny作为命令的最后选项来明确地以单个规则方式允许或拒绝主机.     例如,下面的两个规则允许来自client-1.example.com的SSH连接但却拒绝来自client-2.example.com的连接        sshd : client-1.example.com : allow        sshd : client-2.example.com : deny     访问控制以每个规则为基础,这样选项领域就允许系统管理员把所有访问规则写成一个单一文件,要么是hosts.allow,要么是hosts.deny.有些系统管理员认为这样组织访问规则更容易一些.     9.Shell命令     选项领域允许访问规则通过下面两个指令发出shell命令:        (1).spawn,作为子进程发出一个shell命令.这个命令可以使用/usr/sbin/safe_finger来获取发出请求客户的更多信息,或使用 echo命令来创建专用日志文件.在下面的例子中,试图访问来自example.com 域的Telnet服务的客户被俏俏地登录到一个专用文件.              in.telnetd : .example.com  : spawn /bin/echo `/bin/date` from %h>>/var/log/telnet.log : allow        (2).twist,把要求进行的服务转换成特定的命令.这个命令经常用来给外侵者设立陷阱(也叫"蜜罐儿").也可以用来向预连接的客户发送信息.这个 twist命令必须出现在该规则命令行的末尾.在下面的例子中,试图访问来自example.com域的FTP服务的客户接收到用echo命令发送的一个 讯息.             vsftpd : .example.com : twist /bin/echo "421 This domain has been black-listed. Access denied!"     10.扩展式     扩展式命令与spawn和twist命令一起使用时,可以提供关于客户/服务器以及相关进程的信息.       下面是一个支持扩展式的命令列表:              %a,返回用户的IP地址.              %A,返回服务器的IP地址.              %c,返回大量的客户信息,比如用户名和主机名,或用户名和IP地址.              %d,返回守护进程的名称.              %h,返回客户的主机名(或IP地址,如果主机名没有提供的话).              %H,返回服务器的主机名(或IP地址,如果主机名没有提供的话).              %n,返回客户的主机名.如果主机名没有提供的话,屏幕上会显示unknown.如果客户的主机名和主机地址不匹配的话,屏幕上会显示paranoid.              %N,返回服务器的主机名.如果主机名没有提供的话,屏幕上会显示unknown.如果服务器的主机名和主机地址不匹配的话,屏幕上会显示paranoid.              %p,返回守护进程的进程ID.              %s,返回各种不同类型的服务器信息,比如守护进程的进程和服务器的主机或IP地址.              %u,返回客户的用户名.如果没有提供的话,屏幕上会显示unknown.    下面用来示范的规则与spawn命令一起使用了一个扩展式来在一个定制的日志文件中确认客户主机.    当来自example.com域的一个主机向SSH守护进程(sshd)发出连接意图时,执行echo命令来把这次包括客户主机名(通过使用%h扩展式)的连接尝试信息记录到一个专用文件中.       sshd : .example.com : spawn /bin/echo `/bin/date` access denied to %h>>/var/log/sshd.log : deny    同样的,扩展式也可以用来把个性化的讯息返回给客户.在下面的例子中,试图访问来自example.com域的FTP服务的客户们得到通知,他们的访问被服务器取缔了.       vsftpd : .example.com : twist /bin/echo "421 %h has been banned from this server!"         有关可用扩展式的更完全的解释,以及对附加的访问控制选项的更完全的解释,可参阅man page的第五部分,查看hosts_access(man 5 hosts_access)和hosts_options.   11.连接旗帜(Connection Banners)    当用户连接到服务器时,用合适的旗帜标示显示其连接是一种很好的方式,可以让潜在的袭击者知道本系统管理员很有警惕性.同时也可以控制关于系统什么样的信 息可以呈现给用户.要想为一项服务设置一个TCP Wrappers旗帜标示,可使用banner选项。    这个例子为vsftpd设置一个旗帜标示.首先,创建一个旗帜标示文件,可以储存在系统的任何地方,但必须与其守护进程同名.例如,该文件命名为/etc/banners/vsftpd并包含下面一行:         220-Hello, %c 220-All activity on ftp.example.com is logged. 220-Inappropriate use will result in your access privileges being removed.       %c权标可提供客户的多种信息,比如用户名和主机名,或用户名和IP地址,也许这样会使该连接更让人觉得有胁迫感。      要想使该旗帜在有外来连接进入时显示,可在/etc/hosts.allow文件上加上下面一行:            vsftpd : ALL : banners /etc/banners/

三、举例说明:

allow  : 允许访问 deny   : 拒绝访问 spwan  : 拒绝访问 并且在自己这边执行后面自定义的命令或脚本 twist  : 拒绝访问 并且在访问者那边执行后面自定义的命令或脚本 serverity : 将来访者的信息记录到日志中,然后继续和后面的规则做比对 banners : 显示指定文件中的信息给client端 例如: vsftpd : 192.168.0. : swpan /bin/echo $(date) %c %d >> /var/log/tcpwrap.log vsftpd : 192.168.1. : twist /bin/echo “421 Connection prohibited.” vsftpd : 192.168.2. : banners /var/banners 第一条规则,是拒绝192.168.0的网段访问,并且将日期和来访者的信息记录到tcpwrap.log中 第二条规则,是拒绝192.168.1的网段访问,并且在来访者客户端的那边显示提示信息”421 Connection prohibited.” 第三条规则,当192.168.2的网段访问,在客户端那边显示提示信息,信息内容由 /var/banners文件来指定。

   (1). ALLOW/DENY: 可以在/etc/hosts.deny或/etc/hosts.allow 中被当做一个选项来使用。

例:编辑/etc/hosts.allow

in.telnetd: 192.168.1.

in.telnetd: ALL: DENY

   (2). spawn:在匹配到规则时重新发起一个额外的命令来执行其他的动作,可使用特殊展开。

在子进程中执行,并不影响当前进程。

in.telnetd: ALL : spawn echo "login  attempt  from  %c  to  %s"  | mail -s waring  root

   (3). twist:启动一个额外的命令来取代当前规则中定义的服务。

sshd: 192.168.0. twist /bin/echo "421 Connection prohibited."

     通过一个例子来说明二者区别:

     编辑/etc/hosts.allow

          in.telnetd: 192.168.0.: spawn /bin/echo `date`  %c accessd %d &gt;&gt; /var/log/tcpwrap.log

     可以正常访问,我们来查看下日志:

     [root@station39 xinetd.d]# cat /var/log/tcpwrap.log

           Wed Mar 23 12:26:29 CST 2011 192.168.0.1 accessd in.telnetd

     我们使用twist来试一下:/etc/hosts.allow

           in.telnetd: 192.168.0.: twist /bin/echo "421 connetcion deny!"

     使用物理机访问,被拒绝:

   (4). severity [facility.] priority

       定义访问某个服务时的日志级别,默认authpriv.info级别

                  in.telnetd:ALL: serverity local7.info

   (5). banners

       访问某个服务时返回的信息

                  in.telnetd: ALL: banners  /some/directory

       编辑/etc/hosts.allow

                  in.telnetd: ALL: banners /var/tcpwrap

       举例:

                  [root@station39 xinetd.d]# mkdir  /var/tcpwrap

                  [root@station39 xinetd.d]# vim /var/tcpwrap/in.telnetd

       "Welcome to 192.168.0.39"

       使用物理机访问一下:

本文出自 “秋天的童话” 博客,请务必保留此出处http://wushank.blog.51cto.com/3489095/1156152