使用 TIS 防火墙工具包创建 Linux 防火墙

作者:Benjamin Ewy

随着越来越多的公司尝试在互联网上发展业务,建立安全的网络边界正变得越来越重要。存在许多种被粗略地称为防火墙的事物。防火墙背后的总体原则是,它充当内部网络和外部世界之间的瓶颈。这个瓶颈只允许被认为是安全的流量通过。

基于 IP 的过滤器是防火墙的一种常见形式,它依赖于源地址和目标地址来决定通过哪种类型的流量。它们的优点是灵活性,因为它们可以很容易地适应不同类型的流量需求。基于 IP 的过滤器的主要缺点是它们依赖 IP 地址作为主要的身份验证形式,并且它们也缺乏查看更高协议层以确定正在发送的确切流量类型的能力。

应用层网关是防火墙的另一种形式,通常由一台称为 堡垒主机 的计算机组成。堡垒主机运行一组防火墙软件,该软件实施“凡未明确允许皆禁止”的策略。此策略在应用层实施,这使得堡垒主机能够更完全地控制通过它的流量。

在应用层实现内部网络和外部网络之间的接口,可以对特定服务的身份验证进行更多的控制,特别是允许许多形式的 身份验证。应用层防火墙的主要缺点是,它们需要为每个要通过网关的特定应用程序提供接口。如果需要新的应用程序接口,则必须编写自定义软件,否则无法提供该服务。Trusted Information Systems Firewall Toolkit (fwtk) 是一个非常有用的工具包,用于创建堡垒主机。

fwtk 通过提供几个可以根据站点运营商的意愿组合在一起的小程序来支持堡垒主机的功能,同时通过通用的配置文件简化管理。对于安全策略允许通过防火墙的每项服务,都需要特定的应用层 代理 。fwtk 附带 telnet、rlogin、SMTP 邮件、ftp、http、X window 以及通用 TCP 插板服务器的代理,该服务器充当许多其他服务的透明直通代理。

此外,fwtk 还附带一个名为 netacl 的工具,它实现了网络级访问控制,以及 authsrv,它实现了网络身份验证服务。本文重点介绍准备通用的 Linux 主机作为堡垒主机,获取和编译 fwtk,以及配置其服务以支持安全的网络环境。

准备您的堡垒主机

第一步是准备 Linux 主机作为功能齐全且安全的堡垒主机。防火墙构建者应遵守以下几项原则。理想的堡垒主机应仅提供代理服务,而不应是通用机器。应仅允许管理帐户,并且如果可能,则应将堡垒主机的登录限制为控制台,尽管将讨论允许用于远程维护的强身份验证远程访问。堡垒主机不应依赖任何网络服务,例如 NIS 或任何形式的远程文件访问,例如 NFS。允许其中任何一种都会打开许多可能危及您的堡垒主机的漏洞。

接下来,有必要验证 Linux 主机是否具有所需的功能。每个堡垒主机至少有两个网络接口,一个连接到内部网络,另一个连接到外部网络接入点。这些接口应在进行任何进一步修改之前进行配置和测试,并且您应验证从内部网络和外部网络对堡垒主机的可访问性。必要时请参阅 Linux NET2 HOWTO 和 Linux Multiple Ethernet mini-HOWTO。

应重建内核,确保在执行 makei config禁用 IP 转发 (CONFIG_IP_FORWARD)。如果启用 IP 转发,则如果已建立路由,内核将自动将数据包从一个接口转发到另一个接口。控制此转发是构建堡垒主机的全部意义所在。最后,如果您想为 SMTP 邮件服务提供安全的机制,则必须首先配置和测试 sendmail。请根据需要参阅 Linux Kernel HOWTO 和 Linux Electronic Mail HOWTO。

下一个任务是保护堡垒主机,以便只有代理服务可用。首先,从 inetd 配置文件 /etc/inetd.conf 中删除所有不需要的服务。只需在每个不需要的服务行前面加上 #,并在完成文件编辑后,向 inetd 的进程 ID 发出 kill -HUP(可能使用 killall -HUP inetd)。删除 ftp、telnet、SMTP、nntp、shell、login、talk、stalk、pop、uucp、ftp、bootp、finger、systat、netstat 和您不确定要提供的 每个 其他服务。稍后我们将在本文件中定义我们的代理服务。

