多疑的企鹅 - 使用 WPA 和 FreeRADIUS 保护您的 WLAN,第三部分

作者:Mick Bauer

在前两个“多疑的企鹅”专栏中,我描述了 Wi-Fi 保护访问 (WPA) 如何保护无线局域网 (WLAN) 免受未经授权的访问和窃听。我还开始解释如何使用 FreeRADIUS 在您自己的 WLAN 上实施 WPA。到目前为止,我们已经介绍了安装 FreeRADIUS、创建证书颁发机构 (CA) 以及生成和签署用于 WPA 的数字证书。本月,我将向您展示将这些证书放在哪里、如何配置 FreeRADIUS 以及如何配置您的无线接入点和客户端。有了这些信息,您应该能够很好地开始保护您的 WLAN。

简要回顾

如果您是本系列文章的新读者,或者只是需要回顾一下我们试图实现的目标,让我们简要回顾一下我们的目的和范围。WPA 以 802.1x 协议及其子协议(例如 EAP、PEAP 和 EAP-TLS)的形式,为较旧的、密码已被破解的 WEP 协议添加了强大的身份验证功能。WPA 还通过 TKIP 协议添加了动态会话密钥协商和自动密钥重新生成。如果您的无线客户端软件支持 WPA——也就是说,如果它包含 WPA supplicant——并且您的无线接入点支持 WPA,那么您已经完成了三分之二的路程。但是,如果您想充分利用 802.1x,则需要后端 RADIUS 服务器,这就是 FreeRADIUS 的用武之地。

在我上次建立的示例场景中,我们正在配置 FreeRADIUS 服务器,以对连接到任何 WPA 兼容无线接入点的 Windows XP 无线客户端进行身份验证。我们的 802.1x 方法是 EAP-TLS。您可能还记得,EAP-TLS 使用 TLS 协议,通过使用 X.509 数字证书来相互验证无线 supplicant(客户端)和您的接入点。

本专栏的任务包括:

  • 将我们上次创建的服务器和 CA 证书安装到我们的 FreeRADIUS 服务器上。

  • 配置 FreeRADIUS 以将这些证书与 EAP-TLS 结合使用,从而为我们的接入点验证用户身份。

  • 配置我们的接入点,以将身份验证重定向到我们的 FreeRADIUS 服务器。

  • 将我们上次创建的客户端和 CA 证书安装到 Windows XP 客户端上,并将其配置为在连接到 WLAN 时使用 WPA。

准备 FreeRADIUS 服务器

在本 WPA 系列的第二部分中,我们创建了三个 X.509 数字证书:证书颁发机构证书,名为 cacert.pem;一个服务器证书,名为 server_keycert.pem;以及一个客户端证书,名为 client_cert.p12。服务器和客户端文件都包含证书及其私钥,因此必须小心处理这些文件。但是,CA 证书与其密钥分开存储,因此您可以自由分发 cacert.pem。

FreeRADIUS 将其配置文件存储在 /etc/raddb/ 或 /usr/local/etc/raddb/ 中,具体取决于您的发行版。此目录包含一个子目录 certs/——自然,这就是您需要复制 CA 证书和服务器证书/密钥的位置。确保 cacert.pem 的所有者是用户 root,并且其权限设置为-r--r--r--。另一方面,server_keycert.pem 的所有者应为用户 nobody,并且其权限设置为-r--------。列表 1 显示了这两个文件的长目录列表。

列表 1. raddb/certs 目录中证书的所有权和权限

-r--r--r--  1 root   users 1294 2005-02-10 01:05 cacert.pem
-r--------  1 nobody users 1894 2005-02-10 01:00 server_keycert.pem

只要您关注文件所有权,您还应该确保文件 /var/log/radius/radius.log 和目录 /var/run/radiusd/ 可由 nobody 写入。如果您从源代码编译 FreeRADIUS,则这些路径可能改为 /usr/local/var/log/radius/radius.log 和 /usr/local/var/run/radiusd/。radius.log 和 radiusd/ 都可能由 nobody 拥有。

在我们深入研究 FreeRADIUS 的配置文件之前,我们需要创建两个 FreeRADIUS 必须拥有的文件才能使用 TLS。第一个是 Diffie-Hellman 参数文件,或 dh 文件,它用于协商 TLS 会话密钥。要创建 dh 文件,请将您的工作目录更改为 FreeRADIUS 的 raddb/certs/ 目录,并发出以下命令

# openssl dhparam -check -text -5 512 -out dh

您需要的第二个文件是一个数据文件,其中包含也用于 TLS 操作的随机比特流。 不要 像我在 Internet 上看到的至少一个 WPA 程序建议的那样,只是将当前时间戳或任何其他类似的非随机字符串粘贴到名为 random 的文件中。而是使用内核的高质量随机数生成器。在 raddb/certs 中,运行以下命令

