Если вы настраиваете FreeRADIUS для аутентификации Wi-Fi-пользователей через локальные учетные записи Linux, будьте готовы к нюансам. Всё упирается в совместимость протоколов и правильную конфигурацию модулей – сейчас разберёмся, как избежать типичных ошибок и добиться рабочей схемы.
Почему PAM – не панацея для всех протоколов
Первое, что нужно понять: аутентификация через PAM (Pluggable Authentication Modules) работает только с определёнными типами EAP. Например, стандартный PEAPv0-MSCHAPv2, который часто используют в Windows, здесь не подойдёт – он требует хранения хэшей паролей в специфическом формате (MD4 без соли), чего /etc/shadow не предоставляет.
Ваши пользователи смогут работать только с:
- TTLS-PAP – требует ручной настройки клиентов (например, указания «внешнего» метода аутентификации в Android)
- PEAPv1-GTC – поддерживается не всеми ОС (на том же Windows нужны дополнительные шаги)
Если это приемлемо, двигаемся дальше. Если нет – придётся либо менять требования, либо рассматривать альтернативы вроде интеграции с LDAP.
Важно: Настройки
default
иinner-tunnel
сайтов в FreeRADIUS должны содержать толькоeap
в секциях authorize и authenticate. Убедитесь, что там нет упоминанийchap
,mschap
илиpap
– они конфликтуют с PAM.
Пошаговая настройка FreeRADIUS для работы с PAM
Начнём с базовой конфигурации. Предположим, у вас уже установлен FreeRADIUS 3.x на Raspberry Pi или другом Linux-сервере.
1. Редактируем файлы сайтов:
Перейдите в /etc/freeradius/3.0/sites-available/
. В default
и inner-tunnel
оставьте только то, что связано с EAP:
authorize {
eap # Только EAP — остальное закомментируйте
}
authenticate {
Auth-Type EAP {
eap
}
}
2. Настраиваем модуль PAM:
В /etc/freeradius/3.0/mods-available/
проверьте файл pam
. Должно быть:
pam {
service = "system-auth" # Или другое имя, если используете свой PAM-конфиг
}
Активируем модуль:
ln -s /etc/freeradius/3.0/mods-available/pam /etc/freeradius/3.0/mods-enabled/
3. Правим логику authorize:
В том же inner-tunnel
(или default
, если нужно глобально) добавьте проверку:
authorize {
...
if (!control:Auth-Type && request:User-Password) {
update control {
Auth-Type := pam
}
}
}
Это говорит FreeRADIUS: «Если тип аутентификации не определён, но есть пароль- используй PAM».
4. Добавляем обработку в authenticate:
Теперь в секции authenticate пропишите:
authenticate {
Auth-Type pam {
pam
}
# Остальные методы, если нужны (например, для MS-CHAP)
}
Как совместить PAM с другими методами аутентификации
Допустим, часть пользователей должна аутентифицироваться через PAM, а часть – через встроенные хэши. Для этого используйте файл users
в /etc/freeradius/3.0/
. Пример:
# Для пользователя 'admin' используем локальный хэш
admin Cleartext-Password := "secret"
# Для всех остальных — PAM
DEFAULT Auth-Type := pam
Но помните: если вы разрешаете MS-CHAPv2, пароли из PAM должны быть доступны в формате NT-хэша. Это противоречит идее «не знать пароли пользователей», поэтому лучше разделить методы.
Совет: Если в логах (
radiusd -X
) видите ошибку «No authenticator for user», проверьте, активирован ли модуль pam вmods-enabled
и правильно ли указан service в его конфиге.
Как разрешить пользователям менять пароли
FreeRADIUS сам не умеет менять пароли в системе, но это можно сделать через скрипты. Например, создать веб-интерфейс на PHP или Python, который вызывает passwd
от имени пользователя.
Более элегантный способ – использовать модуль rlm_perl для выполнения скриптов при определённых запросах. Пример сценария:
- Пользователь отправляет запрос на смену пароля через EAP-TTLS
- Perl-скрипт проверяет старый пароль через PAM
- Если всё верно – вызывает
system("echo 'новый_пароль' | passwd --stdin username")
Но будьте осторожны с правами! RADIUS-сервер должен работать от пользователя, имеющего право выполнять passwd
(например, через sudo без пароля).
Вариант для ленивых: Установите daloRADIUS – веб-интерфейс с функцией смены паролей. Он работает с базой данных, но можно настроить синхронизацию с системными пользователями через cron-скрипты.
Типичные ошибки и их решение
Ошибка: «Authentication rejected: Invalid password» при верном пароле | → Проверьте, включён ли модуль pam в mods-enabled . Убедитесь, что в PAM-сервисе (например, /etc/pam.d/system-auth ) нет ограничений. |
Ошибка: «No Auth-Type found» | → В секции authorize не срабатывает условие для Auth-Type. Попробуйте явно указать Auth-Type := pam в файле users для тестового пользователя. |
Ошибка: Клиент не поддерживает TTLS-PAP | → Для iOS/Android: Вручную выберите «PAP» в настройках сети. Для Windows: Установите сертификат CA в доверенные. |
Если после всех настроек аутентификация работает, но соединение обрывается – проверьте firewall. FreeRADIUS использует UDP-порты 1812 (авторизация) и 1813 (учёт). Команда для теста:
radtest username password localhost 0 testing123
Должна быть строка «Access-Accept». Если вместо этого «Access-Reject» – смотрите логи в реальном времени через radiusd -X
.
И последнее: если выбираете между «голым» FreeRADIUS и daloRadius – первый даёт больше гибкости, второй экономит время на базовые задачи. Но для глубокой интеграции с PAM и /etc/shadow лучше остаться на чистой конфигурации.