Radius协议-学习

百度百科定义

RADIUS:Remote Authentication Dial In User Service,远程用户拨号认证系统由RFC2865,RFC2866定义,是应用最广泛的AAA协议。AAA是一种管理框架,因此,它可以用多种协议来实现。在实践中,人们最常使用远程访问拨号用户服务(Remote Authentication Dial In User Service,RADIUS)来实现AAA。

RADIUS是一种C/S结构的协议,它的客户端最初就是NAS(Net Access Server)服务器,任何运行RADIUS客户端软件的计算机都可以成为RADIUS的客户端。RADIUS协议认证机制灵活,可以采用PAPCHAP或者Unix登录认证等多种方式。RADIUS是一种可扩展的协议,它进行的全部工作都是基于Attribute-Length-Value的向量进行的。RADIUS也支持厂商扩充厂家专有属性。

由于RADIUS协议简单明确,可扩充,因此得到了广泛应用,包括普通电话上网、ADSL上网、小区宽带上网、IP电话、VPDN(Virtual Private Dialup Networks,基于拨号用户的虚拟专用拨号网业务)、移动电话预付费等业务。IEEE提出了802.1x标准,这是一种基于端口的标准,用于对无线网络的接入认证,在认证时也采用RADIUS协议。

RFC Radius 协议

RFC文档中心

RFC 2865 Radius 中文版

RFC 2866 Radius Accounting 中文版

RFC 2869 Radius Extensions 中文版

RFC 3576 Dynamic Authorization Extensions to Radius 中文版

Radius-学习

摘 要:

目前,电信运营商和服务提供商所采用的认证方式主要有本地认证、RADIUS认证和不认证;而计费策略更是丰富多彩,常见的有不计费(包月)、按时长计费、按流量计费、按端口计费等等。目前在所有这些认证计费方式中,以采用RADIUS Server进行集中认证计费应用的最为普及和广泛。

AAA是认证(Authentication)、授权(Authorization)和计费(Accounting)的简称,它是一种对网络安全进行管理的基本框架。而RADIUS (Remote Authentication Dia• -In User Service)即远程认证拨号用户服务,是一种分布式的、客户机/服务器结构的信息交互协议,它能保护网络不受未授权访问的干扰。二者结合可以实现对远程接入用户身份、权限以及流量的严格控制。RADIUS为服务供应商和公司提供了一种灵活通用的协议,用来完成集中式的用户认证、口令加密、服务选择、过滤和帐目核对等工作。当进行PAP/CHAP连接或连接第三方认证服务器时,一个单独的RADIUS数据库服务器可以在多个复杂网络上同时管理多个安全系统,并可用于维护成千上万用户的信息安全。

RADIUS不仅指运行于服务器上的软件,还包括网络访问服务器与RADIUS服务器之间的交互操作协议。

AAA可以通过多种协议来实现,在实际应用中,最常使用RADIUS协议。

RADIUS是一种分布式的、客户端/服务器结构的信息交互协议,能保护网络不受未授权访问的干扰,常应用在既要求较高安全性、又允许远程用户访问的各种网络环境中。该协议定义了基于UDP(User Datagram Protocol)的RADIUS报文格式及其传输机制,并规定UDP端口1812、1813分别作为默认的认证、计费端口。

RADIUS最初仅是针对拨号用户的AAA协议,后来随着用户接入方式的多样化发展,RADIUS也适应多种用户接入方式,如以太网接入等。它通过认证授权来提供接入服务,通过计费来收集、记录用户对网络资源的使用。

RADIUS协议的主要特征

  • 客户端/服务器模式
  • 安全的消息交互机制
  • 良好的扩展性

客户端/服务器模式

  • RADIUS客户端

    一般位于网络接入服务器NAS(Network Access Server)上,可以遍布整个网络,负责传输用户信息到指定的RADIUS服务器,然后根据从服务器返回的信息进行相应处理(如接受/拒绝用户接入)。

    设备作为RADIUS协议的客户端,实现以下功能:

    • 支持标准RADIUS协议及扩充属性,包括RFC2865、RFC2866。
    • 对RADIUS服务器状态探测功能。
    • 计费结束请求报文的本地缓存重传功能。
    • RADIUS服务器主备或负载分担功能。
  • RADIUS服务器

    一般运行在中心计算机或工作站上,维护相关的用户认证和网络服务访问信息,负责接收用户连接请求并认证用户,然后给客户端返回所有需要的信息(如接受/拒绝认证请求)。RADIUS服务器通常要维护三个数据库。

  • Users:用于存储用户信息(如用户名、密码以及使用的协议、IP地址等配置信息)。
  • Clients:用于存储RADIUS客户端的信息(如共享密钥、IP地址等)。
  • Dictionary:用于存储RADIUS协议中的属性和属性值含义的信息。

