Настройка FreeRADIUS для аутентификации через локальные учетные записи Linux

Если вы настраиваете 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 лучше остаться на чистой конфигурации.

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное