一、IEEE 802.1X简介
当前802.11无线网络的安全性还是非常脆弱的,很多情况下无线客户端如果得到接入点(AP)的SSID,就可以获得网络的访问权限。而且由于管理员的懒惰没有修改AP厂商默认设置的SSID,甚至配置AP向外广播其SSID,那么安全性还将更低。最常见的解决方法是使用WEP加密,在链路层采用RC4对称加密技术,用户的加密金钥必须与AP的密钥相同时才能获准存取网络的资源,从而防止非授权用户的监听以及非法用户的访问。WEP提供了40位(有时也称为64位)和128位长度的密钥机制,但是它仍然存在许多缺陷,例如一个服务区内的所有用户都共享同一个密钥,一个用户丢失或者泄漏密钥将使整个网络不安全。而且由于WEP加密被发现有安全缺陷,可以在几个小时内被破解。
一些常见AP厂商的默认SSID和默认WEP密钥、密码可以参考如下链接:
IEEE 802.1X是IEEE在2001年6月发布的一个标准,用于对IEEE 802局域网(包括以太网、Token Ring和FDDI)的认证和密钥管理。
802.1X不是加密算法,不同于WEP、3DES、AES或其它的算法,IEEE 802.1X只关注认证和密钥管理,不关心来源密钥使用什么安全服务传送。所以它可以对认证来源和密钥使用任意的加密算法,还可以周期性的更新密钥和重新认证来保证密钥的安全。
IEEE 802.1X不是一个单独的认证方法,它利用可扩展认证协议(EAP)作为它的认证框架。这意味着有802.1X功能的交换机和AP可以支持各种认证方式,包括基于证书的认证、智能卡、标记卡(token cards)、一次性口令等。然而802.1X本身并没有指定和要求使用何种认证方式,交换机和AP只是EAP的一个通道,所以可以只需在主机和后台认证服务器安装软件而无需对交换机和AP升级就可以添加一个新的认证方式。
IEEE 802.1X没有对包进行封装(不像PPPOE或VPN),实现起来不会对交换机和AP的性能有所影响。这意味着IEEE 802.1X处理的速度可以从11 Mbps (802.11) 到 10+ Gbps,并且只要升级交换机的固件而不必购买新的硬件就可以实现。对于主机,IEEE 802.1X可以由网卡驱动来实现,不必使用新的操作系统。
RADIUS服务器(包括Windows 2000 IAS)支持EAP,可以用来管理基于IEEE 802.1X网络的访问。通过RADIUS,IEEE 802.1X允许管理每个用户的授权,包括过滤(2层或3层)、隧道、动态VLANs、速率控制等。
EAP/TLS是802.1X架构的一种认证方式,802.1X和EAP/TLS是无线网络一个越来越受欢迎的安全解决方案。以下是Adam Sulmicki的一个基于开放源码软件的802.1X解决方案。
二、网络结构图
Adam Sulmicki的无线网络结构如下图:
从右边至左边配置如下:
1. 验证服务器-radius服务器
硬件:
IBM THINKPAD T23 2647-2KU 100 Mbps以太网卡
软件:
Linux Red Hat 7.2
FreeRadius (cvs)
OpenSSL (snapshot)
2. 验证端-接入点(AP)
硬件:
CISCO AIRONET 340 series 11 Mbps ACCESS POINT
AIR-AP342E2C
主板: MPC860 50MHz, 2048KB FLASH, 16384KB DRAM, Revision 21
100 Mbps以太网卡
软件:
系统:EnterpriseAP Sys 11.10
3. 请求端-radius服务器
硬件:
IBM THINKPAD T23 2647-2KU
CISCO AIRONET 340 SERIES 11 Mbps WIRELESS ADAPTER
AIR-PCM342
软件:
Linux Red Hat 7.2
xsupplicant (cvs tarball)
三、软件安装
1. OpenSSL
FreeRADIUS和Xsuppicant需要使用稳定版本的OpenSSL,而FreeRADIUS的EAP/TLS模块却需要使用最新的非稳定snapshot版本OpenSSL(或者是2002年3月份以后的稳定版本,OpenSSL 0.9.7或更新),所以要安装两个版本的OpenSSL。
注意非稳定版本的SSL不要使用文件名带stable的,也不要使用带”e”的版本,那一般是用于硬件加密的。
从OpenSSL的网站下载:
ftp://ftp.openssl.org/snapshot/openssl-SNAP-20020227.tar.gz
然后进行配置安装:
mkdir -p /usr/src/802/openssl
cd /usr/src/802/openssl
ncftpget ftp://ftp.openssl.org/snapshot/openssl-SNAP-20020227.tar.gz
tar zxvf openssl-SNAP-20020227.tar.gz
cd openssl-SNAP-20020227
./config shared --prefix=/usr/local/openssl
make
make install
注意:snapshot版本不要安装在常用的路径如:--prefix=/usr或—prefix=/usr/local/ssl,只有FreeRADIUS的EAP/TLS模块需要snapshot版本。
安装后需要修改/usr/local/openssl/ssl/openssl.cnf文件,以下是一个配置修改样例,openssl.conf-diff:
--- /usr/local/openssl/ssl/openssl.cnf-backup Thu Feb 28 03:35:54 2002
+++ /usr/local/openssl/ssl/openssl.cnf Thu Feb 28 03:38:12 2002
@@ -117,30 +117,33 @@
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
-countryName_default = AU
+countryName_default = US
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
-stateOrProvinceName_default = Some-State
+stateOrProvinceName_default = Maryland
localityName = Locality Name (eg, city)
+localityName_default = College Park
0.organizationName = Organization Name (eg, company)
-0.organizationName_default = Internet Widgits Pty Ltd
+0.organizationName_default = University of Maryland
# we can do this but it is not needed normally :-)
#1.organizationName = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd
organizationalUnitName = Organizational Unit Name (eg, section)
-#organizationalUnitName_default =
+organizationalUnitName_default = MISSL
commonName = Common Name (eg, YOUR name)
commonName_max = 64
+commonName_default = adam
emailAddress = Email Address
emailAddress_max = 64
+emailAddress_default = adam@cfar.umd.edu
# SET-ex3 = SET extension number 3
@@ -148,6 +151,7 @@
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
+challengePassword_default = whatever
unstructuredName = An optional company name
定制这个文件使得生成自己的密钥和证书变得简单。生成密钥可以使用下面地址的脚本:
脚本里的whatever是使用的口令,可以根据自己的需要修改。这个脚本会生成私钥、CA和两个证书,样例可以从如下地址查看:
这里的口令都是’whatever’。把证书放到相应路径:
mkdir -p /usr/src/802/keys
cd /usr/src/802/keys
wget ~adam/802/keys/cert.tgz
tar zxvf cert.tgz
mkdir -p /etc/1x
mv /usr/src/802/keys /etc/1x/
2. LibNet
Xsupplicant需要使用LibNet,如果系统里没有必须另行安装:
mkdir -p /usr/src/802/libnet
cd /usr/src/802/libnet
wget
tar zxvf libnet_1.0.orig.tar.gz
cd Libnet-1.0/
./configure
make
make install
3. FreeRADIUS
需要使用2002年3月1日以后cvs版本的FreeRADIUS,可以通过cvs下载,也可以从如下地址获得该可用版本:
wireless/eaptls/radius/radiusd-02.28.02.tar.gz
安装配置:
tar zxvf radiusd-02.28.02.tar.gz
cd radiusd
./configure --prefix=/usr/local/radius
make
make install
/usr/local/radius/sbin/run-radius -X -A
有几点注意:
1. make前需要修改radiusd/src/modules/rlm_eap/types/rlm_eap_tls/下的Makefile文件,让它编译EAP-TLS以及使用snapshot版本的OpenSSL。
--- radiusd/src/modules/rlm_eap/types/rlm_eap_tls/Makefile 2002/01/24
+++ radiusd/src/modules/rlm_eap/types/rlm_eap_tls/Makefile 2002/02/28
@@ -1,11 +1,12 @@
TARGET =
+TARGET = rlm_eap_tls
#TARGET = rlm_eap_tls
SRCS = rlm_eap_tls.c eap_tls.c cb.c tls.c
-RLM_CFLAGS = $(INCLTDL) -I../.. -I/path/to/openssl/include
+RLM_CFLAGS = $(INCLTDL) -I../.. -I/usr/local/openssl/include
HEADERS = eap_tls.h
RLM_INSTALL =
-RLM_LDFLAGS += -L/path/to/openssl/lib
+RLM_LDFLAGS += -L/usr/local/openssl/lib
RLM_LIBS += -lssl
$(STATIC_OBJS): $(HEADERS)
2. 目前的linux系统由于对gethostbyadd_r()和gethostbyname_r()的检测会存在失误,需要在make前对radius的autoconf.h打上如下补丁:
diff -u -r1.44 autoconf.h
--- src/include/autoconf.h
+++ src/include/autoconf.h
@@ -100,10 +100,10 @@
#undef HAVE_CTIME_R
/* Define if you have the gethostbyaddr_r function. */
-#undef HAVE_GETHOSTBYADDR_R
+//#undef HAVE_GETHOSTBYADDR_R
/* Define if you have the gethostbyname_r function. */
-#undef HAVE_GETHOSTBYNAME_R
+//#undef HAVE_GETHOSTBYNAME_R
/* Define if you have the gethostname function. */
#undef HAVE_GETHOSTNAME
另外的办法是编辑radiusd/src/lib/misc.c文件,修改成适合Linux语法的gethostbyadd_r() 和gethostbyname_r()调用。还有方法是修改configure.in配置脚本,详细信息可参考如下链接:
3. 编译安装完radius后需要对服务器进行配置,radius的配置文件在/usr/local/radius/etc/raddb目录下,需要修改启用EAP/TLS功能,以下参考的配置文件:
wireless/eaptls/doc/etc-raddb-radius.conf-diff
wireless/eaptls/doc/etc-raddb-client.conf-diff
wireless/eaptls/doc/etc-raddb-users-diff
4. /usr/local/radius/sbin/run-radius是启动radius服务的脚本,这个脚本定义了LD_LIBRARY_PATH和LD_PRELOAD两个环境变量可以让EAP/TLS使用正确的libssl库,并且libssl库也能装载正确的libcrypto。
#!/bin/sh -x
LD_LIBRARY_PATH=/usr/local/openssl/lib
LD_PRELOAD=/usr/local/openssl/lib/libcrypto.so
export LD_LIBRARY_PATH LD_PRELOAD
/usr/local/radius/sbin/radiusd $@
4. xsupplicant
xsupplicant需要使用2002年3月1日以后最新的cvs版本,可以从如下地址下载:
http://www.open1x.org/xsupplicant-cvs-current.tar.gz
xsupplicant必须使用稳定版的OpenSSL,系统一般都使用稳定版,目录在/usr/local/ssl。
安装xsupplicant:
mkdir -p /usr/src/802/xsup
cd /usr/src/802/xsup
wget http://www.open1x.org/xsupplicant-cvs-current.tar.gz
tar zxvf xsupplicant-cvs-current.tar.gz
cd xsupplicant-cvs-current
./configure
make
make install
/sbin/iwconfig eth1 essid rtest
/sbin/ifconfig eth1 up
xsupplicant -i eth1
注意:
1. 运行xsupplicant之前需要设置essid让无线客户端和AP管理,可以使用iwconfig命令,也可以在/etc/pcmcia/wireless.opts指定。
2. 运行xsupplicant之前必须让无线网卡起来。
3. xsupplicant的配置文件是/etc/1x/1x.conf,下面是一个配置样例:
rtest:id = adam-ctl
rtest:cert = /etc/1x/r/cert-clt.der
rtest:key = /etc/1x/r/cert-clt.pem
rtest:root = /etc/1x/r/root.pem
rtest:auth = EAP
无线网络的名称是rtest,登陆ID为adam-ctl,和radius配置文件/etc/raddb/users一致。下面三行是指定验证文件。不过目前xsupplicant还不支持基于DSA的密钥。
四、测试
把验证服务器和AP的以太网口互联,然后对AP进行配置:
设置radius服务器:
Home -> Setup -> Security -> Authentication Server
192.168.5.200是验证服务器的IP(AP的IP是192.168.5.131),Shared Secret使用前面CA.all里whatever这个口令。
设置验证方式:
Home -> Setup -> Security -> Radio Data Encryption (WEP)
配置完以后,无线客户端就可以使用802.1x协议进行验证了。以下两个文件是服务端和客户端进行验证时的日志文件:
wireless/eaptls/doc/srv.log
wireless/eaptls/doc/clt.log
参考信息
wireless/eaptls/
~aboba/IEEE/
http://www.xfocus.net/article_view.php?id=465