Портал для пользователей LDAP
MultiFactor SelfService Portal — веб-сайт, портал самообслуживания для пользователей LDAP, единая точка входа (Single Sign-On) для корпоративных приложений по протоколам аутентификации SAML, OpenID Connect / OAuth.
Портал доступен вместе с исходным кодом, распространяется бесплатно по лицензии MIT. Актуальная версия находится на GitHub: код и сборка (архив MultiFactor.SelfService.Linux.Portal.zip).
Перед началом работы
- Зайдите в личный кабинет Мультифактора, далее в разделе "Ресурсы" создайте новый ресурс типа "Сайт" - "Self-Service портал":
- название и адрес: произвольные;
- регистрировать новых пользователей: да;
- при подключении без настроенного второго фактора: включить самостоятельную настройку;
- После создания вам будут доступны параметры ApiKey и ApiSecret, они потребуются для настройки портала.
Требования для установки портала
- Портал устанавливается на Linux сервер, протестирован на Debian 11;
- Серверу с установленным порталом необходим доступ к хосту
api.multifactor.ru
по TCP порту 443 (TLS); - Для взаимодействия с LDAP каталогом, компоненту нужен доступ к серверу домена по TCP порту 389 (LDAP) или 636 (LDAPS).
Схема работы
Портал – это веб-приложение. Для запуска и работы портала используется веб-сервер Kestrel. Веб-сервер н е нуждается в установке и входит в состав сборки. Типовая схема работы веб-приложений на стеке .NET 6 для Linux следующая:
- Приложение запускается на веб-сервере Kestrel. Веб-сервер слушает запросы на определенный порт (по умолчанию, 5000) локального хоста по схеме http;
- Реверс-прокси, настроенный на Linux-сервере, слушает запросы на внешний порт сервера по схеме https и перенаправляет их на локальный порт 5000;
- Веб-сервер Kestrel обрабатывает входящие запросы и отправляет их на обработку в приложение.
Таким образом, приложение портала располагается за реверс-прокси и обрабатывает запросы только от него.
Поддержка реализаций LDAP
Портал протестирован со следующими реализациями каталогов:
- ActiveDirectory;
- Samba4;
- FreeIPA.
Ограничения Linux версии
- Не поддерживаются кириллические пароли;
- Не поддерживается проверка логина и пароля в нескольких доменах Active Directory, если между ними настроены доверительные отношения.
Установка
Для автоматической установки портала вы можете воспользоваться инсталлятором. Инсталлятор сводит к минимуму ручные действия и выполнен в виде мастера установки. Для генерации и установки SSL-сер тификата используются сервис Let's Encrypt
и утилита certbot
.
Debian 11
- Получение скрипта инсталлятора:
$ 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
- Запуск инсталлятора:
$ /opt/temp/ssp-installer/install.sh
Журнал работы инсталлятора доступен в /opt/temp/ssp-installer/install-log.txt
.
- Отредактируйте файл конфигурации
appsettings.production.xml
:
$ sudo vi /opt/multifactor/ssp/app/appsettings.production.xml
Описание параметров работы портала доступно в разделе Параметры портала. Внесите изменения, нажмите ESC
и напечатайте :qw
, чтобы сохранить файл.
- Перезапустите службу портала:
$ sudo systemctl restart ssp.service
Установка библиотек
Компонент использует среду выполнения ASP.NET Core runtime версии 6.0, которая является бесплатной, открытой, разрабатывается компанией Microsoft и Open-Source сообществом. Среда выполнения не накладывает никаких ограничений на использование.
Для установки выполните команды:
- Debian 11
Добавьте ключ подписывания пакета в список доверенных ключей, затем добавьте репозиторий пакетов:
$ 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
Установка компонента
Создайте папку, скачайте и распакуйте актуальную версию компонента из GitHub:
$ 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
Создайте системного пользователя 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/ssp
:
$ sudo vi /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
должен выглядеть следующим образом:
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>
<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.
<!-- Включить проверку 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.
Смена истекших паролей осуществляется под технической учётной записью.
Для настройки используются следующие параметры:
<!-- Включить управление паролями. Необходимо подключение к AD по SSL/TLS -->
<PasswordManagement enabled="true">
<!-- Максимальная длительность сессии изменения пароля в формате 'hh:mm:ss' -->
<!-- <PasswordChangingSessionLifetime>00:02:00</PasswordChangingSessionLifetime> -->
<!-- Размер хранилища сессий в байтах (5242880 по умолчанию, 1048576 - минимальное значение) -->
<!-- <PasswordChangingSessionCachesize>5242880</PasswordChangingSessionCachesize> -->
</PasswordManagement>
Восстановление забытых паролей
Функционал восстановления забытых паролей позволяет пользователям из Active Directory самостоятельно (без вовлечения технической поддержки организации) менять забытые и утерянные пароли.
Условия для работы:
- У пользователя должно быть настроено мобильное приложение Multifactor в качестве способа аутентификации;
- На портале должна быть включена возможность управления паролями;
- На портале должна быть включена проверка Captcha;
- Техническая учетная запись дол жна иметь права 'Reset Password' на контейнер с пользователями.
Для настройки используется параметр allowPasswordRecovery
в разделе <PasswordManagement>
:
<!-- Восстановление забытых паролей. Параметр 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/app/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>
.
<Kestrel>
<Endpoints>
<Http>
<!-- http://интерфейс:порт -->
<Url>http://localhost:5000</Url>
</Http>
</Endpoints>
</Kestrel>
<PortalSettings>
...
</PortalSettings>
Подробнее о настройках Kestrel: