Перейти к основному содержимому

Radius сервер для Linux

MULTIFACTOR Radius Adapter — программный компонент, RADIUS сервер для Linux.

Компонент доступен вместе с исходным кодом, распространяется бесплатно. Актуальная версия находится на GitHub: код и сборка (архив release_linux_x64.zip).

Лицензия

Обратите внимание на лицензию. Она не дает вам право вносить изменения в исходный код Компонента и создавать производные продукты на его основе. Исходный код предоставляется в ознакомительных целях.

Требования для установки компонента

  • Компонент устанавливается на Linux сервер, протестирован на CentOS, RHEL, Ubuntu, Debian, Astra Linux, REDOS, ALT Linux, SUSE Linux;
  • Минимальные требования для сервера: 1 CPU, 2 GB RAM, 8 GB HDD (обеспечивают работу ОС и адаптера для 100 одновременных подключений — примерно 1500 пользователей);
  • На сервере должен быть открыт порт 1812 (UDP) для приема запросов от Radius клиентов;
  • Серверу с установленным компонентом необходим доступ к хосту api.multifactor.ru по TCP порту 443 (TLS) напрямую или через HTTP proxy;
  • Для взаимодействия с Active Directory, компоненту нужен доступ к серверу домена по TCP порту 389 (схема LDAP) или 636 (схема LDAPS);
  • Для взаимодействия с Network Policy Server, компоненту нужен доступ к NPS по UDP порту 1812.
Важно

В linux версиях компонентов не поддерживаются символы & и #

Установка

Установка библиотек

Компонент использует среду выполнения ASP.NET Core runtime версии 6, которая является бесплатной, открытой, разрабатывается компанией Microsoft и Open-Source сообществом. Среда выполнения не накладывает никаких ограничений на использование.

Для установки выполните команды:

$ sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
$ sudo yum install aspnetcore-runtime-6.0
https://docs.microsoft.com/ru-ru/dotnet/core/install/linux-centos

В случае возникновения ошибки Unable to load shared library 'ldap.so.2' or one of its dependencies необходимо поправить цепочку таким образом, чтобы симлинк libldap.so.2 в конечном итоге ссылался на конкретную библиотеку libldap-2.X.so.2.Y.Z

Пример: libldap.so.2 -> libldap-2.4.so.2 // это симлинк libldap-2.4.so.2 -> libldap_r-2.4.so.2 // это симлинк libldap_r-2.4.so.2 -> libldap_r-2.4.so.2.11.5 // это симлинк libldap_r-2.4.so.2.11.5 // это сама библиотека

Проверка и исправление симлинка Чтобы проверить симлинки, надо найти, где находится сама библиотека libldap, как правило, это директория /usr/lib/x86_64-linux-gnu.

Далее вводим команду ls -la и видим все файлы и симлинки. Ищем там, кто и как ссылается на libldap, какой ссылки не хватает и создаём её. Чаще всего не хватает одного симлинка - с libldap.so.2 на мажорную версию библиотеки. Создадим его:

Для Debian и Ubuntu
ln -s /usr/lib/x86_64-linux-gnu/libldap-2.4.so.2 /usr/lib/x86_64-linux-gnu/libldap.so.2
Для CentOS и REDOS
ln -s /usr/lib64/libldap_r-2.4.so.2.10.9 /usr/lib64/libldap.so.2
(Версии библиотек могут отличаться)

Аналогичные манипуляции проводим с библиотекой liblber

Установка компонента

Создайте папку, скачайте и распакуйте актуальную версию компонента из GitHub:

$ sudo mkdir /opt/multifactor /opt/multifactor/radius /opt/multifactor/radius/logs
$ sudo wget https://github.com/MultifactorLab/multifactor-radius-adapter/releases/latest/download/release_linux_x64.zip
$ sudo unzip release_linux_x64.zip -d /opt/multifactor/radius

Создайте системного пользователя mfa и дайте ему права на приложение:

$ sudo useradd -r mfa
$ sudo chown -R mfa: /opt/multifactor/radius/
$ sudo chmod -R 700 /opt/multifactor/radius/