最后,通过清理 /etc/rc.d 中的启动文件,删除不需要的程序,从而阻止任何独立守护程序的启动。特别是,检查 rc.inet2 文件并注释掉 rpc.portmap、rwhod、rpc.mountd、rpc.nfsd、rpc.ugidd 和 ypbind。完成删除服务后,重新启动您的堡垒主机并仔细检查 ps aux 的输出,并检查您是否遗漏了任何不必要的程序。运行 rpcinfo -p 和 fwtk 工具目录中附带的端口扫描器也是一个好主意,以验证所有不必要的服务都已关闭。

编译防火墙工具包

获取工具包、Linux 补丁,以及(如果需要)S/Key 包,如 获取防火墙资源 中详述。如果将 Bellcore 的 S/Key 构建到工具包中,它将为网络身份验证提供一次性密码支持。fwtk 还支持许多商业一次性密码系统,但本文未详细介绍其使用方法。

将 fwtk 存档放在 /usr/src/ 中,并运行 tar xfz fwtk-v1.3.tar.Z 以解压缩它。如果您希望在其他位置构建,请根据需要修改 Makefile.config。我们将应用的 Linux 补丁假定 /usr/src/fwtk 是源代码目录。

这些补丁基于 Marco Pauck (pauck@wmd.de) 和 firewall-users 邮件列表的工作。此外,作者还进行了一些修改和添加,以允许 x-gw 代理工作并支持 S/Key 身份验证机制。大多数补丁都围绕 Linux 的 select() 函数工作。将 fwtkpatches.tgz 文件放入 /usr/src/fwtk。然后运行 tar xfz fwtkpatches.tgz,这将创建一个 patches 目录。进入 patches 目录并运行 INSTALL 脚本或手动应用补丁。如果您不需要 S/Key 支持,请运行 INSTALL.noskey 脚本。

假设您需要 S/Key,将 S/Key 存档放在 /usr/src 中,并运行 tar xfz skey-2.2.tar.gz 以解压缩它。必须首先编译 S/Key,以便在编译 fwtk 时可以将其库链接到身份验证服务中。此 S/Key 已经移植到 Linux,因此构建它所需要做的就是在 /usr/src/skey-2.2 目录中运行 make

安装补丁并编译 S/Key 后,如果您想更改任何默认值,可以修改 Makefile.config,但本文的其余部分将假定您已将 Makefile.config 保留为已修补状态。转到 /usr/src/fwtk/ 并运行 makemake install。防火墙组件将默认安装在 /usr/local/etc/ 中。

配置网络访问控制列表

防火墙工具包由三个主要组件组成:netacl、authsrv 和各种服务代理。Netacl 类似于 tcp wrapper,tcpd,这在许多 Linux 系统上很常见。Netacl 用于检查每个服务的规则并采取定义的操作。您编辑 /etc/inetd.conf 文件以调用 netacl,并将普通服务作为其第一个参数传递给 netacl。指纹服务的示例条目可能类似于 列表 1。当在指纹端口上建立连接时,inetd 将调用 netacl。

Netacl 在通用配置文件中查找以查看要采取的操作。通用配置文件称为 netperm-table,位于 /usr/local/etc/netperm-table 中。除了本文中介绍的示例外,还自动安装了包含许多示例的默认 netperm-table。Netacl 在 netperm-table 中查找并读取以 netacl 开头的条目。Netacl 理解 permit-hostsdeny-hosts 选项,用于定义访问列表,并且还需要为每行定义 -exec,如 列表 2 所示。

给定的 服务 可以有多行 permit 和 deny 变体。地址 可以是主机地址列表,并且支持通配符,例如 *.my.domain 或 129.17.*。关键字 unknown 匹配无法使用 DNS 解析的主机。第一个匹配的规则是执行的规则。行不能断开。

在本文给出的示例中,将使用以下约定:.internal.net 将代表您的内部网络。ftp.server.internal.net 将代表您网络内部的 ftp 服务器。www.server.internal.net 将代表您网络内部的 www 服务器。compute.server.internal.net 是您网络内部的计算服务器。trusted.external.net 是您信任的外部网络。bastion.host.internal.network 将代表您的堡垒主机的 IP 地址。

重要的一点是,这些规则不与网络接口关联。如果您为服务编写规则以允许您的内部私有网络具有特殊访问权限,则必须确保这些 IP 地址只能从您的内部网络接收。IP 欺骗可用于伪装成您内部网络上的主机并利用您的规则。这可以通过使用筛选路由器来阻止声称来自内部网络的数据包在它们到达外部网络连接时来防止。通常,您的 Internet 提供商可以在向您的站点馈送的路由器中实施此类规则。

