首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第39期->技术专题
期刊号: 类型: 关键词:
使用FreeRADIUS和XSuppicant进行EAP/TLS验证(一个开放源码的802.1X解决方案)

作者:san <san@nsfocus.com>
主页:http://www.nsfocus.com
日期:2003-03-03

一、IEEE 802.1X简介
当前802.11无线网络的安全性还是非常脆弱的,很多情况下无线客户端如果得到接入点(AP)的SSID,就可以获得网络的访问权限。而且由于管理员的懒惰没有修改AP厂商默认设置的SSID,甚至配置AP向外广播其SSID,那么安全性还将更低。最常见的解决方法是使用WEP加密,在链路层采用RC4对称加密技术,用户的加密金钥必须与AP的密钥相同时才能获准存取网络的资源,从而防止非授权用户的监听以及非法用户的访问。WEP提供了40位(有时也称为64位)和128位长度的密钥机制,但是它仍然存在许多缺陷,例如一个服务区内的所有用户都共享同一个密钥,一个用户丢失或者泄漏密钥将使整个网络不安全。而且由于WEP加密被发现有安全缺陷,可以在几个小时内被破解。

一些常见AP厂商的默认SSID和默认WEP密钥、密码可以参考如下链接:

http://www.wi2600.org/mediawhore/nf0/wireless/ssid_defaults/ssid_defaults-1.0.5.txt

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

    定制这个文件使得生成自己的密钥和证书变得简单。生成密钥可以使用下面地址的脚本:

http://www.missl.cs.umd.edu/wireless/eaptls/doc/CA.all

脚本里的whatever是使用的口令,可以根据自己的需要修改。这个脚本会生成私钥、CA和两个证书,样例可以从如下地址查看:

http://www.missl.cs.umd.edu/wireless/eaptls/keys/cert.tgz

这里的口令都是’whatever’。把证书放到相应路径:

mkdir -p /usr/src/802/keys
cd /usr/src/802/keys
wget http://www.missl.cs.umd.edu/~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 http://ftp.debian.org/debian/dists/potato/main/source/libs/libnet_1.0.orig.tar.gz
tar zxvf libnet_1.0.orig.tar.gz
cd Libnet-1.0/
./configure
make
make install

3. FreeRADIUS
需要使用2002年3月1日以后cvs版本的FreeRADIUS,可以通过cvs下载,也可以从如下地址获得该可用版本:

http://www.missl.cs.umd.edu/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配置脚本,详细信息可参考如下链接:

http://marc.theaimsgroup.com/?t=101488214000003&r=1&w=2

3. 编译安装完radius后需要对服务器进行配置,radius的配置文件在/usr/local/radius/etc/raddb目录下,需要修改启用EAP/TLS功能,以下参考的配置文件:

http://www.missl.cs.umd.edu/wireless/eaptls/doc/etc-raddb-radius.conf-diff
http://www.missl.cs.umd.edu/wireless/eaptls/doc/etc-raddb-client.conf-diff
http://www.missl.cs.umd.edu/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协议进行验证了。以下两个文件是服务端和客户端进行验证时的日志文件:
http://www.missl.cs.umd.edu/wireless/eaptls/doc/srv.log
http://www.missl.cs.umd.edu/wireless/eaptls/doc/clt.log

参考信息
http://www.missl.cs.umd.edu/wireless/eaptls/
http://www.impossiblereflex.com/8021x/eap-tls-HOWTO.htm
http://www.drizzle.com/~aboba/IEEE/
http://www.xfocus.net/article_view.php?id=465
版权所有,未经许可,不得转载