В предыдущей статье я рассматривал настройку двухфакторной аутентификации пользователей для подключения к корпоративным ресурсам через Cisco AnyConnect на базе Active Directory и Microsoft Azure Multi-Factor Authentication Server (MFAS). Сегодня предлагаю Вам рассмотреть вариант с использованием FreeRadius и Google Authenticator.
Из плюсов данного варианта можно отметить только то, что это решение бесплатное.
К минусам можно отнести:
- Интеграция с AD. Конечно можно интегрировать FreeRadius с AD через LDAP, но особенности архитектуры данного решения предусматривают хранение профилей пользователей локально на FreeRadius сервере.
- Только один тип аутентификации – Time-Based One Time Password (TOTP).
- Неочевидность необходимости использования второго фактора (пояснения в статье).
Установка компонентов
Для установки FreeRaduis я использовал Debian Jessie 8.0 на виртуальной машине.
Ввиду того, что для авторизации будет использоваться TOTP, время на сервере должно быть правильным. Лучший способ синхронизировать время – установка NTP.
sudo apt-get update
sudo apt-get install ntp
Далее устанавливаем FreeRadius и необходимые модули: sudo apt-get install build-essential libpam0g-dev freeradius libqrencode3 git
Загружаем и устанавливаем Google Authenticator:cd ~
git clone https://code.google.com/p/google-authenticator/
cd google-authenticator/libpam/
make
make install
Также нам потребуется группа для пользователей, которых мы больше не хотим аутентифицировать: addgroup radius-off
Настройка FreeRadius
Так как FreeRadius должен иметь доступ к .google_authenticator токенам во всех пользовательских директориях, он должен иметь права root-а. Для предоставления прав редактируем файл /etc/freeradius/radusd.conf.
Находим строки:
user = freerad
group = freerad
И заменяем на: user = root
group = root
Здесь, и в дальнейшем, не забываем сохранять изменения. Далее редактируем /etc/freeradius/users. Мы должны добавить ранее созданную группу «radius-off» в секцию «Deny access for a group of users.»
После строк:
# Deny access for a group of users.
#
# Note that there is NO 'Fall-Through' attribute, so the user will not
# be given any additional resources.
#
Добавляем: DEFAULT Group == "radius-disabled", Auth-Type := Reject
Reply-Message = "Your account has been disabled."
DEFAULT Auth-Type := PAM
Теперь редактируем /etc/freeradius/sites-enabled/default.
Находим:
# Pluggable Authentication Modules.
# pam
И раскомментируем строку с pamРедактируем /etc/pam.d/radiusd. Говорим FreeRadius аутентифицировать пользователей по принципу локальный unix пароль + Google Authenticator код.
Здесь мы должны закомметнировать все строки которые начинаются с @:
#@include common-auth
#@include common-account
#@include common-password
#@include common-session
И добавляем: auth requisite pam_google_authenticator.so forward_pass
auth required pam_unix.so use_first_pass
Теперь нам нужно добавить Radius клиента, что бы FreeRadius обрабатывал запросы от CISCO ASA. В файл /etc/freeradius/clients.conf добавляем:Client 192.168.110.6 {
secret = Password
shortname = ASA
}
Настройка пользователя
Создаем пользователя:
adduser mfatest
Создаем для него google-authenticator:cd /home/mfatest/
su mfatest
google-authenticator
В ответ получаем QR code: После этого необходимо перезапустить сервис FreeRadius:
sudo service freeradius restart
На мобильном устройстве должно быть установлено приложение Google Authenticator (ссылки для iOS и Android).
Сканируем QR code с помощью приложения Google Authenticator. В итоге учетная запись «mfatest» подвязывается к Вашему мобильному устройству.
Протестируем аутентификацию:
radtest <username> <unix_password><google_auth> localhost 18120 testing123
Где:- <unix_password><google_auth> — это unix пароль + код из приложения в одну строку. В данном случае пароль Pass_123, код – 731923.
- localhost 18120 testing123– это параметры стандартного локального radius клиента.
В итоге получается:
radtest mfatest Pass_123731923 localhost 18120 testing123
Если все настроено верно, в ответ должны получить что-то вроде:
Настройка CISCO ASA
На ASA рекомендую настроить AnyConnect VPN gateway с локальной аутентификацией. Убедиться, что подключение работает, после чего приступить к настройке аутентификации через Radius.
Настраиваем RADIUS:
- Переходим на Configuration / Remote Access VPN / AAA/Local Users / AAA Server Groups и создаем группу:
- Добавляем в группу сервер:
Где Server Name or IP Address – это адрес нашего FreeRadius, Server Secret Key – ключ который мы настроили для клиента.
- Тестируем связку с RADIUS сервером:
Где Password – это пароль пользователя + код из Google Authenticator
При успешном тесте, на ранее настроенном «AnyConnect Connection Profiles» меняем аутентификацию с локальной на группу FreeRad:
На этом настройки закончены. Чтобы убедится что все работает инициируем тестовое подключение.
Вот здесь и появляется та неочевидность, о которой я говорил. FreeRadius не использует поэтапную аутентификацию, он не умеет (по крайней мере я не нашел) запрашивать код для Google Authentication отдельно. Поэтому для успешной аутентификации, как и в тестах, в строке Password мы вводим пароль+код. Для неискушенного пользователя это может стать преградой для комфортного использования сервиса.
Данная схема универсальна и может быть реализована для любых сервисов, поддерживающих аутентификацию посредством протокола Radius.
Комментарии (7)
DonAlPAtino
20.11.2015 09:27А если для ADшных пользователей создавать папки на сервер вручную не взлетит? Сорри — я не сталкивался пока с freeradius.
MazayZaycev
20.11.2015 10:13извините, не понял вопрос, можете подробнее?
DonAlPAtino
21.11.2015 16:11Я может совсем бред скажу :-). «FreeRadius должен иметь доступ к .google_authenticator токенам во всех пользовательских директориях». Т.е надо сначала аутентифицировать юзера в AD, затем проверить токен в пользовательской директории. Если создать эти директории для каждого AD юзера и положить туда токены — оно не взлетит? Если нет, то можно наверное еще в сторону самбы и nssswitch покопать…
DonAlPAtino
23.11.2015 09:09Я может совсем бред скажу :-). «FreeRadius должен иметь доступ к .google_authenticator токенам во всех пользовательских директориях». Т.е надо сначала аутентифицировать юзера в AD, затем проверить токен в пользовательской директории. Если создать эти директории для каждого AD юзера и положить туда токены — оно не взлетит? Если нет, то можно наверное еще в сторону самбы и nssswitch покопать…
VahMaster
С Active Directory связка не получилась?
MazayZaycev
Нет, не получилось для AD лучше использовать Azure, с Google Authenticator и FreeRadius можно еще попробовать cвязку с LinOTP habrahabr.ru/post/270571