首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 TCP Wrappers 控制访问(2)

使用 TCP Wrappers 控制访问(2)

配置 wrappers下一个任务是在 /etc/inetd.conf  中调用 tcpd 而不是实际的守护进程或服务。首先,创建 /etc/inetd.conf 的备份。在本例中,我仅仅替换想要控制访问的守护进程。我会用 tcpd 替代 ftpd 和 telnetd 作为 /etc/inetd.conf 中的调用守护进程。随意保护此文件中的其他守护进程。/etc/inetd.conf 中我们感兴趣的行有:
1
2
ftp     stream  tcp6      nowait  root    /usr/sbin/ftpd              ftpd
telnet  stream  tcp6    nowait  root    /usr/sbin/telnetd       telnetd -a




我们只是替换想要保护的守护进程,本例中是用 tcpd 替换 ftpd 和 telnetd。编辑完成后,更改以下配置:
1
2
ftp     stream  tcp6    nowait  root    /usr/sbin//tcpd         ftpd
telnet  stream  tcp6    nowait  root    /usr/sbin/tcpd       telnetd -a




下一步,刷新 inted 让更改生效。
1
# refresh -s inetd




根据以上所述,对于其他的 wrapper 支持的第三方应用程序,应查询 hosts.allow 和 hosts.deny 文件。履行文件中的规则从而拒绝或允许对自己的客户端的访问是应用程序的责任。我们现在开始配置主机文件。
wrappers 会默认记录到 /var/adm/messages,使用的是设备级的权限:
1
auth.info    /var/adm/messages




如果您在 makefile 中指定了 LOCAL 设备,那么您必须告诉 syslog 使用 syslog.conf 中哪个文件。以下示例中,所有在 wrappers  中使用 LOCAL 的消息都记录到 /var/adm/wrappers.log 文件中。
1
local0.info             /var/adm/wrappers.log




确保在重启 syslog 之前创建 wrappers.log 文件:
1
# refresh -s syslogd




规则要关闭 wrappers,只需将 hosts.allow 和 hosts.deny 文件改成其他文件名即可。如果不存在允许或拒绝访问文件,wrappers 将不会使用访问控制,从而有效关闭 wrappers 。或者将主机文件清空或清零,这会有同样的效果。

Wrappers 首先在 hosts.allow 文件中查找规则匹配。如果找到匹配,那么 tcpd 会根据规则停下来,批准或拒绝访问。如果在 hosts.allow 文件中未找到匹配,那么 tcpd 会读取 hosts.deny 文件直到找到匹配。如果找到匹配,就拒绝访问,否则批准访问。
我在前面提到了两个文件 hosts.allow 和 deny,但根据规则的灵活性,可以只用一个文件,通常是 hosts.allow 来包含 wrappers 所有规则。
Wrappers 会查询 hosts.allow 和 hosts.deny 中的规则来确定访问。规则的基本格式是:
1
daemon, daemon, ...: client, client, ...: option




其中:
daemon要监控的服务,如 telnetd、ftpd、sshdclient主机名、IP 地址/IP 范围,或域名
选项有:
allow对客户端的访问deny对客户端的访问except会匹配第一个列表中所有项,除非匹配第二个列表。例如,允许 domainA 中所有项,除了 hostX.domainA 和 hostY.domanA。
当一行有多个守护进程或客户端时,用逗号分隔开来。可以用 ALL 关键字来表示所有守护进程或所有客户端。
LOCAL 关键字表示匹配所有不包含点号(“.”)的主机;这表示所有与域不相关的主机。
如果规则允许的话,在每个规则末尾都加上允许或拒绝选项,这是一个好的做法、好的习惯(因为这可以清晰地描绘访问规则,尤其是在 hosts.allow 中有多个允许或拒绝规则时)。
还有一些其他的选项,我将在稍后演示。现在,我们将访问控制结合在一起。
对 hosts.allow 和 hosts.deny 的更改是动态的。一旦文件保存,更改就会生效。

一个好的起点是,仅仅允许您想要访问主机的客户端使用允许的守护进程,拒绝其他所有客户端。
所以,hosts.deny 可以使用以下规则拒绝所有客户端访问所有守护进程:
1
ALL:ALL




本节的其他示例都是只与 hosts.allow 文件有关。为了能让所有守护进程从本地主机(即,与域名不相关的主机)访问,可以使用:
1
ALLOCAL : allow




就我个人而言,我不喜欢使用在任何主机上匹配的 LOCAL 模式,因为网络中所有主机应该属于您的或是某个域。如果原来不是,那么应该是的。尽管如此,在一些小型网络的情况下,却不是这样,LOCAL 允许这些主机访问。  
我们假设仅仅允许属于 mydomain.com 域的主机使用 telnet 或 ssh。以下的 hosts.allow 条目能完成此任务:
1
telnetd,sshd:.mydomain.com :allow




