contents
下一节: 服务和协议 上一级: 各种网络应用 前一级: inetd 超级服务器

tcpd 访问控制机制

由于开放计算机进行网络访问涉及到许多安全风险,应用程序被设计用来防御多种类型的攻击。 然而,其中一些可能存在缺陷(RTM 互联网蠕虫病毒最明显地证明了这一点),或者无法区分安全主机(来自这些主机的特定服务请求将被接受)和不安全主机(来自这些主机的请求应该被拒绝)。 我们已经在上面简要讨论了 finger 和 tftp 服务。 因此,人们会希望将对这些服务的访问限制为仅限“受信任的主机”,这在通常的设置中是不可能的,在通常的设置中,inetd 要么向所有客户端提供此服务,要么根本不提供。

一个有用的工具是 tcpd,gif 它被称为守护进程包装器。 对于您想要监控或保护的 TCP 服务,它会被调用来代替服务器程序。 tcpd 将请求记录到 syslog 守护进程,检查远程主机是否被允许使用该服务,并且只有当检查成功时,它才会执行真正的服务器程序。 请注意,这不适用于基于 UDP 的服务。

例如,要包装 finger 守护进程,您必须将 inetd.conf 中相应的行更改为

           # wrap finger daemon
           finger  stream  tcp     nowait  root    /usr/sbin/tcpd
in.fingerd
 
在不添加任何访问控制的情况下,这对客户端来说就像通常的 finger 设置一样,只是任何请求都会被记录到 syslog 的 auth facility 中。

访问控制是通过名为 /etc/hosts.allow 和 /etc/hosts.deny 的两个文件来实现的。 它们分别包含允许和拒绝访问特定服务和主机的条目。 当 tcpd 处理来自名为 biff.foobar.com 的客户端主机对 finger 等服务的请求时,它会按顺序扫描 hosts.allow 和 hosts.deny,以查找与服务和客户端主机都匹配的条目。 如果在 hosts.allow 中找到匹配的条目,则授予访问权限,而无需考虑 hosts.deny 中的任何条目。 如果在 hosts.deny 中找到匹配的条目,则通过关闭连接来拒绝请求。 如果根本没有找到匹配项,则接受请求。

访问文件中的条目看起来像这样

           servicelist: hostlist [:shellcmd]
 
servicelist 是来自 /etc/services 的服务名称列表,或关键字 ALL。 要匹配除 finger 和 tftp 之外的所有服务,请使用 ``ALL EXCEPT finger, tftp''。

hostlist 是主机名或 IP 地址列表,或关键字 ALL、LOCAL 或 UNKNOWN。 ALL 匹配任何主机,而 LOCAL 匹配不包含点的域名。gif UNKNOWN 匹配任何名称或地址查找失败的主机。 以点开头的名称匹配所有域等于此名称的主机。 例如,.foobar.com 匹配 biff.foobar.com。 还有针对 IP 网络地址和子网号的规定。 详细信息请参阅 hosts_access(5) 手册页。

要拒绝除本地主机之外的所有主机访问 finger 和 tftp 服务,请将以下内容放入 /etc/hosts.deny 中,并保持 /etc/hosts.allow 为空

           in.tftpd, in.fingerd: ALL EXCEPT LOCAL, .your.domain
 
可选的 shellcmd 字段可能包含一个 shell 命令,当条目匹配时将被调用。 这对于设置可能暴露潜在攻击者的陷阱很有用
           in.ftpd: ALL EXCEPT LOCAL, .vbrew.com :
           echo "request from %d@%h" >> /var/log/finger.log; 
           if [ %h != "vlager.vbrew.com" ]; then 
               finger -l @%h >> /var/log/finger.log 
            fi


%h 和 %d 参数分别由 tcpd 扩展为客户端主机名和服务名称。 详细信息请参阅 hosts_access(5) 手册页。


contents
下一节: 服务和协议 上一级: 各种网络应用 前一级: inetd 超级服务器

Andrew Anderson
Thu Mar 7 23:22:06 EST 1996