NAS:网络接入点,比如路由器。在freeradius中,对应一个client配置。
用户: 接入NAS的用户,一般配置用户的密码,TOTP-Secret
等信息。既可以配置在users文件中,也可以配置在数据库中。
模块:freeradius中的一个功能,比如rest模块,sql模块, 在etc/raddb/mods-available/
模块配置信息,配置数据库的连接信息
site: 虚拟服务器,可以理解为监听一个端口,默认监听1812(认证)和1813(计费),比如你重新定义了一个新的site监听1821来服务需要二次验证的客户端。
目前支持的算法:SHA1, 间隔是30s,建议将其改成1分钟, ,上下文中没有TOTP-Secret
是不会执行totp认证的。
执行configure时需要安装
yum install mysql-devel
mysql --login-path=dev radius < schema.sql
insert into radcheck(username, attribute, op, value) values('Hg','TOTP-Secret',':=','yourKey');
yourKey是通过HmacSHA1
算法产生后使用base32
编码的key.
etc/raddb/mods-available/sql
添加连接信息
sql {
dialect = "mysql"
driver = "rlm_sql_mysql"
server = ""
port = 3306
login = ""
password = ""
radius_db = "radius"
read_clients = yes
client_table = "nas"
}
然后再site配置中添加sql
来查询
authorize {
sql
}
PAP使用request Authenticator对user-passwod加密后发送到服务器,
参考rfc2865.txt
b1 = MD5(S + RA) c(1) = p1 xor b1
b2 = MD5(S + c(1)) c(2) = p2 xor b2
. .
. .
. .
bi = MD5(S + c(i-1)) c(i) = pi xor bi
S: shared secret
RA: Request Authenticator
p1: 密码字节流按16字节拆分,(不足时补0)
The String will contain c(1)+c(2)+...+c(i)
所以PAP方式需要将密码发送到服务器。
而CHAP
cat <<'EOF' | /usr/local/freeradius/bin/radclient -x localhost:1812 auth testing123
User-Name = "javacoder"
CHAP-Password = "Hg@123"
EOF
radclient工具hash 后再发送
CHAP-Password=CHAP ID + MD5(CHAP ID, password, challenge)
服务器接收后,如果没有CHAP-Challenge
字段, 那么从request Authenticator
字段取challenge值,从指定的数据源获取user的密码,然后服务器也执行MD5(CHAP ID, password, challenge)
,然后比较两个hash值是否相等, 所以CHAP方式不需要传输密码
总结:
shared secret key
的强度, CHAP依赖用户secret强度。TL-WAR1200L
就不支持radius 报文格式
16:09:20.528537 IP localhost.57401 > localhost.1812: RADIUS, Access-Request (1), id: 0x9c length: 50
0x0000: 0000 0000 0000 0000 0000 0000 0800 4500
0x0010: 004e 4bd3 0000 4011 30ca 7f00 0001 7f00
0x0020: 0001 e039 0714 003a fe4d 019c 0032 cdb9
0x0030: 06c7 3aa8 7712 dd29 2d7c 6ada f23c 010b
0x0040: 6a61 7661 636f 6465 7203 13ea 2166 f486
0x0050: 7085 5846 7741 6364 4ea2 1d0f
16:09:20.528702 IP localhost.1812 > localhost.57401: RADIUS, Access-Accept (2), id: 0x9c length: 20
0x0000: 0000 0000 0000 0000 0000 0000 0800 4500
0x0010: 0030 4bd4 0000 4011 30e7 7f00 0001 7f00
0x0020: 0001 0714 e039 001c fe2f 029c 0014 106f
0x0030: 53cf 12f8 dc2f 8437 945d 39f8 85df
019c
前的是ip报文头和UDP报文头。
请求报文中的019c
中的01表示Access-Request,9c是ID, 0032
表示请求报文长度,接下来16字节是request Authenticator。接下来的010b
中01表示user-name的,0b表示用户字段长度。7203
中的03表示chap-password,13ea
13表示chap-password长度,ea
表示CHAP ID
,剩下的是chap-password
hash值。
RADIUS报文格式
TYPE(1)|ID(1)|LENGTH(2)|request Authenticator(16)|ATTRIBUTE....|
ATTRIBUTE格式
TYPE(1)|LENGTH(1)|CONTENT|
Access-Accept 类似,留给读者分析
计费默认是1813端口
sites-available/default 中默认已经有accounting配置包含listen,preacct,accounting section。
listen {
ipaddr = *
port = 1813
type = acct
}
preacct {
preprocess
acct_unique
suffix
files
}
accounting {
detail
unix
-sql
exec
attr_filter.accounting_response
}
发送测试报文
cat <<'EOF' | /usr/local/freeradius/bin/radclient -x localhost:1813 acct testing123
User-Name = "javacoder"
Class = "ai:6a617661636f6465720313ea2166f486"
Acct-Status-Type = "Accounting-On"
EOF
Posted in: 开源软件
Comments are closed.