# dd if=/dev/urandom of=random count=2

这两个文件都需要用户 nobody 可读,但任何人都不得写入它们。

配置 FreeRADIUS

我们终于准备好配置 FreeRADIUS 了。当您看到 etc/raddb 中长长的文件列表时,您可能会感到害怕,但不要害怕。对于使用 EAP-TLS 的 WPA,我们只需要编辑三个文件:radiusd.conf、eap.conf 和 clients.conf。

在 radiusd.conf 中,我们只需要设置 radiusd 进程运行的用户和组帐户。默认情况下,这些帐户是从启动守护程序的任何用户继承的。如果您从启动脚本运行 radiusd,则它是 root;但是,您绝对不希望以 root 身份运行 radiusd。因此,您应该在 radiusd.conf 中设置 user 和 group 参数,这两个参数都设置为 nobody,如列表 2 所示。

列表 2. 在 radiusd.conf 中设置的两个参数

user = nobody
group = nobody

自然,您可以选择不同的非特权用户和组帐户来代替 nobody 和 nobody,但如果您这样做,则需要调整我们之前调整的证书文件的所有权和权限。无论如何,请确保您的非特权用户在 /etc/password 中的条目将其 shell 设置为非 shell,例如 /bin/false 或 /bin/true——此帐户不应用于 SSH、telnet 或类似程序。就此而言,请首先确保用户和组帐户都存在,如果不存在,请创建它们。

可以在 radiusd.conf 中设置其他参数,但这些参数实际上是唯二需要更改默认设置的参数。有关更多信息,请参阅 radiusd.conf(5) 手册页或 Jonathan Hassell 的著作 RADIUS

我们需要编辑的下一个文件是 eap.conf;这里是真正繁重的工作发生的地方。列表 3 显示了您需要在 eap.conf 中编辑的行。

列表 3. eap.conf 中的更改

eap {
  # There are several generic EAP parameters you can
  # set here, but the important one for our purposes
  # is default_eap_type:

  default_eap_type = tls

  # Next come parameters for specific EAP types. Since
  # we're going to use EAP-TLS, the tls{} section is
  # the one we care about:

  tls {
    # The following parameters tell radiusd where to
    # find its certs and keys, plus dh & random files:

    private_key_password = keYpasSphraSE_GOES_h3r3
    private_key_file = ${raddbdir}/certs/bt_keycert.pem
    certificate_file = ${raddbdir}/certs/bt_keycert.pem
    CA_file = ${raddbdir}/certs/cacert.pem
    dh_file = ${raddbdir}/certs/dh
    random_file = ${raddbdir}/certs/random
    }
  }

在列表 3 中,我使用 private_key_password 参数指定了服务器密钥密码。如果您使用 OpenSSL 的 -nodes 选项创建服务器证书和密钥,则实际上应该为空。不幸的是,我告诉您在上个月的专栏中使用此选项,我现在要收回该建议:即使密钥存储在纯文本配置文件(如 eap.conf)中,使用无密码短语的 X.509 密钥也是不良做法。是的,如果 FreeRADIUS 服务器被 root——被具有 root 权限的黑客入侵——即使是受密码短语保护的证书仍然可能被泄露,这要归功于 eap.conf。但是,如果证书/密钥文件在传输过程中被窃听——例如,当您将其从 CA 主机传输到 FreeRADIUS 服务器时——如果它受密码短语保护,则对攻击者来说是无用的。

无论哪种方式,请确保 eap.conf 仅由 root 拥有和读取,而不是由您在 radiusd.conf 中配置的非特权用户帐户拥有和读取。这似乎是自相矛盾的——nobody 不需要能够读取配置文件吗?但是,如果您以 root 身份启动 radiusd,它会在降级为 nobody 之前读取其配置文件,包括 radiusd.conf、eap.conf 和 clients.conf。

最后,您需要在 clients.conf 中为您的接入点创建一个条目。列表 4 显示了这样一个条目。

列表 4. clients.conf 中的接入点条目

client 10.1.2.3/32 {
      secret          = 1sUpErpASSw0rD
      shortname       = wiremonkeys_AP
}

在列表 4 中,client 语句指定了接入点的 IP 地址。它的 secret 参数指定一个字符串,您的接入点将其用作加密密钥,用于发送到您的 FreeRADIUS 服务器的所有查询。shortname 只是您接入点的别名,用于日志条目等。

您现在可以使用 rc.radiusd 脚本启动 radiusd,例如,rc.radiusd start。您也可以使用rc.radiusd restart重新启动它。如果 radiusd 启动时没有错误,则您已准备就绪。

