分类 wifidog原理 下的文章

wifidog分析-Radius协议

从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下,从RADIUS协议谈谈对身份认证的认识,也总结一下自己。

一.RADIUS协议原理

    RADIUS(Remote Authentication Dial In User Service) 用户远程拨入认证服务,它主要针对的远程登录类型有:SLIP、PPP、telnet和rlogin等。RADIUS协议应用范围很广,包括普通电话、上网业务计费,对VPN的支持可以使不同的拨入服务器的用户具有不同权限。

RADIUS典型应用环境如下:
clip_image002.jpg

RADIUS数据包分为5个部分:
(1) Code:1个字节,用于区分RADIUS包的类型:常用类型有:
接入请求(Access-Request),Code=1;接入允许(Access-Accept),Code=2;接入拒绝(Access-Reject),Code=3;计费请求(Accounting-Request),Code=4等。
(2)Identifier:一个字节,用于请求和应答包的匹配。
(3)Length:两个字节,表示RADIUS数据区(包括Code, Identifier, Length, Authenticator, Attributes)的长度,单位是字节,最小为20,最大为4096。
(4)Authenticator:16个字节,用于验证服务器端的应答,另外还用于用户口令的加密。RADIUS服务器和NAS的共享密钥(Shared Secret)与请求认证码(Request Authenticator)和应答认证码(Response Authenticator),共同支持发、收报文的完整性和认证。另外,用户密码不能在NAS和RADIUS 服务器之间用明文传输,而一般使用共享密钥(Shared Secret)和认证码(Authenticator)通过MD5加密算法进行加密隐藏。
(5)Attributes:不定长度,最小可为0个字节,描述RADIUS协议的属性,如用户名、口令、IP地址等信息都是存放在本数据段。
各个属性的详细编码信息,以及数据格式,限于篇幅,这里不作具体介绍,感兴趣的,可以参看RFC文档,或与我交流。

二.RADIUS协议实现

目前,开源软件包freeRadius , tinyRadius,可以下载到其实现的源码。freeRadius是目前功能最强大的开源RADIUS 服务器软件,采用C语言实现,采用了多进程,进程池的处理方法,拥有很好的吞吐处理能力,同时,提供了连接各种数据库的应用接口,方便用户根据自己的需要进行适当的扩展。值得一提的是,它采用模块化处理,用户可以定做适合自己的认证计费处理模块。
freeRadius的功能强大,也造成了它模块的庞大,不易维护,对安装环境有一些要求。tinyRadius采用Java开发,短小精悍,能接收各种标准协议中的数据包,可以快速的完成对RADIUS数据包的封装与解包,我们可以自己的需要进行某些处理,具有很大的自由度,唯一的缺陷是单线程,没有数据库接口。

三.RADIUS协议对安全的考虑

RADIUS采用UDP协议基于以下几点原因:
1. NAS和RADIUS服务器大多在同一个局域网中,使用UDP更加快捷方便。
2. 简化了服务端的实现。
事实证明,采用UDP协议可行,RADIUS有自己的机制,来解决UDP丢包特点。
如果NAS向某个RADIUS服务器提交请求没有收到返回信息,那么可以要求备份RADIUS服务器重传。由于有多个备份RADIUS服务器,因此NAS进行重传的时候,可以采用轮询的方法。如果备份RADIUS服务器的密钥和以前RADIUS服务器的密钥不同,则需要重新进行认证。
下面重点从RADIUS协议来谈下它在身份认证中如何确保安全认证的。
1. Authenticator:鉴别码,分为请求鉴别码,回应鉴别码。
在“Access-Request”数据包中,Authenticator是一个16字节的随机数,称为“Request Authenticator”。 在机密的整个生存周期中(如RADIUAS服务器和客户端共享的机密),这个值应该是不可预测的,并且是唯一的,因为具有相同密码的重复请求值,使黑客有机会用已截取的响应回复用户。因为同一机密可以被用在不同地理区域中的服务器的验证中,所以请求认证域应该具有全球和临时唯一性。
为防止数据包中数据被截获被篡改,回应鉴别码采用如下方式生成:
ResponseAuth = MD5(Code+ID+Length+RequestAuth+ Attributes+Secret);
回应鉴别码是对整个数据包进行MD5演算产生的16字节索引,防止伪造服务器的回应。
2.加密方式。PAP,CAHP,EAP以及Unix登录认证三种加密认证方式。最常用的是前两种,下面介绍下:
PAP加密,采用此加密方法时,密码存放在User-Password属性中。
User-Password加密方法:
1.在密码的末尾用nulls代替填补形成多个十六个字节的二进制数;
2.把密码按16个字节为一组划分为p1、p2等等;
b1=MD5(Secret + Authenticator) c(1) = p1 异或 b1
b2 = MD5(S + c(1)) c(2) = p2 异或b2
bi = MD5(S + c(i-1)) c (i) = pi 异或 bi
c(1)+c(2)+...+c (i)
在接收时,这个过程被反过来,由于采用异或方式贯穿在每16个字节之间,同样的算法再异或一次,然后配合MD5演算,从而生成原始的密码,尽管这种加密方式是可逆的,黑客截获到密文后,能通过一定的手段来破解出密码,但如果共享密钥未知的情况下,很难破解,也就只能采用蛮力破解方法。使用共享密钥应采用合适的长度,来防止破解,不应过短。