安全的消息交互机制

RADIUS客户端和RADIUS服务器之间认证消息的交互是通过共享密钥的参与来完成的。共享密钥是一个带外传输的、客户端和服务器都知道的字符串,不需要单独进行网络传输。RADIUS报文中有一个16字节的验证字字段,它包含了对整个报文的数字签名数据,该签名数据是在共享密钥的参与下利用MD5算法计算得出。收到RADIUS报文的一方要验证该签名的正确性,如果报文的签名不正确,则丢弃它。通过这种机制,保证了RADIUS客户端和RADIUS服务器之间信息交互的安全性。另外,为防止用户密码在不安全的网络上传递时被窃取,在RADIUS报文传输过程中还利用共享密钥对用户密码进行了加密。

良好的扩展性

RADIUS报文是由报文头和一定数目的属性(Attribute)构成,新属性的加入不会破坏协议的原有实现。

AAA介绍

AAA概述

AAA是认证(Authentication)、授权(Authorization)和计费(Accounting)的缩写,它是运行于NAS(网络访问服务器)上的客户端程序。提供了一个用来对认证、授权和计费这三种安全功能进行配置的一致性框架,实际上是对网络安全的一种管理。这里的网络安全主要指访问控制。包括哪些用户可以访问网络服务器;具有访问权的用户可以得到哪些服务;以及如何对正在使用网络资源的用户进行计费。

下面简单介绍一下AAA所提供的三种服务:

  1. 认证功能

AAA支持以下认证方式:

• 不认证:对用户非常信任,不对其检查,一般情况下不采用这种方式。

• 本地认证:将用户信息(包括本地用户的用户名、密码和各种属性)配置在接入服务器上。本地认证的优点是速度快,降低运营成本;但存储信息量受设备硬件条件限制。

• 远端认证:支持通过RADIUS协议或HWTACACS协议进行远端认证,由接入服务器作为Client端,与RADIUS服务器或TACACS服务器通信。

  1. 授权功能

AAA支持以下授权方式:

• 直接授权:对用户非常信任,直接授权通过。

• 本地授权:根据宽带接入服务器上为本地用户账号配置的相关属性进行授权。

• if-authenticated授权:如果用户通过了认证,并且使用的认证方法不是none,则对用户授权通过。

• RADIUS认证成功后授权:RADIUS协议的认证和授权是绑定在一起的,不能单独使用RADIUS进行授权。

  1. 计费功能

AAA支持以下计费方式:

• 不计费

• 远端计费:支持通过RADIUS服务器或TACACS服务器进行远端计费。

• 本地认证——即在NAS端进行认证、授权和计费,

• 远程认证——通过协议进行远程的认证、授权和计费。

AAA的实现可采用RADIUS协议。RADIUS用来管理使用串口和调制解调器的大量分散用户。

网络接入服务器简称NAS。当用户想要通过某个网络(如电话网)与NAS建立连接从而获得访问其他网络的权利时,NAS可以选择在NAS上进行本地认证计费,或把用户信息传递给RADIUS服务器,由RADIUS进行认证计费;RADIUS 协议规定了NAS与RADIUS 服务器之间如何传递用户信息和计费信息,即两者之间的通信规则;RADIUS服务器负责接收用户的连接请求,完成认证,并把用户所需的配置信息返回给NAS。用户获得授权后,在其正常上线、在线和下线过程中,RADIUS服务器还完成对用户账号计费的功能。

C/S结构

RADIUS采用典型的客户端/服务器(Client/Server)结构,它的客户端最初就是NAS,现在任何运行RADIUS客户端软件的计算机都可以成为RADIUS的客户端。NAS上运行的AAA程序对用户来讲为服务器端,对RADIUS服务器来讲是作为客户端。负责传输用户信息到指定的RADIUS服务器,然后根据从服务器返回的信息进行相应处理(如接入/挂断用户)。RADIUS服务器负责接收用户连接请求,认证用户,然后给NAS返回所有需要的信息。

1、RADIUS的客户端通常运行于接入服务器(NAS)上,RADIUS服务器通常运行于一台工作站上,一个RADIUS服务器可以同时支持多个RADIUS客户(NAS)。

2、RADIUS的服务器上存放着大量的信息,接入服务器(NAS)无须保存这些信息,而是通过RADIUS协议对这些信息进行访问。这些信息的集中统一的保存,使得管理更加方便,而且更加安全。

