Go to 2FA (Двухфакторная аутентификация для ASA SSL VPN)

Потребность предоставить удаленный доступ к корпоративной среде возникает все чаще и чаще, не важно, будь то свои пользователи или партнеры, которым необходим доступ к тому или иному серверу в вашей организации.

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

Моя компания не стала исключением, и мы так же, как и многие другие, пользуемся этой технологией. И, как многие другие, используем, в качестве шлюза удаленного доступа — Cisco ASA 55xx.

При возрастании количества удаленных пользователей появляется потребность в облегчении процедуры выдачи учетных данных. Но в то же время сделать это необходимо не в ущерб безопасности.

Для себя мы нашли решение в применении двухфакторной аутентификации для подключения по Cisco SSL VPN, с применением одноразовых паролей. И эта публикация расскажет, как организовать подобное решение с минимальными затратами по времени и с нулевыми затратами на необходимый софт (с условием, что Cisco ASA в вашей инфраструктуре уже имеется).

Рынок изобилует коробочными решениями для генерации одноразовых паролей, при этом предлагая массу вариантов по их получению, будь то отсылка пароля посредством SMS или использование токенов, как «железных», так и программных (к примеру на мобильном телефоне). Но тяга к экономии и желание сберечь денег для своего работодателя, в условиях нынешнего кризиса заставили меня найти бесплатный способ реализовать сервис по генерации одноразовых паролей. Который, при своей бесплатности, мало чем уступает коммерческим решениям (тут следует оговориться, отметив, что данный продукт имеет и коммерческую версию, но мы же договорились, что затраты, в деньгах, у нас будут нулевыми).

Итак, нам понадобятся:

— Образ Linux со встроенным набором инструментов — multiOTP, FreeRADIUS и nginx, для доступа к серверу по веб (http://download.multiotp.net/ — я использовал готовый образ для VMware)
— Сервер Active Directory
— Собственно Cisco ASA (я, для удобства, использую ASDM)
— Любой софтверный токен, поддерживающий механизм TOTP (Я, к примеру, использую Google Authenticator, но подойдет тот же FreeOTP)

Не стану вдаваться в подробности разворачивания образа. На выходе вы получите Debian Linux с уже установленными multiOTP и FreeRADIUS, настроенными для работы в связке и web-интерфейс для администрирования OTP.

Шаг 1. Инициируем систему и настраиваем под свою сеть
По умолчанию система поставляется с учетными данными root root. Думаю, все догадались, что неплохо было бы сменить пароль пользователя root, после первого логина. Так же необходимо поменять настройки сети (по умолчанию это ‘192.168.1.44’ c шлюзом ‘192.168.1.1’). После можно перезагрузить систему.

В Active Directory создадим пользователя otp, с паролем MySuperPassword.

Шаг 2. Настраиваем подключение и импортируем пользователей Active Directory
Для этого нам понадобится доступ в консоль, и, непосредственно файл multiotp.php, используя который мы настроим параметры подключения к Active Directory.

Переходим в директорию /usr/local/bin/multiotp/ и по очереди выполняем следующие команды:

./multiotp.php -config default-request-prefix-pin=0

Определяет, требуется ли наличие дополнительного (постоянного) пина при вводе одноразового пина (0 или 1)

./multiotp.php -config default-request-ldap-pwd=0

Определяет, требуется ли ввод доменного пароля при вводе одноразового пина (0 или 1)

./multiotp.php -config ldap-server-type=1

Указывается тип LDAP-сервер (0 = обычный LDAP-сервер, в нашем случае 1 = Active Directory)

./multiotp.php -config ldap-cn-identifier="sAMAccountName"

Указывает, в каком формате представлять имя пользователя (данное значение выведет только имя, без домена)

./multiotp.php -config ldap-group-cn-identifier="sAMAccountName"

То же самое, только для группы

./multiotp.php -config ldap-group-attribute="memberOf"

Указывает метод определения принадлежности пользователя к группе

./multiotp.php -config ldap-ssl=1

Использовать ли безопасное подключение к LDAP-серверу (конечно — да!)

./multiotp.php -config ldap-port=636

Порт для подключения к LDAP-серверу

./multiotp.php -config ldap-domain-controllers=adSRV.domain.local

Адрес вашего сервера Active Directory

./multiotp.php -config ldap-base-dn="CN=Users,DC=domain,DC=local"

Указываем, откуда начинать поиск пользователей в домене

./multiotp.php -config ldap-bind-dn="[email protected]"

Указываем пользователя, у которого есть права поиска в Active Directory

./multiotp.php -config ldap-server-password="MySuperPassword"

Указываем пароль пользователя, для подключения к Active Directory

./multiotp.php -config ldap-network-timeout=10

Выставляем таймаут для подключения к Active Directory

./multiotp.php -config ldap-time-limit=30

Выставляем ограничение по времени, на операцию импорта пользователей

./multiotp.php -config ldap-activated=1

Активируем конфигурацию подключения к Active Directory

./multiotp.php -debug -display-log -ldap-users-sync

Производим импорт пользователей из Active Directory

Шаг 3. Генерируем QR-код для токена
Здесь все предельно просто. Открываем веб-интерфейс ОТП-сервера в браузере, логинимся (не забываем сменить пароль для админа, установленный по умолчанию!), и нажимаем на кнопку «Print»:

Go to 2FA (Двухфакторная аутентификация для ASA SSL VPN)
Результатом этого действия будет страница, на которой содержится два QR-кода. Мы смело забиваем на первый из них (не смотря на привлекательную надпись Google Authenticator / Authenticator / 2 Steps Authenticator), и опять же смело сканируем второй код в софтверный токен на телефоне:

Go to 2FA (Двухфакторная аутентификация для ASA SSL VPN)
(да, я намеренно подпортил QR-код, чтоб сделать его нечитабельным).

После совершения данных действий у вас в приложении, каждые тридцать секунд, начнет генерироваться шестициферный пароль.

Для верности можно произвести проверку, в том же интерфейсе:

Go to 2FA (Двухфакторная аутентификация для ASA SSL VPN)
Вбив имя пользователя, и одноразовый пароль из приложения на телефоне. Получили положительный ответ? Значит двигаемся дальше.

Шаг 4. Донастраиваем и тестируем работу FreeRADIUS
Как я упоминал выше — multiOTP уже настроен для работы с FreeRADIUS, на остается провести тесты и внести в конфигурационный файл FreeRADIUS информацию о нашем VPN-шлюзе.

Возвращаемся в консоль сервера, в директорию /usr/local/bin/multiotp/, вводим:

./multiotp.php -config debug=1
./multiotp.php -config display-log=1

Включая тем самым более подробное логирование.

В конфигурационном файле клиентов FreeRADIUS (/etc/freeradius/clinets.conf) комментируем все строки, относящиеся к localhost и добавляем две записи:

client localhost {
        ipaddr = 127.0.0.1
        secret          = testing321
        require_message_authenticator = no
}

— для теста

client 192.168.1.254/32 {
        shortname =     CiscoASA
        secret =        ConnectToRADIUSSecret
}

— для нашего VPN-шлюза.

Перезапускаем FreeRADIUS и пробуем авторизоваться:

radtest username 100110 localhost 1812 testing321

где username = имя пользователя, 100110 = пароль, выданный нам приложением на телефоне, localhost = адрес RADIUS-сервера, 1812 — порт RADIUS-сервера, testing321 — пароль клиента RADIUS-сервера (который мы указали в конфиге).

Результатом данной команды станет вывод, примерно следующего содержания:

Sending Access-Request of id 44 to 127.0.0.1 port 1812
        User-Name = "username"
        User-Password = "100110"
        NAS-IP-Address = 127.0.1.1
        NAS-Port = 1812
        Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=44, length=20

Теперь нам необходимо удостовериться, что пользователь успешно прошел аутентификацию. Для этого мы заглянем в лог самого multiotp:

tail /var/log/multiotp/multiotp.log

И если последней записью там будет:

2016-09-01 08:58:17     notice  username  User    OK: User username successfully logged in from 127.0.0.1
2016-09-01 08:58:17     debug           Debug   Debug: 0 OK: Token accepted from 127.0.0.1

То все прошло успешно, и мы можем выполнить

Шаг 5. Настройка Cisco ASA
Условимся, что мы уже имеем настроенную группу и политики для доступа по SLL VPN, настроенную в связке с Active Directory, и нам необходимо добавить двухфакторную аутентификацию для данного профайла.

1. Добавляем новую группу серверов AAA:

Go to 2FA (Двухфакторная аутентификация для ASA SSL VPN)
2. Добавляем в группу наш multiOTP сервер:

Go to 2FA (Двухфакторная аутентификация для ASA SSL VPN)
3. Правим профайл подключения, выставив в качестве основного сервера аутентификации группу серверов Active Directory:

Go to 2FA (Двухфакторная аутентификация для ASA SSL VPN)
4. На вкладке Advanced -> Authentification так же выбираем группу серверов Active Directory:

Go to 2FA (Двухфакторная аутентификация для ASA SSL VPN)
5. На вкладке Advanced -> Secondary authentification выбираем созданную группу серверов, в которой прописан multiOTP-сервер. Отмечаем, что Session username наследуется из первичной группы серверов ААА:

Go to 2FA (Двухфакторная аутентификация для ASA SSL VPN)
Применяем настройки и

Шаг 6, он же последний
Проверяем, работает ли у нас двухфакторная аутентификация для SLL VPN:

Go to 2FA (Двухфакторная аутентификация для ASA SSL VPN)
Вуа-ля! При подключении посредством Cisco AnyConnect VPN Client так же будет запрашиваться второй, одноразовый, пароль.

Надеюсь, что данная статья поможет кому-то, и что кому-то она даст пищу для размышлений, как можно использовать данный, бесплатный ОТП-сервер, для других задач. Делитесь в комментариях, если будет желание.

Источник: habr.com