列表 3 的第一行将在请求主机是 trusted.external.network 的成员时执行 in.fingerd。第二行将匹配所有其他主机,并输出您选择的消息。这可能是“伪造”的指纹输出,以误导攻击者,或者只是解释该服务不可用。Netacl 通常用于您未代理的服务的权限,但也可以用于根据连接的来源在代理或真实服务之间切换。此功能将在稍后更详细地讨论。

netperm-table 还包含所有代理的配置信息,如 列表 4 所示。格式与 netacl 格式类似,每个规则可以包含多行。这些选项将在稍后针对每个代理更详细地讨论。

提供网络身份验证服务

Authsrv 是防火墙工具包的身份验证服务器。身份验证服务器是可选的,但允许以一致的方式管理多种类型的身份验证。防火墙工具包中的所有代理都内置了对 authsrv 守护程序身份验证的支持,并且可以在 netperm-table 中按代理甚至按 permiti-hosts 选择性地启用。

Authsrv 支持许多不同类型的身份验证,包括内部纯文本密码,以及几种形式的 身份验证,使用与 Bellcore 的 S/Key、Security Dynamic 的 SecurID、Enigma Logics 的 Silver Card 和 Digital Pathways 的 SNK004 Secure Net Key 兼容的一次性密码。在我们的示例中,我们已将 S/Key 及其支持编译到 authsrv 中,但其他机制类似,其详细信息可以在 /usr/src/fwtk/auth 目录中找到。S/Key 是一种质询-响应一次性密码系统,它将在登录时向您显示序列号和密钥。您必须将序列号、密钥和您自己的私有密码短语提供给 S/Key 计算器,它将返回一个 6 个单词的密码。该密码仅对该特定序列号有效,并且它具有使用不可逆算法创建的属性,因此即使当前密码已知,也不可能轻易计算出下一个密码。这种类型的强身份验证是使用 fwtk 的最佳功能之一。

要配置 authsrv,必须将其添加到 inetd.conf 中,以便 inetd 将启动它,如 列表 5 所示。

由于 authsrv 不是一个众所周知的服务,因此必须选择一个未使用的端口并将其添加到 /etc/services 文件中。fwtk 配置手册建议使用端口 7777。相应的 /etc/services 条目将是

# Example services entry
authsrv 7777/tcp

与之前一样,当您更改 /etc/inetd.conf 文件时,您必须向 inetd 发送 -HUP 信号,以使其读取更改。

通过在 netperm-table 中设置其选项来配置 authsrv 本身。Authsrv 识别 databasepermit-hostsnobugususeridbadsleep 选项。database 选项告诉 authsrv 在哪里找到其数据库,permit-hosts 可用于限制哪些主机可以查询 authsrv。建议在堡垒主机上运行 authsrv,以便数据库受到保护,免受滥用。示例配置可能包括 netperm-table 中显示的 列表 6 中的条目。

在我们的示例中,堡垒主机正在运行 authsrv 守护程序,并且堡垒主机是唯一具有需要我们的服务器进行身份验证的代理的主机。我们将 authsrv 请求限制为 来自堡垒主机,以防止未经授权探测数据库。

接下来,我们在堡垒主机上设置一个基于 S/Key 的管理员帐户。首先,需要初始化 auth 数据库。最好的方法是以 root 身份运行 authsrv。然后添加一个管理员用户,并通过在 authsrv 提示符下输入以下内容来启用该用户的登录

authsrv# adduser admin
authsrv# enable admin

将协议设置为 skey,并授予用户向导权限

authsrv# proto admin skey
authsrv# superwiz admin

然后您需要设置管理员密码。S/Key 允许您的密码有多个单词。在引号之间输入您的短语

authsrv# password admin "my neat password phrase"
ID admin s/key is 664 wa56038
authsrv# exit

在您的密码短语之后,authsrv 返回的输出是它将用于质询和密钥的下一个序列号。您可以使用它们来生成一次性密码,根据需要使用 key 程序(阅读其手册页,可在 /usr/src/skey-2.2/key 中找到)。例如,如果您受到以下质询

S/Key Challenge: s/key 663 wa56038