3、RADIUS服务器可以作为一个代理,以客户的身份同其他的RADIUS服务器或者其他类型的认证服务器进行通信。用户的漫游通常就是通过RADIUS代理实现的。简单地说,代理就是一台服务器,可以作为其他RADIUS服务器的代理,负责转发RADIUS认证和计费数据包。所谓漫游功能,就是代理的一个具体实现,这样可以让用户通过本来和其无关的RADIUS服务器进行认证。

RADIUS在协议栈中的位置

RADIUS是一种流行的AAA协议,采用UDP协议传输,在协议栈中位置如下:

RADIUS为何采用UDP,而不是TCP的原因如下:

1、NAS和RADIUS服务器之间传递的一般是几十至上百个字节长度的数据,用户可以容忍几秒到十几秒的验证等待时间。当处理大量用户时服务器端采用多线程,UDP简化了服务器端的实现过程。

2、TCP是必须成功建立连接后才能进行数据传输的,这种方式在有大量用户使用的情况下实时性不好。

3、当向主用服务器发送请求失败后,还要必须向备用的服务器发送请求。于是RADIUS要有重传机制和备用服务器机制,它所采用的定时机制,TCP不能很好的满足。

RADIUS协议采用的是UDP协议,数据包可能会在网络上丢失,如果客户没有收到响应,那么可以重新发送该请求包。多次发送之后如果仍然收不到响应,RADIUS客户可以向备用的RADIUS服务器发送请求包。

RADIUS网络安全

RADIUS协议的加密是使用MD5加密算法进行的,在RADIUS的客户端(NAS)和服务器端(RADIUS Server)保存了一个密钥(key),RADIUS协议利用这个密钥使用MD5算法对RADIUS中的数据进行加密处理。密钥不会在网络上传送。

RADIUS的加密主要体现在以下两方面:

包加密

在RADIUS包中,有16字节的验证字(authenticator)用于对包进行签名,收到RADIUS包的一方要查看该签名的正确性。如果包的签名不正确,那么该包将被丢弃,对包进行签名时使用的也是MD5算法(利用密钥),没有密钥的人是不能构造出该签名的。

口令加密

在认证用户时,用户的口令在NAS和RADIUS Server之间不会以明文方式传送,而是使用了MD5算法对口令进行加密。没有密钥的人是无法正确加密口令的,也无法正确地对加密过的口令进行解密。

口令加密与口令验证过程

当用户上网时,NAS将决定对用户采用何种认证方法。下面对使用RADIUS认证的情况下PPP用户与NAS之间的PAP和CHAP认证过程进行介绍。

  • PAP 验证

用户以明文的形式把用户名和他的密码传递给NAS,NAS把用户名和加密过的密码放到验证请求包的相应属性中传递给RADIUS服务器。RADIUS服务器根据NAS上传的帐号进行验证来决定是否允许用户上网并返回结果。NAS可以在其中包含服务类型属性Attribute Service-Type=Framed-User,和Framed-Protoco• =PPP作为提示来告诉RADIUS服务器PPP是所希望的服务。

Secret password =Password XOR MD5(Challenge + Key)

(Challenge就是RADIUS报文中的Authenticator)

  • CHAP验证

对于CHAP(挑战握手认证协议),它提供对用户口令进行加密的机制。

当用户请求上网时,NAS产生一个16字节的随机码给用户(同时还有一个ID号,本地路由器的Host name)。用户端得到这个包后使用自己独有的设备或软件客户端将CHAP ID、用户密码(口令字)用MD5算法对该随机码进行加密生成一个Secret Password,随同用户名user name一并传给NAS。

NAS把传回来的user name和Secret Password分别作为用户名和密码,并把原来的16字节随机码以及CHAP ID传给RADIUS服务器。RADIUS根据用户名在服务器端查找数据库,得到和用户端进行加密所用的一样的密钥,用MD5算法对CHAP ID,密钥和传来的16字节的随机码进行加密,将其结果与传来的Password作比较,如果相匹配,服务器送回一个接入允许数据包,否则送回一个接入拒绝数据包。

RADIUS报文

报文格式

RADIUS协议是基于UDP协议的 。