PAP加密方法使密码以密文的方式在网络中进行传输,使黑客仍有有机可乘的机会,但CHAP加密方法阻止了密码的传输。
CHAP加密,采用此加密方法时,密码存放在Chap-Password属性中。
这种加密方法的原则是不是密码在网络中进行传输,而只是传输一个索引值,从而增加了安全性,但这样做的代价是,RADIUS服务端必须要知道用户的密码,从而再现密码索引值来和发来的认证请求中的密码索引值比对。
Chap-Password加密方法:
Md5(chapId+password+chapChallenge);
chapId :可以是随机产生的一字节码;
chapChallenge :NAS生成一个随机挑战字(16个字节比较合适)
该字段有时缺失,读取Authenticator域作为挑战字。
3.共享密钥(Secret):共享密钥在密码加密以及数据包的鉴别码部分都参与了运算,即使RADIUS数据包被截获,但不知道共享密钥,很难破解用户的密码伪造数据。共享密钥应采用合适的长度,不应过短,宽大密码范围能有效提供对穷举搜寻攻击的防卫,随着密钥长度的增加,其破解花费的时间将大大增加。
4.为防止非法用户的重放攻击,造成服务器瘫痪。如果在一个很短的时间片段里,一个请求有相同的客户源IP地址、源UDP端口号和标识符,RADIUS服务器会认为这是上一个重复的请求,将直接丢弃,不做任何处理。

四.总结

Radius协议本身比较易掌握,在应用中,可以结合其自身的密码方式,实现满足企业需要的更高强度的强认证,比如结合各种令牌卡,手机短信等等。对协议进行开发,离不开各种抓包工具,像sniffer,tcpdump,ethereal等抓包工具的使用。
外部用户要访问某局域网络中计算机设备,其访问方式有多种,比如采用VPN拨号,Telnet等等。如用户Telnet登陆时,产生用户名和密码信息,而NAS服务器AAA配置中指定了采用RADIUS作为认证服务器,则将其封装成RADIUS请求数据包发送到RADIUS服务器进行身份认证,RADIUS服务器通过NAS和用户进行交流,以提示用户认证通过与否,以及是否需要Challenge身份认证。

其工作原理为:用户接入NAS (Net Access Server),NAS一般为路由器等设备,NAS向RADIUS服务器使用Access-Request数据包提交用户信息,包括用户名、密码等相关信息,其中用户密码是经过MD5加密的,双方使用共享密钥,这个密钥不经过网络传播;RADIUS服务器对用户名和密码的合法性进行检验,必要时可以提出一个Challenge,要求进一步对用户认证,也可以对NAS进行类似的认证;如果合法,给NAS返回Access-Accept数据包,允许用户进行下一步工作,否则返回Access-Reject数据包,拒绝用户访问;如果允许访问,NAS向RADIUS服务器提出计费请求Account-Require,RADIUS服务器响应Account-Accept,对用户的计费开始,同时用户可以进行自己的相关操作。
RADIUS还支持代理和漫游功能。简单地说,代理就是一台服务器,可以作为其他RADIUS服务器的代理,负责转发RADIUS认证和计费数据包。所谓漫游功能,就是代理的一个具体实现,这样可以让用户通过本来和其无关的RADIUS服务器进行认证。
RADIUS能够实现其功能依赖于它自身的数据包结构。RADIUS采用的是UDP传输协议,认证和计费监听端口一般分别为:1812,1813。
以太网上的RADIUS封装后的包结构如下:
以太帧头|IP包头|UDP包头|RADIUS数据包|以太网FCS

在这里我们关心的是红色RADIUS数据包部分。
RADIUS数据包的格式如下:
2.gif

本文章由 http://www.wifidog.pro/2015/03/27/wifidog%E5%88%86%E6%9E%90-2.html整理编辑,转载请注明出处

wifidog配置linksys54g总结

最开始想用openwrt,刷了一个,结果发现不会用,里面配置太复杂了,被wan lan搞晕了,一直无法联网,因为在公司路由器本来在一个局域网下,没办法请公司SA帮忙弄了哈,也没有搞定,换DDWRT吧,这个可是有中文界面的,顿觉亲了很多。

ddwrt确实方便很多了,不过一定要注意呀,因为我要用WIFIDOG,之前下了几个版本都没有wifidog的配置,好像可以自己装,没试过,因为最开始测试用的wiwiz,下载到路由器上以后,没法安装,最后直接下了dd-wrt.v24_nokaid_generic.bin这个版本的ddwrt,上面可以直接配置wifidog.org相当的方便。