运行 key 663 wa56038 并输入您的密码短语。它将响应一个六个单词的短语,您可以输入该短语来验证自己的身份。如果您要旅行,则有 Macintosh 和 DOS 版本的 S/Key 计算器,或者您可以让 key 打印出您的下一个密码列表,方法是运行 key -n number 663 wa56038,它将打印出您的下一个 number 密码及其相应的序列号。

还有另一个名为 authmgr 的程序,可用于远程管理身份验证数据库。除了此处显示的那些功能外,还有许多其他功能,例如用户组和组权限,以及按用户、按时间指定身份验证的功能。这些附加功能可以在 authd 手册页中找到。最后,有两个实用程序 authdump 和 authload,允许您获取当前数据库的快照,用于存档或管理目的,然后重新加载数据库。

配置和使用代理服务

本节重点介绍 telnet、ftp、http 和 SMTP 邮件的服务代理的配置和使用。讨论了配置这些服务的常用方法,但是它们中的每一个都有许多选项并且非常灵活。应查看每个服务的手册页,以确定其他配置是否更适合您的安装。rlogin 和 X-Windows 的代理配置类似于 telnet 代理。通用 TCP 直通代理可用于 NNTP 新闻传输、talk 会话或站点希望通过防火墙的任何其他 TCP 服务。

telnet 代理称为 tn-gw。tn-gw 有许多选项,包括在其他服务上看到的 permit-hostsdeny-hosts 行,以及许多消息选项。fwtk 配置手册讨论了如何使用 netacl 在堡垒主机上同时允许 telnet 服务和 telnet 代理共存,尽管这只是许多可能的配置之一。

首先,使用 netacl 根据来源切换服务,如 列表 7 所示,其中显示了 /etc/inetd.conf 条目,以及 列表 8,其中显示了对 netperm-table 的添加。

当 telnet 连接启动时,inetd 调用 netacl。Netacl 查看源 IP 地址,如果它不是来自堡垒主机,则调用 tn-gw 代理。如果源地址未知,则 tn-gw 代理会打印拒绝消息并关闭,并且仅允许来自 .trusted.external.net 的非身份验证连接到 compute.server.internal.net。来自内部网络的连接对其目标没有任何限制(默认),并且允许来自内部网络的用户更改其堡垒主机密码。此外,还允许从内部网络到堡垒主机本身的连接。最后,在与指定的身份验证服务器进行身份验证后,允许所有其他主机转到除堡垒主机本身以外的任何目标。您可能不想使用此设置(允许来自任何外部站点的未经身份验证的访问不是一个好主意),但它展示了工具包提供的许多选项。

如果用户在内部网络上并且想要 telnet 访问外部网络,他们将 telnet bastion.host,然后键入 c external.host 以连接到外部主机。

如果用户在外部网络上并且想要连接到内部主机,他们将必须 telnet bastion.host,输入他们的用户 ID 和特定身份验证类型要求的身份验证,然后 c internal.host

最后,如果管理员想要从内部网络连接到堡垒主机,他们将 telnet bastion host,然后 c bastion.host,并且 netacl 将在堡垒主机上启动真实的 telnet 服务。

接下来,我们将配置 ftp 代理系统。我们将假定您的站点不希望从堡垒主机向外部网络提供匿名 ftp 服务。TIS 配置指南更详细地讨论了如何配置在同一主机上支持匿名 ftp 和 ftp 代理的站点。我们的示例将仅在堡垒主机上具有 ftp 代理。

需要修改 inetd.conf 文件以调用 ftp-gw 代理。由于我们没有像 telnet 示例中那样切换提供的服务,因此未使用 Netacl。inetd.conf 行如 列表 9 所示。然后在 netperm-table 中建立权限,如 列表 10 所示。

如果反向名称查找失败,这些行将打印 ftp-deny.txt 文件并关闭连接;内部节点将被允许通过网关进行 ftp 而无需身份验证,但 RETRSTOR 事务将被记录。此外,它将允许外部节点在通过身份验证服务器进行身份验证后连接到内部 ftp 服务器,并记录 RETRSTOR 事务。

内部网络上的用户将 ftp 连接到堡垒主机,并在用户名提示符下输入他们的目标。要作为用户 bob 转发到站点 big.archive,他们需要在堡垒主机的用户名提示符下输入 bob@big.archive,它将转发连接。外部网络上的用户必须首先验证自己的身份,然后输入他们的目标。ftp-gw 手册页中对此进行了更详细的讨论。

现在,配置 http 的代理。这与其他代理类似,并且可以具有相对简单的配置。首先,将 列表 11 中的行添加到 /etc/inetd.conf 文件,然后设置 列表 12 中显示的 netperm-table 配置条目。

此配置将允许内部主机在无需身份验证的情况下访问他们想要的任何位置,并允许外部主机在无需身份验证的情况下连接到 www.server.internal.net 主机。检查 http-gw 手册页,了解涉及特定 http 操作的特定身份验证的选项。

对于内部网络上的用户,我们可以配置他们的支持代理的网页浏览器以透明地通过防火墙 http 代理。我们将使用 Netscape 浏览器作为我们的示例。在“选项”菜单下找到“网络首选项”菜单。在该菜单下,有一个关于代理配置的部分。选择手动代理配置,并为每个代理服务及其各自的端口输入您的堡垒主机的 IP 地址。现在您可以再次使用正常的 http 地址,并且浏览器将自动通过堡垒主机执行所有必要的请求。

我们要代理的最后一个服务是 SMTP 邮件。fwtk 附带两个程序——smap 和 smapd——它们用于减少 sendmail 的问题并使其免受某些攻击。但是,它们确实使用了 sendmail,因此本节将假定堡垒主机的 sendmail 配置已经设置和调试。Sendmail 配置超出了本文的范围。必要时可以查阅 Linux Electronic Mail HOWTO。

列表 13 显示了 smap 的 /etc/inetd.conf 条目,列表 14 显示了如何从启动脚本启动 smapd,列表 15 显示了 netperm-table 条目。Smap 是一个最小的 SMTP 客户端,由 inetd 调用,接受 SMTP 邮件消息,并将它们写入特殊的假脱机目录。Smapd 是一个守护程序,它在 rc.M(或您的发行版中启动 sendmail 的任何启动脚本)中替换 sendmail。Smapd 将查看假脱机目录并定期使用 sendmail 传递消息。这次,需要进行三处更改。

接下来,创建 /var/spool/inspool 目录并使其归 uucp 所有。运行 mkdir /var/spool/inspool; chown uccp /var/spool/inspool。最后,从 cron 作业运行 sendmail,以便它可以处理任何无法传递的条目。类似

0,30 * * * * /usr/lib/sendmail -q >/dev/null 2>&1

的行应添加到 root 的 crontab 中。

最终要点和附加资源

TIS 防火墙工具包是一个非常灵活且有用的程序集合,用于创建堡垒主机。本文介绍了一系列关于如何配置基于 Linux 的堡垒主机的示例。这些程序中的许多程序都具有附加功能,应阅读工具包附带的文档以充分利用这些程序。fwtk 附带了几个附加工具,例如端口扫描器和几个日志摘要生成器。

完成堡垒主机的最后一个步骤是删除可能已安装的任何不必要的程序。一般来说,每天都会发现新的漏洞,因此安装的程序越少越好。这包括 gcc!如果没有编译器,许多黑客在闯入后可以做的事情会受到限制。在配置系统后,在系统上运行 Tripwire 是一个好主意,以提供针对未经授权修改系统的保护。Tripwire 验证文件的校验和,并在系统被修改时向您发出警报。最后,对您的堡垒主机进行完整备份,以便您拥有“第一天”的副本,以便在紧急情况下恢复。

关于防火墙的信息,有很多有用的参考资料。fwtk 附带概述、安装和配置指南、用户手册(向用户展示如何通过防火墙访问服务)以及与 fwtk 关联的所有程序的手册页。

有用的 Linux 资源包括 Linux NET-2 HOWTOLinux Firewall HOWTOLinux Multiple Ethernet mini-HOWTOLinux Kernel HOWTO。所有这些都可以在 sunsite.unc.edu、tsx-11.mit.edu 及其镜像站点上找到。

这些以及其他有用的关于防火墙的在线信息可以在 TIS 资源 中找到。

以下是一些关于防火墙的优秀书籍

  • Firewalls and Internet Security。Cheswick & Bellovin,Addison Wesley。

  • Building Internet Firewalls。Chapman & Zwicky,O'Reilly & Associates。

  • Internet Firewalls and Network Security。Siyan & Hare,New Riders Publishing。

Benjamin Ewy (bewy@tisl.ukans.edu) 从事 Unix 系统管理工作已有 5 年,并已将 Linux 专业地使用了 3 年。他的专业兴趣包括网络工程的各个方面,尤其是网络安全。在不工作时,他喜欢设计扬声器并与他的新家庭共度时光。

加载 Disqus 评论