radius 总结.doc
文本预览下载声明
从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下,从RADIUS协议谈谈对身份认证的认识,也总结一下自己。
一.RADIUS协议原理
RADIUS(Remote Authentication Dial In User Service) 用户远程拨入认证服务,它主要针对的远程登录类型有:SLIP、PPP、telnet和rlogin等。RADIUS协议应用范围很广,包括普通电话、上网业务计费,对VPN的支持可以使不同的拨入服务器的用户具有不同权限。
RADIUS典型应用环境如下:
RADIUS数据包分为5个部分:
(1) Code:1个字节,用于区分RADIUS包的类型:常用类型有:
接入请求(Access-Request),Code=1;接入允许(Access-Accept),Code=2;接入拒绝(Access-Reject),Code=3;计费请求(Accounting-Request),Code=4等。
(2)Identifier:一个字节,用于请求和应答包的匹配。
(3)Length:两个字节,表示RADIUS数据区(包括Code, Identifier, Length, Authenticator, Attributes)的长度,单位是字节,最小为20,最大为4096。
(4)Authenticator:16个字节,用于验证服务器端的应答,另外还用于用户口令的加密。RADIUS服务器和NAS的共享密钥(Shared Secret)与请求认证码(Request Authenticator)和应答认证码(Response Authenticator),共同支持发、收报文的完整性和认证。另外,用户密码不能在NAS和RADIUS 服务器之间用明文传输,而一般使用共享密钥(Shared Secret)和认证码(Authenticator)通过MD5加密算法进行加密隐藏。
(5)Attributes:不定长度,最小可为0个字节,描述RADIUS协议的属性,如用户名、口令、IP地址等信息都是存放在本数据段。
各个属性的详细编码信息,以及数据格式,限于篇幅,这里不作具体介绍,感兴趣的,可以参看RFC文档,或与我交流。
二.RADIUS协议实现
目前,开源软件包freeRadius , tinyRadius,可以下载到其实现的源码。freeRadius是目前功能最强大的开源 RADIUS 服务器软件,采用C语言实现,采用了多进程,进程池的处理方法,拥有很好的吞吐处理能力,同时,提供了连接各种数据库的应用接口,方便用户根据自己的需要进行适当的扩展。值得一提的是,它采用模块化处理,用户可以定做适合自己的认证计费处理模块。
freeRadius的功能强大,也造成了它模块的庞大,不易维护,对安装环境有一些要求。tinyRadius采用Java开发,短小精悍,能接收各种标准协议中的数据包,可以快速的完成对RADIUS数据包的封装与解包,我们可以自己的需要进行某些处理,具有很大的自由度,唯一的缺陷是单线程,没有数据库接口。
三.RADIUS协议对安全的考虑
RADIUS采用UDP协议基于以下几点原因:
1. NAS和RADIUS服务器大多在同一个局域网中,使用UDP更加快捷方便。
2. 简化了服务端的实现。
事实证明,采用UDP协议可行,RADIUS有自己的机制,来解决UDP丢包特点。
如果NAS向某个RADIUS服务器提交请求没有收到返回信息,那么可以要求备份RADIUS服务器重传。由于有多个备份RADIUS服务器,因此NAS进行重传的时候,可以采用轮询的方法。如果备份RADIUS服务器的密钥和以前RADIUS服务器的密钥不同,则需要重新进行认证。
下面重点从RADIUS协议来谈下它在身份认证中如何确保安全认证的。
1. Authenticator:鉴别码,分为请求鉴别码,回应鉴别码。
在“Access-Request”数据包中,Authenticator是一个16字节的随机数,称为“Request Authenticator”。 在机密的整个生存周期中(如RADIUAS服务器和客户端共享的机密),这个值应该是不可预测的,并且是唯一的,因为具有相同密码的重复请求值,使黑客有机会用已截取的响应回复用户。因为同一机密可以被用在不同地理区域中的服务器的验证中,所以请求认证域应该具有全球和临时唯一性。
为防止数据包中数据被截获被篡改,回应鉴别码采用如下方式生成:
ResponseAuth = MD5(Code+ID+Length+RequestAuth+ Attributes+Secret);
回应鉴别码是对整个
显示全部