Создайте файл службы systemd:

$ sudo vi /etc/systemd/system/multifactor-radius.service

Замените содержимое и сохраните файл:

[Unit]
Description=Multifactor Radius Adapter

[Service]
WorkingDirectory=/opt/multifactor/radius/
ExecStart=/usr/bin/dotnet /opt/multifactor/radius/multifactor-radius-adapter.dll
Restart=always
# Restart service after 10 seconds if the service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=multifactor-radius
User=mfa
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

# How many seconds to wait for the app to shut down after it receives the initial interrupt signal.
# If the app doesn't shut down in this period, SIGKILL is issued to terminate the app.
# The default timeout for most distributions is 90 seconds.
TimeoutStopSec=30

[Install]
WantedBy=multi-user.target

Включите автозапуск службы:

$ sudo systemctl enable multifactor-radius

Общие параметры

Общие параметры работы компонента хранятся в файле /opt/multifactor/radius/multifactor-radius-adapter.dll.config в формате XML.

Минимальная конфигурация:

<!-- Адрес и порт (UDP) по которому адаптер будет принимать запросы на аутентификацию от клиентов -->
<add key="adapter-server-endpoint" value="0.0.0.0:1812"/>

<!-- Адрес API MULTIFACTOR -->
<add key="multifactor-api-url" value="https://api.multifactor.ru"/>

<!-- Доступ к API MULTIFACTOR через HTTP прокси (опционально) -->
<!-- <add key="multifactor-api-proxy" value="http://login:password@proxy:3128"/> -->

<!-- Уровень логирования: 'Debug', 'Info', 'Warn', 'Error' -->
<add key="logging-level" value="Debug"/>

Настройка сетевых подключений

Идентификация клиентов

Для настройки каждого сетевого подключения к адаптеру используется отдельный конфигурационный файл с расширением .config, который должен находиться в папке /clients.

Идентификация клиента производится либо по IP адресу, либо по атрибуту NAS-Identifier. По IP удобно идентифицировать конфигурацию единичных сетевых устройств, например, межсетевых экранов. По NAS-Identifier – несколько однотипных, например, группу хостов с WinLogon или SSH.

<!-- IP адрес сетевого устройства, которое будет подключаться к адаптеру -->
<add key="radius-client-ip" value="10.10.10.10"/>
<!-- Или RADIUS атрибут NAS-Identifier, передаваемый с сетевого устройства при подключении к адаптеру -->
<add key="radius-client-nas-identifier" value="windows"/>
<!-- Shared secret, настроенный на сетевом устройстве -->
<add key="radius-shared-secret" value=""/>

Если идентификация клиентов не требуется, можно сделать универсальные настройки в файле multifactor-radius-adapter.dll.config, которые будут применимы для всех подключений.

warning

В параметре radius-shared-secret,не поддерживаются спецсимволы:('>','<','&'), так как XML-парсер адаптера считает это частью разметки.

Проверка первого фактора в Active Directory

Для проверки первого фактора в домене Active Directory, внесите в конфигурацию клиента следующие параметры:

<!-- Где проверять первый фактор: ActiveDirectory -->
<add key="first-factor-authentication-source" value="ActiveDirectory"/>

<!-- Домен: в текущем примере domain.local на сервере 10.0.0.4 -->
<add key="active-directory-domain" value="ldaps://10.0.0.4/DC=domain,DC=local"/>

<!-- Разрешать доступ только пользователям из указанной группы (не проверяется, если удалить настройку) -->
<add key="active-directory-group" value="VPN Users"/>
<!-- Запрашивать второй фактор только у пользователей из указанной группы (второй фактор требуется всем, если удалить настройку) -->
<add key="active-directory-2fa-group" value="2FA Users"/>
<!-- Не запрашивать второй фактор у пользователей из указанной группы (в том числе, если пользователь одновременно находится в группе, заданной в active-directory-2fa-group) -->
<add key="active-directory-2fa-bypass-group" value="Bypass 2FA Users"/>

