Двухфакторная аутентификация на открытом исходном коде

Привет, друзья! Этой статьей мы даем старт нашим публикациям на 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, добавив в него строку вида:

DATABASE_URI = ‘postgresql://linotpuser:linotppass@ip/linotp_db

, где linotpuser – пользователь postgresql с правами на БД, linotppass – пароль пользователя linotpuser, ip – ip-адрес сервера БД, linotp_db – название БД

4. Выполнить инициализацию БД:

linotp init database

5. Выключить AstraMode apache, установив в файле /etc/apache2/apache2.conf значение: AstraMode off

6. Рестартовать apache:

systemctl restart apache2

7. При необходимости переустановить портал:

apt remove linotp-selfservice

apt install linotp-selfservice

8. Добавить администратора:

linotp local-admins add test

linotp local-admins password test

Создание базы данных на серверах СУБД

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:

ln -s /etc/freeradius/3.0/sites-available /etc/freeradius/sites-available

ln -s /etc/freeradius/3.0/sites-enabled /etc/freeradius/sites-enabled

ln -s /etc/freeradius/3.0/clients.conf /etc/freeradius/clients.conf

ln -s /etc/freeradius/3.0/users /etc/freeradius/users

3. Скопировать ветку git в каталог /root/

git clone https://github.com/LinOTP/linotp-auth-freeradius-perl.git

4. Создать каталог: /usr/share/linotp

5. Установить модуль аутентификации linotp:

cp /root/linotp-auth-freeradius-perl/radius_linotp.pm /usr/share/linotp/radius_linotp.pm

6. Скопировать конфигурацию ниже в файл /etc/freeradius/sites-enabled/linotp:

server linotp {

listen {

ipaddr = *

port = 1812

type = auth

}

listen {

ipaddr = *

port = 1813

type = acct

}

authorize {

preprocess

update {

&control:Auth-Type := Perl

}

}

authenticate {

Auth-Type Perl {

perl

}

}

accounting {

unix

}

}

7. В каталоге /etc/freeradius/sites-enabled/ удалить все кроме linotp

8. Настроить коннектор perl в качестве базы пользователей:

nano /etc/freeradius/users

DEFAULT Auth-type := perl

nano /etc/freeradius/3.0/mods-available/perl

perl {

filename = /usr/share/linotp/radius_linotp.pm

func_authenticate = authenticate

func_authorize = authorize

}

9. Создать ссылку для mods-enabled и удалить eap:

ln -s /etc/freeradius/3.0/mods-available/perl /etc/freeradius/3.0/mods-enabled/perl

rm /etc/freeradius/3.0/mods-enabled/eap

10. Создать конфигурацию коннекторов для проверки учетных данных, которые переданы в Radius:

mkdir /etc/linotp2

nano /etc/linotp2/rlm_perl.ini

URL=https://validate/simplecheck

REALM=realm1

RESCONF=resolver1

Debug=True

SSL_CHECK=False

11. Добавить информацию о VPN-шлюзе:

nano /etc/freeradius/clients.conf

client VPN {

ipaddr = X.X.X.X

secret = your_secret

}

, где 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

REALM=realm1

RESCONF=resolver1

Debug=True

SSL_CHECK=False

Для предотвращения конфликтов при использовании 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: проектирование, пуско-наладочные работы, техническая поддержка, сопровождение системы. Обращайтесь!

 

Источник

Читайте также