Linux 系统上使用 xsupplicant 的 802.1x

作者:Matthew Gast

当 WEP 的缺陷变得明显时,无线行业开始开发新的协议来解决已公开的弱点。这些新协议围绕 IEEE 802.1x 框架发展起来,这是一种在 LAN 链路上使用可扩展身份验证协议 (EAP) 及其所有方法的方式。操作系统供应商以及第三方开发人员将 802.1x 客户端软件程序(称为 supplicants)推向市场。

然而,Linux 最初被排除在 802.1x 的热潮之外。在 supplicants 广泛可用之前,支持高级用户的网络管理员被迫依赖基于手动 WEP 的解决方案,使用 MAC 地址过滤或 VPN 来保护 Linux。值得庆幸的是,现在有两个开源 supplicants 为 Linux 带来了高质量的无线安全。本文介绍了设置 xsupplicant(也称为 Open1X)的过程。

无线扩展

无线扩展 API 最初旨在提供一种统一的方式,让程序与驱动程序进行交互。像任何 API 一样,它可以使开发人员不必了解如何与每张网卡交互的细节。例如,802.1x supplicants 能够使用无线扩展系统调用来设置密钥,而不是为存在的每张网卡使用特定于网卡的调用。

无线扩展接口经历了几个版本。在无线扩展版本 18 (WE-18) 中添加了 WPA 支持。一些使用 2.6 内核的发行版已经具有 WE-18 支持。但是,旧内核需要打补丁。我的测试笔记本电脑运行的是 Slackware,它仍然使用 2.4 内核。2.4 内核支持版本 16 的无线扩展,但版本 2.4.30 有可用的补丁。补丁下载位置出现在本文的在线资源中。首先,将两个补丁应用于内核源代码

# patch -p1 ~/iw249_we17-13.diff
patching file include/linux/netdevice.h
patching file include/linux/wireless.h
patching file include/net/iw_handler.h
patching file net/core/dev.c
patching file net/core/wireless.c
# patch -p1 ~/iw240_we18-5.diff
patching file include/linux/wireless.h
patching file net/core/wireless.c

为了保持模块的清晰,我经常发现在修补内核时,编辑 Makefile 以在补丁级别之外包含一个额外的版本号很有帮助。我的无线扩展 18 内核构建为 2.4.30WE18。

与无线扩展一起使用的最常见工具是无线工具集,您将使用的最常见工具是 iwconfig。无线工具版本 28 是当前版本,支持 WE-18。从网站(参见资源)获取源代码。一个简单的make命令构建这些工具。

启动驱动程序

Linux 支持许多网卡,但少数驱动程序占据了大部分的普及率

  • MADwifi,多频段 Atheros Wi-Fi 驱动程序:基于 Atheros 的网卡对 802.11a 网络具有一些最佳的硬件支持。如果您的网卡支持 802.11a,则很可能它使用 Atheros 设计的芯片。

  • 用于 Centrino 芯片组的 Intel IPW 驱动程序:Intel 赞助了针对各种 Centrino 芯片组的开源驱动程序开发项目。由于市场上 Centrino 芯片组的数量众多,这些驱动程序被广泛使用。

  • orinoco_cs:第一款广泛使用的 802.11 网卡是 Orinoco Gold 卡,它基于 Hermes 芯片组。这些网卡以各种名称出售,并且在当时都表现出色。尽管这些网卡的无线电性能和吞吐量不再是最先进的,但该驱动程序已被充分理解,并且经常用作新想法的试验平台。

本文并非旨在对驱动程序的使用进行权威性的论述。我使用基于 Atheros 的网卡,因为我在家中使用 802.11a 网络,并且想要一个双频网卡进行数据包分析。因此,我将撰写关于 MADwifi 的内容。

MADwifi 尚未发布任何打包的源文件。要使用该驱动程序,您必须从 CVS 下载代码。与 MADwifi 一起分发的构建文件使用您当前的内核。如果您已修补内核以更新无线扩展,请在构建 MADwifi 之前重新启动

$ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:
↪/cvsroot/madwifi co madwifi
$ cd madwifi
$ make

root@bloodhound:/home/user/madwifi# make install

基于 Atheros 的网卡不使用固件。相反,它们有一个称为硬件抽象层 (HAL) 的二进制对象。Atheros 对 FCC 法规的解释方式要求 HAL 保持闭源。HAL 的作用与其他网卡上的固件相同——它为驱动程序实现低级操作。HAL 以 uuencoded 文件的形式分发,因此您必须安装 uudecode 程序才能安装 HAL。它可能在您的发行版的 shell 存档实用程序包中,但位置可能有所不同。OpenBSD Atheros 驱动程序包含一个开源的、反向工程的 HAL,但尚未移植到 Linux。

