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

Портал для пользователей 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 обрабатывает входящие запросы и отправляет их на обработку в приложение.

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

Поддержка реализаций LDAP

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

  • ActiveDirectory;
  • Samba4;
  • FreeIPA.

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

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

Установка

Может быть полезно

Для автоматической установки портала вы можете воспользоваться инсталлятором. Инсталлятор сводит к минимуму ручные действия и выполнен в виде мастера установки. Для генерации и установки SSL-сертификата используются сервис Let's Encrypt и утилита certbot.

Debian 11
  1. Получение скрипта инсталлятора:

    $ sudo mkdir -p /opt/temp/ssp-installer && sudo chmod a+w /opt/temp/ssp-installer
    $ wget -q -O /opt/temp/ssp-installer/install.sh https://raw.githubusercontent.com/MultifactorLab/Install/main/src/ssp/install.sh
    $ sudo chmod +x /opt/temp/ssp-installer/install.sh
  2. Запуск инсталлятора:

    $ /opt/temp/ssp-installer/install.sh

    Журнал работы инсталлятора доступен в /opt/temp/ssp-installer/install-log.txt.

  3. Отредактируйте файл конфигурации appsettings.production.xml:

    $ sudo vi /opt/multifactor/ssp/app/appsettings.production.xml

    Описание параметров работы портала доступно в разделе Параметры портала. Внесите изменения, нажмите ESC и напечатайте :qw, чтобы сохранить файл.

  4. Перезапустите службу портала:

    $ sudo systemctl restart ssp.service

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

Компонент использует среду выполнения 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

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

/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 vi /etc/nginx/sites-available/ssp

Добавьте следующий блок конфигурации и сохраните файл:

/etc/nginx/sites-available/ssp
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;
}

Затем активируйте конфигурацию, создав символическую ссылку на ваш пользовательский конфигурационный файл 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 должен выглядеть следующим образом:

/etc/nginx/sites-available/ssp
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.

/opt/multifactor/ssp/app/appsettings.production.xml
<PortalSettings>
<CompanySettings>
<!-- Название вашей организации -->
<Name>ACME</Name>

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

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

<!-- [Опционально] Base DN для подключения к FreeIPA -->
<!-- <LdapBaseDn>cn=users,cn=accounts,dc=domain,dc=local</LdapBaseDn> -->

<!-- Настройки технической учетной записи в Active Directory -->
<TechnicalAccountSettings>
<User>user@domain.local</User>
<Password>password</Password>
</TechnicalAccountSettings>

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

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

<MultiFactorApiSettings>
<!-- Адрес API Мультифактора -->
<ApiUrl>https://api.multifactor.ru</ApiUrl>
<!-- Параметр API Key из личного кабинета Мультифактора -->
<ApiKey>key</ApiKey>
<!-- Параметр API Secret из личного кабинета Мультифактора -->
<ApiSecret>secret</ApiSecret>
<!-- [Опционально] Доступ к API Мультифактора через HTTP прокси-->
<!-- <ApiProxy>http://proxy:3128</ApiProxy> -->
</MultiFactorApiSettings>

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

<!-- Управление устройствами Exchange AciveSync (Active Directory) -->
<ExchangeActiveSyncDevicesManagement enabled="false"/>

<!-- Язык интерфейса: 'ru', 'en', 'auto:ru', 'auto:en' -->
<UICulture>auto:ru</UICulture>

<GroupPolicyPreset>
<!-- [Опционально] Новым пользователям при регистрации будут назначены эти группы из личного кабинета Мультифактора -->
<!-- <SignUpGroups>Группа1;группа два;group3</SignUpGroups> -->
</GroupPolicyPreset>
</PortalSettings>

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

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

Проверка Captcha

Для защиты от автоматизированного перебора паролей от учётных записей на странице входа в портале предусмотрена возможность проверки пользователя с помощью теста Captcha. В качестве провайдеров сервиса Captcha поддерживаются Yandex SmartCaptcha и Google reCAPTCHA.

Web.config
<!-- Включить проверку Captcha -->
<CaptchaSettings enabled="true">
<!-- Провайдер Captcha: 'Yandex', 'Google' -->
<CaptchaType>Yandex</CaptchaType>
<!-- Key из личного кабинета провайдера Captcha -->
<Key>key</Key>
<!-- Secret из личного кабинета провайдера Captcha -->
<Secret>secret</Secret>
<!-- Где показывать Captcha: 'Always', 'PasswordRecovery' -->
<CaptchaRequired>Always</CaptchaRequired>
</CaptchaSettings>

Управление паролями

Портал самообслуживания позволяет пользователям управлять своими доменными паролями: менять текущий пароль, менять истекший пароль, восстанавливать забытый пароль.

Для использования функционала управления паролями порталу необходимо подключение к каталогу по SSL/TLS.

Смена истекших паролей осуществляется под технической учётной записью.

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

Web.config

<!-- Включить управление паролями. Необходимо подключение к AD по SSL/TLS -->
<PasswordManagement enabled="true">
<!-- Максимальная длительность сессии изменения пароля в формате 'hh:mm:ss' -->
<!-- <PasswordChangingSessionLifetime>00:02:00</PasswordChangingSessionLifetime> -->
<!-- Размер хранилища сессий в байтах (5242880 по умолчанию, 1048576 - минимальное значение) -->
<!-- <PasswordChangingSessionCachesize>5242880</PasswordChangingSessionCachesize> -->
</PasswordManagement>

Восстановление забытых паролей

Функционал восстановления забытых паролей позволяет пользователям из Active Directory самостоятельно (без вовлечения технической поддержки организации) менять забытые и утерянные пароли.

Условия для работы:

Для настройки используется параметр allowPasswordRecovery в разделе <PasswordManagement>:

Web.config
<!-- Восстановление забытых паролей. Параметр allowPasswordRecovery (true: включить, false: выключить) -->
<PasswordManagement enabled="true" allowPasswordRecovery="true">
</PasswordManagement>

Особенности при работе с FreeIPA

Для корректного подключения к FreeIPA в файле конфигурации необходимо раскомментировать и заполнить настройку LdapBaseDn. Пример:

<LdapBaseDn>cn=users,cn=accounts,dc=domain,dc=local</LdapBaseDn>

Запуск

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

$ 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"
}

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

В: Почему пользователь не может восстановить пароль, хотя техническая учётная запись портала имеет право на сброс пароля (Reset Password) на контейнере с пользователями?

О: Сервер Active Directory имеет некоторые ограничения на назначение правил доступа пользователям, которые являются членами привилегированных групп (например, Domain Admins). Такие пользователи не наследуют ACL от родительских объектов, поэтому вы должны убедиться, что для необходимых привелигерованных пользователей созданы локальные правила, предоставляющие технической учётной записи право Reset Password.


В: Как изменить интерфейс и порт, котрый слушает веб-сервер Kestrel?

О: В файле конфигурации appsettings.production.xml добавьте блок конфигурации <Kestrel>...</Kestrel>. Интерфейс и порт указываются в ноде <Url>.

/opt/multifactor/ssp/app/appsettings.production.xml
<Kestrel>
<Endpoints>
<Http>
<!-- http://интерфейс:порт -->
<Url>http://localhost:5000</Url>
</Http>
</Endpoints>
</Kestrel>

<PortalSettings>
...
</PortalSettings>

Подробнее о настройках Kestrel: