Home Без рубрики Установка SSP SelfService Portal от Multifactor на Ubuntu 22.04

Установка SSP SelfService Portal от Multifactor на Ubuntu 22.04

by admin

MULTIFACTOR SelfService Portal — веб-сайт, портал самообслуживания для пользователей LDAP, единая точка входа (Single Sign-On) для корпоративных приложений по протоколам аутентификации SAML, OpenID Connect / OAuth.

Портал доступен вместе с исходным кодом, распространяется бесплатно по лицензии MIT. Актуальная версия находится на GitHub: код и сборка (архив MultiFactor.SelfService.Linux.Portal.zip).

Ограничения Linux версии

  1. Не поддерживаются кириллические пароли;
  2. Не поддерживается проверка логина и пароля в нескольких доменах 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

Служба заработала

You may also like

Leave a Comment