Привет, друзья! Этой статьей мы даем старт нашим публикациям на vc.ru по информационной безопасности!
Сегодня на повестке дня у нас тема «Как организуется защита процедуры аутентификации при организации удаленного доступа» на примере кейса с клиентом.
Условия и решения
Для защиты удаленного доступа собственных сотрудников, подрядчиков, внешних аудиторов к собственной инфраструктуре принято использовать VPN-решения. При этом доступ по VPN осуществляется под обычной доменной учетной записью. В случае компрометации пароля такой учетной записи (кража пароля, подбор пароля, передача пароля и т.д.) злоумышленник получает удаленный доступ к инфраструктуре организации. Чтобы снизить риски такого варианта развития событий — усложняется процедура доступа, то есть добавляется дополнительный фактор аутентификации.
Для решения задачи защиты процедуры аутентификации при организации удаленного доступа к нам обратился один из клиентов. Условия задачи были следующими:
- решение должно работать сегодня;
- российские коммерческие решения – это дорого, нужно что-то дешевле;
- решение должно поддерживать работу по протоколу RADIUS;
- решение должно использовать не устаревшие версии ПО;
- решение должно быть удобным в использовании.
Нами был предложен клиенту продукт на базе ПО с открытым исходным кодом LinOTP.
В российском сегменте Интернет есть статьи (1, 2, 3) по внедрению решения LinOTP. Берем их за основу, но адаптируем под текущие реалии: в качестве операционной системы мы будем использовать Astra Linux версии 1.7 (также нами успешно тестировался Debian 11), решение должно быть внедрено в отказоустойчивом состоянии, компоненты решения по максимуму должны быть разнесены на выделенные серверы, в качестве СУБД должна использоваться PostgreSQL.
Для начала стоит определиться из каких компонентов состоит LinOTP. В руководстве разработчика в соответствующем разделе приведена слишком размытая информация, поэтому по результатам изучения документации и приведенных выше статей нами определены следующие логические компоненты для вынесения на отдельные серверы:
1. LinOTP core, который обеспечивает выполнение следующих функций:
- взаимодействие со сторонними хранилищами данных пользователей для идентификации пользователей с целью предоставления доступа к токенам;
-
расчет значений OTP с использованием различных алгоритмов OTP;
-
аутентификация пользователей;
-
управление токенами;
-
интерфейс самообслуживания для пользователей;
-
управление платформой LinOTP.
2. СУБД PostgreSQL, которая используется для хранения настроек и информации о выпущенных токенах.
3. FreeRADIUS, обеспечивающий возможность выполнения:
- интеграция с клиентами по RADIUS протоколу (аутентификация);
-
переадресация запросов на аутентификацию от подключенных клиентов в LinOTP.
Архитектура системы в таком случае будет выглядеть так:
Балансировка обращений от VPN-шлюза (для защиты процедуры аутентификации в котором и используется LinOTP) до компонента FreeRADIUS обеспечивается механизмами VPN-шлюза (интеграция с 2 серверами FreeRADIUS).
Для балансировки обращений от FreeRADIUS к LinOTP core может использоваться любой веб-балансировщик, в нашем случае будет использоваться Nginx, устанавливаемый непосредственно на серверах FreeRADIUS.
Схема легко упрощается, если компоненты FreeRADIUS и LinOTP core разместить на одном сервере. В этом случае не понадобится решать вопрос балансировки обращений от FreeRADIUS к LinOTP Core.
Процедура установки и настройки компонент LinOTP по предложенной на схеме архитектуре
Установка LinOTP на серверах LinOTP:
1. На сервере с установленной Astra Linux 1.7 добавить репозиторий http://dist.linotp.org/debian/linotp3 и обновить список репозиториев
2. Установить пакеты LinOTP: linotp-archive-keyring и linotp
3. Скорректировать файл /usr/share/linotp/linotp.cfg, добавив в него строку вида:
, где linotpuser – пользователь postgresql с правами на БД, linotppass – пароль пользователя linotpuser, ip – ip-адрес сервера БД, linotp_db – название БД
4. Выполнить инициализацию БД:
5. Выключить AstraMode apache, установив в файле /etc/apache2/apache2.conf значение: AstraMode off
6. Рестартовать apache:
7. При необходимости переустановить портал:
8. Добавить администратора:
Создание базы данных на серверах СУБД
1. Начальные условия: СУБД PostgreSQL установлена и разрешает аутентификацию по паролю извне
2. Создать учетную запись linotpuser, назначить ей пароль linotppass
3. Создать БД linotp_db (encoding – UTF8)
Установка и настройка FreeRADIUS на серверах FreeRADIUS:
1. Установить freeradius и дополнительные пакеты: python-ldap, freeradius (тестирование проводилось с версией 3.0), python-passlib python-bcrypt, git, libtry-tiny-perl, libio-all-lwp-perl, libconfig-file-perl
2. Создать символические ссылки и конфигурационные файлы для freeradius:
3. Скопировать ветку git в каталог /root/
4. Создать каталог: /usr/share/linotp
5. Установить модуль аутентификации linotp:
6. Скопировать конфигурацию ниже в файл /etc/freeradius/sites-enabled/linotp:
7. В каталоге /etc/freeradius/sites-enabled/ удалить все кроме linotp
8. Настроить коннектор perl в качестве базы пользователей:
9. Создать ссылку для mods-enabled и удалить eap:
10. Создать конфигурацию коннекторов для проверки учетных данных, которые переданы в Radius:
11. Добавить информацию о VPN-шлюзе:
, где ipaddr – IP-адрес VPN-шлюза, secret – пароль, который также необходимо добавить в настройки интеграции VPN-шлюза и компонент FreeRADIUS LinOTP на стороне VPN-шлюза.
При использовании nginx на серверах FreeRADIUS необходимо скорректировать конфигурационный файл /etc/linotp2/rlm_perl.ini, поменяв в нем IP-адрес сервера LinOTP на IP текущего сервера FreeRADIUS (на котором 443 порт должен слушать nginx):
URL=http://validate/simplecheck
Для предотвращения конфликтов при использовании 2 серверов LinOTP необходимо скопировать ключ /etc/linotp/encKey с одного сервера LinOTP на другой.
В результате произведенных действий мы получаем готовую инсталляцию LinOTP в отказоустойчивом состоянии на серверах с ОС Astra Linux с использованием СУБД PostgreSQL. Интеграцию VPN-шлюза c LinOTP необходимо настроить в соответствии с инструкциями производителя VPN-шлюза (поддерживающего интеграцию по FreeRADIUS) с учетом секрета, заданного на этапе настройки компонента FreeRADIUS.
LinOTP готова к использованию, и можно разрабатывать для пользователей инструкцию по выпуску токенов и их применению при удаленном доступе по VPN в корпоративную сеть.
Настройка интеграции LinOTP с любым другим решением, например, системами класса PAM (контроль привилегированных пользователей), поддерживающим протокол FreeRADIUS, осуществляется аналогично.
LinOTP поддерживает работу с различными видами токенов (TOTP, SMS, PUSH и т.д.), позволяет настраивать политики по выпуску токенов, в том числе автоматизированному выпуску, обеспечивает возможность пользователям самостоятельно управлять токенами, регистрирует события аутентификации, уведомляет о таких событиях и многое-многое другое.
Если есть вопросы, не стесняйтесь и пишите в комментариях!
P.S Наша компания оказывает полный комплекс услуг по продукту LinOTP: проектирование, пуско-наладочные работы, техническая поддержка, сопровождение системы. Обращайтесь!