0x01 前言
最近在调试系统的时候发现新版的freeradius于freeradius 2有了很大的变化。我的系统使用自动登录脚本来登入系统获取数据,而freeradius则是验证软件。
为了控制系统负载不会太高,所以需要控制系统登录的优先级和同时登陆数。同时登陆数这个需要freeradius的支持。而我在freeradius 2中只需要简单地修改sql.conf文件即可启用,而freeradius 3则不是。
为了达到这需求,我们需要启用freeradius的Simultaneous Use Checking Queries功能。
0x02 准备
首先需要准备freeradius 3,安装并配置好。
在这里我使用mariadb,在freeradius中为mysql模块来存储用户数据。
要注意在数据库中的表radcheck。如果需要启用同时登陆数检测,并当超过阀值时能拒绝用户登入,则需要在此表中添加以下内容:
id username attribute op value 1 username Simultaneous-Use := 2
意思是当该用户目前的session为2时,如果再有登入请求则会拒绝:
Sending Access-Reject Id 255 from 127.0.0.1:1812 to 127.0.0.1:41568 Reply-Message := '\r\nYou are already logged in - access denied\r\n\n'
log:
log { stripped_names = no auth = no auth_badpass = no auth_goodpass = no colourise = yes msg_denied = "You are already logged in - access denied" }
0x03 注意
这里有一点非常重要,要设定一个时间间隔,定时向客户端发送心跳包,检测用户是否在线。如果用户不在线,则需要向freeradius发出请求,将该session删除。
我记得刚接触freeradius的时候没有配置心跳包,导致用户意外离线后session依然存在,然后需要手动将session删除。
0x04 启用
启用Simultaneous Use Checking Queries功能非常简单,修改以下文件即可:
#打开文件 [root@test ~]# vim /etc/raddb/mods-config/sql/main/mysql/queries.conf #定位到以下模块 Simultaneous Use Checking Queries #取消以下内容的注释 simul_count_query = "\ SELECT COUNT(*) \ FROM ${acct_table1} \ WHERE username = '%{SQL-User-Name}' \ AND acctstoptime IS NULL"
0x05 结语
其实可以将freeradius用在付费服务中,例如电信的PPPoE,当然,电信拥有更高端的服务实现这个功能。