Двухфакторная аутентификация клиентов Cisco AnyConnect. FreeRadius и Google Authenticator

674584aa6b464846a05eb444a4da942c.png

В предыдущей статье я рассматривал настройку двухфакторной аутентификации пользователей для подключения к корпоративным ресурсам через 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:
056f2e9993fe4a84aeae6271d0e90da7.jpg

После этого необходимо перезапустить сервис FreeRadius:

sudo service freeradius restart


На мобильном устройстве должно быть установлено приложение Google Authenticator (ссылки для iOS и Android).

Сканируем QR code с помощью приложения Google Authenticator. В итоге учетная запись «mfatest» подвязывается к Вашему мобильному устройству.
6accfa4551f34ef9951ac19ce04c4c3f.jpg

Протестируем аутентификацию:

radtest   localhost 18120 testing123

Где:

  •  — это unix пароль + код из приложения в одну строку. В данном случае пароль Pass_123, код — 731923.
  • localhost 18120 testing123— это параметры стандартного локального radius клиента.


В итоге получается:

radtest mfatest Pass_123731923 localhost 18120 testing123


Если все настроено верно, в ответ должны получить что-то вроде:
aa76265fa4c546c08e0d4db8dd02701b.jpg

Настройка CISCO ASA


На ASA рекомендую настроить AnyConnect VPN gateway с локальной аутентификацией. Убедиться, что подключение работает, после чего приступить к настройке аутентификации через Radius.

Настраиваем RADIUS:

  1. Переходим на Configuration / Remote Access VPN / AAA/Local Users / AAA Server Groups и создаем группу:
    990692a4e4f34674bcc8ce5b3e4ee5a1.jpg
  2. Добавляем в группу сервер:
    cc9d4434d3134c1ea27b43175003123f.jpg
    Где Server Name or IP Address — это адрес нашего FreeRadius, Server Secret Key — ключ который мы настроили для клиента.
  3. Тестируем связку с RADIUS сервером:
    b15b1902913c480e92125bba80753205.jpg
    Где Password — это пароль пользователя + код из Google Authenticator


При успешном тесте, на ранее настроенном «AnyConnect Connection Profiles» меняем аутентификацию с локальной на группу FreeRad:
08df103d245a47dbbd88f59cf869c946.jpg

На этом настройки закончены. Чтобы убедится что все работает инициируем тестовое подключение.
e3db4caba714434c9eb8126ed1d1ce50.jpg

Вот здесь и появляется та неочевидность, о которой я говорил. FreeRadius не использует поэтапную аутентификацию, он не умеет (по крайней мере я не нашел) запрашивать код для Google Authentication отдельно. Поэтому для успешной аутентификации, как и в тестах, в строке Password мы вводим пароль+код. Для неискушенного пользователя это может стать преградой для комфортного использования сервиса.

Данная схема универсальна и может быть реализована для любых сервисов, поддерживающих аутентификацию посредством протокола Radius.

© Habrahabr.ru