В данной статье хотелось бы поделиться своим опытом по настройке 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:
В файл /etc/raddb/sites-enabled/default в секцию authorize вносим правки:
1) Раскомментируем модуль sql (если еще не раскомментирован)
2) ПОСЛЕ модуля sql добавляем следующее условие проверки:
3) И закомментируем отдельную строку
pap
В итоге секция authorize выглядит следующим образом:
Условие тут описано самое простое: если пользователь входит в группу admins, то его аутентифицирует модуль pap, если в любую другую группу — то challAvecAuth (т.е. SAS). Какие написать условия зависит только от задачи и Вашей фантазии.
4) Перезапускаем radius и получаем PROFIT!
К сожалению, столкнувшись с данной проблемой, я не смог найти готового решения на просторах гуглов и прочих яндексов, и поэтому раскуривал маны самостоятельно.
Итак, задача и ее решение:
ДАНО:
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!