You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于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区块,添加权限规则。核心逻辑是:

  1. 调用LDAP模块拉取用户组信息
  2. 根据设备类型(用NAS-IdentifierNAS-IP-Address区分)和用户组,判断是否允许访问
  3. 允许则返回对应设备属性,拒绝则返回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

火山引擎 最新活动