RADIUS(Remote Authentication Dial-In User Service),即用户远程拨入认证服务,直译过来是远程身份验证拨入用户服务,后者更有助于理解该协议的原理。
本文基于Wikipedia,只做学习了解目的。
协议简介
RADIUS 是一种 C/S 结构的网络应用层协议,工作在 1812、1813 端口上,它是目前应用最广泛的 AAA(认证 Authentication、授权 Authorization、计费 Accounting) 协议。
Radius 协议主要针对的远程登陆类型:SLIP、PPP、telnet 和 rlogin 等。Radius 协议应用范围很广,包括普通电话、上网业务计费,对 VPN 的支持可以使不同的拨入服务器的用户具有不同权限。
NAS(Network Access Server)
在讲解 RADIUS 协议内容之前,先简单介绍一下NAS(网络接入服务器)。
The NAS is meant to act as a gateway to guard access to a protected resource.
工作流程:
用户在接入网络之前,需要将用户信息(用户名密码)发送给 NAS,NAS 再将信息发送给对应的 AAA 服务器,通过 AAA 服务器的验证之后,AAA 服务器通知 NAS 该用户已被验证,之后 NAS 准许用户接入网络。NAS 扮演了一个 gateway 的角色,守护着受保护资源的访问。需要注意的是,NAS 不保存客户端能连接哪些网络资源或者哪些证书是有效的,这方面的信息。
通常 NAS 中包含了一个 Radius client 组件,它通过和 Radius server 通信进行验证。Radius 就是常见于 NAS 的 AAA 协议了,在讲解协议内容时,我们以 NAS 做为例子讲解。
协议内容
RADIUS 使用两个包类型来管理完整的 AAA 进程:管理认证和授权的 Access-Request;管理计费的 Accounting-Request,分别定义在 RFC2865 与 RFC2866 中。
Access-Request
-
用户向 NAS 发送获取特定网络资源连接的请求,同时将 credentials 通过 linklayer-protocol(数据链路层协议,如:PPP)发送给 NAS 设备;
-
NAS 向 Radius server 发送 Access-Request,通过 RADIUS 协议请求准许访问的授权。通常来说这个 request 中包括了 1 中提到的 credentials,典型地就是用户名密码,或者用户提供的安全证书,但是有时候也会包含 NAS 所知道的一些用户的信息,比如网络地址或者电话号码等。
-
Radius server 使用认证方案(authenticcation schemes 如 PAP、CHAP、EAP)检查这些信息是否正确。以往的 Radius server 通过本地的平面文件数据库来验证用户信息,现在的 Radius server 可以参考外部的资源,例如 SQL,Kerberos,LDAP 或者 Active Directory 来验证用户证书。Radius server 根据不同的情况返回三种不同的 response;
-
Access Reject
验证失败,用户被无条件拒绝访问所请求的网络资源;
-
Access Challenge(可理解为盘问)
要求提供额外的用户信息,例如次要密码、PIN、token 或者 card;一般出现在更复杂的认证会话中;
-
Acccess Accept
验证成功,一旦验证成功之后,Radius server 将会检查用户能使用的网络服务。比如,一个 用户也许可以使用公司的无线网络,但是不能使用 VPN 服务。当然,这些信息可以从本地数据库中获取,也可以通过外部资源查找,比如 LDAP 或者 Active Directory;
-
-
每个不同的 response 中都包含了一个 Reply-Message,它会包含拒绝连接的原因;对 challenge(盘问)的提示或者成功连接的欢迎信息。
-
Radius server 发送给 NAS 的授权属性规定了准许的条款,例如一个 Access-Accept 授权中也许包括了以下条款:
- The specific IP address to be assigned to the user
- The address pool from which the user’s IP should be chosen
- The maximum length of time that the user may remain connected
- An access list, priority queue or other restrictions on a user’s access
- L2TP parameters
- VLAN parameters
- Quality of Service (QoS) parameters
-
当一个客户端被设置成使用 RADIUS,所有用户在使用该客户端时,都会看到一个登陆提示,用户在这个登陆提示中填写用户名密码,之后通过一个数据链路协议如 PPP(数据包中会存放这些信息)发送给 Radius client(NAS),Radius client 创建一个“Access-Request”用来存放客户端发送过来的信息,其中密码会使用算法加密。
Accounting-Request
- 当 NAS 准许用户访问网络时,计费就开始了(一个 Accounting-Request 数据包中包含了一个叫 Acct-Status-Type 的属性,此时它的值为 start)。Radius client 发送一个 Accounting-Request 给 server,在这个 request 里面包含了用户的身份信息、网络地址等同时包含了标志为开启的状态属性。
- 定时从 client 到 server 发送一个 acct_status_type=interim update 的 Accounting-Request,主要目的是为了更新一个活跃会话的状态,“Interim”中记录了当前会话持续时间和当前数据使用情况。
- 最后,当用户想要关闭一个连接的时候,client 发送一个 acct_status_type=stop 的 request 给 server,提供最终在时间、包转发、数据转发和关闭连接的原因等相关的信息。
- 通常,client 发送一个 Accounting-Request 之后,会等待一个 Accounting-Response 确认回复。这些数据信息的意义在于计费和监控。
包结构 (Packet structure)
RADIUS 数据包格式如上图所示,从左到右传送出去,从 code 到 identifier 再到 Length 最后是 Authenticator 和 attributes。
- RADIUS Codes(十进制)如下表所示:
Code | Assignment |
---|---|
1 | Access-Request |
2 | Access-Accept |
3 | Access-Reject |
4 | Accounting-Request |
5 | Accounting-Response |
11 | Access-Challenge |
12 | Status-Server (experimental) |
13 | Status-Client (experimental) |
40 | Disconnect-Request |
41 | Disconnect-ACK |
42 | Disconnect-NAK |
43 | CoA-Request |
44 | CoA-ACK |
45 | CoA-NAK |
255 | Reserved |
- Identifier 的作用是匹配每一个 requests 和 replies(请求和回复)
- Length 指明了整个 RADIUS 数据包的大小,包括 Code、Identifier、Length、Authenticator 和 Attributes
- Authenticator 用于认证从 Radius server 发送过来的答复,并且它被用于加密 passwords,长度为 16bytes
- Attribute Value pairs(AVP)属性值,在 AAA 整个协议的请求和响应中都会用到,AVP 的类型多达 190 多种,具体的情况可以查看官方资料(RFC 文档)。
- 值得注意的是 RADIUS 是可扩展的,所以许多供应商都在里面集成了自己想要使用的属性值,这样的属性值称之为 Vendor-Specific Attributes(VSAs)