一、TCP Wrapper的概念
1.1 TCP Wrapper及其与网络服务的关系
TCP Wrappers建立的保护机制通过定义哪些主机允许或不允许连接到"wrapped"网络服务上来实现。TCP Wrappers为多种不同的服务提供访问把关的功能。大多数现代网络服务系统,像SSH,Telnet和FTP,都利用TCP Wrappers在外来进入系统的请求和被请求的服务器之间设立防范。
当一个客户试图与一个TCP-wrapped服务进行连接时,这个服务首先会检查主机的访问文件(/etc/hosts.allow和 /etc/hosts.deny)来决定这个客户是否被允许连接到这个服务。 在大多数情况下,这个服务还会使用syslog守护进程(syslogd)把这个发出请求的客户用户名以及所要求访问的服务写入/var/log/secure或/var/log/messages文件中。如果一个客户被允许进行连接,TCP Wrappers会释放它对所请求服务的连接控制权,然后将不再在这个客户与服务器间的通信过程中起任何作用.除了可以控制访问和记录日志信息外,TCP Wrappers还可以在允许或拒绝到网络服务的连接请求之前来执行相关的命令与客户进行交流。
因为TCP Wrappers是系统管理员所使用的安全工具库的一个很有价值的补充,红帽企业Linux中的多数网络服务都与libwrap.a库相连.这样的应用程序包括/usr/sbin/sshd,/usr/sbin/sendmail等。
1.2 TCP Wrapper的优势
TCP Wrappers拥有以下其它网络控制技术不具备的优势:
A.对客户和wrapped(会绕的)网络服务的透明性。连接的客户和wrapped网络服务都不需要知道TCP Wrappers在使用中.合法用户会被记录到日志中,并获得所需要的服务,而非法用户则无法获得要求的服务。
B.中央化管理多项协议。TCP Wrappers独立运行于它们所保护的网络服务,这就允许多个服务器应用程序共享一组通用的访问控制配置文件,从而简化了管理任务。
二、TCP Wrapper的配置文件
/etc/hosts.allow和/etc/hosts.deny文件的格式是完全相同的。每个规则都必须位于其正确的行位.空行或以井字号(#)开始的行会被忽略。
2.1 规则定义格式
每条规则都使用以下基本格式来对网络服务的访问进行控制:
<daemon list>: <client list> [: <option>: <option>: ...]
字段解释如下:
<daemon list> 一个由逗号分隔的进程名(不是服务名)列表,在/usr/sbin中的程序,或ALL(EXCEPT)通配符。守护进程列表也接受运算符来提供更大的灵活性。
<client list> 一个由逗号分隔的主机名,主机IP地址,特殊模式或通配符列表,该列表用来识别受这项规则影响的主机。客户列表也接受运算符来允许更大的灵活性.
<option> 这项规则被触发时要运行一个动作选项或由冒号分隔开动作列表.选项领域支持扩展式,发布shell命令,允许或拒绝访问以及修改日志记录.
下面是一个基本的主机访问规则示例:
vsftpd : .example.com
这条规则指示TCP Wrappers监测在example.com域内的任何主机向FTP守护进程(vsftpd)发出的连接。如果这条规则出现在hosts.allow 中,连接则被接受.如果这条规则出现在hosts.deny中,连接则被拒绝。前面提到,hosts.allow和hosts.deny两个配置文件中的内容一摸一样,外来的连接是不是允许取决于规则出现在哪个文件中(如出现deny或者allow命令除外),当然当同时出现,有优先级之分,下面会详细说明。
下面的主机访问规则比较复杂,而且使用两个选项领域:
sshd : .example.com / :spawn /bin/echo `/bin/date` access denied>>/var/log/sshd.log / :deny
请注意每个选项领域前面都有反斜线(/).使用反斜线可以防止由于规则太长而造成失败。
这个范例规定如果example.com中的某个主机试图向SSH守护进程(sshd)发出连接请求,那么执行echo命令来将这次尝试添加到一个专用日志文件里,并且拒绝该连接.因为使用了命令选项 deny,这一行拒绝访问,即使它出现在 hosts.allow 文件里。
2.2 通配符
通配符使TCP Wrappers更容易匹配各种守护进程或主机.使用通配符最频繁的是在访问规则的客户列表领域内.
以下是可以被使用的通配符:
<daemon list & client list>
ALL,完全匹配,可以用在守护进程列表和客户列表中.
<client list>
LOCAL,与任何不包括圆点(.)的主机匹配,如localhost.
KNOWN,与任何带有已知主机名和主机地址或已知用户的主机匹配.
UNKNOWN,与任何带有未知主机名和主机地址或未知用户的主机匹配.
PARANOID,与任何带有主机名和主机地址不相匹配的主机匹配.
2.3 模式
模式可以用在访问规则的客户领域里,从而更准确地给客户主机指定分组.
下面是一个常用模式列表:
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.斜线(/),如果一个客户列表以斜线开始,这个列表就被当作一个文件名对待.若是需要指定很大数量主机的各种规则的话,这一点就很有用处.
2.4 算子
目前,访问控制规则接受一个算子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算子来进行排序.
2.5 记录日志
通过使用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设施才会起作用.
2.6访问控制
选项领域也允许系统管理员通过添加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.有些系统管理员认为这样组织访问规则更容易一些.也就是说,上面的语句无论出现在哪个文件,允许或者拒绝由allow或deney命令来决定。
2.7 Shell命令
选项领域允许访问规则通过下面两个指令发出shell命令:
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
twist,把要求进行的服务转换成特定的命令.这个命令经常用来给外侵者设立陷阱(也叫"蜜罐儿").也可以用来向预连接的客户发送信息.这个twist命令必须出现在该规则命令行的末尾.在下面的例子中,试图访问来自example.com域的FTP服务的客户接收到用echo命令发送的一个讯息.
vsftpd : .example.com /
: twist /bin/echo "421 This domain has been black-listed. Access denied!"
2.8 扩展式
扩展式命令与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。
2.9 连接旗帜
当用户连接到服务器时,用合适的旗帜标示显示其连接是一种很好的方式,可以让潜在的袭击者知道本系统管理员很有警惕性.同时也可以控制关于系统什么样的信息可以呈现给用户.要想为一项服务设置一个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/