作为该过程一部分构建的内核模块安装在您的模块目录中。该驱动程序包括其自己的 802.11 支持层,由模块 wlan、wlan_wep、wlan_tkip 等组成。MADwifi 的硬件特定部分由以前缀 ath_ 开头的模块组成:驱动程序 ath_pci、HAL ath_hal 和速率自适应算法 (ath_rate_*)。所有模块都安装在 net/ 目录中。

测试驱动程序

除了在内核中具有最新的无线支持外,您还需要具有正确配置的无线网络子系统。在 Linux 上处理 802.1x 时遇到的许多“无线”问题都是 PC 卡配置问题。插入网卡后,您应该会听到一声高音调的哔声,表明卡服务已加载正确的驱动程序。第二声哔声用于传达网卡配置的状态,因此第二声较低的哔声是可以的,因为尚未设置网卡的配置。

如果网卡被识别并且加载了正确的驱动程序,请尝试启动一个没有加密且没有身份验证的无线网络。使用 iwconfig 配置与网络的关联,并使用 ifconfig 启动网卡。MADwifi 驱动程序创建以前缀 ath 开头的接口,因此我的接口是 ath0。根据您使用的驱动程序,您的接口可能有所不同。当网卡首次启动时,您可以看到它扫描网络,因为 iwconfig 报告的频率会发生变化。当网卡成功关联到网络时,它会报告接入点 MAC 地址以及工作频率。此时,您应该能够使用您的 Linux 发行版首选的任何工具向网络请求 IP 地址

# iwconfig ath0 essid "clearnet"
# ifconfig ath0 up
# iwconfig ath0
ath0  IEEE 802.11g  ESSID:"etherclear"
      Mode:Managed  Frequency:2.412 GHz  Access Point: 00:0B:0E:2F:0A:40
      Bit Rate:12 Mb/s   Tx-Power:50 dBm   Sensitivity=0/3
      Retry:off   RTS thr:off   Fragment thr:off
      Power Management:off
      Link Quality=39/94  Signal level=-56 dBm  Noise level=-95 dBm
      Rx invalid nwid:107  Rx invalid crypt:0  Rx invalid frag:0
      Tx excessive retries:22  Invalid misc:22   Missed beacon:0
# dhcpcd -d -t 10 ath0
dhcpcd: MAC address = 00:20:a6:4c:ca:4b
dhcpcd: your IP address = 172.16.199.84

如果您可以关联到网络,则您的网卡是功能正常的。尽管没有必要找出您是否可以从未加密的网络获取 IP 地址,但了解帧处理和网络堆栈正在工作,并且网络上正确配置了 DHCP 服务是有帮助的。在无线网络系统具有基本功能后,我们可以继续为其提供安全性。

xsupplicant

Linux 有两个主要的 supplicants:xsupplicant(也称为 Open1X)和 wpa_supplicant。本文仅讨论前者。在开始使用 xsupplicant 之前,请检查系统上的 OpenSSL 版本。xsupplicant 需要 OpenSSL 0.9.7 或更高版本才能提供传输层安全 (TLS) 支持。所有常用的 802.1x 身份验证协议都需要 TLS,无论是直接使用数字证书进行身份验证 (EAP-TLS) 还是作为某种其他形式的身份验证的保护隧道 (TTLS 或 PEAP)。您需要软件包的开发版本才能获得预期的标头。

从 SourceForge 下载源代码(参见资源)。在撰写本文时,当前版本为 1.2pre1

$ tar -xzf Xsupplicant-1.2pre1.tar.gz
$ cd xsupplicant
$ ./configure --with-madwifi-path=~/madwifi
. . .
Adding MADWIFI WPA support.
. . .
$ make

# make install

构建的结果是安装了三个可执行文件。您可能唯一会使用的是 /usr/local/sbin/xsupplicant。

证书处理

安全的 EAP 身份验证通常依赖于数字证书。证书数据使用隐私增强邮件 (PEM) 格式或可 distinguished encoding rules (DER) 进行编码。我的经验是 xsupplicant 喜欢 PEM 格式的证书,但许多证书颁发机构颁发 DER 格式的证书。幸运的是,OpenSSL 非常擅长在格式之间进行转换

# openssl x509 -inform DER -outform PEM \
-in MyCA.der -out MyCa.pem

要查看证书内编码的实际数据,您可以使用 openssl 命令打印文本输出

# openssl x509 -in MyCA.pem -text

您如何确切地获得证书取决于您的网络管理员。许多证书颁发机构在网页上提供根证书。