请注意本例中 mydomain.com 之前的点号(“.”)。这是个通配符,表示所有主机以 mydomain.com 结尾。我们还在规则结尾指定这是一条允许规则。尽管这不是严格限制,但如前所述,这样做是一种好的做法。
现在进一步假设我们允许使用以下 IP 地址远程登录 ssh 和 telnet:192.168.4.10 和所有以 192.168.6 开头的 IP 地址。请再次注意,在部分 IP 地址后使用点号;这相当于 192.168.6.*.,或者更精确一点,以 192.168.6 开头的所有 IP 地址。另一种看待 192.168.6. 范围内 IP 地址的方法是等于 192.168.6/24 或所有 192.168.6.1 与 192.168.6.254 之间的 IP 地址。
另外,我们还想允许使用 telnet 和 ssh 访问以下域:mydomain.com 和 mydomain2.com 域。以下命令能完成此任务:
1
2
telnetd,sshd:.mydomain.com, .mydomain2.com :allow
telnetd,sshd:192.168.4.10 , 192.168.6.: allow




现在,我们假设允许从 mydomain.com 域中的所有主机上进行 ftp 访问,除了 mydomain.com 中的两个主机:uktrip1 和 uktrip2 。通过使用允许规则,我们可以利用 except 选项提供两个列表,让 “except” 左侧的主机允许访问,“except” 右侧列表中包含的主机拒绝访问。
1
2
3
telnetd,sshd:.mydomain.com :allow
telnetd,sshd:192.168.4.10 , 192.168.6.: allow
ftpd:.mydomain.com except uktrip1.mydomain.com, uktrip2.mydomain.com : allow




我们现在看看拒绝规则。要拒绝 192.168.8. 和 192.168.9. 的 telnet 访问,但允许 192.168.6. 的 telnet 访问,我可以使用:
1
2
telnetd :192.168.8., 192.168.9.: deny
telnetd :192.168.6.: allow




前一个示例也可以用 except 选项来改写:
1
telnetd:192.168.6. except 192.168.8., 192.168.9.: allow




Wrappers 会将消息记录到  /var/adm/messages 文件中。消息文件中一个典型的名为 tardis 的被拒绝 telnent 连接会像这样:
1
2
Oct 23 15:50:55 rs6000 auth|security|warning telnetd[270546]: refused connect from
tardis




一个典型的名为 tardis 的失败的 ssh 连接像这样:
1
Oct 23 15:53:36 rs6000 auth|security:info sshd[262252]: refused connect from tardis




如果打开 PARANOID,那么 wrappers 会通知您所有无法解析的主机与 IP 不匹配情况:
1
2
error ftpd[2605110]: warning:/etc/hosts.allow, line 2: host name/address mismatch:
192.168.7.12 != uktrn004.mydomain.com




有时候能看到哪些主机 DNS 条目不正确也是好事,这样可以被负责 DNS 维护的人员纠正过来。在公司内部网络尤其如此。与拒绝不匹配主机/IP 不同的是,只允许域用户进入(假设这是在安全的公司网络中)。在以下示例中,所有属于 mydomain.com 域的用户都允许访问,请注意对所有守护进程都使用了 ALL:
1
ALLARANOID, mydomain:allow




使用诊断工具 tcpdmatch 和 tcpdchktcpdchk 工具会检查 hosts.allow 和 hosts.deny 文件中的语法错误。它还会试着解析文件中的 IP 地址以确定其存在,并检查 /etc/inetd.conf 文件相应的访问文件中的守护进程是否存在。tcpdchk 的基本格式是:
1
tcpdchk –a | -v




此处:
-a显示有错误或歧义项的行。-v检查并显示所有规则。
例如,使用 all 规则检查:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# tcpdchk –v
Using network configuration file:/etc/inetd.conf

>>> Rule /etc/hosts.allow line 4:daemons:telnetd sshd
warning:/etc/hosts.allow, line 4: sshd: no such process name in /etc/inetd.conf
clients:192.168.4.10 192.168.5.access:   granted

>>> Rule /etc/hosts.allow line 5:daemons:ftpd
clients:.mydomain.com EXCEPT uktrip1.mydomain.com uktrip2.mydomain.com
access:   granted

>>> Rule /etc/hosts.deny line 1:daemons:ALL
clients:ALL
option:   banners /etc/banners/deny
option:   DENY
access:   denied




Tcpdchk 在第一条规则条目输出中报告,sshd 服务并不是从 /etc/inetd.conf 中运行,这是对的。此版本的 sshd 带有 wrapper 支持,存放在 /usr/sbin 中。第二条规则条目输出报告没有错误,而且这些域可以通过 DNS 解析。host.deny 文件的第三条规则条目输出报告也没有错误。
tcpdmatch 工具非常适于在设置访问规则之前对其进行初始测试。wrappers 会根据 hosts.allow 和 osts.deny 文件中的规则,预测访问是批准还是拒绝的。只需要提供想要测试的守护进程的名称和 IP 或主机或域名。
tcpdmatch 的基本格式是:
1
tcpdmatch <daemon> <host>




其中,<daemon> 是实际的守护进程,例如 ftpd,<host> 是 IP 或主机名。
返回列表