- Начало работы
- Интеграция
- HTTP API
- OpenID Connect
- RADIUS протокол
- RADIUS адаптер
- LDAP адаптер
- Портал самообслуживания
- MULTIFACTOR Directory Sync
- Windows Logon
- Регистрация пользователей
- .NET Core
- 1с-Bitrix24
- 1с-плагин двухфакторной аутентификации
- ADFS
- ASP.NET
- Ansible AWX
- Atlassian Cloud
- BearPass
- Check Point VPN
- Cisco ASA VPN
- Citrix Gateway
- Deckhouse Stronghold
- Exchange ActiveSync
- FortiGate VPN
- HRBOX
- Huawei Cloud
- Huawei VPN
- Ideco
- Infrascope
- Grafana
- Keycloak
- Let's Encrypt Windows Server
- Linux logon (GUI/SSH)
- Linux SSH
- Linux SUDO
- Microsoft Entra ID
- MikroTik L2TP VPN
- NGate VPN
- Network Policy Server (NPS)
- Nextcloud
- OpenVPN
- OpenVPN + AD
- OpenVPN Access Server
- OpenVPN pfSense
- Outlook Web Access (OWA)
- Palo Alto GlobalProtect
- Passwork
- RD Gateway (RDGW)
- Redmine
- Starvault
- Solar SafeInspect
- UserGate VPN
- VMware Horizon Cloud
- VMware Horizon View
- VMware vCloud Director
- VMware vSphere
- Vault
- ViPNET
- Windows VPN
- WordPress
- Yandex.Cloud
- Yandex 360
- Zabbix
- АйТи-Бастион
- Континент 4 VPN
- МТС Линк (бывш. webinar.ru)
- С-Терра VPN
- Точка доступа Wi-Fi
- ФПСУ-IP/Клиент
RadiusV2 сервер для Linux
MULTIFACTOR RadiusV2 Adapter — программный компонент, RADIUS сервер для Linux.
Компонент доступен вместе с исходным кодом, распространяется бесплатно. Актуальная версия находится на GitHub: код и сборка (архив release_linux_V2.zip).
Важно
Текущая версия Radius-адаптера v2 не является финальной и может дорабатываться в будущем.
Лицензия
Обратите внимание на лицензию. Она не даёт вам право вносить изменения в исходный код Компонента и создавать производные продукты на его основе. Исходный код предоставляется в ознакомительных целях.
Требования для установки компонента
- Компонент устанавливается на Linux сервер, протестирован на CentOS, RHEL, Ubuntu, Debian, Astra Linux, REDOS.
- Минимальные требования для сервера: 1 CPU, 2 GB RAM, 8 GB HDD (обеспечивают работу ОС и адаптера для 100 одновременных подключений — примерно 1500 пользователей);
- На сервере должен быть открыт порт 1812 (UDP) для приема запросов от Radius клиентов;
- Серверу с установленным компонентом необходим доступ к хосту api.multifactor.ru по TCP порту 443 (TLS) напрямую или через HTTP proxy;
- Для взаимодействия с LDAP серверов (например Active Directory, FreeIpa или другие) компоненту нужен доступ к серверу домена по TCP порту 389 (схема LDAP) или 636 (схема LDAPS);
- Для взаимодействия с со сторонним Radius сервером (например Network Policy Server), компоненту нужен доступ к NPS по UDP порту 1812.
Установка
Установка библиотек
С данным компонентом используется среда выполнения ASP.NET Core runtime версии 8, которая является бесплатной, открытой, разрабатывается компанией Microsoft и Open-Source сообществом. Среда выполнения не накладывает никаких ограничений на использование.
Если ваша ОС не поддерживает ASP.NET Core runtime версии 8, использовать адаптер V2 не получится.
Для установки на Debian 12, Ubuntu 20.04/22.04,/24.04, Astra1.8, Alt Linux
wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb
Установите среду выполнения .NET 8
sudo apt-get update && sudo apt-get install -y aspnetcore-runtime-8.0
Установка библиотек liblber и libldap
sudo apt install libldap-2.5-0
Для установки на CentOS Stream 9
sudo dnf update -y sudo dnf upgrade -y sudo dnf install -y dotnet-runtime-8.0
Для установки на CentOS Stream 8
sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm sudo dnf install -y dotnet-runtime-8.0
Для установки на RHEL 8 и 9
sudo dnf install -y dotnet-sdk-8.0
Если команда выше не сработала, добавьте репозиторий вручную:
sudo dnf install -y wget sudo wget https://packages.microsoft.com/config/rhel/8/packages-microsoft-prod.rpm sudo rpm -Uvh packages-microsoft-prod.rpm sudo dnf install -y dotnet-sdk-8.0
Для установки на РЕД ОС
Для установки на РЕД ОС 7
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/8/packages-microsoft-prod.rpm sudo yum update -y sudo yum install -y dotnet-runtime-8.0
Для установки на РЕД ОС 8
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/8/packages-microsoft-prod.rpm sudo dnf update -y sudo dnf install -y dotnet-runtime-8.0
Если при запуске программ возникает ошибка:
Unable to load shared library ' libldap-2.4.so.2' or one of its dependencies
То это означает, что системе не хватает симлинков для корректного поиска библиотек.
Проверка наличия библиотек
Выполните команду:
ls -la /usr/lib/x86_64-linux-gnu | grep libldap ls -la /usr/lib/x86_64-linux-gnu | grep liblber
Вывод покажет, какие версии библиотек установлены и как они ссылаются друг на друга.
Если в системе не хватает симлинка libldap-2.4.so.2, создадим его:
sudo ln -s /usr/lib/x86_64-linux-gnu/libldap-2.5.so.2 /usr/lib/x86_64-linux-gnu/libldap-2.4.so.2
Аналогично для liblber:
sudo ln -s /usr/lib/x86_64-linux-gnu/liblber-2.5.so.2 /usr/lib/x86_64-linux-gnu/liblber-2.4.so.2
Важно
В РЕД ОС нужны библиотеки libldap-2.4 и liblber-2.4 поэтому для этой ОС симлинки будут выглядеть так:
sudo ln -s /usr/lib64/libldap-2.4.so.2 /usr/lib64/libldap-2.4.so.2 sudo ln -s /usr/lib64/liblber-2.4.so.2 /usr/lib64/liblber-2.4.so.2
В CentOS или RedHat-подобных дистрибутивах библиотеки обычно находятся в /usr/lib64/, поэтому команды будут такими:
sudo ln -s /usr/lib64/libldap-2.5.so.2 /usr/lib64/libldap-2.4.so.2 sudo ln -s /usr/lib64/liblber-2.5.so.2 /usr/lib64/liblber-2.4.so.2
Установка компонента
Создайте папку, скачайте и распакуйте актуальную версию компонента из 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_V2.zip sudo unzip release_linux_V2.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 nano /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.v2.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.service
Общие параметры
Для удобства дальнейшего расширения функциональности и упрощения диагностики проблем рекомендуем:
- Основной конфигурационный файл оставить стандартным (со значениями по умолчанию).
- Использовать шаблоны из папки
clientsдля настройки новых ресурсов.Преимущества такого подхода:
- Упрощает добавление новых ресурсов при необходимости расширения 2FA.
- Снижает риск ошибок конфигурации.
- Облегчает поиск и устранение неисправностей.
Этот подход обеспечит более структурированное и поддерживаемое решение.
Минимальная конфигурация Multifactor.Radius.Adapter.v2.dll.config:
<appSettings> . . . <!-- Адрес и порт (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"/> --> <!-- Уровень логирования: 'Verbose', 'Debug', 'Info', 'Warn', 'Error' --> <add key="logging-level" value="Debug"/> <!--<add key="logging-format" value="json"/>--> . . . </appSettings>
Настройка сетевых подключений
Идентификация клиентов
Для настройки каждого сетевого подключения к адаптеру используется отдельный конфигурационный файл с расширением .config, который должен находиться в папке /clients.
Идентификация клиента производится либо по IP адресу, либо по атрибуту NAS-Identifier. По IP удобно идентифицировать конфигурацию единичных сетевых устройств, например, межсетевых экранов. По NAS-Identifier – несколько однотипных, например, группу хостов с WinLogon или SSH.
<appSettings> . . . <!-- 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=""/> . . . </appSettings>
Если идентификация клиентов не требуется, можно сделать универсальные настройки в файле Multifactor.Radius.Adapter.v2.dll.config, которые будут применимы для всех подключений.
Важно
В параметре radius-shared-secret, не поддерживаются спецсимволы: (‘>’,'<‘,’&’,’#’), так как XML-парсер адаптера считает это частью разметки.
Проверка первого фактора в LDAP cервере.
Секция LdapServers содержит конфигурацию для подключения к одним или нескольким LDAP-каталогам (допустимо перечисление различных каталогов: ActiveDirectory, MultiDirectory, FreeIPA, OpenLDAP). Все параметры задаются внутри корневого элемента <ldapServers>
Чтобы обеспечить проверку первого фактора в LDAP-каталоге, настройте в клиентской конфигурации данный параметр в разделе appSettings:
<appSettings> . . . <!-- Где проверять первый фактор --> <add key="first-factor-authentication-source" value="Ldap"/> . . . </appSettings>
Пример минимальной конфигурации для ActiveDirectory, MultiDirectory, Samba
Необходимо задать секцию ldapServers, в которой необходимо создать секцию ldapServer, где указываются параметры каталога :
<ldapServers>
<!-- Настройки LDAP сервера -->
<ldapServer
connection-string="ldap://127.0.0.1:389"
username="CN=admin,CN=Users,DC=domain,DC=your"
password="password"
/>
</ldapServers>
Пример минимальной конфигурации для FreeIPA, OpenLDAP, ALD Pro
Необходимо задать секцию ldapServers, в которой необходимо создать секцию ldapServer, где указываются параметры каталога :
<ldapServers>
<!-- Настройки LDAP сервера -->
<ldapServer
connection-string="ldap://127.0.0.1:389"
username="UID=admin,CN=users,CN=accounts,DC=example,DC=local"
password="password"
/>
</ldapServers>
Обязательные параметры подключения
connection-string
Строка подключения к LDAP-каталогу. По умолчанию используется ldap протокол.
connection-string="ldap://127.0.0.1:389" connection-string="domain.your" connection-string="127.0.0.1" connection-string="ldaps://127.0.0.1:636"
username
Distinguished Name (DN) учетной записи службы, используемой для привязки (bind) к каталогу.
username="CN=admin1,CN=Users,DC=domain,DC=your"
password
Пароль для указанной учетной записи службы.
password="123456"
Параметр таймаута ответа от LDAP-каталога
bind-timeout-in-seconds
Время ожидания ответа от LDAP-каталога при операции привязки, в секундах. Значение по умолчанию: 30
bind-timeout-in-seconds="45"
Параметры разграничения доступа на основании политик для групп LDAP
access-groups
Список групп, пользователи которых имеют право проходить аутентификацию. Группы задаются в формате Distinguished Name через точку с запятой.
access-groups="CN=VPN Users,OU=groups,DC=domain,DC=your"
second-fa-groups
Пользователи только из этих групп будут проходить второй фактор. Группы задаются через точку с запятой в формате distinguished name.
second-fa-groups="CN=2FA Users,OU=groups,DC=domain,DC=your"
second-fa-bypass-groups
У пользователей только из этих групп не будет запрашиваться второй фактор. Группы задаются через точку с запятой в формате DN.
second-fa-bypass-groups="CN=2FA Bypass Users,OU=groups,DC=domain,DC=your"
authentication-cache-groups
Список групп, для пользователей которых будет кэшироваться результат успешного прохождения второго фактора. (см. кэширование аутентификации)
Параметры работы с группами
load-nested-groups
Определяет, необходимо ли загружать и проверять вложенные группы членства пользователя. Принимает значения true или false. Включение этой настройки может увеличить время обработки запроса.
load-nested-groups="true"
nested-groups-base-dn
Ограничивает поиск вложенных групп указанными контейнерами. Значения задаются в формате DN через точку с запятой. По умолчанию поиск осуществляется из корня каталога.
nested-groups-base-dn="CN=Users,DC=domain,DC=your;CN=admins,DC=domain,DC=your"
Параметры атрибутов пользователя
phone-attributes
Задает имена LDAP-атрибутов, из которых извлекается номер телефона пользователя. Атрибуты указываются через точку с запятой. Система использует первое непустое значение.
phone-attributes="mobile;phone"
identity-attribute
Использовать значение указанного атрибута как Identity для запроса в облако Multifactor. Допускается только одно значение. Если настройка не указана, то используется имя пользователя из RADIUS пакета.
Значение атрибута может быть любым существующим атрибутом в LDAP-каталоге.
identity-attribute="userPrincipalName" identity-attribute="mail" identity-attribute="sAMAccountName"
Параметр UPN
requires-upn
Требует, ввод логина в формате UPN (User Principal Name, например, user@domain.com). Принимает значения true или false. По умолчанию: false.
requires-upn="true"
Работа с несколькими доменами
Адаптер при запуске находит все домены и может проводить аутентификацию пользователя в любом из них.
Внимание
Если среда включает несколько доменов или домены, установите параметр
requires-upn="true". Это обеспечит корректную работу механизма поиска пользователей, предотвращая неоднозначность при разрешении имен.
Пример перечисления доменов:
<configuration>
<appSettings>
. . .
</appSettings>
. . .
<ldapServers>
<!-- Настройки LDAP сервера -->
<ldapServer
connection-string="ldap://127.0.0.1:389"
username="CN=admin,CN=Users,DC=domain,DC=your"
password="password"
requires-upn="true"
/>
<ldapServer
connection-string="ldap://192.168.0.1:389"
username="CN=admin,CN=Users,DC=domain1,DC=your"
password="password"
requires-upn="true"
/>
</ldapServers>
</configuration>
Проверка первого фактора во внешнем RADIUS сервере
Для проверки первого фактора в RADIUS, например, в Network Policy Server применимы следующие параметры:
<appSettings> . . . <!-- Где проверять первый фактор: 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; 193.168.0.10:1812"/> <!-- Время ожидания ответа от RADIUS сервера в формате hh:mm:ss. По умолчанию время ожидания 5 секунд --> <add key="nps-server-timeout" value="00:00:05" /> . . . </appSettings>
Важно
Если необходима проверка членства в LDAP группе или передача LDAP атрибута, то необходимо указать секцию
ldapServersи задать параметры длягруппилиатрибутов. По умолчанию передаётся атрибутnameи
Без проверки первого фактора
Адаптер может работать без проверки пароля пользователя, только со вторым фактором доступа. Для настройки используется следующая конфигурация клиента:
<appSettings> . . . <!--Где проверять первый фактор: None --> <add key="first-factor-authentication-source" value="None"/> . . . </appSettings>
Важно
Если необходима проверка членства в LDAP группе или передача LDAP атрибута, то необходимо указать секцию
ldapServersи задать параметры длягруппилиатрибутов. По умолчанию передаётся атрибутnameи
Проверка второго фактора перед первым
Адаптер может быть настроен на обязательное подтверждение второго фактора до проверки учетных данных в LDAP-каталоге.
В этом режиме, если пользователь не подтвердил свой второй фактор, адаптер не отправляет запрос на проверку логина и пароля в LDAP-каталог.
Это позволяет эффективно противостоять атакам перебора, так как неавторизованные попытки блокируются на более раннем этапе, до обращения к центральному каталогу, что, в том числе, предотвращает блокировку учетных записей в каталоге из-за превышения лимита неудачных попыток ввода пароля.
У данного параметра несколько вариантов значений: none, any, otp.
none
Обязательная проверка второго фактора до проверки учетных данных в LDAP-каталоге отключена. Проверка второго фактора будет проходит по стандартному сценарию.
any
Обязательная проверка подтверждения второго фактора до проверки учетных данных в LDAP-каталоге будет осуществлена любым из настроенных методов. (Push в мобильном приложении; Multifactor; push в Telegram; программные и аппаратные OTP токены; смс\звонок.)
otp
В режиме OTP пользователь должен ввести одноразовый пароль (OTP) вместе с паролем. Если пароль не требуется пользователю достаточно ввести только одноразовый пароль (OTP).
Пароль + OTP: mypassword123456 Только OTP: 123456
Важно
Данный параметр используется только вместе с
invalid-credential-delay.
<appSettings> . . . <!-- Проверка второго фактора перед первым. Варианты METHOD: "none", "any", "otp" --> <add key="pre-authentication-method" value="METHOD"/> <!-- Задержка ответа в секундах при отказе в доступе: случайная в интервале между 3 и 6 сек. (включая границы интервала) --> <add key="invalid-credential-delay" value="3-6" /> . . . </appSettings>
Подключение к серверу аутентификации
Для взаимодействия с серверами аутентификации MULTIFACTOR, которые отправляют второй фактор доступа, необходимо заполнить два параметра в конфигурации клиента:
<appSettings> . . . <!-- Параметр NAS-Identifier для подключения к API MULTIFACTOR - из личного кабинета --> <add key="multifactor-nas-identifier" value=""/> <!-- Параметр Shared Secret для подключения к API MULTIFACTOR - из личного кабинета --> <add key="multifactor-shared-secret" value=""/> . . . </appSettings>
Значения параметров необходимо взять из личного кабинета, в разделе «Ресурсы».
Разграничение IP-адресов
Данный параметр задаёт список допустимых IP адресов для обработки адаптером. Если AccessRequest пакет пришел не с адреса из настройки, то такой пакет игнорируется. Пакеты StatusServer будут обрабатываться в обычном режиме. Можно задавать конкретные IP, подсети, диапазоны адресов. Несколько значений задаются через точку с запятой.
Пример:
<appSettings> . . . <add key="ip-white-list" value="192.168.0.1; 127.0.0.1/16 ; 199.168.0.1-199.168.0.10"/> <add key="ip-white-list" value="192.168.0.1; 192.168.0.2"/> <add key="ip-white-list" value="199.168.0.1-199.168.0.10; 136.168.0.1-136.168.0.10"/> . . . </appSettings>
Дополнительные RADIUS атрибуты
При успешной аутентификации, в ответе клиенту компонент может передавать настраиваемые RADIUS атрибуты. Такие атрибуты обычно используются на сетевом оборудовании для разграничения прав доступа.
Атрибуты могут быть четырёх видов:
- Безусловные
- Условные: с проверкой вхождения пользователя в группу на сервере LDAP
- Условные: с проверкой имени пользователя
- С трансляцией значения атрибута LDAP в RADIUS.
Пример XML-синтаксиса файла конфигурации для передачи атрибута Class (RADIUS Attribute ID 25).
<configuration>
<!-- Параметры работы компонента -->
<appSettings>
. . .
</appSettings>
<!-- Параметры работы LDAP сервера -->
<ldapServers>
. . .
</ldapServers>
<!-- Настройка передачи дополнительных 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 атрибутов должно быть выполнено одно из условий:
- Указан источник первого фактора LDAP-каталог и задано название домена;
- Заданы параметры сервисной учётной записи LDAP-каталога, если источником первого фактора является RADIUS, или первый фактор не проверяется.
Кэширование аутентификации
Адаптер можно настроить на кэширование аутентификаций пользователей вторым фактором.
В этом режиме повторные запросы ранее аутентифицированных вторым фактором пользователей будут приняты без запроса второго фактора. Кэш действует в течение настраиваемого временного интервала.
Запрос является повторным, если параметры текущего запроса совпадают с параметрами предыдущего запроса.
Формат и допустимые значения:
- Диапазон: от
00:00:00до23:59:59 - Формат:
hh:mm:ss
Компоненты ключа: - CallingStationId: значение одноименного атрибута из RADIUS-запроса. Если атрибут отсутствует, используется IP-адрес клиента, полученный из UDP-пакета.
- configName: имя конфигурационного файла, применяемого к данному клиенту.
- UserName: имя пользователя из RADIUS-пакета (атрибут
User-Name).
Для настройки используется следующий параметр:
<appSettings> . . . <!-- Пропускать повторные аутентификации без запроса второго фактора в течение 1 часа 20 минут 10 секунд (максимальное значение 23:59:59, кэширование отключено, если удалить настройку) --> <add key="authentication-cache-lifetime" value="01:20:10" /> . . . </appSettings>
Максимальное значение для данного параметра 23:59:59.
Защита от сбоев
В случае недоступности (по любой причине) API MULTIFACTOR, адаптер может работать в одном из двух вариантов:
- Пропускать без второго фактора (по умолчанию)
- Отказывать в доступе
Для настройки используется следующий параметр:
<appSettings> . . . <!-- true: пропускать, false: запрещать --> <add key="bypass-second-factor-when-api-unreachable" value="true"/> . . . </appSettings>
Прочие параметры
Пользователям, регистрирующимся в системе через Radius адаптер, можно автоматически присваивать членство в группах MULTIFACTOR следующей настройкой:
<appSettings> . . . <add key="sign-up-groups" value="group1;Название группы 2"/> . . . </appSettings>
Дополнительные настройки безопасности и конфиденциальности:
<appSettings> . . . <!-- Отключить передачу адаптером ФИО, email, IP пользователей на сервер MULTIFACTOR --> <add key="privacy-mode" value="Full"/> <!-- можно указать перечень передаваемых атрибутов --> <add key="privacy-mode" value="Partial:Name,Email,Phone,RemoteHost"/> . . . </appSettings>
Настройка времени ожидания ответа API MULTIFACTOR:
<appSettings> . . . <!--Время ожидания ответа от api мультифактора, по умолчанию 65 секунд. Время в формате hh:mm:ss--> <add key="multifactor-api-timeout" value="00:01:05"/> <!--Если указываете время менее 65 секунд, используйте следующий синтаксис. Время в формате hh:mm:ss--> <add key="multifactor-api-timeout" value="00:00:45!"/> . . . </appSettings>
Запуск
После настройки конфигурации запустите компонент:
sudo systemctl start multifactor-radius
Статус можно проверить командой:
sudo systemctl status multifactor-radius
Дебаг
Логи старта приложения находятся в отдельном файле startup.logs в папке logs.
Для вывода причин неуспешного запуска адаптера используйте следующую команду:
/usr/bin/dotnet /opt/multifactor/radius/Multifactor.Radius.Adapter.v2.dll
Последующие изменения в файле конфигурации службы потребуют перезапуска подсистемы служб и службы:
sudo systemctl daemon-reload sudo systemctl restart multifactor-radius
Журналы
Журналы работы компонента записываются в syslog и сохраняются в текстовые файлы в директорию /opt/multifactor/radius/logs. Если директория пуста или ее нет, нужно убедиться, что у пользователя, под которым запускается служба, есть права на запись в эту директорию.
Уровень и формат логирования
Уровень и формат логирования необходимо настраивать в корневом файле конфигурации multifactor-radius-adapter.dll.config :
Существуют следующие уровни логирования:
- Verbose
- Debug
- Info
- Warn
- Error
Пример:
<add key="logging-level" value="Debug"/>
Существуют следующие форматы логирования:
- ElasticCommonSchema
- Json
- JsonUtc
- JsonTz
Пример:
<add key="logging-format" value="json"/>
Логирование ошибок запуска
При запуске системы активируется механизм логирования. Ошибки, возникающие на этапе запуска, дублируются в два потока вывода: в консоль и в файл startup.log, расположенный в папке logs.
Лог-файлы адаптеров подвергаются ротации с интервалом в 30 дней.
В процессе ротации старые логи удаляются и замещаются новыми.
Для просмотра содержимого syslog можно воспользоваться командой:
$ sudo less /var/log/syslog
Для просмотра журналов службы multifactor-radius используйте команду:
$ sudo journalctl -fu multifactor-radius
Запись журналов в SIEM
Для записи журналов работы адаптера в SIEM систему, добавьте в общие настройки следующие параметры:
<!-- Адрес и порт сервера, протокол может быть udp или tcp --> <add key="syslog-server" value="udp://syslog-server:514"/> <!-- Формат журнала: RFC3164 или RFC5424 --> <add key="syslog-format" value="RFC5424"/> <!-- Категория: User, Auth, Auth2, Local0 .. Local7 --> <add key="syslog-facility" value="Auth"/> <!-- Название приложения (tag) --> <add key="syslog-app-name" value="multifactor-radius"/>
Если syslog передаёт искаженные символы, нужно поменять следующую настройку на false (по умолчанию true):
<add key="syslog-use-tls" value="false" />
Обновление адаптера
- наличие компонента .Net версии 8
- остановить службу
- перезаписать файлы на новые (не заменяя конфигурационные файлы)
- включить службу обратно.
Необходимо будет вновь дать права на каталог с адаптером
sudo chown -R mfa: /opt/multifactor/radius/ sudo chmod -R 700 /opt/multifactor/radius/
Шаблоны журналов
Для настройки шаблона записи журналов используются следующие настройки в корневом файле конфигурации multifactor-radius-adapter.v2.dll.config:
<appSettings>
. . .
<!--
Примеры шаблонов:
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=""/> -->
. . .
</appSettings>
Подробнее о шаблонах: 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.
Переменные среды
Адаптер теперь поддерживает переменные среды: вы можете настроить адаптер, установив переменные среды ОС.
Такой подход имеет ряд преимуществ:
- независимость от файлов конфигурации: решает проблему возможной перезаписи файлов;
- более простая контейнеризация: просто установите набор переменных среды внутри контейнера;
- повышенная безопасность; конфиденциальные данные можно передавать через переменные без использования файловой системы
- Не нужно использовать файлы настроек .config (удалите их или оставьте со значениями по умолчанию.): любые настройки можно описать через переменные окружения.
файлы конфигурации
*.configВы можете продолжать использовать файлы конфигурации
*.config, если хотите.
При старте адаптер считывает конфигурацию из файла Multifactor.Radius.Adapter.v2.dll.config, а также из файлов *.config, находящихся в папке /clients.
После этого адаптер получает переменные из окружения и «накладывает» их поверх настроек, считанных из файлов: значения из переменных окружения перегружают значения из файлов настроек.
Примеры
Базовый синтаксис:
# Linux export VAR=VALUE # Windows (PowerShell) $Env:VAR = VALUE
VAR — имя переменной окружения, а VALUE — значение.
Директива export нужна, чтобы установить указанную переменную не только для текущей оболочки, но и для всех процессов, запускаемых из этой оболочки.
Чтобы передать в адаптер настройку через переменные окружения, нужно правильно указать имя.
Для передачи настройки в основной конфиг (Multifactor.Radius.Adapter.v2.dll.config) имя переменной должно выглядеть так:
export RAD_APPSETTINGS__FirstFactorAuthenticationSource=Ldap
RAD_ — префикс.
APPSETTINGS — секция в файле настроек.
FirstFactorAuthenticationSource — имя настройки.
__ — разделитель уровней вложенности. Регистр не важен.
Важно
Если название файла конфигурации содержит пробелы, при формировании имени для переменной окружения эти пробелы надо игнорировать:
my rad->myrad.
Альтернатива:
<appsettings> . . . <add key="first-factor-authentication-source" value="Ldap" /> . . . </appsettings>
Более сложный пример:
export RAD_RADIUSREPLY__ATTRIBUTES__ADD__0__NAME=Class export RAD_RADIUSREPLY__ATTRIBUTES__ADD__0__VALUE=users1
0 — это индекс (номер) элемента.
Альтернатива:
<RadiusReply>
<Attributes>
<add name="Class" value="users1" />
</Attributes>
</RadiusReply>
Чтобы передать настройку в клиентскую конфигурацию, нужно добавить имя конфигурации сразу после префикса _RAD. Например, для конфигурации, которая находится в файле my-rad.config имя переменной будет выглядеть так:
export RAD_my-rad_APPSETTINGS__FirstFactorAuthenticationSource=Ldap
Работа с несколькими адаптерами
При необходимости использования нескольких Radius адаптеров на одной машине, необходимо выполнить следующие действия.
Создайте директорию:
mkdir /opt/multifactor/radius1
Создайте системного пользователя mfa, если не был создан ранее:
sudo useradd -r mfa
Задайте ему права на новые директорию:
sudo chown -R mfa: /opt/multifactor/radius1/ sudo chmod -R 700 /opt/multifactor/radius1
Создайте файл службы systemd:
sudo nano /etc/systemd/system/multifactor-radius-1812.service
Далее его необходимо отредактировать следующим образом:
# /etc/systemd/system/multifactor-radius-1812.service [Unit] Description=Multifactor Radius Adapter (listening on UDP 1812) After=network.target [Service] Type=simple WorkingDirectory=/opt/multifactor/radius1/ ExecStart=/usr/bin/dotnet /opt/multifactor/radius1/Multifactor.Radius.Adapter.v2.dll Restart=always RestartSec=10 KillSignal=SIGINT TimeoutStopSec=30 User=mfa SyslogIdentifier=multifactor-radius-1812 Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target
После внесения всех изменений необходимо сохранить файл и перезапустить подсистемы служб:
sudo systemctl daemon-reload
Далее добавьте службу в автозагрузку:
sudo systemctl enable multifactor-radius-1812
После чего запустите службу:
sudo systemctl start multifactor-radius-1812
Кластерная конфигурация
При размещении компонента в кластерной конфигурации придерживайтесь схемы Active/Passive или выбирайте вариант, при котором повторный запрос с клиента будет обрабатываться тем же сервером.
Для наилучшей работы с nginx или HAProxy также укажите в настройках прокси-сервера заголовок proxy_protocol.
Дополнительная информация про Active Directory
- Для работы с Active Directory используется простая проверка подлинности пароля пользователя. Настоятельно рекомендуем использовать схему LDAPS для шифрования трафика между адаптером и доменом (на сервере AD должен быть установлен сертификат, в т.ч. самоподписанный).
Удаление компонента
Удаление .NET Core
Для просмотра списка установленных на вашей машине версий SDK и сред выполнения .NET Core используйте команду:
dotnet --info
Далее, выполните команды:
Ubuntu
Ubuntu 20.04
sudo apt-get remove aspnetcore-runtime-8.0
Ubuntu 22.04
sudo rm /usr/bin/dotnet sudo rm -r /usr/local/lib/dotnet/ sudo dpkg --purge 1.0.2n-1ubuntu5.10
Ubuntu 24.04
sudo rm /usr/bin/dotnet sudo rm -r /usr/local/lib/dotnet/ sudo dpkg --purge 1.0.2n-1ubuntu5.10
Debian 12
sudo apt-get remove aspnetcore-runtime-8
Astra
Astra Орёл
sudo apt-get remove dotnet-sdk-8.0
Astra Смоленск
sudo apt purge dotnet-* aspnetcore-*
CentOS stream 89
sudo dnf remove aspnetcore-runtime-8.0
RHEL 8/9
sudo dnf remove dotnet* aspnetcore* netstandard*
РЕД ОС 8
sudo dnf remove aspnetcore-runtime-8.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
Вопросы и ответы
В: Как ускорить проверку групп в LDAP-каталоге?
О: По умолчанию адаптер проверяет в том числе вложенные группы, то есть пользователь может состоять в группе или состоять в группе, которая состоит в группе, которую проверяет адаптер. Если запрос занимает более 100 миллисекунд, вы можете отключить проверку вложенности следующей настройкой:
load-nested-groups="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"/>