配置接入点

下一步是整个过程中最简单的部分:配置您的无线接入点以使用 WPA 并指向您的 FreeRADIUS 服务器。这只需要两条信息,您在 FreeRADIUS 服务器的 clients.conf 文件中输入的 RADIUS 密钥和您的 FreeRADIUS 服务器的 IP 地址。

如何将这两条信息呈现给您的接入点取决于您的特定硬件和软件。我自己的接入点是具有 WLAN 功能的 Actiontec DSL 路由器。从其 Web 界面,我单击“Setup→Advanced Setup→Wireless Settings”,并将“Security”设置为“WPA”。然后,我将其配置为使用 802.1x 而不是预共享密钥。我还为其提供了服务器 IP 地址 10.1.2.3,我的 FreeRADIUS 服务器的 IP 和密钥 1sUpErpASSw0rD,如列表 4 所示。我将“Port”的值保留为其默认值 1812。

说到这里,如果您的接入点和 RADIUS 服务器之间有防火墙,则需要允许接入点通过 UDP 端口 1812 和 1813 访问 RADIUS 服务器。这样做还允许 RADIUS 服务器从这些端口发回数据包。

配置 Windows XP 客户端

接下来我们将介绍配置 Windows XP 无线客户端以使用您新启用的 WPA 接入点。这是一本 Linux 杂志,我不会详细描述此过程——为此,您可以参阅 Ken Roser 的 HOWTO 的 4.3 节,该 HOWTO 列在在线资源中。总而言之,您需要

  1. 运行命令mmc从“开始”→“运行...”启动。

  2. 在 Microsoft Management Console 中,选择“文件”→“添加/删除管理单元”,添加“证书”管理单元,并将其设置为管理“我的用户帐户”的证书,然后在下一个屏幕上,仅管理“本地计算机”的证书。

  3. 将您的 CA (cacert.pem) 证书复制到 Windows 系统的硬盘驱动器,例如,复制到 C:\cacert.pem。

  4. 在 MMC 中,展开“控制台根节点”和“证书 - 当前用户”,然后右键单击“受信任的根证书颁发机构”。在弹出菜单中,选择“所有任务”→“导入”。告知后续向导导入文件 C:\cacert.pem 并将其存储在“受信任的根证书颁发机构”中。

  5. 将您的客户端证书/密钥文件复制到您的 Windows 系统,例如,复制到 C:\client_cert.p12。

  6. 在 MMC→“控制台根节点”→“证书”中,展开“个人”,然后右键单击“证书”。在弹出菜单中,选择“所有任务”→“导入”。告知后续向导导入文件 C:\client_cert.p12。

  7. 然后,证书导入向导会提示您输入证书的密码短语。在同一对话框中,它提供了启用强私钥保护的选项。不幸的是,启用此选项会破坏 WPA,因此请务必取消选中此选项。此外,取消选中将此密钥标记为可导出的选项——最好备份您刚刚导入的受密码保护的文件,而不是允许导入的未受保护版本可导出。

  8. 在后续屏幕中,让向导“自动选择证书存储”。

现在您的 Windows XP 系统已准备就绪——剩下的就是创建一个无线网络配置文件。但是,这因您的无线网卡驱动程序和您正在运行的 Windows XP Service Pack 而异。在我的 Windows XP SP1 系统上,使用 Centrino 芯片组和 XP 的本机 WPA supplicant,我创建了一个无线网络配置文件,指定了我的 WLAN 的 SSID。我将“网络身份验证”设置为“WPA”,“数据加密”设置为“TKIP”,并将“EAP 类型”设置为“智能卡或其他证书”。Windows 会自动确定我使用的客户端证书——这是因为我们费尽心思创建了一个引用 Windows XP 扩展属性的客户端证书(请参阅我之前的专栏)。

配置无线网络配置文件后,您的 Windows 系统应自动连接到您的接入点并协商 WPA 连接。如果成功,则“网络连接”应显示您的“无线网络连接”条目的状态为“身份验证成功”。

结论

我希望您已经成功走到这一步,并且 WPA 开了一个好头。WPA 并非完美——世界需要能够处理受密码短语保护的客户端证书而无需以明文形式存储密码短语的 WPA supplicant。但是,无线网络似乎最终正朝着安全的方向发展。

本文资源: /article/8200

Mick Bauer,CISSP,是 Linux Journal 的安全编辑,也是明尼苏达州明尼阿波利斯市的一名 IS 安全顾问。O'Reilly & Associates 最近发布了他的著作 Linux 服务器安全 第二版(2005 年 1 月)。Mick 还创作工业波尔卡音乐,但很有品味地很少演奏。

加载 Disqus 评论