RADIUS(Remote Authentication Dial In User Service)简介及Lunix平台下构建RADIUS服务器设置步骤RADIUS:Remote Authentication Dial In User Service,远程用户拨号认证系统,由RFC2865,RFC2866定义,是目前应用最广泛的AAA(AAA=authentication、Authorization、Accounting,即认证、授权、计费)协议。
RADIUS协议最初是由Livingston公司提出的,原先的目的是为拨号用户进行认证和计费。
后来经过多次改进,形成了一项通用的认证计费协议。
创立于1966年Merit Network, Inc.是密执安大学的一家非营利公司,其业务是运行维护该校的网络互联MichNet。
1987年,Merit在美国NSF(国家科学基金会)的招标中胜出,赢得了NSFnet (即Internet前身)的运营合同。
因为NSFnet是基于IP的网络,而MichNet却基于专有网络协议,Merit面对着如何将MichNet的专有网络协议演变为IP协议,同时也要把MichNet上的大量拨号业务以及其相关专有协议移植到IP网络上来。
1991年,Merit决定招标拨号服务器供应商,几个月后,一家叫Livingston的公司提出了建议,冠名为RADIUS,并为此获得了合同。
1992年秋天,IETF的NASREQ工作组成立,随之提交了RADIUS 作为草案。
很快,RADIUS成为事实上的网络接入标准,几乎所有的网络接入服务器厂商均实现了该协议。
1997年,RADIUS RFC2039发表,随后是RFC2138,最新的RADIUS RFC2865发表于2000年6月。
RADIUS是一种C/S结构的协议,它的客户端最初就是NAS(Net Access Server)服务器,现在任何运行RADIUS客户端软件的计算机都可以成为RADIUS的客户端。
RADIUS协议认证机制灵活,可以采用PAP、 CHAP或者Unix登录认证等多种方式。
RADIUS是一种可扩展的协议,它进行的全部工作都是基于Attribute-Length-Value的向量进行的。
RADIUS也支持厂商扩充厂家专有属性。
RADIUS的基本工作原理:用户接入NAS(Network Access Server),NAS向RADIUS服务器使用Access-Require数据包提交用户信息,包括用户名、密码等相关信息,其中用户密码是经过MD5加密的,双方使用共享密钥,这个密钥不经过网络传播;RADIUS服务器对用户名和密码的合法性进行检验,必要时可以提出一个Challenge,要求进一步对用户认证,也可以对NAS进行类似的认证;如果合法,给NAS返回Access-Accept数据包,允许用户进行下一步工作,否则返回Access-Reject数据包,拒绝用户访问;如果允许访问,NAS向RADIUS服务器提出计费请求Account- Require,RADIUS 服务器响应Account-Accept,对用户的计费开始,同时用户可以进行自己的相关操作。
RADIUS还支持代理和漫游功能。
简单地说,代理就是一台服务器,可以作为其他RADIUS服务器的代理,负责转发RADIUS认证和计费数据包。
所谓漫游功能,就是代理的一个具体实现,这样可以让用户通过本来和其无关的RADIUS服务器进行认证,用户到非归属运营商所在地也可以得到服务,也可以实现虚拟运营。
RADIUS服务器和NAS服务器通过UDP协议进行通信,RADIUS服务器的1812端口负责认证,1813端口负责计费工作。
采用UDP的基本考虑是因为NAS和RADIUS服务器大多在同一个局域网中,使用UDP 更加快捷方便。
RADIUS协议还规定了重传机制。
如果NAS向某个RADIUS服务器提交请求没有收到返回信息,那么可以要求备份RADIUS服务器重传。
由于有多个备份RADIUS服务器,因此NAS进行重传的时候,可以采用轮询的方法。
如果备份RADIUS服务器的密钥和以前RADIUS服务器的密钥不同,则需要重新进行认证。
由于RADIUS协议简单明确,可扩充,因此得到了广泛应用,包括普通电话上网、ADSL上网、小区宽带上网、IP电话、VPDN(Virtual Private Dialup Networks,基于拨号用户的虚拟专用拨号网业务)、移动电话预付费等业务。
最近IEEE提出了802.1x标准,这是一种基于端口的标准,用于对无线网络的接入认证,在认证时也采用RADIUS 协议。
LUNIX平台下构建RADIUS服务器下面我们一起来学习在Linux平台下架建一个完整的RADIUS服务器。
RADIUS主要用于对远程拨入的用户进行授权和认证。
它可以仅使用单一的“数据库”对用户进行认证(效验用户名和口令)。
它主要针对的远程登录类型有:SLIP、PPP、telnet和rlogin等。
其主要特征有:1.客户机/服务器(C/S)模式一个网络接入服务器(以下简称NAS)作为RADIUS的客户机,它负责将用户信息传入RADIUS服务器,然后按照RADIUS服务器的不同的响应来采取相应动作。
另外,RADIUS服务器还可以充当别的RADIUS服务器或者其他种类认证服务器的代理客户。
2.网络安全(Network Security)NAS和RADIUS服务器之间的事务信息交流由两者共享的密钥进行加密,并且这些信息不会在两者之间泄漏出去。
3.灵活认证机制(Flexible Authentication Mechanisms)RADIUS服务器支持多种认证机制。
它可以验证来自PPP、PAP、CHAP和UNIX系统登录的用户信息的有效性。
4.协议可扩展性(Extensible Protocol)所有的认证协议都是基于“属性-长度-属性值”3元素而组成的。
所以协议是扩展起来非常方便。
在目前很多比较高版本的Linux中,它们都把 RADIUS的安装程序包含在系统源码中。
这样使得我们可以很容易地通过免费的Linux系统学习RADIUS授权、认证的原理和应用。
RADIUS协议原理要弄清楚RADIUS协议为何能实现授权和认证,我们必须应该从四个方面去认识RADIUS协议:协议基本原理、数据包结构、数据包类型、协议属性。
下面我们就来详细地介绍这些内容。
协议基本原理NAS提供给用户的服务可能有很多种。
比如,使用telnet 时,用户提供用户名和口令信息,而使用PPP时,则是用户发送带有认证信息的数据包。
NAS一旦得到这些信息,就制造并且发送一个“Access-Request”数据包给RADIUS服务器,其中就包含了用户名、口令(基于MD5加密)、NAS的ID号和用户访问的端口号。
如果RADIUS服务器在一段规定的时间内没有响应,则NAS会重新发送上述数据包;另外如果有多个RADIUS 服务器的话,NAS在屡次尝试主RADIUS服务器失败后,会转而使用其他的RADIUS服务器。
RADIUS服务器会直接抛弃那些没有加“共享密钥”(Shared Secret)的请求而不做出反应。
如果数据包有效,则RADIUS服务器访问认证数据库,查找此用户是否存在。
如果存在,则提取此用户的信息列表,其中包括了用户口令、访问端口和访问权限等。
当一个RADIUS服务器不能满足用户的需要时,它会求助于其他的RADIUS服务器,此时它本身充当了一个客户端。
如果用户信息被否认,那么RADIUS服务器给客户端发送一个“Access-Reject”数据包,指示此用户非法。
如果需要的话,RADIUS服务器还会在此数据包中加入一段包含错误信息的文本消息,以便让客户端将错误信息反馈给用户。
相反,如果用户被确认,RADIUS服务器发送“Access-Challenge”数据包给客户端,并且在数据包中加入了使客户端反馈给用户的信息,其中包括状态属性。
接下来,客户端提示用户做出反应以提供进一步的信息,客户端得到这些信息后,就再次向RADIUS服务器提交带有新请求ID的“Access-Request”数据包,和起初的“Access-Request”数据包内容不一样的是:起初“Access-Request”数据包中的“用户名/口令”信息被替换成此用户当前的反应信息(经过加密),并且数据包中也包含了“Access-Challenge”中的状态属性(表示为0 或1)。
此时,RADIUS服务器对于这种新的“Access-Request”可以有三种反应:“Access-Accept”、“Access- Reject”或“Access-Challenge”。
如果所有的要求都属合法,RADIUS返回一个“Access-Accept”回应,其中包括了服务类型(SLIP, PPP, Login User等)和其附属的信息。
例如:对于SLIP和PPP,回应中包括了IP地址、子网掩码、MTU和数据包过滤标示信息等。
数据包结构RADIUS数据包被包装在UDP数据报的数据块(Data field))中,其中的目的端口为1812。
具体的数据包结构如表1。
8位 8位 16位code Identifier LengthAuthenticator(128位)Attributes…(不定长)· Code Code域长度为8位,具体取值见表2。
其中,1、2、3用于用户认证,而4、5则是统计流量用,12、13 用于试验阶段,255作为保留。
code 含义1 Access-Request2 Access-Accept3 Access-Reject4 Accounting-Request5 5Accounting-Response11 Access-Challenge12 Status-Server(experimenta)13 Status-client(experimenta)255 Reserved· Identifier Identifier域长度为8位,主要用于匹配请求和回应数据包,也即是数据包的编号。
· Length 长度为16位,取值范围(20<=Length<=4096),此长度包括Code、Identifier、Length、 Authenticator和Attribute五个数据域的长度总和(Code、Identifier、Length、Authenticator为定长,Attribute为变长)。
超出范围的数据将被视为附加数据(Padding)或直接被忽略。
· Authenticator 长度为16个字节(128位),主要用于鉴定来自RADIUS服务器的回应,同时也用于对用户口令进行加密。