Проблема Freeradius с избыточной балансировкой нагрузки LDAP-Group - PullRequest
0 голосов
/ 01 октября 2019

Мне нужно назначить пользователю vlan, соответствующий группе в активном каталоге, после того как пользователь прошел аутентификацию через EAP-TLS. Я создал скрипт, который обрабатывает назначение vlan в /policy.d/vlan_assignment:

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

Все отлично работает, только с включенным модом включен только один ldap-сервер. Я хотел бы использовать функцию балансировки избыточной нагрузки, предлагаемую freeradius.

В разделе radius.conf, разделы модулей, я создаю конфигурацию двух серверов 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
        [...]
    }
        [...]
}

Но у меня есть следующая ошибка в политике. d / vlans_assignent при запуске freeradius -X:

Неизвестный атрибут 'LDAP-Group'

Я прочитал и искал решения, но не смог. Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 01 октября 2019

Это потому, что вы создали экземпляры модуля LDAP, поэтому имя атрибута LDAP-Group изменилось. Есть несколько способов решить эту проблему, но самый простой - дать указание модулю LDAP использовать один и тот же атрибут для всех его экземпляров, а затем заставить его получить полный список участников.

Для каждого модуля LDAP раскомментируйтеи установите cache_attribute таким же. Это можно просто установить на «LDAP-Group», если хотите.

Затем снова для каждого модуля LDAP раскомментируйте и установите для cacheable_dn значение «да».

Вам может потребоваться вызвать 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-state на update outer.session-state.

Другая потенциальная проблема, с которой вы можете столкнуться, это то, что вы перечисляете rlb_ldap в post-auth, но не переопределяете метод. Это означает, что когда вызывается rlb_ldap, он выполняет свои обычные обязанности после авторизации, которые изменяют объект пользователя в каталоге LDAP для записи в последний раз и затем вошли в систему.

Чтобы исправить это, измените свой вызов rlb_ldap наrlb_ldap.authorize, это приведет к тому, что вместо этого будет получена информация о членстве в группе.

...