Оглавление
MULTIFACTOR SelfService Portal — веб-сайт, портал самообслуживания для пользователей LDAP, единая точка входа (Single Sign-On) для корпоративных приложений по протоколам аутентификации SAML, OpenID Connect / OAuth.
Портал доступен вместе с исходным кодом, распространяется бесплатно по лицензии MIT. Актуальная версия находится на GitHub: код и сборка (архив MultiFactor.SelfService.Linux.Portal.zip).
Ограничения Linux версии
- Не поддерживаются кириллические пароли;
- Не поддерживается проверка логина и пароля в нескольких доменах Active Directory, если между ними настроены доверительные отношения.
Установка библиотек
Компонент использует среду выполнения ASP.NET Core runtime версии 8.0, которая является бесплатной, открытой, разрабатывается компанией Microsoft и Open-Source сообществом. Среда выполнения не накладывает никаких ограничений на использование.
Для установки выполните команды:
**Для Debian 12 , Ubuntu 20.04/22.04/24.04 и Astra 1.8:**
apt-get install unzip
apt install net-tools
cd /tmp
mkdir install
cd /tmp/install
sudo unlink /etc/resolv.conf
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
sudo systemctl restart systemd-resolved.service
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
Делам симлинк
ln -s /usr/lib/x86_64-linux-gnu/libldap ДОБИТЬ ТАБОМ /usr/lib/x86_64-linux-gnu/libldap.so.2
В случае возникновения ошибки 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 // это сама библиотека
Ошибка которая может появится в будущем при старте ssp приложения
Ошибка System.DllNotFoundException: Unable to load shared library ‘ldap.so.2’ or one of its dependencies. In order to help diagnose loading problems, consider using a tool like strace. If you’re using glibc, consider setting the LD_DEBUG environment variable:
cd /usr/lib/x86_64-linux-gnu
grep libldap*
grep: libldap-2.5.so.0.1.7: binary file matches
ln -s /usr/lib64/libldap-2.5.so.0.1.7 /usr/lib64/libldap.so.2
Установка компонента
Создайте папку, скачайте и распакуйте актуальную версию компонента из GitHub:
Создайте системного пользователя mfa и дайте ему права на приложение:
sudo mkdir /opt/multifactor /opt/multifactor/ssp /opt/multifactor/ssp/app /opt/multifactor/ssp/key-storage
sudo wget https://github.com/MultifactorLab/multifactor-selfservice-portal/releases/latest/download/MultiFactor.SelfService.Linux.Portal.zip
sudo unzip MultiFactor.SelfService.Linux.Portal.zip -d /opt/multifactor/ssp/app
sudo useradd mfa
sudo chown -R mfa: /opt/multifactor/ssp
sudo chmod -R 700 /opt/multifactor/ssp
Создайте файл службы systemd:
sudo nano /etc/systemd/system/ssp.service
[Unit]
Description=Self Service Portal
[Service]
WorkingDirectory=/opt/multifactor/ssp/app
ExecStart=/usr/bin/dotnet /opt/multifactor/ssp/app/MultiFactor.SelfService.Linux.Portal.dll
Restart=always
RestartSec=10
KillSignal=SIGINT
TimeoutStopSec=90
SyslogIdentifier=ssp-service
User=mfa
Environment=ASPNETCORE_ENVIRONMENT=production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
Включите автозапуск службы:
sudo systemctl enable ssp.service
Настройка Nginx
Установите Nginx:
sudo apt-get install nginx
sudo service nginx start
Перейдите в браузере по адресу http://<server_IP_address>/index.nginx-debian.html
и убедитесь, что отображается стандартная страница Nginx.
Настройте nginx в режиме реверс-прокси. Откройте файл /etc/nginx/sites-available/ssp
:
sudo nano /etc/nginx/sites-available/ssp
server {
# DNS имя сервера с порталом
server_name mfa.mycompany.ru;
location / {
# http://<host>:<port> Kestrel
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
listen 80;
}
Затем активируйте конфигурацию, создав символическую ссылку на ваш пользовательский конфигурационный файл ssp
в каталоге sites-enabled
, конфигурации из которого Nginx считывает во время запуска:
sudo ln -s /etc/nginx/sites-available/ssp /etc/nginx/sites-enabled/
Для проверки конфигурации выполните:
sudo nginx -t
Если конфигурация верна, примените ее:
sudo nginx -s reload
По умолчанию прокси-сервер работает с незащищенным http-соединением.Для корректной работы требуется установить сертификат и настроить https, файл /etc/nginx/sites-available/ssp
должен выглядеть следующим образом:
nano /etc/nginx/sites-available/ssp
mfa.mycompany.ru замените на ваш домен
server {
server_name mfa.mycompany.ru;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# слушать порт 443
listen 443 ssl;
# настройки ssl
ssl_certificate /etc/ssl/certificate.pem;
ssl_certificate_key /etc/ssl/key.pem;
#include /etc/letsencrypt/options-ssl-nginx.conf;
#ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
# резервный сервер для перенаправления запросов http на https
server {
if ($host = mfa.mycompany.ru) {
return 301 https://$host$request_uri;
}
listen 80;
server_name domain.org;
return 404;
}
Сертификат я буду копировать через powershell
scp 'C:\cert\key.pem' administrator@172.16.1.225:/tmp
scp 'c:\cert\certificate.pem' administrator@172.16.1.225:/tmp
cp /tmp/certificate.pem /etc/ssl
cp /tmp/key.pem /etc/ssl
cd /etc/ssl
sudo chmod 644 certificate.pem
sudo chmod 600 key.pem
Параметры портала
Как работает портал, как только мы сделаем sudo systemctl start ssp.service , программа считает xml файл и если он считается удачно мы увидим как программа слушает 5000 порт (netstat -tunpl). Если будут проблемы сервер Nginx будет отдавать 500 ошибку , проблемы со службой можно будет посмтртеть в логах как привило это либо проблемы с .dll файлами либо ошибки в конфигурациях самого xml , либо со службой DNS которая не может зарезолвить к примеру имя домена для соединения по https.
Вот так выглядит нормальное состояние службы
root@selfportal:/home/administrator# sudo systemctl daemon-reload
sudo systemctl restart ssp.service
sudo systemctl status ssp.service
● ssp.service - Self Service Portal
Loaded: loaded (/etc/systemd/system/ssp.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2025-03-14 12:54:03 UTC; 21ms ago
Main PID: 2962 (dotnet)
Tasks: 5 (limit: 6821)
Memory: 1.5M
CPU: 6ms
CGroup: /system.slice/ssp.service
└─2962 /usr/bin/dotnet /opt/multifactor/ssp/app/MultiFactor.SelfService.Linux.Portal.dll
Параметры работы портала хранятся в файле /opt/multifactor/ssp/app/appsettings.production.xml
в формате XML.
nano /opt/multifactor/ssp/app/appsettings.production.xml
В этом xml включен сброс пароля , подключение идет как ldaps , подключен google captha v2
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<Environment>production</Environment>
<Logging>
<LogLevel>
<Default>Information</Default>
<Microsoft>Warning</Microsoft>
</LogLevel>
</Logging>
<AllowedHosts>*</AllowedHosts>
<PortalSettings>
<CompanySettings>
<Name>Mycompany</Name>
<Domain>ldaps://S25RUMSKDC32.corp.local/dc=corp,dc=local</Domain>
<LogoUrl>images/logo.svg</LogoUrl>
</CompanySettings>
<TechnicalAccountSettings>
<User>administrator</User>
<Password>Passw$rd</Password>
</TechnicalAccountSettings>
<!-- requiresUserPrincipalName: Only UPN user name format permitted -->
<!-- useUpnAsIdentity: user name will be transformed to the UPN format automatically -->
<ActiveDirectorySettings requiresUserPrincipalName="false" useUpnAsIdentity="false">
<SecondFactorGroup>2FA Users</SecondFactorGroup>
<!--<UseUserPhone>true</UseUserPhone>-->
<!--<UseMobileUserPhone>true</UseMobileUserPhone>-->
</ActiveDirectorySettings>
<MultiFactorApiSettings>
<ApiUrl>https://api.multifactor.ru</ApiUrl>
<!-- API KEY parameter from the Multifactor personal account. -->
<ApiKey>rs_3gdfs9a9599b45454b61ed481639a7</ApiKey>
<!-- API Secret parameter from the Multifactor personal account. -->
<ApiSecret>3fsdfgfb4fb3232326a63444e693f74c</ApiSecret>
<!--<ApiProxy>http://proxy:3128</ApiProxy>-->
</MultiFactorApiSettings>
<CaptchaSettings enabled="true">
<!--Captcha provider: 'Google', 'Yandex'-->
<CaptchaType>Google</CaptchaType>
<Key>16LcdOfQqABBBAPHwr4343IiNqXXuEkrHoFbllpJ</Key>
<Secret>16LcdOfQqbbbBBiB9m4343M26tdQfhQj_femeX</Secret>
<!--When Captcha is displayed: 'Always', 'PasswordRecovery' -->
<CaptchaRequired>Always</CaptchaRequired>
</CaptchaSettings>
<!--<LoggingLevel>Info</LoggingLevel>-->
<!--<LoggingFormat>json</LoggingFormat>-->
<!-- Enable user password change. AD connection must be secure (SSL/TLS) -->
<!-- To Enable password recovery, Captcha on PasswordRecovery page must be enabled -->
<PasswordManagement enabled="true" allowPasswordRecovery="true">
<!-- Changing session duration in hh:mm:ss (00:02:00 by default) -->
<!-- <PasswordChangingSessionLifetime>00:02:00</PasswordChangingSessionLifetime> -->
<!-- Session storage size in `bytes` (5242880 by default, 1048576 is minimal value) -->
<!-- <PasswordChangingSessionCachesize>5242880</PasswordChangingSessionCachesize> -->
</PasswordManagement>
<!-- Enable user Exchange AciveSync devices provisioning. Doesn't work with Samba. -->
<ExchangeActiveSyncDevicesManagement enabled="false" />
<!--<UICulture>auto:en</UICulture>-->
<!--<GroupPolicyPreset>-->
<!-- Groups to assign to the registered user -->
<!--<SignUpGroups>group name 1;group 2</SignUpGroups> -->
<!--</GroupPolicyPreset>-->
<!-- FreeIPA support -->
<!--<LdapBaseDn></LdapBaseDn>-->
</PortalSettings>
</configuration>
После стартуем службу
После настройки конфигурации запустите компонент:
sudo systemctl start ssp.service
Статус можно проверить командой:
sudo systemctl status ssp.service
Последующие изменения в файле конфигурации службы потребуют перезапуска подсистемы служб и службы:
sudo systemctl daemon-reload
sudo systemctl restart ssp.servic
sudo systemctl daemon-reload
sudo systemctl restart ssp.service
sudo systemctl status ssp.service
Дебаг
Журналы работы портала записываются в syslog
и сохраняются в текстовые файлы в директорию /opt/multifactor/ssp/app/logs
. Если директория пуста или ее нет, нужно убедиться, что у пользователя, под которым запускается служба, есть права на запись в эту директорию.
Для просмотра содержимого syslog можно воспользоваться командой:
/opt/multifactor/ssp/app/logs
sudo less /var/log/syslog
Для просмотра журналов службы ssp.service используйте команду:
sudo journalctl -fu ssp.service
Пример1.
Служба не работает
root@selfportal:/opt/multifactor/ssp/app/logs# sudo systemctl status ssp.service
● ssp.service - Self Service Portal
Loaded: loaded (/etc/systemd/system/ssp.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: core-dump) since Fri 2025-03-14 13:11:36 UTC; 5s ago
Process: 2253 ExecStart=/usr/bin/dotnet /opt/multifactor/ssp/app/MultiFactor.SelfService.Linux.Portal.dll (code=dumped, signal=ABRT)
Main PID: 2253 (code=dumped, signal=ABRT)
CPU: 732ms
Mar 14 13:11:36 selfportal systemd[1]: ssp.service: Main process exited, code=dumped, status=6/ABRT
Mar 14 13:11:36 selfportal systemd[1]: ssp.service: Failed with result 'core-dump'.

Сайт отдает 502

sudo journalctl -fu ssp.service выдает ошибку , где показана проблема в конфигурации xml

После изменения в xml как на скрине с техническим пользователем который был залочен и перезапуском служб
sudo systemctl daemon-reload
sudo systemctl restart ssp.service
sudo systemctl status ssp.service
Служба заработала

