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

Портал для пользователей LDAP

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

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

Перед началом работы

  1. Зайдите в личный кабинет Мультифактора, далее в разделе "Ресурсы" создайте новый ресурс типа "Сайт" - "Self-Service портал":
    • название и адрес: произвольные;
    • регистрировать новых пользователей: да;
    • при подключении без настроенного второго фактора: включить самостоятельную настройку;
  2. После создания вам будут доступны параметры ApiKey и ApiSecret, они потребуются для настройки портала.

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

  • Портал устанавливается на Linux сервер, протестирован на Debian 11;
  • Серверу с установленным порталом необходим доступ к хосту api.multifactor.ru по TCP порту 443 (TLS);
  • Для взаимодействия с LDAP каталогом, компоненту нужен доступ к серверу домена по TCP порту 389 (LDAP) или 636 (LDAPS).

Схема работы

Портал – это веб-приложение. Для запуска и работы портала используется веб-сервер Kestrel. Веб-сервер не нуждается в установке и входит в состав сборки. Типовая схема работы веб-приложений на стеке .NET 6 для Linux следующая:

  1. Приложение запускается на веб-сервере Kestrel. Веб-сервер слушает запросы на определенный порт (по умолчанию, 5000) локального хоста по схеме http;
  2. Реверс-прокси, настроенный на Linux-сервере, слушает запросы на внешний порт сервера по схеме https и перенаправляет их на локальный порт 5000;
  3. Веб-сервер Kestrel обрабатывает входящие запросы и отправляет их на обработку в приложение.

Таким образом, приложение портала располагается за реверс-прокси и обрабатывает запросы только от него.

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

  1. Не поддерживаются кириллические пароли;
  2. Не поддерживается проверка логина и пароля в нескольких доменах Active Directory, если между ними настроены доверительные отношения.

Установка

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

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

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

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

$ wget https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ rm packages-microsoft-prod.deb

Установите среду выполнения:

$ sudo apt-get update && \
sudo apt-get install -y aspnetcore-runtime-6.0
https://docs.microsoft.com/ru-ru/dotnet/core/install/linux-debian

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

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

$ sudo mkdir /opt/multifactor /opt/multifactor/ssp /opt/multifactor/ssp/app /opt/multifactor/ssp/logs /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

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

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

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

$ sudo vi /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/default:

$ sudo vi /etc/nginx/sites-available/default

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

server {
# DNS имя сервера с порталом
server_name ssp.domain.org;

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;
}

Для проверки конфигурации выполните:

$ sudo nginx -t

Если конфигурация верна, примените ее:

$ sudo nginx -s reload

По умолчанию прокси-сервер работает с незащищенным http-соединением. Если требуется установить сертификат и настроить https, файл /etc/nginx/sites-available/default должен выглядеть следующим образом:

server {
server_name ssp.domain.org;

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/letsencrypt/live/ssp.domain.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ssp.domain.org/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

# резервный сервер для перенаправления запросов http на https
server {
if ($host = ssp.domain.org) {
return 301 https://$host$request_uri;
}

listen 80;

server_name domain.org;
return 404;
}

Здесь для получения сертификата использовались сервис Let's Encrypt и утилита certbot. Похожие настройки можно получить, следуя инструкции.

Параметры портала

Параметры работы портала хранятся в файле /opt/multifactor/ssp/app/appsettings.production.xml в формате XML.

<PortalSettings>
<Company>
<!-- Название вашей организации -->
<Name>ACME</Name>

<!-- Название домена Active Directory для проверки логина и пароля пользователей -->
<Domain>ldaps://dc.domain.local/dc=domain,dc=local</Domain>

<!-- URL адрес логотипа организации -->
<LogoUrl>images/logo.svg</LogoUrl>
</Company>

<!-- Техническая учетная запись в Active Directory -->
<TechnicalAccount>
<User>user</User>
<Password>password</Password>
</TechnicalAccount>

<ActiveDirectoryOptions>
<!--[Опционально] Запрашивать второй фактор только у пользователей из указанной группы для Single Sign On (второй фактор требуется всем, если удалить настройку) --> -->
<!-- <SecondFactorGroup>2FA Users</SecondFactorGroup> -->

<!-- [Опционально] Использовать номер телефона из Active Directory для отправки одноразового кода в СМС (не используется, если удалить настройку). -->
<!-- <UseUserPhone>true</UseUserPhone> -->
<!-- <UseMobileUserPhone>true</UseMobileUserPhone> -->
</ActiveDirectoryOptions>

<MultiFactorApi>
<!-- Адрес API Мультифактора -->
<ApiUrl>https://api.multifactor.ru</ApiUrl>

<!-- Параметр API KEY из личного кабинета Мультифактора. -->
<ApiKey>key</ApiKey>

<!-- Параметр API Secret из личного кабинета Мультифактора. -->
<ApiSecret>secret</ApiSecret>

<!-- [Опционально] Доступ к API Мультифактора через HTTP прокси.-->
<!-- <ApiProxy>http://proxy:3128</ApiProxy> -->
</MultiFactorApi>

<GoogleReCaptchaSettings>
<!-- Включена проверка капчи Google reCaptcha2. -->
<Enabled>false</Enabled>

<!-- Site Key из личного кабинета https://www.google.com/recaptcha/admin -->
<!-- <Key>site key</Key> -->

<!-- Secret Key из личного кабинета https://www.google.com/recaptcha/admin -->
<!-- <Secret>secret</Secret> -->
</GoogleReCaptchaSettings>

<!-- Использовать UPN для входа в портал -->
<!-- <RequiresUserPrincipalName>true</RequiresUserPrincipalName> -->

<!-- Уровень логирования: 'Debug', 'Info', 'Warn', 'Error' -->
<LoggingLevel>Info</LoggingLevel>

<!-- Управление паролями. Необходимо подключение к AD по SSL/TLS -->
<EnablePasswordManagement>true</EnablePasswordManagement>
<!-- Управление устройствами Exchange AciveSync. Не работает для Samba. -->
<EnableExchangeActiveSyncDevicesManagement>false</EnableExchangeActiveSyncDevicesManagement>

<!--
Язык интерфейса
ru - Русский,
en - English,
auto:ru - язык браузера, по умолчанию Русский,
auto:en - язык браузера, по умолчанию English.
Если настройку убрать или оставить пустой, бует использоваться English.
-->
<UICulture>auto:ru</UICulture>
</PortalSettings>

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

При включении параметра UseActiveDirectoryMobileUserPhone компонент будет использовать телефон, записанный на вкладке Telephones в поле Mobile. Формат телефона также может быть любым.

Запуск

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

$ sudo systemctl start ssp.service

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

$ sudo systemctl status ssp.service

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

$ sudo systemctl daemon-reload
$ sudo systemctl restart ssp.service

Журналы

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

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

$ sudo less /var/log/syslog

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

$ sudo journalctl -fu ssp.service

Доступ к порталу

Портал доступен по адресу https://ssp.domain.org.

Для реализации liveness check используйте GET https://ssp.domain.org/api/ping.
Пример ответа:

{
"timeStamp": "2022-08-05T08:19:42.336Z",
"message": "Ok"
}