各字段的解释如下:

  • Code:长度为1个字节,用来说明RADIUS报文的类型。不同RADIUS报文的Code值不相同。例如,Code为1时表示Access-Request报文,Code为2时表示Access-Accept报文。

  • Identifier:长度为1个字节,用来匹配请求报文和响应报文,以及检测在一段时间内重发的请求报文。RADIUS客户端发送请求报文后,RADIUS服务器返回的响应报文中的Identifier值应与请求报文中的Identifier值相同。

  • Length:长度为2个字节,用来指定RADIUS报文的长度。超过Length取值的字节将作为填充字符而忽略。如果接收到的报文的实际长度小于Length的取值,则该报文会被丢弃。

  • Authenticator:长度为16个字节,用来验证RADIUS服务器的响应报文,同时还用于用户密码的加密。

  • Attribute:即RADIUS属性字段,长度不定,为报文的内容主体,用来携带专门的认证、授权和计费信息,提供请求和响应报文的配置细节。Attribute可以包括多个RADIUS属性,每一个RADIUS属性都采用(Type、Length、Value)三元组的结构来表示。

    • 类型(Type):长度为1个字节,取值为1~255,用于表示RADIUS属性的编号。
    • 长度(Length):长度为1个字节,表示该RADIUS属性(包括类型、长度和属性值)的长度,单位为字节。
    • 属性值(Value):最大长度为253字节,表示该RADIUS属性的信息,其格式和内容由类型和长度决定。

报文类型

RADIUS认证报文

报文名称 说明
Access-Request 认证请求报文,是RADIUS报文交互过程中的第一个报文,用来携带用户的认证信息(例如:用户名、密码等)。认证请求报文由RADIUS客户端发送给RADIUS服务器,RADIUS服务器根据该报文中携带的用户信息判断是否允许接入。
Access-Accept 认证接受报文,是RADIUS服务器对RADIUS客户端发送的Access-Request报文的接受响应报文。如果Access-Request报文中的所有属性都可以接受(即认证通过),则发送该类型报文。RADIUS客户端收到此报文后,用户才能认证通过并被赋予相应的权限。
Access-Reject 认证拒绝报文,是RADIUS服务器对RADIUS客户端的Access-Request报文的拒绝响应报文。如果Access-Request报文中的任何一个属性不可接受(即认证失败),则RADIUS服务器返回Access-Reject报文,用户认证失败。
Access-Challenge 认证挑战报文。EAP中继认证时,RADIUS服务器接收到Access-Request报文中携带的用户名信息后,会随机生成一个MD5挑战字,同时将此挑战字通过Access-Challenge报文发送给用户。用户使用该挑战字对用户密码进行加密处理后,将新的用户密码信息通过Access-Request报文发送给RADIUS服务器。RADIUS服务器将收到的已加密的密码信息和本地经过加密运算后的密码信息进行对比,如果相同,则该用户为合法用户。

RADIUS计费报文

报文名称 说明
Accounting-Request(Start) 计费开始请求报文。如果RADIUS客户端使用RADIUS模式进行计费,RADIUS客户端会在用户开始访问网络资源时,向RADIUS服务器发送计费开始请求报文。
Accounting-Response(Start) 计费开始响应报文。RADIUS服务器接收并成功记录计费开始请求报文后,需要回应一个计费开始响应报文。
Accounting-Request(Interim-update) 实时计费请求报文。为避免RADIUS服务器无法收到计费结束请求报文而继续对该用户计费,可以在RADIUS客户端上配置实时计费功能。RADIUS客户端定时向RADIUS服务器发送实时计费请求报文,减少计费误差。
Accounting-Response(Interim-update) 实时计费响应报文。RADIUS服务器接收并成功记录实时计费请求报文后,需要回应一个实时计费响应报文。
Accounting-Request(Stop) 计费结束请求报文。当用户断开连接时(连接也可以由NAS断开),RADIUS客户端向RADIUS服务器发送计费结束请求报文,其中包括用户上网所使用的网络资源的统计信息(上网时长、进/出的字节数等),请求RADIUS服务器停止计费。
Accounting-Response(Stop) 计费结束响应报文。RADIUS服务器接收计费停止请求报文后,需要回应一个计费停止响应报文。

RADIUS认证、授权、计费流程

RADIUS CoA/DM报文

设备支持RADIUS CoA/DM功能,提供一种动态修改在线用户权限或者强制用户下线的机制。

RADIUS CoA/DM报文

报文名称 说明
CoA-Request 动态授权请求报文。当管理员需要更改某个在线用户的权限时(例如,管理员不希望用户访问某个网站),可以通过RADIUS服务器发送一个动态授权请求报文给RADIUS客户端,使RADIUS客户端修改在线用户的权限。
CoA-ACK 动态授权请求接受报文。如果RADIUS客户端成功更改了用户的权限,则RADIUS客户端回应动态授权请求接受报文给RADIUS服务器。
CoA-NAK 动态授权请求拒绝报文。如果RADIUS客户端未成功更改用户的权限,则RADIUS客户端回应动态授权请求拒绝报文给RADIUS服务器。
DM-Request 用户离线请求报文。当管理员需要让某个在线的用户下线时,可以通过RADIUS服务器发送一个用户离线请求报文给RADIUS客户端,使RADIUS客户端终结用户的连接。
DM-ACK 用户离线请求接受报文。如果RADIUS客户端已经切断了用户的连接,则RADIUS客户端回应用户离线请求接受报文给RADIUS服务器。
DM-NAK 用户离线请求拒绝报文。如果RADIUS客户端无法切断用户的连接,则RADIUS客户端回应用户离线请求拒绝报文给RADIUS服务器。

