使用TCP WRAPPERS的Linux访问控制
维护良好的访问控制列表是一种不错的做法,任何Linux系统管理员都必须采用。
这可以借助多种工具来实现。
在防火墙之后和服务守护程序之前添加一层安全保护是一种很好的方法,因为即使防火墙遭到破坏,攻击者仍然必须克服为保护服务而应用的另外包装。
在某些情况下,我们还可以保护不具有用于维护访问列表的内置安全机制的守护程序。
TCP Wrapper是一种如此出色的工具,已在Linux/Unix操作系统中广泛用于根据请求源维护过滤器。
最初,当Wietse Venema提出TCP Wrappers时,它仅适用于inetd守护程序处理的服务,如今,它可以与几乎所有可用的基于Internet协议的服务一起使用。
为了了解TCP包装程序的工作流程,下面显示的图表可能会有所帮助。
上图中需要注意的一个重要事实是“ TCP Wrapper出现在防火墙和网络服务之间”
要记住的另一件事是:“如果配置了xinetd,则TCP Wrapper的过滤完成后,它将将控制权传递给xinetd,这将再次通过xinetd特定的过滤器.”
默认情况下,TCP Wrapper已安装在大多数Linux发行版中。
为了验证,我们可以查询RPM数据库,如下所示。
[root@myvm1 ~]# rpm -qa | grep tcp_wrappers tcp_wrappers-7.6-40.6.el5 [root@myvm1 ~]#
此软件包安装的重要共享库文件是libwrap.so。
[root@myvm1 ~]# ls /usr/lib/libwrap.so /usr/lib/libwrap.so [root@myvm1 ~]#
任何需要其访问筛选由TCP包装程序完成的服务,则该服务二进制文件都需要使用libwrap.so文件进行编译。
默认情况下,大多数可用服务都使用libwrap.so库(这意味着特定服务将与TCP包装器一起使用。
)
有关共享库的更多信息。
阅读:Linux中的共享库
[root@myvm1 ~]# ldd /usr/sbin/vsftpd | grep libwrap libwrap.so.0 => /lib/libwrap.so.0 (0x00add000) [root@myvm1 ~]#
在上面的示例中,我使用“ ldd”命令查询ftp(文件传输协议)服务二进制文件(vsftpd)使用的库文件,并搜索libwrap.so。
如上面的示例所示,我们始终可以使用ldd命令查询所需的二进制文件,以验证其是否支持TCP包装器。
在继续进行TCP包装器的配置之前,让我们首先说明一些要点,这些点是TCP包装器的优点,而另一些点是TCP包装器的缺点。
关于TCP包装器的注意事项
- TCP包装器的主要优点之一是,它可以用于一处管理多个TCP服务。
- 通过syslog记录接受和拒绝传入请求。
- 仅使用名为hosts.allow和hosts.deny的两个文件轻松简单地管理配置
- 我们可以修改特定TCP服务的访问列表,而无需重新启动该服务。 TCP包装器的行为类似于即插即用。实际上,修改的效果是非常直接的。
- 我们只能使用tcp包装器控制基于地址的访问列表。这意味着我们将无法获得像iptables这样的成熟防火墙所支持的灵活性和其他复杂选项。
- 通信的两个端点(服务和客户端)不知道它们之间是否存在TCP包装器
- TCP包装程序的简单性也引起了许多管理员的困惑。这主要是因为要提到两个文件允许和拒绝规则。
- 同样,在配置hosts.allow和deny中“每行一条规则”也容易引起错误,这将导致忽略该特定规则。
Linux TCP包装器配置
像任何其他Linux服务一样,TCP包装器也使用普通的文本文件进行配置。
下面提到的两个文件用于它。
- /etc/hosts.allow
- /etc/hosts.deny
在接收到客户请求时,了解读取这些文件的顺序非常重要。
配置了TCP包装程序的服务器在接收到来自客户端的对特定服务的请求后,将首先通过/etc/hosts.allow文件。
如果它为该特定源地址(客户端地址)找到了该特定服务的条目,它将允许连接。
在上述过程中要注意的一点是,如果首先在/etc/hosts.allow中允许主机,然后在/etc/hosts.deny中拒绝该主机,则将允许该主机。
因为一旦在/etc/hosts.allow中找到对源地址的允许条目,服务器就将允许连接,而不必担心/etc/hosts.deny。
因此,请始终记住,文件/etc/hosts.allow总是由系统首先处理的
这些文件的配置顺序也很重要。
仅应用请求的第一个匹配规则,其余规则被忽略。
主机文件遵循的格式如下:
服务/守护程序名称:客户/主机地址:[<其他选项>:<选项>]
服务/守护程序名称
这是服务或者守护程序名称的列表。
他们每个人都用昏迷隔开。
关键字“ ALL”还可以用于指定所有使用TCP包装程序的服务。
客户/主机地址
这不过是需要通过规则传递的主机名或者IP地址的列表。
<其他选项>
我们可以在选项的帮助下指定要执行的操作。
每当规则匹配时,我们将研究可以执行哪些操作。
TCP包装器示例配置
让我们看一下TCP包装程序的一些示例配置。
[root@myvm1 ~]# cat /etc/hosts.allow ALL: .theitroad.com [root@myvm1 ~]#
正如我前面提到的,“ ALL”充当与tcp包装程序兼容的所有服务的通配符。
在上面显示的示例中,它将允许从“ theitroad.com”域向计算机发出的所有请求。
另请注意,在上述情况下,“ hosts.deny”文件为空。
即使我们在hosts.deny中添加相同的条目,也不会有任何用处,因为将首先处理hosts.allow。
拒绝对特定服务的请求
[root@myvm1 ~]# cat /etc/hosts.allow sshd: .theitroad.com [root@myvm1 ~]#
在上面显示的示例中,仅允许“ theitroad.com”域中的sshd服务。
[root@myvm1 ~]# cat /etc/hosts.allow vsftpd: .theitroad.com [root@myvm1 ~]#
在上面显示的示例中,仅允许theitroad.com域中的vsftpd服务。
再次牢记这一事实,将忽略hosts.deny中的冲突条目,因为将首先处理hosts.allow,并且如果允许请求模式,它将根本不会处理hosts.deny文件。
我们也可以通过在hosts.deny中进行相同的输入来拒绝上述示例中所示的相同请求,但是在这种情况下,hosts.allow必须为空,否则不得包含类似的允许规则。
让我们看一下允许和拒绝主机的另一种模式。
[root@myvm1 ~]# cat /etc/hosts.allow ALL: 172.16. [root@myvm1 ~]#
在上面的示例中,允许所有IP地址为172.16.
*。
*的主机建立与主机上所有基于TCP包装程序的服务的连接。
在上面的示例中,如果我们添加ALL:172.16.104.54,在文件hosts.deny中将没有任何用处,因为我们已经允许hosts.allow文件中来自172.16. *。*的所有请求。
我们还可以使用基于IP和子网掩码的样式进行相同的输入,如下所示。
[root@myvm1 ~]# cat /etc/hosts.allow ALL: 172.16.0.0/255.255.0.0 [root@myvm1 ~]#
如果要拒绝或者允许大量主机,则还可以通过在另一个文件中提及ip /主机名列表并在/etc/hosts.allow中指向该文件来做到这一点。
[root@myvm1 ~]# cat /etc/hosts.allow sshd: /etc/sshd.hosts [root@myvm1 ~]#
在上述规则中,需要注意的重要一点是,规则以“ /”开头,并提到了文件的路径。
以前,我们看到我们可以允许/拒绝整个域,但是如果我们想对该域上的某些主机进行例外处理,该怎么办。
[root@myvm1 ~]# cat /etc/hosts.allow ALL: .theitroad.com EXCEPT example.theitroad.com [root@myvm1 ~]#
在上面的示例中,除example.theitroad.com外,所有来自theitroad.com域的主机都将被允许。
以完全类似的方式,在将其余服务允许到一组主机或者域之后,我们也可以拒绝一个特定服务,如下所示。
[root@myvm1 ~]# cat /etc/hosts.allow ALL EXCEPT sshd: 172.16.0.0/255.255.0.0 [root@myvm1 ~]#
在上面显示的方法中,除ssh之外,所有服务均允许来自172.16.0.0网络的所有主机。
tcp wrapper条目中的<options>字段也可用于将所有条目本身放在一个文件中(是的,我们可以使用单个文件接受和拒绝规则。
这是避免混淆的最佳方法。
),此类输入的语法应格外小心。
[root@myvm1 ~]# cat /etc/hosts.deny vsftpd : example1.theitroad.com : allow sshd : example1.theitroad.com : deny sshd : example2.slahroot.in : allow [root@myvm1 ~]#
在上面的示例中,我在hosts.deny文件中输入了允许和拒绝服务连接的条目(我将hosts.allow文件保留为空)。
“ allow”和“ deny”是条目中归档的选项的一部分。
必须记住的另一个重要事实是我们在tcp包装文件中制定的访问规则的长度。
每行一条规则是必须遵循的方式。
否则,规则可能会在处理过程中不应用而被跳过。
对于所有冗长的规则,都有一个解决方法,可以通过包含“ /”来解决。
一个例子如下所示。
[root@myvm1 ~]# cat /etc/hosts.allow vsftpd : 172.16.103.150 \ : spawn /bin/echo ftp access prohibited>>/var/log/ftp.log \ : deny Rapid Rescore [root@myvm1 ~]#
在上面的示例中,我们使用了反斜杠来表示该规则是一行。
此外,我们还产生了echo过程,以使文本重定向到ftp日志文件。
如上所示,可以在“选项”字段的帮助下执行此类操作。
就像我们使用spawn在ftp日志中回显某些文本内容一样,可以通过一些选项将其设置为非常详细的日志。
[root@myvm1 ~]# cat /etc/hosts.allow vsftpd : 172.16.103.150 \ : spawn /bin/echo %c %h %p %u ftp access prohibited>>/var/log/ftp.log \ : deny [root@myvm1 ~]#
在上面的示例中,我使用了
%c提供完整的客户端信息,例如用户名和主机名
%h用于确定客户端的IP地址
%p用于记录进程的进程ID
%u用于请求服务的客户端的用户名。
使用相同的生成方法和重定向,我们可以做出更多有趣的事情来触发匹配规则。
通过运行以下命令,可以找到TCP包装程序的完整mannuel条目,如下所示。
[root@myvm1 ~]# man hosts_options [root@myvm1 ~]#