基于AD安全组的FreeRadius多组件认证访问控制配置问询
嘿,恭喜你已经搞定了AD+OTP的基础认证!你的思路完全没问题——post-auth阶段确实是处理这类基于用户组的权限控制的合适位置,咱们一步步来实现你要的功能:
第一步:确保LDAP模块能获取用户的AD安全组信息
既然你已经能通过AD认证,说明ldap模块已经配置好了,现在只需要在LDAP配置里添加组查询规则,让FreeRadius能拉取用户所属的AD安全组。
编辑/etc/raddb/mods-available/ldap文件,找到group区块(没有就新增),配置如下:
group { # 替换成你的AD组所在基础DN base_dn = "OU=SecurityGroups,DC=yourdomain,DC=com" # 过滤规则:匹配用户DN作为成员的组 filter = "(member=%{control:LDAP-User-DN})" # 查询范围:遍历子目录 scope = sub # 要获取的AD属性:memberOf会返回用户所有所属组的DN attribute = memberOf }
为了避免频繁查询AD影响性能,建议开启LDAP缓存,在同一个文件里找到cache区块启用:
cache { enabled = yes # 缓存有效期(秒) lifetime = 3600 # 最大缓存条目数 max_entries = 1000 }
配置完后,确保ldap模块已启用(未启用的话执行ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap)。
第二步:在post-auth阶段用unlang实现权限过滤
编辑/etc/raddb/sites-enabled/default,找到post-auth区块,添加权限规则。核心逻辑是:
- 调用LDAP模块拉取用户组信息
- 根据设备类型(用
NAS-Identifier或NAS-IP-Address区分)和用户组,判断是否允许访问 - 允许则返回对应设备属性,拒绝则返回
reject
示例配置如下:
post-auth { # 先调用LDAP模块获取用户的AD安全组 ldap # LDAP查询失败直接拒绝认证 if (!ok) { reject } # 处理交换机认证请求(假设交换机的NAS-Identifier设为"NETWORK_SWITCH") if (%{NAS-Identifier} == "NETWORK_SWITCH") { # 检查用户是否属于"Switch_Admin"安全组(替换成你的组DN) if ("%{ldap:memberOf}" =~ "CN=Switch_Admin,OU=SecurityGroups,DC=yourdomain,DC=com") { # 允许访问,返回交换机需要的属性(比如特权级别) update reply { Cisco-AVPair = "shell:priv-lvl=15" # 你之前测试的自定义VSA组也可以在这里设置 Your-Custom-VSA = "switch-group-admin" } } else { reject } } # 处理VPN认证请求(假设VPN的NAS-Identifier设为"VPN_GATEWAY") elsif (%{NAS-Identifier} == "VPN_GATEWAY") { # 检查用户是否属于"VPN_Access"安全组 if ("%{ldap:memberOf}" =~ "CN=VPN_Access,OU=SecurityGroups,DC=yourdomain,DC=com") { # 允许VPN访问,返回隧道属性(根据你的VPN设备调整) update reply { Tunnel-Type = VLAN Tunnel-Medium-Type = IEEE-802 Tunnel-Private-Group-ID = "VPN_VLAN_100" } } else { reject } } # 其他设备(防火墙、路由器)可以继续添加elsif分支 else { # 默认拒绝未匹配规则的设备请求 reject } }
第三步:测试验证
用radtest模拟不同设备的认证请求,比如测试交换机权限:
radtest -x your-ad-user "your-password+otp" localhost your-radius-secret 0 "NAS-Identifier=NETWORK_SWITCH"
如果用户属于Switch_Admin组,会返回Access-Accept并带上你设置的属性;不属于则返回Access-Reject。
一些注意事项
- 确保LDAP配置里的
bind_dn用户有权限读取AD的memberOf属性和组信息 - 如果用户属于多个组,
%{ldap:memberOf}会返回所有组DN,用=~做模糊匹配,需要精确匹配可改用== - 不同设备的
NAS-Identifier需要提前在设备上配置好,也可以用NAS-IP-Address区分设备
内容的提问来源于stack exchange,提问作者bwinchell