wifidog认证服务用authpuppy.org,web服务配置(nginx)。

if (!-e $request_filename) {
     rewrite ^(.*) /index.php last;
}

ddwrt => services => hotspot

171404_8zsx_234255.png

gateway id 这个很重要,认证服务需要这个。

服务器路径这个一定要注意哈,加/,这个最开始老是不对,研究了很久。发现原来路径里面少了一个/,导致无法访问到正确的认证接口,如果是路径的最后还要多加一个/哦。亲

认证服务配置

nodes页面里面加一个node,默认会有一个的啦。定义gw_id就是刚才ddwrt wifidog里面配置的那个。

然后去下载一个plugin,做验证的,apAuthLocalUserPlugin,就他了吧。安装以后里面可以配置,页面信息,注册等等。

现在客户端连接上你的WIFI,去测试下吧,应该可以了哦。亲。

下面说下自己开发wifidog服务端接口的问题。

我只实现了4个接口地址,不晓得其他的还有那些哈。E文看的不是很懂,需要的自己可以看http://dev.wifidog.org/wiki/doc/developer/WiFiDogProtocol_V1

/login 这个是连接的时候访问的登录接口 登录成功以后,返回一个302转向到http://gw_server:gw_port/wifidog/auth?token=你的token,这样子就可以了。至于是否需要用户名密码等等登录方法。看你自己咯

/auth 这个接口太重要,之前各种没法验证的原因都是因为没有访问到这个,路由器在刚才拿到login之后的token后,会再次访问这个接口,带上了一些其他参数如ip、MAC地址等等,当然也包括token,服务器端可以再次做验证,这个接口重要是的要返回给路由成功与否,结果如下:

Auth: Number

Number 如下:

0 - AUTH_DENIED - User firewall users are deleted and the user removed.
6 - AUTH_VALIDATION_FAILED - User email validation timeout has occured and user/firewall is deleted
1 - AUTH_ALLOWED - User was valid, add firewall rules if not present
5 - AUTH_VALIDATION - Permit user access to email to get validation email under default rules
-1 - AUTH_ERROR - An error occurred during the validation process

自己猜内容,我都是猜的。反正我返回的1,就对了。

/ping 这个接口很简单。返回结果内容包含Pong字符串就可以了。

/portal 哦。这个还是有点重要哦,是认证通过以后,路由器自动定向的页面,当然如果你需要返回到用户之前的页面,在/login接口的时候,路由器传入了一个url的地址,那个是用户真的想访问的地址。

本文章由 http://www.wifidog.pro/2015/03/25/wifidog%E9%85%8D%E7%BD%AE%E5%9C%A8linksys54g.html 整理编辑,转载请注明出处

wifidog配置,什么是wifidog认证功能?什么是wifidog?

wifidog是路由器的一种上网认证功能, 如果开启此功能, 所有通过路由器上网的设备(电脑,笔记本,手机等)都会跳转到指定的界面, 需要通过某种方式认证才可以上网.

具体这种wifidog功能路由器系统(固件)有DD-WRT ,OPEN-WRT等.
以DD-WRT 系统为例,可以在"服务--->热点" 找到WIFIDOG功能 ,如下图:

20131203110312_4727.jpg

本文章由 http://www.wifidog.pro/2015/03/25/wifidog%E9%85%8D%E7%BD%AE-4.html 整理编辑,转载请注明出处

wifidog如何判断用户不在线?

wifidog如何判断用户不在线?

    if (p1->counters.last_updated +
                        (config->checkinterval * config->clienttimeout)
                        <= current_time) {
        /* Timing out user */
        debug(LOG_INFO, "%s - Inactive for more than %ld seconds, removing client and denying in firewall",
                p1->ip, config->checkinterval * config->clienttimeout);
        fw_deny(p1->ip, p1->mac, p1->fw_connection_state);
        client_list_delete(p1);

        /* Advertise the logout if we have an auth server */
        if (config->auth_servers != NULL) {
                                UNLOCK_CLIENT_LIST();
                                auth_server_request(&authresponse, REQUEST_TYPE_LOGOUT, ip, mac, token, 0, 0, session_id);
                                LOCK_CLIENT_LIST();
        }

wifidog发送logout 请求的地方一个是客户端主动触发wifidog下线请求,另一个就在上述代码所述。
这段代码主要是用来判断客户端是否在一定时间内没上网,如果是,wifidog会将其踢出,然后告诉服务器这个客户端已经下线了。

这里可以改成客户端连接一段时间后再踢下线,同样可以改成发现用户没有连接路由器直接踢下线,后者需要用到arp 包来ping 客户端,前者只要在客户端连接之后加个上线时间再在上述代码的if 判断处改成当前时间减去上线时间即可。

本文章由 http://www.wifidog.pro/2015/03/25/wifidog%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E7%94%A8%E6%88%B7%E4%B8%8D%E5%9C%A8%E7%BA%BF.html 整理编辑,转载请注明出处