配置 xsupplicant

运行时,xsupplicant 在 /etc 中搜索其配置文件。配置文件 /etc/xsupplicant.conf 默认未安装,但很容易复制过来

# cp xsupplicant.conf /etc/xsupplicant.conf

在配置文件中指定用户身份、可能的密码和根 CA 证书。每个网络都可以通过将整个网络配置括起来来拥有自己的配置。使用 PEAP 和 MSCHAP-V2 进行内部身份验证的网络的简单配置可能如下所示

dynamic-wep
{
  allow_types=all
  identity = testuser
  eap_peap {
      root_cert = /usr/local/etc/myCA.der
      random_file = /path/to/random/source
      allow_types = eap_mschapv2
      eap-mschapv2 {
        username = testuser
        password = "testpw"
      }
  }
}

Linux 有两个随机数设备,/dev/random 和 /dev/urandom。两者都从系统熵池中提取随机数,但前者设备仅返回强随机数。因此,我强烈建议使用 /dev/random 作为随机数设备文件。许多 802.1x 实现可以应对等待响应时相对较大的延迟。在 2005 年 5 月拉斯维加斯举行的 Interop Labs 中,我们通过多跳全球分布式 RADIUS 系统验证了一个用户帐户,因此端到端延迟远高于大多数网络。

为了测试目的,可以通过将 root_cert 位置设置为 NONE 来禁用证书验证。尽管对于测试目的很有用,但禁用证书身份验证会消除证书提供的保护,不应在正常部署中这样做。

运行 xsupplicant

配置 xsupplicant 后,您终于可以对网络进行身份验证了。首先使用 iwconfig 连接到您要连接的网络并启动接口。我发现给 xsupplicant 一个虚拟 WEP 密钥会有所帮助,这样它就知道它将连接到加密网络。三个命令就可以解决问题

# iwconfig ath0 key 12345678901234567890123456
# iwconfig essid "batnet"
# ifconfig ath0 up

无线接口名称取决于驱动程序。我的接口是 ath0,但您的可能不是。

在当前版本的 xsupplicant 中,必须使用 -i 选项提供接口。在测试时,我通常发现使用 -d 记录调试消息并使用 -f 将进程保持在前台很有帮助。要查看可以打印的完整列表,请使用 --help

# xsupplicant -w -dasic -i ath0 -f

调试消息会打印出发送和接收的每个帧,并提供每个发送或接收帧的处理信息。在该过程结束时,密钥信息将被处理。例如,动态 WEP 密钥看起来像这样

Processing EAPoL-Key!
[INT] Key Descriptor   = 1
[INT] Key Length       = 13
[INT] Replay Counter   = 41 2F BB 2D 00 00 00 D6
[INT] Key IV           = 66 15 69 E2 B2 8C 0E 89 7C D3 94 8C 93 25 43 1B
[INT] Key Index (RAW)  = 80
[INT] Key Signature    = 49 C1 15 B8 E9 D0 87 53 A6 FD 5D 76 CB 51 9D 65
[INT] EAPoL Key Processed: unicast [1] 13 bytes.
[INT] Using peer key!
[INT] Successfully set WEP key [1]
[INT] Successfully set the WEP transmit key [1]
配置和使用 WPA

WPA 由命令行选项触发,并在配置文件的全局部分中配置了两个选项。WPA 允许您指定用于单播(成对)和广播或多播(组)帧的加密类型。这两个选项都可以在配置文件中设置,并且可以采用 wep40、wep104、tkip、ccmp 或 wrap 的值。但是,此时,只有基于 RC4 的密码——WEP 和 TKIP——可以可靠地工作。像这样设置配置的两行

wpa_pairwise_cipher = tkip
wpa_group_cipher = tkip

network-config
{
  . . .
}

要在运行时使用 WPA,您必须在驱动程序中为您的网卡以及主配置文件中配置支持。WPA 不仅仅是 TKIP 的新加密例程,它还会影响关联过程和密钥分发。由于需要驱动程序支持的级别,您需要使用 -D 选项指定驱动程序,并且必须使用已编译 WPA 支持的驱动程序

# xsupplicant -dasic -i ath0 -D madwifi

本文资源: /article/8404

Matthew Gast 是无线 LAN 领域领先技术书籍 802.11 Wireless Networks: The Definitive Guide (O'Reilly Media) 的作者。他目前是一家先进无线系统公司的咨询工程总监,在那里他帮助客户了解新的安全协议和标准,以及如何使用它们构建安全的无线局域网。可以通过 matthew.gast@gmail.com 与他联系,但仅限他在海平面附近时。

加载 Disqus 评论