В данной статье хотелось бы поделиться своим опытом по настройке freeradius в части поддержки различных типов аутентификации пользователей.

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

Итак, задача и ее решение:

ДАНО:


1) Сервер под управлением CentOS 6.6 с установленным пакетом freeradius (версия 2.1.12).
2) Сервер SAS (Safenet Authentication Service) для обеспечения двухфакторной аутентификации пользователей для radius.
3) Учетные записи пользователей хранятся на SAS сервере и в БД MySQL, развернутой на radius сервере.
4) Интеграция freeradius и SAS уже выполнена согласно инструкции и успешно работает, об этом писать в статье не буду.
5) Интеграция freeradius с MySQL также настроена.

ПРОБЛЕМА:


При включении модуля аутентификации SAS, radius прекращает аутентифицировать пользователей, учетки которых хранятся в MySQL (самого RADIUS).

Для интеграции freeradius и SAS используется дополнительный модуль challAvecAuth, который прописывается в раздел authorize и authenticate файла /etc/raddb/sites-enabled/default. И хотя все инструкции по freeradius утверждают, что читая секцию authorize радиус пытается аутентифицировать пользователя всеми перечисленными модулями по-очереди, на практике столкнулся с тем, что если в секции authorize появляется модуль challAvecAuth не зависимо от его места (в начале, в конце, в середине), он «заставляет» freeradius использовать только себя. ВСЕ остальные модули не срабатывают.

ЗАДАЧА:


Настроить аутентификацию пользователей user1 и user2 через SAS, а пользователей user3 и user4 через radius.

РЕШЕНИЕ:


Для решения данной задачи был использован встроенный в freeradius язык unlang. С помощью него было описано условие, согласно которому пользователи user1 и user2, состоящие в группе operators аутентифицируются через SAS, а пользователи user3 и user4, состоящие в группе admins – через сам radius. Информация о принадлежности пользователей группам хранится в БД MySQL равно как и логин – пароль пары пользователей user3 и user4.
Структура таблиц MySQL:
select * from radusergroup;

username	groupname	priority
user1	operators	0
user2	operators	0
user3	admins	0
user4	admins	0 

Select * from radcheck;

Id	username	attribute	op	Value
1	user3	Cleartext-Password	:=	User3pwd
2	user4	Cleartext-Password	:=	User4pwd

В файл /etc/raddb/sites-enabled/default в секцию authorize вносим правки:
1) Раскомментируем модуль sql (если еще не раскомментирован)
2) ПОСЛЕ модуля sql добавляем следующее условие проверки:
if (Sql-Group == admins) {
                pap
                }
        else {
                challAvecAuth
                }

3) И закомментируем отдельную строку
pap
В итоге секция authorize выглядит следующим образом:
authorize {
        preprocess
        chap
        mschap
        digest        
        suffix
        eap {
                ok = return
        }
        sql      
        expiration
        logintime
        if (Sql-Group == admins) {
                pap
                }
        else {
                challAvecAuth
                }
        }

Условие тут описано самое простое: если пользователь входит в группу admins, то его аутентифицирует модуль pap, если в любую другую группу — то challAvecAuth (т.е. SAS). Какие написать условия зависит только от задачи и Вашей фантазии.
4) Перезапускаем radius и получаем PROFIT!

Комментарии (0)