Paranoid Penguin - 使用 WPA 和 FreeRADIUS 保护您的 WLAN,第二部分
上个月,我描述了新的无线局域网安全协议 Wi-Fi Protected Access (WPA)。我展示了它如何为原本不安全的 WEP 协议添加强大而灵活的身份验证,以及动态加密密钥协商。我还展示了 WPA 的组成协议,包括 802.1x、各种 EAP 和 RADIUS 的变体,是如何相互关联的。在本月的专栏中,我将开始展示如何使用 FreeRADIUS 和 OpenSSL 为 WPA 和其他 802.1x 场景创建您自己的身份验证服务器。
您可能还记得,WPA 比 WEP 更加模块化。WEP 中的身份验证和加密都是通过所有无线客户端共享的密钥实现的,而 WPA 中的身份验证通常是通过使用 802.1x 协议实现的。预共享密钥 (PSK) 模式(其工作方式更像 WEP)也是一种选择。使用 WPA,每个客户端的唯一加密密钥都是动态生成的,并由接入点定期刷新。
802.1x 是一种灵活的身份验证协议,它依赖于可扩展身份验证协议 (EAP)。WPA 支持的产品中支持许多不同的 EAP 变体,包括 EAP-TLS 和 PEAP。如果您选择跳过 802.1x 并以更简单的 PSK 模式部署 WPA,这种模式为您提供动态加密密钥生成,但通过以明文形式传输身份验证凭据来暴露它们,那么您只需使用相同的预共享密钥配置您的接入点和无线客户端即可。
但是,如果您想通过使用 802.1x 中更强大的身份验证机制来充分发挥 WPA 的潜力,则需要 RADIUS 服务器。商业工具可用于此工作,例如 Funk Software 的 Steel Belted RADIUS。但是,如果您更喜欢免费和开源的 RADIUS 应用程序,FreeRADIUS 支持所有主要的 EAP 变体,并且既稳定又安全。以下是如何使其工作的方法。
当然,我没有足够的空间来描述 FreeRADIUS 与 802.1x 的所有可能用途,甚至专门针对无线场景的用途。因此,让我们从描述一个示例使用场景开始,后续步骤可以实现该场景。
实施 WPA 时,最重要的选择是使用哪种 EAP 变体。这不仅受您的 RADIUS 服务器软件支持的限制,还受您的客户端平台的限制。有趣的是,您的无线接入点是 EAP 不可知的——假设它首先支持 802.1x 和/或 WPA。它只是将 EAP 流量从客户端传递到服务器,而无需显式支持任何特定的 EAP 子类型。
您的客户端平台支持什么功能取决于您的客户端操作系统及其无线硬件。例如,具有 Intel Pro/2100 (Centrino) 芯片组的 Microsoft Windows XP 系统支持 EAP-TLS 和 PEAP,但 EAP-TTLS 不是一种选择。但是,如果您使用 wpa_supplicant (请参阅在线资源) 运行 Linux,您将有更广泛的选择。
在我们的示例场景中,我将介绍 EAP-TLS。EAP-TLS 需要客户端证书,这反过来又需要您设置证书颁发机构 (CA)。但是,使用 EAP-TLS 有几个充分的理由。首先,EAP-TLS 得到广泛支持。其次,TLS (X.509 证书) 身份验证提供强大的安全性。第三,使用 OpenSSL 创建您自己的 CA 实际上不需要太多工作。
因此,我们的示例场景涉及使用 EAP-TLS 连接到启用 WPA 的接入点的 Windows XP 客户端。反过来,接入点配置为从运行 Linux 的 FreeRADIUS 1.0.1 服务器进行身份验证。
SuSE 9.2、Fedora Core 3 和 Red Hat Enterprise Linux 各自都有自己的 FreeRADIUS RPM 软件包,名为 freeradius。Debian Sarge (Debian-testing) 具有相同名称的 DEB 软件包。对于 Red Hat、Fedora 和 Debian-testing,如果您想使用 MySQL 身份验证数据库,则可以使用其他软件包。此外,Debian-testing 还将一些其他功能分解为更多软件包。但是,对于所有四个发行版,您进行 802.1x 身份验证唯一需要的软件包是基本 freeradius 软件包。如果您的首选 Linux 发行版没有自己的 FreeRADIUS 软件包,或者即使有,但版本不够新以满足您的需求,您可以从网站 (请参阅资源) 下载最新的 FreeRADIUS 源代码。
编译 FreeRADIUS 很简单:它是常见的./configure && make && make install例程。如果您是编译新手,请参阅源发行版的 INSTALL 文件以获取更详细的说明。您应该以某个非 root 用户身份执行configure和make命令,并且仅以 root 身份执行make install。
请注意,默认情况下,configure 脚本将 FreeRADIUS 安装到 /usr/local 的子目录中。由于 Makefile 没有卸载操作,我建议保持此设置不变,因为如果以后需要删除 FreeRADIUS,这将简化删除操作。
在配置 FreeRADIUS 之前,我们需要创建一些证书。在创建任何证书之前,我们必须创建我们的 CA。我的书《Linux 服务器安全》第 5 章中有一个名为“如何成为小型 CA”的章节,其中比我现在可以深入探讨的要详细得多,但这里仍然是一个速成课程。
首先,什么是 CA,它应该驻留在哪里?CA 是充当公钥基础设施根目录的系统。它是通过数字签名保证您的组织中颁发的所有证书的真实性的中央机构。它还定期发布证书吊销列表 (CRL),即 CA 不再保证的证书列表,例如,颁发给已离开组织的人员的证书、不再在线的服务器等等。
所有这些都不需要您的 CA 充当实际服务器;事实上,最好不要这样做。为了使 CA 值得信赖,必须仔细保护它免受滥用。因此,我自己的 CA 倾向于驻留在我仅定期连接到网络的系统上,例如 VMware 虚拟机。
您可能已经拥有一个 CA,您已使用它为 Web 服务器、stunnel 或其他使用 TLS 的应用程序创建证书。如果是这样,您也可以将其用于 WPA。如果不是,以下是如何创建 CA 的方法。首先,确保您指定的 CA 系统已安装 OpenSSL。OpenSSL 是所有流行的 Linux 发行版以及 FreeBSD、OpenBSD 等上的标准软件包。确保您安装了 OpenSSL 的一种快速方法是发出命令which openssl——如果已安装,这将返回 OpenSSL 命令的路径。
接下来,将您的工作目录更改为系统保存 OpenSSL 的配置和证书文件的位置。在 SuSE 上,这是 /etc/ssl,但此位置因发行版而异。搜索文件 openssl.cnf 应该会将您带到正确的位置。
现在,使用您选择的文本编辑器打开文件 openssl.cnf。我们需要调整一些默认设置,以便稍后更快地创建证书。列表 1 显示了我喜欢在 openssl.cnf 中更改的行。
列表 1. openssl.cnf 的更改,以实现最佳证书创建
# First we change the CA root path in the CA_default # section to reflect the CA we're about to create [ CA_default ] dir = ./micksCA # Where everything is kept # The following lines are further down in openssl.cnf: countryName_default = US stateOrProvinceName_default = Minnesota 0.organizationName_default = Industrial Wiremonkeys of the World
接下来,我们应该编辑 CA 创建脚本,将 CA 的根目录更改为 demoCA 以外的其他目录,即与我们刚刚在 openssl.cnf 中更改的 dir 变量相匹配。我使用脚本 CA.sh,在 SuSE 系统上,该脚本位于 /usr/share/ssl/misc 中,但在您的系统上可能位于其他位置。您需要更改的行是CATOP=./micksCA.
如果您更改了工作目录来编辑此文件,请更改回您的 SSL 配置目录,例如,/etc/ssl。从那里,使用 -newca 选项运行 CA.sh 脚本,例如,/usr/share/ssl/misc/CA.sh -newca。然后,系统会提示您创建一个新的根证书,并为您的私钥键入一个密码短语。选择一个难以猜测的密码短语,并将其写在安全的地方——如果您忘记了它,您将无法使用您的 CA。
脚本完成后,您的 SSL 配置目录应包含一个新目录,在我们的示例中为 micksCA。此目录的根级别是您的新 CA 的公共证书;默认情况下,此文件名为 cacert.pem。正如我稍后演示的那样,您需要将此文件复制到您的 FreeRADIUS 服务器和每个无线客户端。
如果您有 Windows XP 无线客户端,您还需要做一件事。Windows XP 需要服务器和客户端证书中的某些属性,因此您需要创建一个名为 xpextensions 的文件,其中包含列表 2 中显示的行。
列表 2. xpextensions 的内容
[ xpclient_ext] extendedKeyUsage = 1.3.6.1.5.5.7.3.2 [ xpserver_ext ] extendedKeyUsage = 1.3.6.1.5.5.7.3.1
xpextensions 文件在我要向您展示的一些 OpenSSL 命令中被引用。它应该与 openssl.cnf 位于同一目录中。
EAP-TLS 的工作原理
在 EAP-TLS 中,无线客户端和您的 RADIUS 服务器相互进行身份验证。他们相互出示各自的证书,并以加密方式验证这些证书是否由您组织的证书颁发机构签名。在某些方面,这是一种优雅而简单的身份验证处理方式。在 FreeRADIUS 服务器上安装 CA 的公共证书后,您无需显式配置任何其他客户端信息,例如用户名、密码等。
但这并不意味着 EAP-TLS 比用户名-密码方案更省力。您仍然需要使用 OpenSSL 为所有用户创建证书,并将这些证书复制给他们。您还需要确保每个人都在正确的位置安装了根 CA 证书的副本。
对于 EAP-TLS,除了您的 CA 证书之外,您至少还需要两个证书:一个用于您的 FreeRADIUS 服务器的服务器证书和一个用于您的网络上每个无线客户端的客户端证书。创建证书是一个三步过程
生成签名请求,即未签名的证书。
使用您的 CA 密钥对签名请求进行签名。
将签名的证书复制到将要使用它的主机上。
让我们首先使用 OpenSSL 的 req 命令创建服务器证书签名请求
$ openssl req -new -nodes -keyout server_key.pem -out server_req.pem -days 730 -config ./openssl.cnf
此命令创建文件 server_req.pem,其中包含实际请求(未签名的证书)和 server_key.pem,其无密码短语的私钥。但是,首先,系统会提示您输入您组织的国家/地区代码、州等,其中大部分可以使用您在 openssl.conf 中调整的默认值。但是,请特别注意公用名称。当提示您输入此名称时,键入您的服务器的完全限定域名,例如,server.wiremonkeys.org。
接下来,让我们使用我们的 CA 密钥通过使用 OpenSSL 的 ca 命令来签署请求
$ openssl ca -config ./openssl.cnf \ -policy policy_anything -out server_cert.pem \ -extensions xpserver_ext -extfile ./xpextensions \ -infiles ./server_req.pem
此命令读取文件 server_req.pem,并在提示输入您的 CA 密钥的密码短语后,将它的签名版本及其对应的私钥保存到文件 server_cert.pem。请注意 -extensions 和 -extfile 选项——这就是为什么我们之前创建了文件 xpextensions。
使用您选择的文本编辑器打开您签名的证书,并删除以下行之前的所有内容-----BEGIN CERTIFICATE-----。像这样将它和您的密钥连接到一个文件中
$ cat server_key.pem server.cert.pem > \ server_keycert.pem
现在我们有了一个带有密钥的服务器证书,我们可以将其复制到我们的 FreeRADIUS 服务器。但是,它的私钥未受密码保护,因此请确保在将其放置到位后删除任何多余的副本。
现在我们需要创建一个客户端证书签名请求。用于执行此操作的 OpenSSL 命令与用于创建服务器证书的命令类似
$ openssl req -new -keyout client_key.pem \ -out client_req.pem -days 730 -config ./openssl.cnf
如您所见,我们将我们的签名请求和密钥分别写入文件 client_req.pem 和 client_key。但是,与服务器签名请求不同,我们省略了 -nodes 选项。因此,当您运行此命令时,系统会提示您输入密码短语,可以使用该密码短语加密证书的私钥。
接下来,我们签署客户端证书的签名请求
$ openssl ca -config ./openssl.cnf \ -policy policy_anything -out client_cert.pem \ -extensions xpclient_ext -extfile ./xpextensions \ -infiles ./client_req.pem
同样,这与我们服务器的等效命令类似,不同之处在于这次 -extensions 命令引用了 xpextensions 中的不同条目。此外,如果您的客户端运行 Linux,您应该删除证书中的多余内容,就像您对 server_cert.pem 所做的那样。然后,您可以将证书和密钥文件分开,也可以将它们连接在一起。从那里,将您的客户端证书文件复制到您的 Linux 客户端系统。
如果您的证书将由 Windows XP 客户端使用,您还需要执行一个步骤。您需要使用以下命令将证书文件转换为 PKCS12 格式的文件
openssl pkcs12 -export -in client_cert.pem \ -inkey client_key.pem -out client_cert.p12 -clcerts
系统会提示您输入 client_key.pem 的密码短语,然后为新文件输入新密码短语;如果您愿意,可以使用与以前相同的密码。您可能会很想简单地按 Enter 键,尤其是考虑到 Windows XP 中的 WPA 请求者仅在您存储不带密码短语的证书时才有效。但是,在网络中不受保护地移动私钥是非常非常糟糕的做法,因此我强烈建议您不要删除密码短语,直到此文件安全地复制到您的 Windows XP 客户端之后。
为了防止您想借此机会抨击 Microsoft,我必须指出,Linux 上的 Xsupplicant 和 wpa_supplicant 都要求您要么使用空白密码短语,要么将密码短语以明文形式存储在配置文件中。这与良好的证书处理智慧背道而驰。我希望有一天我们能看到足够智能的 WPA 请求者,以便在启动时提示用户输入其证书密码短语。
生成的文件,在本例中为 client_cert.p12,包含您的签名证书及其私钥。将其复制到您的 Windows XP 客户端系统。
我们已经安装了 FreeRADIUS,创建了证书颁发机构,生成了服务器和客户端证书,并将它们传输到各自的主机。但我们还没有完成。我们仍然需要配置 FreeRADIUS、我们的接入点和我们的无线客户端。我们将在下次完成所有这些工作。在那之前,请注意安全!
本文的资源: /article/8134。
Mick Bauer,CISSP,是Linux Journal的安全编辑,也是明尼苏达州明尼阿波利斯的 IS 安全顾问。O'Reilly & Associates 最近发布了他的著作《Linux 服务器安全》第二版 (2005 年 1 月)。Mick 还创作工业波尔卡音乐,但很有品味地很少表演它。