首页 > 解决方案 > 冗余负载平衡 LDAP 组的 Freeradius 问题

问题描述

在用户通过 EAP-TLS 进行身份验证后,我需要为用户分配与活动目录中的组对应的 vlan。我在 /policy.d/vlan_assignment 中创建了处理 vlan 分配的脚本:

vlan_assignment {
    if (LDAP-Group == "CN=radiusClient,CN=Users,DC=myGroup,DC=dom") {
        update reply {
    [...]
    }
}

仅在启用 mods 的情况下启用了一个 ldap 服务器时,一切都可以完美运行。我想使用freeradius提供的冗余负载平衡功能。

在 radius.conf 的 modules 部分,我创建了两个 ldap 服务器的配置:

modules {
    ldap server1 {
            server = 'SRVAD01'
            port = 389
           [...]
    }
    ldap server2 {
            server = 'SRVAD02'
            port = 389
           [...]
    }
}

并在实例化部分

instantiate {
    redundant-load-balance rlb_ldap {
        server1
        server2
    }   
}

与 ldap 服务器的连接仅发生在我的站点外隧道的 post_auth 部分。

server outer-tunnel {
    listen {
    [...]
    }
    authorize {
        filter_username
        preprocess
        auth_log
        suffix
        eap {
            ok = return
            updated = return
        }
        sql
        expiration
        logintime
        pap
    }
    authenticate {
        Auth-Type PAP {
            pap
        }
        pam
        eap
    }
    preacct {
        preprocess
        acct_unique
        suffix
    }
    accounting {
        detail
        unix
        sql
        exec
        attr_filter.accounting_response
    }
    session {
        sql
    }
    post-auth {
        update {
            &reply: += &session-state:
        }   
       #*****edit ****         
        rlb_ldap.authorize
        if (ok || updated) {
            update session-state {
                &LDAP-Group += &LDAP-Group[*]
            }
        }
        #********************
        vlan_assignment
        exec
        [...]
    }
        [...]
}

但是我在启动 freeradius -X 时在 policy.d/vlans_assignent 中有以下错误:

未知属性“LDAP 组”

我阅读并寻找解决方案但失败了。谁能帮我?

标签: ldapload-balancingfreeradiusredundancy

解决方案


这是因为您创建了 LDAP 模块的实例,所以 LDAP-Group 属性的名称已更改。有几种方法可以解决这个问题,但最简单的方法是指示 LDAP 模块对其所有实例使用相同的属性,然后让它检索完整的成员资格列表。

对于每个 LDAP 模块,取消注释并将cache_attribute设置为相同。如果需要,可以将其设置为“LDAP-Group”。

然后,对于每个 LDAP 模块,取消注释并将cacheable_dn设置为“yes”。

在尝试任何组检查之前,您可能需要调用 rlb_ldap 来预填充组信息,否则组检查只会命中一个 LDAP 或另一个,并且您不会获得冗余。

如果您使用 EAP,并在内部隧道中提取 LDAP 信息,则需要将组成员身份信息存储在会话状态列表中并在再次检查成员身份信息之前将其恢复。

要存储 LDAP 组信息:

ldap
if (ok || updated) {
    update session-state {
        &LDAP-Group += &LDAP-Group[*]
    }
}

要恢复它:

update request {
    update request {
        &LDAP-Group += &session-state:LDAP-Group[*]
    }
}

如果您在内部服务器中提取组信息,则需要更改update session-stateupdate outer.session-state.

您可能遇到的另一个潜在问题是,您在 post-auth 中列出了 rlb_ldap,但没有覆盖该方法。这意味着当 rlb_ldap 被调用时,它将执行其正常的身份验证后职责,即修改 LDAP 目录中的用户对象以记录最后一次登录的时间。

要解决此问题,请将您的 rlb_ldap 调用更改为rlb_ldap.authorize,这将导致检索组成员信息。


推荐阅读