2015年3月

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 配置radius配置文件radiusd.conf分析

Radiusd.conf文件是freeradius的核心配置文件,其中设置了 服务器的基本信息, 配置文件与日志文件的环境变量,并详细配置freeradius模块所使用的信息, 与认证和计费所使用模块的配置. 配置的变量定义的形式为${foo},他们就在这个文件上,并且不随请求到请求而改变. 变量的格式参照 variables.txt.

1.1 环境变量
此处定义其他配置文件以及目录的位置,也就是环境变量

prefix = /usr/local

exec_prefix = ${prefix}

sysconfdir = ${prefix}/etc

localstatedir = ${prefix}/var

sbindir = ${exec_prefix}/sbin

logdir = ${localstatedir}/log/radius

raddbdir = ${sysconfdir}/raddb

radacctdir = ${logdir}/radacct

配置文件和日志文件的位置

confdir = ${raddbdir}

run_dir = ${localstatedir}/run/radiusd

日志文件的信息,添加到如下配置文件的底部

log_file = ${logdir}/radius.log

1.2 全局配置
模块的位置由 libdir来配置。

如果不能工作,那么你可以从新配置,从新Build源码,并且使用 共享库。

pidfile: Where to place the PID of the RADIUS server.

pidfile = ${run_dir}/radiusd.pid

user/group

如果有评论,服务器会运行 用户/组 启动它. 修改用户/组,必须具有root权限启动服务器

这里的含义是指定启动radius服务可以限定操作系统上的用户和组,但是不建议启动它.

#user = nobody

#group = nobody

最长请求时间(秒),这样的问题经常需要存在在应用SQL数据库时候,建议设置为5秒到120秒之间.

max_request_time = 30

当请求超过最长请求时间的时候,可以设置服务器删除请求.

当你的服务在threaded(线程下)运行,或者 线程池(thread pool) 模式,建议这里设置为no.

但用threaded 服务设置为yes时,有可能使服务器崩溃.

delete_blocked_requests = no

在 reply 发送给NAS后的等待清空时间. 建议 2秒 到 10秒

cleanup_delay = 5

服务器的请求最大数 ,建议值 256 到无穷

max_requests = 1024

让服务器监听某个IP,并且从次IP发送 相应 信息. 主要是为了 服务器同时具有多服务器时候使用.

bind_address = *

可以指定raidus的使用端口号,使用0表示使用默认的radius端口, 在配置文件 /etc/services配置.

port = 0

如果需要服务器同时监听其他的IP,可以用listen 块. 下面是例子

#listen {

# IP address on which to listen.

# Allowed values are:

# dotted quad (1.2.3.4)

# hostname (radius.example.com)

# wildcard (*)

# ipaddr = *

# Port on which to listen.

# Allowed values are:

# integer port number (1812)

# 0 means "use /etc/services for the proper port"

# port = 0

# Type of packets to listen for.

# Allowed values are:

# auth listen for authentication packets

# acct listen for accounting packets

#

# type = auth

#}

hostname_lookups大概是表示为NAS查找它的域名信息?可以通过域名配置NAS?

hostname_lookups = no

是否允许 core dumps.

allow_core_dumps = no

expressions支持,规则和扩展.

regular_expressions = yes

extended_expressions = yes

记录User-Name属性的全称.

log_stripped_names = no

是否记录认证请求信息到日志文件

log_auth = no

当请求被拒绝时记录密码, 当请求正确时记录密码

log_auth_badpass = no

log_auth_goodpass = no

是否允许用户名冲突,即重复同用户同时登陆.强烈不建议启用重复用户.

usercollide = no

将用户名 小写化, 将密码小写化.

lower_user = no

lower_pass = no

是否去除用户名和密码中的空格

nospace_user = no

nospace_pass = no

程序执行并发检查(不理解含义)

checkrad = ${sbindir}/checkrad

安全 配置 域

security {

指在Radius包中的最大属性数目.设置为0表示无穷大.

max_attributes = 200

发送 Access-Reject 包时候,可以设置一定的延迟,以缓慢DOS攻击,也可以缓慢穷举破解用户名和密码的攻击

reject_delay = 1

服务器是否对状态服务器的请求信息进行相应.

status_server = no

}

PROXY CONFIGURATION

代理域.

是否开启代理服务,具体配置参照 ${confdir}/proxy.conf

proxy_requests = yes

$INCLUDE ${confdir}/proxy.conf

Clients配置

$INCLUDE ${confdir}/clients.conf

是否启用snmp配置,具体配置文件在snmp.conf

snmp = no

