在无线网络中使用RADIUS服务器+mysql进行用户认证
授权方式:署名,非商业用途,保持一致,转载时请务必以超链接(http://www.fwolf.com/blog/post/369)的形式标明文章原始出处和作者信息及本声明。安全性
无线网络使用非常方便,但方便之余还要考虑安全性的问题。
首先是传输的安全线,WEP方式现在已经是不安全的了,容易被黑客破解密钥,监听通讯数据,所以现在以WPA及其衍生方式为主。
取消SSID自动播放功能也是一个好的习惯,所有无线局域网都有一个缺省的SSID(服务标识符)或网络名。如果企业具有网络管理能力,应该定期更改SSID;或者取消SSID自动播放功能。
然后就是接入的安全性了,即通过认证的用户才允许使用网络,除了网络设备自身具备的MAC绑定、ACL等功能之外,还可以选择RADIUS来进行认证,甚至完成计费等其他任务。
RADIUS的全称为Remote Authentication Dial-In User Service,是一种能够让服务器验证各种接入用户身份的协议(基于udp),RADIUS可以对用户身份进行集中管理,安全性更好,策略也更灵活,同时还可以记录用户的网络使用情况用于网管分析或者计费,已经成为比较常用的工业标准。在使用中,路由器、交换机等设备在需要验证用户身份的时候,向RADIUS服务器发送请求,RADIUS服务器则返回用户的相关信息,交给路由器、交换机等设备处理。
提供RADIUS服务的软件,windows下可以选IAS(Internet Authentication Service/Internet验证服务),Linux下则是FreeRADIUS,另外还有Cisco的ACS(听起来像是基于硬件设备的?)等等。
在本文中,我们将架设一个RADIUS服务器,并采用用户名、口令的方式验证无线上网用户。服务器为Ubuntu Gutsy 7.10。
安装radius
$ sudo aptitude install freeradius freeradius-dialupadmin freeradius-mysql
Setting up freeradius (1.1.3-3ubuntu1) ...
Adding group `freerad' (GID 120) ...
Done.
Adding system user `freerad' (UID 112) ...
Adding new user `freerad' (UID 112) with group `freerad' ...
Not creating home directory `/etc/freeradius'.
Adding user `freerad' to group `shadow' ...
Done.
* Starting FreeRADIUS daemon freeradius Wed Nov 7 11:35:36 2007 : Info: Starting - reading configuration files ...
[ OK ]
Setting up freeradius-dialupadmin (1.1.3-3ubuntu1) …
Setting up freeradius-mysql (1.1.3-3ubuntu1) …
* Reloading configuration files for FreeRADIUS daemon… * HUP sent… [ OK ]
现在安装是完成了,但用这种方式配置下去,最终用winxp客户端登录的时候,会提示没有用户密码的失败请求,即使你输入了正确的用户名/密码:
Login incorrect: [t/<no User-Password attribute>] (from client home_wlan port 1 cli 00-16-6F-6C-53-2C)
或者在启动服务器时看见这样的错误:
rlm_eap: Failed to link EAP-Type/tls: rlm_eap_tls.so: cannot open shared object file: No such file or directory
这并不是因为是使用了PEAP、EAP-MSCHAPv2协议,AP没有发送密码明文,而是RADIUS服务器端没有打开tls, ttls, peap模块,或者打开了但没有生效,再深层次的原因就是大概因为版权或协议问题,debian中的freeradius没有把openssl编译进去,用户若想使用,只能手工下载源码编译。参见(一、二、三)
简言之,还得从freeradius官网下载最新版源码再编译安装一遍,过程倒也不复杂:
tar zxvf freeradius-1.1.7.tar.gz
cd freeradius-1.1.7/
dpkg-buildpackage -rfakeroot
# 提示缺少什么包,就装上什么包
dpkg -i freeradius_1.1.7-0_i386.deb freeradius-mysql_1.1.7-0_i386.deb
另外说明,是否能够直接编译安装,跳过apt安装我没有试验过,主要是怕证书文件和用户、组什么的不能准备好。
配置radius
修改配置文件:/etc/freeradius/radiusd.conf(注意如果在文件末尾修改的话,后面的值不会覆盖前面的值,所以要直接在原位置上修改),先打开几个log选项:
log_auth = yes
log_auth_badpass = yes
log_auth_goodpass = yes
适当延长发送认证失败消息之前的暂停秒数,防止暴破,默认为1秒。
reject_delay = 5
把authorize、accounting、session、post-auth几个部分中sql一句前的注释取消掉,启用mysql认证。
更改clients.conf,设置允许使用radius服务的设备,一般是AP的地址,secret是AP连接radius的密码,比如:
client 192.168.0.0/24 {
secret = some_pass
shortname = wlan
nastype = other
}
把eap.conf中的tls, ttls, peap三段的注释全部取消,这是启用peap的关键,也是上面手工编译安装的目的。
还有文档说使用mysql认证的情况下,需要注释掉users文件中的如下内容:
DEFAULT Auth-Type = System
Fall-Through = 1
个人理解如果不这样的话,由于sql认证的顺序排在后面,所以前面的认证失败之后就去验证system的用户账号去了,mysql认证实际等于是没起到作用,但我没修改这个文件,也能够正常使用。
更改sql.conf,设置与mysql相关的信息:
server = "localhost"
login = "mysql_user"
password = "mysql_pass"
现在重启freeradius服务,应该就可以正常服务了,可以简单测试一下(test/test是错误的用户名/密码,testing123是默认在clients.conf中定义的本机用户的secret):
# radtest test test localhost 0 testing123
Sending Access-Request of id 5 to 127.0.0.1 port 1812
User-Name = "test"
User-Password = "test"
NAS-IP-Address = 255.255.255.255
NAS-Port = 0
Re-sending Access-Request of id 5 to 127.0.0.1 port 1812
User-Name = "test"
User-Password = "test"
NAS-IP-Address = 255.255.255.255
NAS-Port = 0
rad_recv: Access-Reject packet from host 127.0.0.1:1812, id=5, length=20
可以看到服务器接受到了请求,并返回了用户/密码=test/test的reject信息。
现在来准备mysql,先建库和用户:
$ mysql -u root -p
mysql> set names 'utf8';
mysql> show variables where variable_name like '%character_set%';
mysql> create database radius;
mysql> CREATE USER 'radius'@'localhost' IDENTIFIED BY '**********';
mysql> GRANT USAGE ON * . * TO 'radius'@'localhost' IDENTIFIED BY '**********' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
mysql> GRANT ALL PRIVILEGES ON `radius` . * TO 'radius'@'localhost';
然后创建radius相关的表和初始数据,表结构可以从Freeradius官网下载,本机也有一份/usr/share/doc/freeradius/examples/mysql.sql.gz,解压就行。表结构创建好之后,就可以创建使用者账号了,默认是存储在radcheck表中的,可以使用这样的sql语句:
insert into radcheck (username,attribute,op,value) values ('user1','Password','==','password1');
其中参数attribute对应的值Password用User-Password也行,op对应的值用:=也行。
AP端设置
我使用的AP为H3C Aolynk WAP500ag,关闭a网,只开g网,主要设置为:
Secrity Mode: WPA
Clipher Type: AES(比TKIP方式更加安全)
RADIUS Server IP/Secret: RADIUS服务器所在的ip以及`clients.conf`中设置的对应`secret`。
Access Control: Disable
客户端设置
aolynk WUB320g
认证方法:WPA,加密设置:AES,在802.1x验证中,设置验证方式为PEAP,验证ID好像无用,但不让置空(查看mysql中的记录,好像是登录成功后所显示的user名,依然用处不大),不使用Client证书,Tunnel协议为EAP-MSCHAP v2,ID和密码为RADIUS设置(存储在mysql中)的用户名/密码,如图:
迅驰笔记本
我用的这台笔记本上,Inter PROSet/Wireless 9.0.1.4(1999-2005)好像版本太旧,不支持我所设置的验证方式,在配置式里面能够设定“网络验证=WPA-企业、数据加密=AES-CCMP、验证类型=PEAP、身份验证协议=MS-CHAP-V2、用户身份凭证=用户名+密码”,但连接上之后提示“未知的验证状态”,无法传输数据,然后过一会儿被断开连接,所以只能使用winxp的网络连接设置。
WinXP的设置:无线网络连接属性->无线网络配置Tab页->首选网络(属性)->关联Tab页,网络验证:WPA,数据加密:AES,然后在“关联”Tab页,EAP类型:受保护的EAP(PEAP),在属性中,不选“验证服务器证书”,选择“启用快速重新连接”,验证方法:安全密码(EAP-MSCHAP v2),并在“配置”中不选择“自动使用windows登录名和密码”。写的迷糊吧,还是看图好了:
登录的时候,如果验证失败,就会提示用户点状态栏上的小图标,更换其他凭证,其实就是输入新的用户名/密码。
这种方式会自动记录下成功的用户名和密码,没有取消自动记录的选项,不过我在上海交大无线网-使用802.1x认证时注意密码泄漏问题中找到一个注册表文件,可以清空密码,其实内容也是非常的简单:
REGEDIT4
[-HKEY_CURRENT_USER\Software\Microsoft\Eapol\UserEapInfo]
上海交通大学网络中心 无线网还有一些无线网络使用方面的资料,非常值得参考。
连接成功,服务器上的log,供参考
rad_recv: Access-Request packet from host 192.168.0.201:1168, id=9, length=227
Message-Authenticator = 0xd183f5b181b63e0d6a8f4e73f39af43b
Service-Type = Framed-User
User-Name = "t"
Framed-MTU = 1488
State = 0x8e35307b622be9576b22872d13e0814b
Called-Station-Id = "00-0F-E2-51-41-70:WAP500g_1"
Calling-Station-Id = "00-16-6F-6C-53-2C"
NAS-Identifier = "wap500ag_1"
NAS-Port-Type = Wireless-802.11
Connect-Info = "CONNECT 54Mbps 802.11g"
EAP-Message = 0x020900261900170301001b307b40587df20edfbd63f7bbfe1b56600d799d610ba835f3e1f8f3
NAS-IP-Address = 192.168.0.201
NAS-Port = 1
NAS-Port-Id = "STA port # 1"
Processing the authorize section of radiusd.conf
modcall: entering group authorize for request 29
modcall[authorize]: module “preprocess” returns ok for request 29
modcall[authorize]: module “chap” returns noop for request 29
modcall[authorize]: module “mschap” returns noop for request 29
rlm_realm: No ‘@’ in User-Name = “t”, looking up realm NULL
rlm_realm: No such realm “NULL”
modcall[authorize]: module “suffix” returns noop for request 29
rlm_eap: EAP packet type response id 9 length 38
rlm_eap: No EAP Start, assuming it’s an on-going EAP conversation
modcall[authorize]: module “eap” returns updated for request 29
users: Matched entry DEFAULT at line 153
users: Matched entry DEFAULT at line 172
modcall[authorize]: module “files” returns ok for request 29
radius_xlat: ‘t’
rlm_sql (sql): sql_set_user escaped user –> ‘t’
radius_xlat: ‘SELECT id, UserName, Attribute, Value, op FROM radcheck WHERE Username = ‘t’ ORDER BY id’
rlm_sql (sql): Reserving sql socket id: 1
radius_xlat: ‘SELECT radgroupcheck.id,radgroupcheck.GroupName,radgroupcheck.Attribute,radgroupcheck.Value,radgroupcheck.op FROM radgroupcheck,usergroup WHERE usergroup.Username = ‘t’ AND usergroup.GroupName = radgroupcheck.GroupName ORDER BY radgroupcheck.id’
radius_xlat: ‘SELECT id, UserName, Attribute, Value, op FROM radreply WHERE Username = ‘t’ ORDER BY id’
radius_xlat: ‘SELECT radgroupreply.id,radgroupreply.GroupName,radgroupreply.Attribute,radgroupreply.Value,radgroupreply.op FROM radgroupreply,usergroup WHERE usergroup.Username = ‘t’ AND usergroup.GroupName = radgroupreply.GroupName ORDER BY radgroupreply.id’
rlm_sql (sql): Released sql socket id: 1
modcall[authorize]: module “sql” returns ok for request 29
rlm_pap: Found existing Auth-Type, not changing it.
modcall[authorize]: module “pap” returns noop for request 29
modcall: leaving group authorize (returns updated) for request 29
rad_check_password: Found Auth-Type EAP
auth: type “EAP”
Processing the authenticate section of radiusd.conf
modcall: entering group authenticate for request 29
rlm_eap: Request found, released from the list
rlm_eap: EAP/peap
rlm_eap: processing type peap
rlm_eap_peap: Authenticate
rlm_eap_tls: processing TLS
eaptls_verify returned 7
rlm_eap_tls: Done initial handshake
eaptls_process returned 7
rlm_eap_peap: EAPTLS_OK
rlm_eap_peap: Session established. Decoding tunneled attributes.
rlm_eap_peap: Received EAP-TLV response.
rlm_eap_peap: Tunneled data is valid.
rlm_eap_peap: Success
rlm_eap: Freeing handler
modcall[authenticate]: module “eap” returns ok for request 29
modcall: leaving group authenticate (returns ok) for request 29
Login OK: [t/<no User-Password attribute>] (from client hbzbb_wlan port 1 cli 00-16-6F-6C-53-2C)
Processing the post-auth section of radiusd.conf
modcall: entering group post-auth for request 29
rlm_sql (sql): Processing sql_postauth
radius_xlat: ‘t’
rlm_sql (sql): sql_set_user escaped user –> ‘t’
radius_xlat: ‘INSERT into radpostauth (user, pass, reply, date) values (’t', ‘Chap-Password’, ‘Access-Accept’, NOW())’
rlm_sql (sql) in sql_postauth: query is INSERT into radpostauth (user, pass, reply, date) values (’t', ‘Chap-Password’, ‘Access-Accept’, NOW())
rlm_sql (sql): Reserving sql socket id: 0
rlm_sql (sql): Released sql socket id: 0
modcall[post-auth]: module “sql” returns ok for request 29
modcall: leaving group post-auth (returns ok) for request 29
Sending Access-Accept of id 9 to 192.168.0.201 port 1168
Framed-IP-Address = 255.255.255.254
Framed-MTU = 576
Service-Type = Framed-User
MS-MPPE-Recv-Key = 0×578ab49877c333d5c8c93124e9d76c463a0abc2facc7ae25347a0d97490b6869
MS-MPPE-Send-Key = 0×019b5f44bb5dcb0b2c8f2af449215f548af6c63a8ecb692e79342d60a2131d08
EAP-Message = 0×03090004
Message-Authenticator = 0×00000000000000000000000000000000
User-Name = “t”
Finished request 29
其余未解决的问题
- 使用dialupadmin管理账号等
- 实现用户的MAC地址绑定
参考
- 無限寬頻如何做到通過帳號密碼的驗證之後才能上網
- RFC 2865 - Remote Authentication Dial In User Service (RADIUS)
- Remote Authentication Dial In User Service (RADIUS)
- 无线网络安全指南:IAS RADIUS实现无线网络验证
- 在 Linux 上构建一个 RADIUS 服务器
- RADIUS原理介绍及其在Linux下的搭建











Save to Browser Favorites
Ask
backflip
blinklist
BlogBookmark
Bloglines
BlogMarks
Blogsvine
BUMPzee!
CiteULike
co.mments
Connotea
del.icio.us
DotNetKicks
Digg
diigo
dropjack.com
dzone
Facebook
Fark
Faves
Feed Me Links
Friendsite
folkd.com
Furl
Google
Hugg
Jeqq
Kaboodle
linkaGoGo
LinksMarker
Ma.gnolia
Mister Wong
Mixx
MySpace
MyWeb
Netvouz
Newsvine
PlugIM
popcurrent
Propeller
Reddit
Rojo
Segnalo
Shoutwire
Simpy
sk*rt
Slashdot
Sphere
Sphinn
Spurl.net
Squidoo
StumbleUpon
Technorati
ThisNext
Webride
Windows Live
Yahoo!
Email This to a Friend
If you like this then please subscribe to the