Назад | Перейти на главную страницу

RADIUS-сервер: Хеширование пароля перед проверкой

Мне нужно настроить сервер RADIUS для аутентификации с помощью адаптивного портала pfSense. К сожалению, все пароли в базе данных RADIUS хешируются по определенному алгоритму. Я использую MySQL-базу данных.

Поскольку пользователь отправляет свои пароли в виде открытого текста на RADIUS-сервер, мне интересно, могу ли я хэшировать отправленный пароль на RADIUS-сервере, а затем проверить наличие имени пользователя и хешированного пароля.

Если этого можно избежать, я не хочу хешировать пароль на стороне клиента. Адаптивный портал pfSense в настоящее время является единственным приложением, использующим RADIUS-сервер. Но если я хочу расширить свою инфраструктуру, мне придется реализовать алгоритм хеширования на каждом клиенте.

Есть ли вообще возможность таким образом модифицировать RADIUS-сервер? Может с доработкой ядра? К сожалению, я не знаю, в каком файле отправленные данные ищутся в базе данных.

У кого-нибудь есть подсказка, где мне нужно искать?

(Я использую Ubuntu Server 12.04 x86, freeradius, freeradius-mysql)

Настройте экземпляр модуля rlm_sql.

Добавить запрос в authorize {} для получения хешированного пароля.

update control {
    <password-attribute> := "%{sql:SELECT password FROM foo_table WHERE user=%{User-Name}}"
}

Атрибут пароля может быть одним из следующих: Открытый текст-Пароль MD5-Пароль SMD5-Пароль Шифрованный пароль SHA2-Пароль SHA-Пароль SSHA-Пароль LM-Пароль NT-Пароль.

Затем позвоните в pap модуль. Модуль pap должен установить Auth-Type как pap и будет хешировать значение User-Password в соответствии со схемой, используемой для значения атрибута password, и сравнивать их.

В качестве альтернативы, если вы хотите использовать внешний скрипт PHP, вы можете поместить в авторизацию следующее:

authorize {
    update {
        Tmp-String-0 := `/usr/bin/php5 -f /path/to/cpauth.php '%{User-Name}' '%{User-Password}'`
    }

    if (Tmp-String-0 == 'Accept') {
        update control {
            Auth-type := Accept
        }
    }
    else {
        reject
    }
}

Затем повторите «Принять» или «Отклонить».