$INCLUDE ${confdir}/snmp.conf

线程池 配置 域

thread pool {

启动时服务的个数.(在启动Mysql模块后可以明显看到.)当同时进行的请求数超过5个时,会增加线程服务.

start_servers = 5

最大的服务数

max_servers = 32

当少于最少空闲服务时,它会建立服务,大于最大空闲服务时会停止多余的服务.

最少空闲服务,与最大空闲服务.

min_spare_servers = 3

max_spare_servers = 10

每个server最大的请求数.当有内存漏洞时,可能需要配置.

max_requests_per_server = 0

}

1.3 模块配置
1.3.1 PAP 模块

# Supports multiple encryption schemes 支持多种加密方式

# clear: Clear text 明文

# crypt: Unix crypt Unix 加密

# md5: MD5 ecnryption MD5加密

# sha1: SHA1 encryption. SHA1加密

# DEFAULT: crypt 默认是Unix加密

pap {

encryption_scheme = crypt

}

1.3.2 CHAP模块
chap {

authtype = CHAP

}

1.3.3 PAM模块
PAM模块 (PAM) 是行业标准验证框架,

鉴于很多系统的PAM库都有内存漏洞,所以不建议使用。

pam {

pam_auth = radiusd

}

1.3.4 UNIX 系统用户的 认证模块
unix {

cache = no

cache_reload = 600

# passwd = /etc/passwd

# shadow = /etc/shadow

# group = /etc/group

radwtmp = ${logdir}/radwtmp

}

1.3.5 EAP模块
详细见${confdir}/eap.conf

$INCLUDE ${confdir}/eap.conf

1.3.6 MSCHAP 模块
mschap {

#use_mppe = no

#require_encryption = yes

#require_strong = yes

# 为了纠正window发送chap时有时包括域,有时又不包括域的信息.

#with_ntdomain_hack = no#ntlm_auth = "/path/to/ntlm_auth –request-nt-key –username=%{Stripped-User-Name:-%{User-Name:-None}} –challenge=%{mschap:Challenge:-00} –nt-response=%{mschap:NT-Response:-00}"

}

1.3.7 LDAP 配置 <SPAN style="FONT-SIZE: 9pt; COLOR:

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

wifidog无线认证RADIUS 配置指南

RADIUS 是通信网络中负责认证、鉴权、计费的服务节点。它通常和各种网络接入服务节点相连,如路由器、交换机、RAS、等各种网络接入服务器(NAS)。由于 RADIUS 和各种网络接入服务器是通过标准 RFC 协议进行连接交互,所以 RADIUS 和各种网络接入服务器的配置方法也非常相似,下面就以 WinRadius 和 3COM 公司的 RS 1500 进行举例说明。
出于安全性考虑,每个网络接入服务器(NAS)通常和两个 RADIUS 相连接,这两个 RADIUS 处于主备份关系,即 primary 和 secondary。网络接入服务器(NAS)和 RADIUS 之间的接口有两个:认证(accounting)接口、计费(authentication)接口。每个接口的配置参数主要都是:RADIUS IP、port、secret 三个。secret 是安全配置参数,只要网络接入服务器(NAS) 和 RADIUS 相同即可。
网络接入服务器(NAS)通常采用 Telnet 方式进行配置,您只需在 Windows、Linux/Unix 下运行 telnet 命令就可以启动 Telnet 连接,等连接到网络接入服务器(NAS)后,您只需输入相应的配置命令即可,例如:

  • 关闭 RADIUS 命令:disable accounting、disable authentication remote。
  • 打开 RADIUS 命令:enable accounting、enable authentication remote。
  • 配置 RADIUS 命令:set accounting、set authentication。
    主要配置参数为:
    primary_port
    primary_secret <"secret_string">
    primary_server [IP_address or host_name]
    retransmissions
    secondary_port
    secondary_secret <"secret string">
    secondary_server [IP_address or host_name]
    timeout [number_seconds]
  • 调试 RADIUS 命令:show accounting、show accounting settings、show
    authentication、show authentication settings

RADIUS 服务器的配置主要是 port、secret 两个。如果您的 RADIUS 服务器和多个网络接入服务器(NAS),而不同网络接入服务器(NAS)又使用了不同的 secret,这时您需要为每个网络接入服务器(NAS)指定对应的 secret,即在 WinRadius 的"配置/多重密钥"中指定即可。
另外,大多数网络接入服务器(NAS)都有简单的认证功能。但是几乎全部商用网络接入都需要配置 RADIUS 服务器来实现复杂的认证、鉴权、计费功能。

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