<!-- Использовать номер телефона из Active Directory для отправки одноразового кода в СМС (не используется, если удалить настройку) -->
<!-- <add key="phone-attribute" value="mobile"/> -->

При включении параметра phone-attribute компонент будет использовать телефон, записанный в указанном LDAP-атрибуте пользователя. Формат телефона может быть любым.

Проверка первого фактора во внешнем RADIUS сервере

Для проверки первого фактора в RADIUS, например, в Network Policy Server применимы следующие параметры:

<!-- Где проверять первый фактор: Radius -->
<add key="first-factor-authentication-source" value="Radius"/>
<!-- Адрес (UDP), с которого адаптер будет подключаться к серверу -->
<add key="adapter-client-endpoint" value="0.0.0.0"/>
<!-- Адрес и порт (UDP) сервера -->
<add key="nps-server-endpoint" value="192.168.0.10:1812"/>

Без проверки первого фактора

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

<!--Где проверять первый фактор: None -->
<add key="first-factor-authentication-source" value="None"/>

Настройка сервисной учётной записи

Сервисная учётная запись необходима для проверки членства пользователей в группах Active Directory или для загрузки LDAP атрибутов в случае, если первый фактор проверяется в Radius или не проверяется (None).

Для подключения к домену необходимо задать домен и учётные данные сервисного пользователя.

<!-- Домен: в текущем примере domain.local на сервере 10.0.0.4 -->
<add key="active-directory-domain" value="ldaps://10.0.0.4/DC=domain,DC=local"/>
<!-- Логин сервисной учётной записи Active Directory для проверки членства пользователей в группах -->
<add key="service-account-user" value="service-account@domain.local"/>
<!-- Пароль сервисной учётной записи Active Directory для проверки членства пользователей в группах -->
<add key="service-account-password" value=""/>

Подключение к серверу аутентификации

Для взаимодействия с серверами аутентификации MULTIFACTOR, которые отправляют второй фактор доступа, необходимо заполнить два параметра в конфигурации клиента:

<!-- Параметр NAS-Identifier для подключения к API MULTIFACTOR - из личного кабинета -->
<add key="multifactor-nas-identifier" value=""/>
<!-- Параметр Shared Secret для подключения к API MULTIFACTOR - из личного кабинета -->
<add key="multifactor-shared-secret" value=""/>

Значения параметров необходимо взять из личного кабинета, в разделе "Ресурсы".

Дополнительные RADIUS атрибуты

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

Атрибуты могут быть четырех видов:

  1. Безусловные
  2. Условные: с проверкой вхождения пользователя в группу на сервере LDAP
  3. Условные: с проверкой имени пользователя
  4. С трансляцией значения атрибута LDAP в RADIUS.

Пример XML-синтаксиса файла конфигурации для передачи атрибута Class (RADIUS Attribute ID 25).

<configuration>
<!-- Объявление секции RadiusReply -->
<configSections>
<section name="RadiusReply" type="MultiFactor.Radius.Adapter.RadiusReplyAttributesSection, multifactor-radius-adapter" />
</configSections>

<!-- Параметры работы компонента -->
<appSettings>
...
</appSettings>

<!-- Настройка передачи дополнительных RADIUS атрибутов -->
<RadiusReply>
<Attributes>
<!-- Всегда передавать атрибут Class со значением Test1 -->
<add name="Class" value="Test1" />
<!-- Всегда передавать атрибут Class со значением из Ldap атрибута SampleLdapAttr -->
<add name="Class" from="SampleLdapAttr"/>
<!-- Передавать атрибут Class со всеми группами пользователя в Active Directory -->
<add name="Class" from="memberOf"/>
<!-- Передавать атрибут Class со значением Users, если пользователь входит в LDAP группу VPN Users -->
<add name="Class" value="Users" when="UserGroup=VPN Users"/>
<!-- Передавать атрибут Class со значением Admin, если имя пользователя SamlpeAdminName -->
<add name="Class" value="Admin" when="UserName=SamlpeAdminName"/>
</Attributes>
</RadiusReply>
</configuration>

