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

使用 TCP Wrappers 控制访问(1)

使用 TCP Wrappers 控制访问(1)

简介TCP wrappers 通常被称为 wrappers,它是由 编写,已经出现几年了。其背后的思想很简单,其要旨是可以在您的 AIX (UNIX®/Linux®) 主机上快速轻松地锁定流行的通过 TCP 访问的客户端。
Wrappers 允许系统管理员控制 wrappers 支持的基于 TCP 的服务或守护进程的访问。Tcpd 控制从 /etc/inetd.conf 中运行的 TCP 守护进程。不过,很多基于 TCP 的应用程序已加入 wrappers 支持(一般使用 libwrap 库),并且能感知 wrapper;不通过 /etc/inetd.conf 进行控制也没有关系。可以在 wrappers 下进行访问控制的通常有 telnet、ssh、sendmail、ftp 包、pop3 和 stunnel。
Wrappers 提供对基于 UDP 的连接的有限控制,不过我建议使用内置或第三方防火墙进行基于 UDP 的访问。
如果要看应用程序是否支持 wrapper,使用 strings 命令和 grep 获取 hosts_access 或 host:
1
2
3
# strings /usr/sbin/sshd|grep hosts_access
@(#)65  1.1  src/tcpwrapper/usr/sbin/tcpwrapper/hosts_access.c, tcpwrap, 53twrp2
10, 0617A_53twrp210 2/27/06 04:52:25




或者可以使用 ldd 命令:
1
ldd </path/application> | grep libwrap




wrappers 守护进程称为 tcpd。得到调用的是它,而非 /etc/inetd.conf 文件中的实际守护进程。Tcpd 读取两个文件,hosts.allow 和 hosts.deny,读取时基于这两个文件中的规则。当找到第一条规则匹配后,会拒绝或允许调用客户端的访问。所有操作都会被记录到消息文件或指定的日志文件中,这可以通过 syslog 来确定。通常情况下,hosts.allow 包含允许访问的规则,而 hosts.deny 包含拒绝访问的规则。
下面看一下典型的 telnet 客户端场景,它是这样工作的。客户端试图通过 telnet 会话连接到配置有 wrappers 的主机上。未知的客户端连接到 wrappers 守护进程,而不是实际的 telnentd 守护进程。根据 hosts.allow 或 hosts.deny 文件中的规则,会允许或拒绝该客户端的访问。如果拒绝访问,就会终止 telnet 连接。如果该客户端符合允许访问规则,那么 tcpd 就会交出对所调用的实际守护进程的控制权(本例中是 telnetd)。无论哪种情况,许可或拒绝访问都会通过 syslog 被记录下来。
在本文中,我将演示如何从头开始配置,并且讨论和审查阻止或允许不同远程服务连接的规则。
构建 wrappers可以下载 Wrappers 并用于 IPv4 或 IPv6 的网络。下载的版本是 7.6。根据我管理超过 50 台 AIX 主机的经验,IPv6 版本在只有 IPv4 的网络中运行得很好,因此使用此版本。要构建 wrappers,需要一个 C 编译器;因此我使用 AIX 工具箱中的 gcc。在 参考资料 部分中可以找到所有下载内容的详细信息。
1
2
3
# gcc -v
Target: powerpc-ibm-aix5.3.0.0
...gcc version 4.2.0




下载完成后,解压缩并解包 wrappers。文件解压到 tcp_wrappers_7_6-ipv6.4 目录:
1
2
3
4
5
6
7
8
9
# gunzip tcp_wrappers_7.6-ipv6.4.tar.gz
# tar -xvf tcp_wrappers_7.6-ipv6.4.tar
x tcp_wrappers_7.6-ipv6.4
x tcp_wrappers_7.6-ipv6.4/DISCLAIMER, 792 bytes, 2 media blocks.
x tcp_wrappers_7.6-ipv6.4/BLURB, 1736 bytes, 4 media blocks.
x tcp_wrappers_7.6-ipv6.4/CHANGES, 19195 bytes, 38 media blocks.
x tcp_wrappers_7.6-ipv6.4/Makefile, 32976 bytes, 65 media blocks.
….
#




下一个任务是定制 wrappers,使它 能够进行规则检查、查找和查找验证(如果需要的话)、记录、生成程序和使用标题。
在 makefile 中,通过取消注释行的方式启用以下条目,如下所示:
1
2
# SysV.4 Solaris 2.x OSF AIX
REAL_DAEMON_DIR=/usr/sbin




real_daemon 通知 wrappers 实际的守护进程,如 ftpd、telnetd 和 sshd 在哪里。
1
HOSTNAME= -DALWAYS_HOSTNAME




始终尝试主机名查找:
1
ACCESS  = -DHOSTS_ACCESS




启用主机控制访问是 wrappers 的最关键之处,所以确定它未被注释。
1
STYLE   = -DPROCESS_OPTIONS     # Enable language extensions.




为标题消息启用语言扩展,使用 shell 命令以及 spawn 和 twist 命令。
1
FACILITY= LOG_MAIL




确保 wrappers 了解 syslog 机制:
1
FACILITY=LOG_LOCAL0




如果您愿意,您可以不使用 LOCAL,而从 wrappers 发送消息到具体的日志文件:
1
IPV6 = -DHAVE_IPV6




这支持 IPv6。
如果在主机上运行 IPv4,未注释以下内容或客户端的 IP 地址可能会让 wrappers 无法解析。通常,它会将 IP 记录为 0.0.0.0. 而不是实际 IP。
1
SEVERITY= LOG_INFO




通过 syslog 的日志记录级别:
1
PARANOID= -DPARANOID




Wrappers 会做正向和反向查找,从而检查主机名对应的 IP。如果此条件不满足,就会按照访问规则采取行动。如果 DNS 设置不正确,就会造成连接客户端的问题。如果与您的安全策略有冲突,那么就不要取消注释该行。
在实际的 AIX 构建阶段,我们会:
1
2
3
4
generic aix osf alpha dynix:
        @make REAL_DAEMON_DIR=$(REAL_DAEMON_DIR) STYLE=$(STYLE) \
        LIBS= RANLIB=ranlib ARFLAGS=rv AUX_OBJ=setenv.o \
        NETGROUP=-DNETGROUP TLI= IPV6="$(IPV6)" all




保存并退出更改;然后构建。
1
# make CC=gcc aix




完成之后,会编译以下的二进制文件:
tcpd会启动 tcpd 二进制文件而不是 /etc/ inetd.conf 中为客户端提供服务的实际守护进程。如果第三方应用程序已经带有 wrappers 支持,服务或守护进程会查询允许或拒绝访问的 hosts.allow 或 hosts.deny 文件,这由第三方守护进程或服务决定。tcpdmatch该工具可帮助测试和诊断 tcpd 如何处理传入的请求。该工具非常有用,您可以通过提供守护进程名称和客户端来测试访问控制的规则。tcpdchk该工具可以读取当前存在的 hosts.allow 和 host.deny 文件并检查所有语法错误。try-from该工具可以帮助排除访问规则中的错误,它是在远程的 shell 中执行,以验证主机名和 IP 是否返回。safe_finger该工具包含 finger 命令,可以确定客户端上的反向查找。libwrap.a可以在构建其他应用程序时使用该库来提供 wrapper 支持。如果带有 libwrap,那么第三方应用程序应该履行 hosts.allow 和 hosts.deny 中的规则。


下一个任务是将二进制文件和库复制到本地 bin 和 sbin 目录中。在本例中,我将文件复制到以下目录:
1
2
3
4
5
# cp tcpd /usr/sbin
# cp tcpdmatch /usr/local/bin
# cp tcpdchk /usr/local/bin
# cp try-from /usr/local/bin
# cp safe_finger /usr/local/bin




最后是 libwrap:
1
# cp libwrap.a /usr/local/lib




确保可以对 tcpd 文件有执行的权限。
返回列表