FreeRADIUS基于LDAP组实现访问控制及组属性配置的技术咨询
嗨,我来帮你搞定这个需求~ 要实现仅允许network-admins OU下的组成员访问,同时根据用户所属组返回不同属性,可以通过调整FreeRADIUS的LDAP模块配置和授权逻辑来实现,具体步骤如下:
一、确认LDAP组查询的基础配置
你当前的LDAP组配置已经有了正确的基础,再核对下关键参数:
group { base_dn = "ou=network-admins,ou=groups,${..base_dn}" filter = "(objectClass=groupOfNames)" name_attribute = "cn" membership_filter = "(member=%{control:Ldap-UserDn})" cacheable_name = yes }
这个配置会自动查询network-admins OU下所有groupOfNames类型的组,并匹配用户是否为组成员,cacheable_name=yes还能缓存组信息提升性能,没问题。
二、添加组访问控制逻辑(拒绝非授权用户)
需要在FreeRADIUS的authorize配置块中,先执行LDAP查询获取用户组信息,再检查用户是否属于授权组,不属于则直接拒绝。
打开你的radiusd.conf(或对应的站点配置文件),修改authorize部分:
authorize { # 先调用LDAP模块,查询用户信息及所属组 ldap # 检查用户是否属于network-admins下的任意授权组 if (!Ldap-Group) { reject update reply { Reply-Message = "您不属于授权组,无法访问。" } } }
这里的Ldap-Group是LDAP模块返回的用户所属组的属性,只要用户在network-admins下的任意组中,这个属性就会存在;反之则触发拒绝逻辑。
三、基于不同组配置专属属性
假设network-admins下有两个组(比如wifi-admins和vpn-admins),要给不同组返回不同的Radius属性,可以在authorize或post-auth块中添加条件逻辑:
示例配置(针对不同组设置属性)
authorize { # 前面的LDAP查询和组检查逻辑... # 给wifi-admins组设置WiFi相关属性 if (Ldap-Group == "wifi-admins") { update reply { Framed-IP-Address = 192.168.10.0/24 Framed-Netmask = 255.255.255.0 } } # 给vpn-admins组设置VPN相关属性 elsif (Ldap-Group == "vpn-admins") { update reply { Tunnel-Type = VLAN Tunnel-Medium-Type = IEEE-802 Tunnel-Private-Group-ID = 100 } } }
特殊情况处理(用户属于多个组)
如果用户同时属于多个授权组,可以用=~匹配符来判断组是否存在,比如:
if ("wifi-admins" =~ Ldap-Group) { # 叠加WiFi属性 update reply { Framed-IP-Address = 192.168.10.0/24 } }
四、测试验证配置
配置完成后,重启FreeRADIUS服务,然后用radtest命令测试:
radtest 测试用户名 测试密码 localhost 0 你的Radius密钥
同时查看FreeRADIUS的日志(一般在/var/log/radius/radius.log),确认组信息是否正确获取、属性是否正常返回,以及非授权用户是否被拒绝。
备注:内容来源于stack exchange,提问作者Kristof Rado

