RFC2865 NetWare/IP Domain Name and Information 远程拨入用户认证服务
和密码。或许也可以选择一种配置连接协议,比如像点对点的传输协议(Point-to-Point Protocol),通过认证包来传递这种认证信息。
一旦客户端收到此类信息,它会选择使用RADIUS协议进行认证。之后,客户端创建一个“接入请求”数据包,此包包含了诸如像用户名、用户密码、客户机ID、用户正在访问的端口编号。当密码出现时,有一种基于RSA实验室的信息分类算法(Message Digest Algorithm)MD5[3]的方法对其加密。
“接入请求”是通过网络提交给RADIUS服务器。如果在一定长度的时间里,服务器没有返回响应信息,请求会被重复传输许多次。在主服务器故障或不能连接到的情况下,客户端也可以继续向一个或多个后备服务器发出请求。后备服务器在多次尝试连接主服务器失败后,或在一轮循环方式结束后被选择连接。重试和回退算法是当前研究的课题,本文不对它做详细说明。
一旦RADIUS服务器收到请求信息,它会对传输信息的客户端进行验证。一个来自没有和RADIUS服务器具有共享机密的客户端请求,该数据包会被简单的丢弃。如果客户端是合法的,RADIUS服务器会查询用户数据库找到这个用户,把查询到的用户名同请求中的进行比较。数据库中的用户记录包含了一组对用户来说必须满足的用户接入条件,它不只是包含用户的密码验证信息,而且也可以指定允许接入的客户端和端口号。
在为了满足某个请求时,RADIUS服务器也可以作为客户端,向其他服务器传输请求。 如果任何“代理状态(Proxy-State)”属性出现在接入请求数据包中,它们都必须在不做任何更改和保持原顺序的前提下拷贝到响应数据包中。其他属性可以放到“代理状态(Proxy-State)”属性的前面、后面甚至是中间。
如果有任何条件没有得到满足,RADIUS服务器会发出一个“接入拒绝(Access-Reject)”响应,表示该用户请求是无效的。如果要求的话,RADIUS服务器可以在接入拒绝响应中包含文本消息,此文本消息可以通过客户端显示给用户。除了代理状态(Proxy-State)属性外没有任何其他属性允许存在于接入拒绝(Access-Reject)响应中。
如果所有的条件被满足而且服务器会传输一个用户必须响应的盘问,因此RADIUS服务器会传输一个“接入盘问(Access Challenge)”响应。它或许会包含一个文本信息,可以在用户端向用户显示的响应提示,并可以包含一种状态属性。
如果客户端收到接入盘问而且支持“盘问/响应(challenge/respond)”,如果有的话,它会向用户显示文本信息,并提示用户做出响应。然后,客户端再次提交一个包含新请求号的源接入请求,并用加密响应代替用户密码属性,如果有的话,还包括来自接入盘问的状态属性。状态属性应该仅有0或1两个常数出现在一个请求中。服务器可以用“接入接受(Access-Accept)”、“接入拒绝(Access-Reject)”或“接入盘问(Access-Challenge)”对这个新接入请求进行响应。
如果所有的条件都被满足,用户的配置值表被置于接入允许响应中。这些值包含了服务类型(如:串行线路接口协议(SLIP),点对点传输协议(PPP),登录用户(Login User))和交付要求服务的所有必须值。对串行线路接口协议(SLIP)和点对点传输协议(PPP)来说,这些值也许包括诸如IP地址、子网掩码、最大传输单元(MTU),要求压缩率和指定的包过滤标志。对字符模式的用户,这些值或许还包括请求的协议和主机。
2.1盘问/响应
在盘问响应认证过程中,用户被给予一个不可预知的数字,并要求对此数字加密后返回
6
RFC2865 NetWare/IP Domain Name and Information 远程拨入用户认证服务
结果。已授权用户装备有特殊的设备,如智能卡或软件,它们能不费力的计算出正确响应结果。没有授权的用户仅仅只能对响应进行猜测,因为他们缺少适当的设备或软件和必需的密钥知识来模拟此种设备或软件。
接入盘问报文典型地包含一个回复信息,此信息中包括一个可以显示给用户的盘问,例如一个不可能被重复的数值。典型的情况是来自扩展服务器,扩展服务器是知道那一类鉴别码对应这个已经被授权的用户,因此能选择一个适当基数和长度的随机的或不重复的伪随机数。
用户然后把这个盘问(不重复的数值)输入到他的设备或软件中,并计算出一个响应值,用户将此值输入到客户端,由客户端通过第二个接入请求数据包把它提交给RADIUS服务器。如果响应报文是与RADIUS服务器预期的响应报文匹配,则服务器会回送一个接入允许数据包,否则是回送接入拒绝数据包。
例如,网络接入服务器传输一个接入请求数据包给RADIUS服务器,包中包含网络接入服务器的标识,网络接入服务器的端口号,用户名,用户密码(此密码或许是一个像“challenge”似的固定字符串,或者是被忽略的)。服务器送回一个具有状态和回复消息的接入盘问数据包,其中回复消息包含有 “challenge 12345678,在提示处输入你的响应值”信息,这几行信息可由接入服务器显示给用户。网络接入服务器(NAS)为这个响应提供提示信息,传输一个新的接入请求给服务器(用新的包编号),包括NAS标识、NAS端口号、用户名、用户密码(刚才由用户输入的响应值,现在已经加密),和来自服务器端接入盘问中相同的状态属性。根据判断响应值是否与要求的值匹配,服务器送回一个接入允许或接入拒绝数据包,或者甚至会传输另一个接入盘问数据包。
2.2 用不加密验证和加密验证配合动作
对口令验证协议(PAP),NAS采取了PAP ID和密码,在一个接入请求包中将它们作为用户名和用户密码传输出去。NAS可以包含服务类型属性Attribute Service-Type= Framed-User,和Framed-Protocol=PPP作为一个提示告诉RADIUS服务器PPP服务是所希望的服务。
对质询握手身份认证协议(CHAP),NAS创建一个随机质询(最好是是16个字节),然后把它传输给用户,用户返回一个带有CHAP ID和CHAP用户名的CHAP响应。NAS随后传输一个请求接入数据包给RADIUS服务器,该请求包中,CHAP用户名称替代了用户名(User-Name)、CHAP ID和加密的响应值代替CHAP密码(CHAP-Password)(属性3 )。随机质询或者被包含在CHAP盘问(CHAP-Challenge)属性中,或者如果它是16个字节长,它可被放到接入请求数据包中的请求鉴别码(Request Authenticator)域中。NAS可以包含Attribute Service-Type=Framed-User,和Framed-Protocol=PPP作为一个提示告诉RADIUS服务器PPP服务是所希望的服务。
RADIUS服务器根据用户名检查对应的密码,加密盘问,用MD5算法对CHAP ID字节,前面找到的密码和CHAP盘问(如果在CHAP盘问属性存在则来自与此,否则来自请求认证者),把这个结果与CHAP密码进行比较。如果它们是相匹配,服务器送回一个接入允许数据包,否则送回一个接入拒绝数据包。
如果RADIUS服务器不能执行被请求的认证,它一定返回一个接入拒绝数据包。例如,CHAP要求以明文方式给服务器传输密码,以便它能加密CHAP盘问并与CHAP响应相比较。如果不是以明文传输密码,服务器一定会给客户端传输一个接入拒绝包。
7
RFC2865 NetWare/IP Domain Name and Information 远程拨入用户认证服务
2.3 代理
对RADIUS代理服务器来说,一个RADIUS服务器在收到一个来自RADIUS客户端(例如NAS服务器)的验证请求(或者记账请求)后,向一个远程的RADIUS服务器提交该请求,收到来自远程服务器的回复后,将这个回复传输给客户,这个回复可能带有反映本地管理策略的变化。使用RADIUS代理服务器通常是为了漫游。漫游功能使两个或更多的管理实体允许每一个用户为某项服务而拨入到任一个实体网络中。 NAS传输RADIUS接入请求给“转送服务器(forwarding server)”,转送服务器把这个请求转送给“远程服务器(remote server)”。远程服务器送回一个响应(接入允许、接入拒绝、接入质询)给转送服务器,转送服务器再把这个响应返回给NAS。对于RADIUS代理操作,用户名属性可以包含一个网络接口标识符[8]。哪一个服务器应该接收转送请求是根据认证域确定。认证域可以是网络接口标识符(指定的域)的一部分。或者,哪个服务器接收转送请求的选择可以基于任何一种转送服务器指定使用的标准,例如“调用站编号(Called-Station Id)”。
一个RADIUS服务器可以同时作为转送服务器和远程服务器运行。在某些域中作为一个转发服务器,在其他域中作为一个远程服务器。一个转发服务器可以作为任何数量远程服务器的转发者。一个远程服务器可以有任意数量的转发服务器向它转发,也能向任意数量域提供认证。一个转发服务器可以向另一个转发服务器转发,从而生成一个代理链,应当注意避免循环引用。
下面的过程解释了一个代理服务器在一个NAS服务器、转发服务器和远程服务器之间的通信。
1.NAS向一个转发服务器发出接入请求。
2.转发服务器把这个请求转发给一个远程服务器。
3.远程服务器给转发服务器送回接入允许、接入拒绝或接入盘问。在这个例子中,服
务器送回的是接入允许。
4.转发服务器将接入允许传输给NAS。
转发服务器必须把已经存在于数据包中的任何代理状态属性当作不可见的数据。它的操作禁止依靠被前面服务器添加到代理状态属性中的内容 如果收到来自客户端的请求中有任何代理状态属性,在给客户端的回复中,转发服务器必须在给客户端的回复中包括这些代理状态属性。当转发服务器转发这个请求时,它可以把代理状态属性包含在其中,也可以在已转发的请求中忽略代理状态属性。如果转发服务器在转发的接入请求中忽略了代理状态属性,它必须在响应返回给用户之前把这些代理状态属性添加到该响应中。
现在我们更为详细地说明每一步。
1.NAS传输它的接入请求给转发服务器。如果用户密码存在,转发服务器会用与NAS共有的密钥对用户密码进行解密。如果在数据包中有一个CHAP密码属性存在,没有CHAP盘问属性存在,转发服务器必须保证请求鉴别码完整的情况下,或者把它拷贝到CHAP盘问属性中。
转发服务器可以向数据包添加一个代理状态属性(只能添加一个)。如果它添加了代理状态,该代理状态只能出现在数据包中任何其他代理状态属性之后。转发服务器禁止修改任何其他已经存在于数据包中的代理状态属性(转发服务器可以选择不转发它们,但一定不能对它们修改)。转发服务器禁止改变包括代理状态在内的同种类型任何属性的顺序。
2.如果用户密码存在的话,转发服务器用和远程服务器共有的密钥对用户密码进行加
8
RFC2865 NetWare/IP Domain Name and Information 远程拨入用户认证服务
密。它还会根据要求设置标识,向远程服务器转发接入请求。
3.远程服务器(如果是最终目标服务器)会使用用户密码、CHAP密码或者是将来扩 展时指定的一些方法验证用户的合法性,然后返回接入允许、接入拒绝或者接入盘问给转发 服务器。对于这个例子,远程服务器传输的是一个接入允许数据包,远程服务器必须按照原 有的顺序而且不做任何修改的情况下,把所有的代理状态属性从接入请求中拷贝到响应数据 包中。
4.转发服务器使用它与远程服务器共有的密钥对响应鉴别码(Response Authenticator) 进行验证,如果验证失败,它会简单的将数据包丢弃。如果验证通过,转发服务器去掉最后 的代理状态(如果数据包内它附加过一个),使用它与NAS共有的密钥签发响应鉴别码,恢 复标识使它与NAS传输的源请求标识匹配,然后传输接入允许给NAS。
转发服务器可能修改属性以执行本地策略。关于这种策略的讨论是在这篇文档范围之 外,而且是受以下限制的。转发服务器禁止修改数据包中存在的代理状态、状态或类别属性。 转发服务器的实施者应该认真考虑什么样的值可以做为服务类型(Service-Type)接受。 对在代理请求允许中通过NAS提示的服务种类或管理的服务种类一起传输服务种类的结果 要给与认真的考虑,而且实施者希望可以提供一些机制阻止那些以上提到的这些种类,或者 是其他的服务种类,或者是其他的属性。关于这些机制的讨论不是在本文档范围之内的。
2.4 为什么使用UDP
一个经常问到的问题是为什么使用UDP而不是TCP作为传输协议。选择UDP是基于严格的技术上的原因。
这有许多必须被理解的论点。RADIUS是一个事务,基于几个具有有趣特点的协议。 1.如果向主验证服务器发出的请求失败,则必须查找备用服务器。
为了满足这个要求,考虑到向备用服务器传输请求,请求副本必须保留在传输层。 这意味着重发计时器仍然是需要的。
2.这个特别协议的计时要求与TCP所提供的有较大的不同。
在一种极端的情况下,RADIUS不做丢失数据的响应检查。用户愿意为完成验证而 等几秒钟。通常带有侵略性的TCP中继 (基于平均往返时间)是不需要的,TC确认P开销也 是不需要的。
在另一种极端情况下,用户不愿花几分钟等待验证。因此两分钟后,可靠的TCP数 据递送也是无效的。对备用服务器快速的使用能在用户放弃之前获得访问。 3. 协议的无状态特性简化了UDP的使用 服务器和客户机不停变化。系统重新启动,或单路供电。通常情况下,这不会产生问题, 但会导致出现超时和TCP连接中断检测,通过编写编码能够处理这类异常事件。无论如何 UDP完全消除了这类特殊处理以及其中的任何一部分。每一个服务器和客户端只需一次打开 他们UDP 传输,尔后可以使传输处于一种打开的状态,也许在网络上从始至终传输的是不 成功信息。
4. UDP简化了服务器的实现
在最早的RADIUS实现中,服务器是单线程的。这意味着只能有一个请求被接收、处理 和返回。随后发现在后台安全机制会占用实时时间(1秒或更多)的环境中这样做是难管理 的。服务器的请求队列会被填满,在每分钟内有成百上千的用户正在等待验证的环境中,请 求的轮换时间会长于用户所能忍受的等待时间,(尤其严重的是在数据库中的一次特殊的查 找,或者花在DNS上的时间大于30秒的情况)。显而易见的解决方法是多线程。用UDP解决
9
RFC2865 NetWare/IP Domain Name and Information 远程拨入用户认证服务
这一问题是很简单的。每一个请求得到一个单独的进程,通过一个简单的UDP数据包进行与 客户端原始通信,从而达到与客户端NAS直接响应的目的。
UDP并不是一副万能药。应当注意的是使用UDP需要一种内嵌于TCP的功能:使用UDP, 我们必须通过人工成功管理联系同一台服务器中继计时器,但我们并不需要花费同样的我们必须通过人工成功管理联系同一台服务器中继计时器,但我们并不需要花费同样的注意力给TCP提供的计时器。这是在这个协议中以很小的代价换来UDP诸多优点的惩罚.
没有TCP我们仍然可能使用着金属线连接的锡罐通信。但是对于这个特殊的协议,UDP 是一个更好的选择。
2.5 中继提示
如果RADIUS服务器和副RADIUS服务器拥有共享密钥,在向备用服务器转发数据包时用相同的ID和请求鉴别码是可行的,因为属性内容没有发生变化。用一个新的请求鉴别码向备用服务器传输也是可以的。
如果你改变了用户密码属性的内容(或者其他属性),你需要一个新的请求鉴别码,因此还需要一个新的ID。
如果NAS向一个与前一个服务器完全相同的服务器传输RADIUS请求,而且属性内容没有发生变化,你必须使用相同请求鉴别码、ID、和源端口号。若出现属性被修改,你必须使用新的请求鉴别码和ID。
NAS可以在所有的服务器中使用同一个ID,或者对每一个服务器使用单独的ID,这是根据使用者的要求决定。如果由于额外的请求,一个NAS需要多于256个ID,它可以使用额外的源端口号传输这些请求,并对每一个源端口ID进行跟踪。这样做,某一时刻对某一个服务器的额外请求,上限大约是16,000,000。
2.6 保持激活状态应该考虑的损害
一些应用者已经采取传输测试的RADIUS请求给服务器的方法,看服务器是否处于激活状态。这种方法是不可取得,因为它会增加额外的负荷,而且因为没有提供任何附加有用信息,所以损害可测量性。因为一个RADIUS请求是包含在一个单独的数据包中,在你送出ping 的这段时间里,你或许可以传输一个RADIUS请求,得到一个RADIUS响应得知RADIUS服务器处于激活状态。如果你没有要传输的RADIUS请求,就不必关心服务器是否处于激活状态,因为你没有使用到它。
如果你想监视你的RADIUS服务器,可以使用简单网络管理协议(SNMP),这是SNMP的指责所在。
3. 包的格式
一个完整的RADIUS数据包是被封装在UDP的数据域中[4],在那UDP目标端口域指定为1812 (十进制数)。
在应答数据包生成时,源端口号和目的端口号进行颠倒。
本备忘录是为RADIUS协议作评注的。RADIUS早期的配置中是使用的UDP的1645
10