Radius 深入浅出

8月 31, 2023 |

NAS:网络接入点,比如路由器。在freeradius中,对应一个client配置。
用户: 接入NAS的用户,一般配置用户的密码,TOTP-Secret等信息。既可以配置在users文件中,也可以配置在数据库中。
模块:freeradius中的一个功能,比如rest模块,sql模块, 在etc/raddb/mods-available/模块配置信息,配置数据库的连接信息
site: 虚拟服务器,可以理解为监听一个端口,默认监听1812(认证)和1813(计费),比如你重新定义了一个新的site监听1821来服务需要二次验证的客户端。

totp 二次验证

目前支持的算法:SHA1, 间隔是30s,建议将其改成1分钟, ,上下文中没有TOTP-Secret是不会执行totp认证的。

数据库mysql 存储客户信息

执行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和CHAP区别

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方式不需要传输密码
总结:

  1. PAP加密混淆后传输密码, 而CHAP只传输密码的hash值。
  2. PAP依赖shared secret key的强度, CHAP依赖用户secret强度。
  3. CHAP流程更复杂,有些设备不一定支持,比如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 类似,留给读者分析

accounting 计费功能

计费默认是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.