Названия и значения атрибутов могут быть любыми, которые поддерживаются на вашем сетевом устройстве. Например, для передачи групп FortiGate можно использовать атрибут Fortinet-Group-Name. Словарь со всеми доступными атрибутами расположен в файле /opt/multifactor/radius/content/radius.dictionary.

Для передачи LDAP атрибутов должно быть выполнено одно из условий:

  • Указан источник первого фактора ActiveDirectory и задано название домена;
  • Заданы параметры сервисной учётной записи Active Directory, если источником первого фактора является RADIUS, или первый фактор не проверяется.

Кэширование аутентификации

Адаптер можно настроить на кэширование аутентификаций пользователей вторым фактором.

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

Запрос является повторным, если параметры текущего запроса совпадают с параметрами предыдущего запроса. Параметры:

  1. название клиентской конфигурации адаптера;
  2. calling-station-id (IP или Remote Host пользователя) — не может быть пустым;
  3. логин пользователя.

Для настройки используется следующий параметр:

<!-- Пропускать повторные аутентификации без запроса второго фактора в течение 1 часа 20 минут 10 секунд (кэширование отключено, если удалить настройку) -->
<add key="authentication-cache-lifetime" value="01:20:10" />

Защита от сбоев

В случае недоступности (по любой причине) API MULTIFACTOR, адаптер может работать в одном из двух вариантов:

  1. Пропускать без второго фактора (по умолчанию)
  2. Отказывать в доступе

Для настройки используется следующий параметр:

<!-- true: пропускать, false: запрещать -->
<add key="bypass-second-factor-when-api-unreachable" value="true"/>

Прочие параметры

Дополнительные параметры работы с Active Directory:

<!-- Отключить проверку вложенных групп в Active Directory (ускорение запроса) -->
<add key="load-active-directory-nested-groups" value="false"/>
<!-- Передавать атрибут userPrincipalName из Active Directory в качестве логина пользователя -->
<add key="use-upn-as-identity" value="true"/>
<!-- Передавать указанный атрибут из Active Directory в качестве логина пользователя -->
<add key="use-attribute-as-identity" value="mail"/>

Параметр use-upn-as-identity устарел, с версии 2.0.59 вместо него следует использовать use-attribute-as-identity.

Пользователям, регистрирующимся в системе через Radius адаптер, можно автоматически присваивать членство в группах MULTIFACTOR следующей настройкой:

<add key="sign-up-groups" value="group1;Название группы 2"/>

Дополнительные настройки безопасности и конфиденциальности:

<!-- Задержка ответа в секундах при отказе в доступе: случайная в интервале между 3 и 6 сек. (включая границы интервала) -->
<add key="invalid-credential-delay" value="3-6" />
<!-- Отключить передачу адаптером ФИО, email, IP пользователей на сервер MULTIFACTOR -->
<add key="privacy-mode" value="Full"/>

Настройка времени ожидания ответа API MULTIFACTOR (минимальный таймаут 65 секунд):

<add key="multifactor-api-timeout" value="00:01:05"/>

Запуск

После настройки конфигурации запустите компонент:

$ sudo systemctl start multifactor-radius

Статус можно проверить командой:

$ sudo systemctl status multifactor-radius

Последующие изменения в файле конфигурации службы потребуют перезапуска подсистемы служб и службы:

$ sudo systemctl daemon-reload
$ sudo systemctl restart multifactor-radius

Журналы

Журналы работы компонента записываются в syslog и сохраняются в текстовые файлы в директорию /opt/multifactor/radius/logs. Если директория пуста или ее нет, нужно убедиться, что у пользователя, под которым запускается служба, есть права на запись в эту директорию.

Для просмотра содержимого syslog можно воспользоваться командой:

$ sudo less /var/log/syslog

Для просмотра журналов службы multifactor-radius используйте команду:

$ sudo journalctl -fu multifactor-radius

Шаблоны журналов

Для настройки шаблона записи журналов используются следующие настройки в корневом файле конфигурации multifactor-radius-adapter.dll.config:

<!-- 
Примеры шаблонов:
1) [{Timestamp:HH:mm:ss} {Level:u3}] ext_ip={CallingStationId} {Message:lj}{NewLine}{Exception}
2) [{Timestamp:HH:mm:ss} {Level:u3}] {CorrelationId} {Message:lj}{NewLine}{Exception}
3) {Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {CorrelationId}{Message:lj}{NewLine}{Exception}
-->

<!-- Шаблон записи журналов в текстовый файл -->
<!-- <add key="file-log-output-template" value=""/> -->
<!-- Шаблон записи журналов в консоли -->
<!-- <add key="console-log-output-template" value=""/> -->

Подробнее о шаблонах: https://github.com/serilog/serilog/wiki/Formatting-Output.

Идентификатор корреляции

Для отслеживания событий на протяжении всей цепочки аутентификации пользователя используется идентификатор корреляции {CorrelationId}.

Значение идентификатора передается в формате "ConfigName-N", где

  • "ConfigName" - имя конфигурации клиента, который подключился
  • "N" - счетчик, который сбрасывается каждые сутки в 00:00.

Адрес удалённого клиента

Для записи названия хоста или IP удалённого пользователя используется шаблон {CallingStationId}.

Значение параметра последовательно проверяется в следующих RADIUS-атрибутах до первого непустого:

  • Calling-Station-Id;
  • MS-Client-Machine-Account-Name;
  • MS-RAS-Client-Name.

Кластерная конфигурация

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

Для наилучшей работы с nginx или HAProxy также укажите в настройках прокси-сервера заголовок proxy_protocol.

Дополнительная информация про Active Directory

  • Для работы с Active Directory используется простая проверка подлинности пароля пользователя. Настоятельно рекомендуем использовать схему LDAPS для шифрования трафика между адаптером и доменом (на сервере AD должен быть установлен сертификат, в т.ч. самоподписанный).

Удаление компонента

Удаление .NET Core

Для просмотра списка установленных на вашей машине версий SDK и сред выполнения .NET Core используйте команду:

dotnet --info

Далее, выполните команды:

$ sudo yum remove aspnetcore-runtime-6.0

Удаление адаптера

Остановите службу multifactor-radius, удалите её из автозапуска и удалите конфигурационный файл юнита:

$ sudo systemctl stop multifactor-radius
$ sudo systemctl disable multifactor-radius
$ sudo rm /etc/systemd/system/multifactor-radius.service

Перезагрузите настройки systemd, просканировав систему на наличие изменённых юнитов:

$ sudo systemctl daemon-reload

Удалите файлы адаптера и системного пользователя mfa:

$ sudo rm -rf /opt/multifactor/radius/
$ sudo userdel -r mfa

Вопросы и ответы

В: Где прописывается сервисная учетная запись для подключения к Active Directory?

О: Если проверка первого фактора осуществляется в Active Directory, сервисная учетная запись не используется. Адаптер подключается к AD от имени пользователя, который запрашивает аутентификацию.

В иных случаях, см. Настройка сервисной учётной записи.


В: Можно указать несколько групп AD для контроля доступа и условного включения второго фактора?

О: Да, перечислите их через точку с запятой.


В: Как ускорить проверку групп в Active Directory?

О: По умолчанию адаптер проверяет в том числе вложенные группы, то есть пользователь может состоять в группе или состоять в группе, которая состоит в группе, которую проверяет адаптер. Если запрос занимает более 100 миллисекунд, вы можете отключить проверку вложенности следующей настройкой:

<add key="load-active-directory-nested-groups" value="false"/>

В: Как указать несколько доменов или хостов DC?

О: Перечислите их через точку с запятой.


В: Адаптер может работать в режиме Radius proxy?

О: Да, при подключении к внешнему Radius серверу, адаптер работает в качестве прокси: транслирует трафик между сетевым устройством и внешним сервером без изменений.


В: Как указать несколько IP для идентификации клиента?

О: Можно перечислить адреса через точку с запятой, можно указать диапазон, можно комбинировать, например:

<add key="radius-client-ip" value="192.168.0.1-192.168.0.5; 192.168.0.10"/>

или так

<add key="radius-client-ip" value="10.0.0.0/24"/>