最近一直在做freedius.net,freeradius这个东西原本是在linux下的radius服务器。
可是呢现在要用到windows下,虽然有windows的版本——freeradius.net。但是很可笑的是.net竟然没有连接mssql的驱动,在google上找了很久,没有解决的办法。于是想把radius服务器放linux下的,然后联另一台windows下的mssql服务器。在网上看别人写的东西和freeradius的帮助文档比总是迷迷糊糊的。所以学习一下radius协议,然后看能不能改下freeradius。可是看了一些从万方上找来的学位论文,我晕,这是学位论文嘛!写的牛头不对马嘴,而且还有错别字。让人看了雾头雾水的。唉,有些话就不多说了。大家都明白。
Radius是Remote Authentication Dial In User Service的简称,即远程验证拨入用户服务。 当用户想要通过某个网络(如电话网)与NAS(网络接入服务器)建立连接从而获得访问其他网络的权利时,NAS可以选择在NAS上进行本地认证计费,或把用户信息传递给RADIUS服务器,由Radius进行认证计费;RADIUS 协议规定了NAS与RADIUS 服务器之间如何传递用户信息和记账信息;RADIUS服务器负责接收用户的连接请求,完成验证,并把传递服务给用户所需的配置信息返回给NAS。
AAA是验证,授权和记账(Authentication,Authorization,and Accounting)的简称。它 是运行于NAS上的客户端程序。它提供了一个用来对验证,授权和记账这三种安全功能进行配置的一致的框架。AAA的配置实际上是对网络安全的一种管理。这里的网络安全主要指访问控制。
验证(Authentication): 验证用户是否可以获得访问权。可以选择使用RADIUS协议。
授权(Authorization) : 授权用户可以使用哪些务。
记账(Accounting) : 记录用户使用网络资源的情况。
由此可见,可以用radius协议来实现AAA。NAS(Network Access Server网络接入服务器简称) 。当用想要对访问某个网络是,就像NAS发送接入请求。当NAS接受到接入请求是NAS就像radius服务器转发用户的接入请求,然后radius返回消息包。NAS根据这个消息包判断用户是否可以接入。如果允许接入,用户就像NAS发送计费请求,NAS再向radius转发请求,然后用户就可以访问网络资源。计费由radius完成。 这样以来,验证,授权,记账,全由radius完成。
RADIUS 协议常用的认证端口号为1812或1645,计费端口号为1813或1646。RADIUS通过建立一个唯一的用户数据库,存储用户名,用户的密码来进行验证; 存储传递给用户的服务类型以及相应的配置信息来完成授权。
RADIUS服务器采用的是C/S模式。对于radius来说NAS就是客户端。radius可以做为另一个radius服务器或者另一种认证服务器的地客户端。
用户<-->NAS<-->RADIUS 业务流程说明。
1、用户拨入后(1),所拨入的设备(比如NAS)将拨入用户的用户的信息(比如用户名、口令、所占用的端口等等)打包向RADIUS服务器发送(2)。
2、如果该用户是一个合法的用户,那么Radius告诉NAS该用户可以上网,同时传回该用户的配置参数(3);否则,Radius反馈NAS该用户非法的信息(3)。
3、如果该用户合法,MAS就根据从RADIUS服务器传回的配置参数配置用户(4)。如果用户非法,NAS反馈给用户出错信息并断开该用户连接(4)。
4、如果用户可以访问网络,RADIUS客户要向RADIUS服务器发送一个记费请求包表明对该用户已经开始记费(5),RADIUS服务器收到并成功记录该请求包后要给予响应(6)。
5、当用户断开连接时(连接也可以由接入服务器断开)(7),RADIUS客户向RADIUS服务器发送一个记费停止请求包,其中包含用户上网所使用网络资源的统计信息(上网时长、进/出的字节/包数等)(8),RADIUS服务器收到并成功记录该请求包后要给予响应(9)。
网络安全
RADIUS协议的加密是使用MD5加密算法进行的,在RADIUS的客户端(NAS)和服务器端(Radius Server)保存了一个密钥(key),RADIUS协议利用这个密钥使用MD5算法对RADIUS中的数据进行加密处理。密钥不会在网络上传送。RADIUS的加密主要体现在两方面:报签名和口令加密。
包签名:主要由于验证所接受的包是否是合法的用户和服务器发来的。这样可以在一定程度上防止黑的冒充服务器发包。
在RADIUS包中,有16字节的验证字(authenticator)用于对包进行签名,收到RADIUS包的一方要查看该签名的正确性。如果包的签名不正确,那么该包将被丢弃,对包进行签名时使用的也是MD5算法(利用密钥),没有密钥的人是不能构造出该签名的。
包的签名与加密详细说明如下:
包的签名指的是RADIUS包中16字节的Authenticator,我们称其为"验证字"。
认证请求包
RequestAuth=Authenticator,认证请求包的验证字是一个不可预测的16字节随机数。这个随机数将用于口令的加密。
认证响应包
ResponseAuth = MD5(Code+ID+Length+Authenticator+Attributes+Key)。
记费请求包
RequestAcct = MD5(Code+ID+Length+16ZeroOctets+Attributes+Key)。
记费响应包
ResponseAcct = MD5(Code+ID+Length+RequestAcct+Attributes+Key)。
口令加密:
在认证用户时,用户的口令在NAS和Radius Server之间不会以明文方式传送,而是使用了MD5算法对口令进行加密。没有密钥的人是无法正确加密口令的,也无法正确地对加密过的口令进行解密。
口令的加密:
称共享密钥(key)为Key;16字节的认证请求验证字(Authenticator)为Auth;将口令(Password)分割成16字节一段(最后一段不足16字节时用0补齐),为p1、p2等;加密后的口令块为c(1)、c(2)等。下面运算中b1、b2为中间值:
b1 = MD5(Key + Auth) c(1) = p1 xor b1
b2 = MD5(Key + c(1)) c(2) = p2 xor b2
…… ……
bi = MD5(Key+ c(i-1)) c(i) = pi xor bi
那么加密后的口令为c(1)+c(2)+...+c(i)。
上面是协议规定的算法,也有的RADIUS服务器为了实现起来简单,修改了上述的算法,具体的讲,b1的算法同上,但bi=b2=b1(i>=1),其他运算不变。当用户的口令长度不超过16字节时,两种算法的结果是一样的。
口令加密与口令验证过程
当用户上网时,NAS决定对用户采用何种验证方法。下面分别在本地验证和Radius验证两种情况下介绍用户与NAS之间的PAP和CHAP验证方式。
1)NAS本地认证
PAP 验证(Password Authentication Protocol:密码验证协议):用户以明文的形式把用户名和密码传递给NAS。 NAS根据用户名在NAS端查找本地数据库,如果存在相同的用户名和密码表明验证通过,否则表明验证未通过。
CHAP 验证(Challenge Handshake Authentication Protocol:挑战握手验证协议): 当用户请求上网时,服务器产生一个16字节的随机码(challenge)给用户(同时还有一个ID号,本地路由器的 host name)。用户端得到这个包后使用自己独用的设备或软件对传来的各域进行加密,生成一个Secret Password传给NAS。NAS根据用户名查找自己本地的数据库,得到和用户端进行加密所用的一样的密码,然后根据原来的16字节的随机码进行加密,将其结果与Secret Password作比较,如果相同表明验证通过,如果不相同表明验证失败。
Secret Password = MD5(Chap ID + Password + challenge)
2)Radius认证
如果用户配置了RADIUS验证而不是本地验证,过程略有不同。
PAP验证:用户以明文的形式把用户名和他的密码传递给NAS,NAS把用户名和加密过的密码放到验证请求包的相应属性中传递给RADIUS服务器。RADIUS服务器对NAS上传的帐号进行验证并返回结果来决定是否允许用户上网。
Secret password =Password XOR MD5(Challenge + Key)
( Challenge就是Radius报文中的Authenticator)
CHAP验证:当用户请求上网时,NAS产生一个16字节的随机码给用户(同时还有一个ID号,本地路由器的 host name)。用户端得到这个包后使用自己独有的设备或软件对传来的各域进行加密,生成一个Secret Password传给NAS。NAS把传回来的CHAP ID和Secret Password分别作为用户名和密码,并把原来的16字节随机码传给RADIUS服务器。RADIUS根据用户名在服务器端查找数据库,得到和用户端进行加密所用的一样的密码,然后根据传来的16字节的随机码进行加密,将其结果与传来的Password作比较,如果相同表明验证通过,如果不相同表明验证失败。
Secret password = MD5(Chap ID + Password + challenge)
标准Radius协议包结构
Code:包类型;1字节;指示RADIUS包的类型。
1Access- request 认证请求
2 Access- accept 认证响应
3 Access- reject 认证拒绝
4 Accounting-request 计费请求
5 Accounting-response 计费响应
*11 Access-challenge 认证挑战
Identifier: 包标识;1字节,取值范围为0 ~255;用于匹配请求包和响应包,同一组请求包和响应包的Identifier应相同。
Length: 包长度;2字节;整个包中所有域的长度。
Authenticator:16 字节长;用于验证RADIUS服务器传回来的请求以及密码隐藏算法上。
该验证字分为两种:
1、请求验证字---Request Authenticator
用在请求报文中,必须为全局唯一的随机值。
2、响应验证字---Response Authenticator
用在响应报文中,用于鉴别响应报文的合法性。
响应验证字=MD5(Code+ID+Length+请求验证字+Attributes+Key)
Attributes:属性
Attributes:属性
Type
1 User-Name
2 User-Password
3 CHAP-Password
4 NAS-IP-Address
5 NAS-Port
6 Service-Type
7 Framed-Protocol
8 Framed-IP-Address
9 Framed-IP-Netmask
10 Framed-Routing
11 Filter-Id
12 Framed-MTU
13 Framed-Compression
14 Login-IP-Host
15 Login-Service
16 Login-TCP-Port
17 (unassigned)
18 Reply-Message
19 Callback-Number
20 Callback-Id
21 (unassigned)
22 Framed-Route
23 Framed-IPX-Network
24 State
25 Class
26 Vendor-Specific
27 Session-Timeout
28 Idle-Timeout
29 Termination-Action
30 Called-Station-Id
31 Calling-Station-Id
32 NAS-Identifier
33 Proxy-State
34 Login-LAT-Service
35 Login-LAT-Node
36 Login-LAT-Group
37 Framed-AppleTalk-Link
38 Framed-AppleTalk-Network
39 Framed-AppleTalk-Zone
40 Acct-Status-Type
41 Acct-Delay-Time
42 Acct-Input-Octets
43 Acct-Output-Octets
44 Acct-Session-Id
45 Acct-Authentic
46 Acct-Session-Time
47 Acct-Input-Packets
48 Acct-Output-Packets
49 Acct-Terminate-Cause
50 Acct-Multi-Session-Id
51 Acct-Link-Count
60 CHAP-Challenge
61 NAS-Port-Type
62 Port-Limit
63 Login-LAT-Port
Length
属性长度。
Value
属性值。