交互流程

CoA(Change of Authorization)是指用户认证成功后,管理员可以通过RADIUS协议来修改在线用户的权限或对其进行重认证。

DM(Disconnect Message)是指用户下线报文,即由RADIUS服务器主动发起的强制用户下线的报文。

与用户上线授权或用户主动下线过程相比,CoA/DM的特点是请求报文是由服务器发送的,回应报文是由设备发送的,成功则回应ACK报文、失败则回应NAK报文。

会话识别

NAS设备为用户提供的每一个服务构成一个会话,会话的开头定义为首次提供服务的点,会话的结束定义为服务结束点。

设备接收到RADIUS服务器的CoA-Request报文或者DM-Request报文后,根据报文中的某些RADIUS属性来识别用户。用来识别用户的RADIUS属性包括:

  • RADIUS标准属性:User-Name(1)
  • RADIUS标准属性:Acct-Session-ID(4)
  • RADIUS标准属性:Framed-IP-Address(8)
  • RADIUS标准属性:Calling-Station-Id(31)

匹配的方式包括以下两种:

  • any方式

    其中一个属性与设备上的用户信息进行匹配检查。识别用户所用的RADIUS属性优先级为:Acct-Session-ID(4) > Calling-Station-Id(31) > Framed-IP-Address(8)。按照优先级在请求报文中查找属性,优先找到哪个属性就用哪个属性与设备上的用户信息进行匹配,匹配成功时,设备回应ACK报文,否则回应NAK报文。

  • all方式

    所有的属性与设备上的用户信息进行匹配检查。识别用户所用的RADIUS属性包括:Acct-Session-ID(4)、Calling-Station-Id(31)、Framed-IP-Address(8)和User-Name(1)。请求报文中以上属性都要与设备上的用户信息进行匹配,全部匹配成功时,设备回应ACK报文,否则回应NAK报文。

RADIUS服务器的CoA-Request报文或DM-Request报文与设备上的用户信息匹配失败时,设备会在回应的CoA-NAK报文或DM-NAK报文中通过错误码描述失败的原因。

CoA-NAK报文中的错误码

名称 数值 说明
RD_DM_ERRCODE_MISSING_ATTRIBUTE 402 请求报文中缺少关键属性,导致RADIUS属性完整性检查失败
RD_DM_ERRCODE_INVALID_REQUEST 404 对请求报文进行属性解析时,解析失败
RD_DM_ERRCODE_INVALID_ATTRIBUTE_VALUE 407 请求报文中包含不支持或不存在的属性,导致属性检查失败。授权检查的内容包括:VLAN、ACL、CAR、重定向ACL编号以及基于接口的认证用户不支持授权华为RADIUS扩展属性RD_hw_URL_Flag和RD_hw_Portal_URL可能出现的错误包括:授权的业务方案不存在授权的QoS模板不存在或QoS模板中未配置用户队列授权的上下行优先级超过最大值授权的UCL组索引值不在规格范围内解析ISP VLAN和出端口信息错误重认证属性与其他属性同时授权
RD_DM_ERRCODE_SESSION_CONTEXT_NOT_FOUND 503 会话请求失败。包括:当前针对请求用户的授权正在处理申请RADIUS临时表失败用户信息不匹配或未找到用户用户非RADIUS认证用户
RD_DM_ERRCODE_RESOURCES_UNAVAILABLE 506 其他授权失败的情况使用该错误码

DM-NAK报文中的错误码

名称 数值 说明
RD_DM_ERRCODE_INVALID_REQUEST 404 对请求报文进行属性解析时,解析失败
RD_DM_ERRCODE_SESSION_CONTEXT_NOT_REMOVABLE 504 用户删除失败或用户不存在

代码实现(Java)

参考链接

http://www.h3c.com/cn/d_201309/922098_30005_0.htm

https://support.huawei.com/enterprise/zh/doc/EDOC1100086522

posted @ 2021-10-08 11:25  Ricardo_ML  阅读(2529)  评论(2编辑  收藏  举报