- Технологический стек
- Архитектура решения
- Установка и настройка MULTIDIRECTORY
- Настройка Kerberos
- Настройка DNS
- Настройка DHCP
- Доверие доменов
- Групповые политики
- Подключение MF SelfService Portal к MD
- Управление пользователями, группами и ресурсами
- Подключение 2FA MULTIFACTOR
- Политики доступа
- Схема LDAP
- Журналирование событий
- Парольные политики
- Роли и полномочия
- LDAP-аутентификация в Ansible AWX
- LDAP-аутентификация в ArgoCD
- LDAP-аутентификация в GitLab
- LDAP-аутентификация в GitFlic
- LDAP-аутентификация в Jenkins
- LDAP-аутентификация в Harbor
- LDAP-аутентификация в Nexus
- LDAP-аутентификация в PostgreSQL
- LDAP-аутентификация в Proxmox VE
- LDAP-аутентификация в Rancher
- LDAP-аутентификация в SpaceVM
- LDAP-аутентификация в Tantor
- LDAP-аутентификация в Штурвал
Установка и настройка MULTIDIRECTORY
Общая информация
В статье описывается установка и настройка MULTIDIRECTORY. Для подробного ознакомления с архитектурой ознакомьтесь со статьей.
Требования для установки MULTIDIRECTORY
- Компонент устанавливается на Linux-сервер, протестирован на Ubuntu, Debian, Astra.
- Минимальные параметры сервера, рассчитанного на 1000 пользователей:
4 CPU (с поддержкой AVX инструкций), 8 GB RAM, 40 GB HDD.- Необходимо зарегистрировать домен и сопоставить его с IP вашего сервера.
- В случае использования локального домена, необходимы сертификаты для SSL/TLS. Объект сертификата должен совпадать с доменным именем, по которому будет доступен веб-интерфейс.
- Необходим статический IP-адрес. Пример: webadmin.domain.ru -> 255.255.255.255.
- При использовании локальной доменной записи необходимо добавить запись на ваш DNS-сервер со ссылкой на IP-адрес машины, где устанавливается MULTIDIRECTORY. Пример: webadmin.domain.internal -> 10.0.0.20
- Для работы
MULTIDIRECTORYв Linux необходимо произвести установку Docker и Docker-Compose.- Для работы
MULTIDIRECTORYв Windows необходимо установить Docker Desktop.- MULTIDIRECTORY использует порт 53 для запуска и работы контейнера с DNS сервером. Для корректного запуска освободите данный порт.Вопросы и ответы
- При использовании локального домена требуется сгенерировать или добавить свой сертификат вручную.
Для генерации или добавления см. секцию Вопросы и ответы.
Подключение внешней СУБД
В случае необходимости подключения внешней СУБД, а не встроенной, воспользуйтесь данной инструкцией:
Подключение внешней СУБД
Обратите внимание
Все сервисы работают при помощи Traefik, используя PostgreSQL в качестве базы данных. Другие СУБД несовместимы.
При первоначальной установки setup.sh / setup.ps1, идет настройка файла конфигурации .env
Настройте следующие параметры для подключение к внешней СУБД:
POSTGRES_USER=user_login # Укажите учетные данные POSTGRES_DB=base_name # Укажите базу данных POSTGRES_HOST=1.2.3.4 # Укажите ip-адресс POSTGRES_PASSWORD=password # Укажите пароль от учетной записи
На сервере где установлена внешняя СУБД настройте файлы конфигурации:
- postgresql.conf — изменив параметр listen_addresses
- pg_hba.conf — добавив строки для разрешения подключения к базе данных
После выполнения данных действий, перезапустите сервис PostgreSQL.
Переменные файла .env
Описание переменных файла .env
| Переменная | Описание |
|---|---|
DEFAULT_NAMESERVER |
IP-адрес хост-сервера (DNS), используется как основной nameserver. |
POSTGRES_USER |
Имя пользователя PostgreSQL. |
POSTGRES_DB |
Имя базы данных PostgreSQL. |
POSTGRES_HOST |
Хост базы данных PostgreSQL (имя контейнера или внешний сервер). |
POSTGRES_PASSWORD |
Пароль пользователя PostgreSQL (может генерироваться автоматически). |
DOMAIN |
Домен WEB-интерфейса MULTIDIRECTORY. |
SECRET_KEY |
Секретный ключ . |
SALT_API_USER |
Пользователь для доступа к Salt API. |
SALT_API_USER_PASS |
Пароль пользователя Salt API (может генерироваться автоматически). |
SALT_API_ENABLED |
Флаг включения Salt API. |
SALT_API_URL |
URL сервиса Salt API. |
PDNS_API_KEY |
API-ключ PowerDNS. |
PDNS_DIST_KEY |
API-ключ dnsdist. |
HOST_MACHINE_NAME |
Имя текущей машины (хоста), определяется автоматически. |
Установка MULTIDIRECTORY
Установка MULTIDIRECTORY Enterprise Edition
Скачайте архив с предоставленными Вам образами.
Выполните разархивацию при помощи команды:
tar -xvf Enterprise_complete.tar
Перейдите в папку с файлами конфигурации:
cd ./MD-RELEASE
Загрузите образы с помощью команды:
docker load -i all_images-*.tar
Выполните генерацию .env, запустив setup.bat, setup.sh или setup.ps1 в зависимости от системы:
Linux:
./setup.sh
Windows:
./setup.bat
./setup.ps1
Запустите сервисы при помощи команды:
docker compose up -d
Настройка Web-интерфейса MULTIDIRECTORY
После успешной настройки и запуска сервисов Docker – перейдите в браузер. В поисковую строку введите домен, который ранее был указан при генерации .env-файла.
Вы попадете в настройку WEB-интерфейса вашей MULTIDIRECTORY.
Проверьте правильность написания домена, выберите необходимые вам настройки:
- Настроить DNS. Если стоит галочка, то настройка DNS будет произведена сразу же (настройку DNS можно произвести и позже в WEB-интерфейсе администратора).
- Настроить Kerberos. Если стоит галочка, то настройка Kerberos произойдет сразу же (настройку Kerberos можно произвести и позже из интерфейса администратор
MULTIDIRECTORY). - Сгенерировать пароли для Kerberos. Если стоит галочка, то произойдет автоматическая генерация паролей для Kerberos. После настройки WEB-интерфейса сгенерированные пароли будут выгружены в файл.
Нажмите кнопку «Далее».
Примечание
Домен в данном поле заполняется автоматически из файла
.env. Вы можете изменить данное поле. Например: веб-интерфейс доступен по адресу webadmin.domain.ru. Этот адрес автоматически подставится, вы можете изменить его на domain.ru

Настройка DNS
Если был выбран пункт «Настроить DNS» откроется мастер настройки DNS, все поля будут заполнены:

Обозначение полей
- Имя зоны — по умолчанию заполняется автоматически именем используемого домена. Можно переименовать. Данное именя нельзя будет сменить в дальнейшем.
- Домен — по умолчанию заполняется автоматически из файла
.env.- TTL по умолчанию — продолжительность кэширования записи серверами и клиентами до её истечения. Значение измеряется в секундах.
Если был выбран пункт «Привязать к внешнему DNS серверу»
- IP — адрес Вашего внешнего DNS сервера, который будет использоваться.
- TSIG Ключ — содержимое файла, которое было сгенерировано на внешнем DNS сервере.

После заполнения всех полей нажмите кнопку «Далее».
Настройка Kerberos
Если НЕ была выбрана автоматическая генерация паролей для Kerberos
Если вы сняли галочку с пункта «Сгенерировать пароли для Kerberos автоматически», появится окно, в которое необходимо будет внести пароли для krbadmin и стэша.
- Krbadmin — это служебная учетная запись сервера Kerberos. Она используется для взаимодействия с сервером LDAP. Данная учетная запись ограничена полномочиями и может управлять только своей выделенной областью в дереве LDAP.
- Пароль stash, используется для защиты мастер ключа шифрования базы данных Kerberos. Вы можете выгрузить внесенные вами пароли в файл.
Требование к паролям:
- Пароли должны быть более 7 символов;
- Пароли не должны быть одинаковыми у krbadmin и стэша (они должны отличаться друг от друга);
- Пароли должны содержать заглавные и строчные буквы (A-Z и a-z) и цифры (0-9).
После внесния паролей нажмите кнопку «Далее».

Внесите данные администратора, под которыми будет осуществлен первоначальный вход.
Требование к паролям:
- Пароли должны быть более 7 символов;
- Пароли должны содержать заглавные и строчные буквы (A-Z и a-z) и цифры (0-9).
Для продолжения нажмите кнопку «Далее».

В появившемся окне проверьте правильность созданной учетной записи администратора:
- UPN.
- Отображаемое имя.
- Email.
Нажмите кнопку «Далее».

Создание учетной записи администратора завершено. Вход в WEB-интерфейс MULTIDIRECTORY будет осуществлен автоматичекси.
Установка MULTIDIRECTORY Community Edition
Linux
Создайте папку для MULTIDIRECTORY:
mkdir MultiDirectory; cd MultiDirectory;
Скачайте необходимые файлы:
wget -O setup.sh https://raw.githubusercontent.com/MultiDirectoryLab/MultiDirectory/main/.package/setup.sh wget -O docker-compose.yml https://github.com/MultiDirectoryLab/MultiDirectory/releases/download/v2.7.0/docker-compose.yml wget -O traefik.yml https://github.com/MultiDirectoryLab/MultiDirectory/releases/download/v2.7.0/traefik.yml wget -O kea-ctrl-agent.conf https://github.com/MultiDirectoryLab/MultiDirectory/releases/download/v2.7.0/kea-ctrl-agent.conf
Запустите установку:
bash setup.sh
После заполнения будет создан файл .env.
Windows (PowerShell)
Создайте папку:
mkdir MultiDirectory; cd MultiDirectory;
Скачайте файлы:
curl -O https://raw.githubusercontent.com/MultiDirectoryLab/MultiDirectory/main/.package/setup.ps1 curl -O https://github.com/MultiDirectoryLab/MultiDirectory/releases/download/v2.7.0/docker-compose.yml curl -O https://github.com/MultiDirectoryLab/MultiDirectory/releases/download/v2.7.0/traefik.yml curl -O https://github.com/MultiDirectoryLab/MultiDirectory/releases/download/v2.7.0/kea-ctrl-agent.conf
Запустите:
.\setup.ps1
Запустите сервисы при помощи команды:
docker compose pull; docker compose up -d
Настройка Web-интерфейса MULTIDIRECTORY
После успешной настройки и запуска сервисов Docker – перейдите в браузер. В поисковую строку внесите домен, который ранее был указан при генерации .env-файла.
Вы попадете в настройку WEB-интерфейса вашей MULTIDIRECTORY.
Проверьте правильность написания домена, выберите необходимые вам настройки:
- Настроить DNS. Если стоит галочка, то настройка DNS будет произведена сразу же (настройку DNS можно произвести и позже в WEB-интерфейсе администратора).
- Настроить Kerberos. Если стоит галочка, то настройка Kerberos произойдет сразу же (настройку Kerberos можно произвести и позже из интерфейса администратор
MULTIDIRECTORY). - Сгенерировать пароли для Kerberos. Если стоит галочка, то произойдет автоматическая генерация паролей для Kerberos. После настройки WEB-интерфейса сгенерированные пароли будут выгружены в файл.
Нажмите кнопку «Далее».
Примечание
Домен в данном поле заполняется автоматически из файла
.env. Вы можете изменить данное поле. Например: веб-интерфейс доступен по адресу webadmin.domain.ru. Этот адрес автоматически подставится, вы можете изменить его на domain.ru

Настройка DNS
Если был выбран пункт «Настроить DNS» откроется мастер настройки DNS, все поля будут заполнены:

Обозначение полей
- Имя зоны — по умолчанию заполняется автоматически именем используемого домена. Можно переименовать. Данное именя нельзя будет сменить в дальнейшем.
- Домен — по умолчанию заполняется автоматически из файла
.env.- TTL по умолчанию — продолжительность кэширования записи серверами и клиентами до её истечения. Значение измеряется в секундах.
Если был выбран пункт «Привязать к внешнему DNS серверу»
- IP — адрес Вашего внешнего DNS сервера, который будет использоваться.
- TSIG Ключ — содержимое файла, которое было сгенерировано на внешнем DNS сервере.

После заполнения всех полей нажмите кнопку «Далее».
Настройка Kerberos
Если НЕ была выбрана автоматическая генерация паролей для Kerberos
Если вы сняли галочку с пункта «Сгенерировать пароли для Kerberos автоматически», появится окно, в которое необходимо будет внести пароли для krbadmin и стэша.
- Krbadmin — это служебная учетная запись сервера Kerberos. Она используется для взаимодействия с сервером LDAP. Данная учетная запись ограничена полномочиями и может управлять только своей выделенной областью в дереве LDAP.
- Пароль stash, используется для защиты мастер ключа шифрования базы данных Kerberos. Вы можете выгрузить внесенные вами пароли в файл.
Требование к паролям:
- Пароли должны быть более 7 символов;
- Пароли не должны быть одинаковыми у krbadmin и стэша (они должны отличаться друг от друга);
- Пароли должны содержать заглавные и строчные буквы (A-Z и a-z) и цифры (0-9).
После внесния паролей нажмите кнопку «Далее».

Внесите данные администратора, под которыми будет осуществлен первоначальный вход.
Требование к паролям:
- Пароли должны быть более 7 символов;
- Пароли должны содержать заглавные и строчные буквы (A-Z и a-z) и цифры (0-9).
Для продолжения нажмите кнопку «Далее».

В появившемся окне проверьте правильность созданной учетной записи администратора:
- UPN.
- Отображаемое имя.
- Email.
Нажмите кнопку «Далее».

Создание учетной записи администратора завершено. Вход в WEB-интерфейс MULTIDIRECTORY будет осуществлен автоматичекси.
Обновление MULTIDIRECTORY
Важно!
Для обновления на версию 2.7.0 необходимо обновить и запустить setup.sh
Чтобы обновить вашу MULTIDIRECTORY, ипользуйте следующие шаги:
Обновление версии
Обновление MultiDirectory Enterprise
Выполните команду
docker compose down
Перейдите на директорию выше:
cd ..
Скачайте предоставленный Вам архив с обновленными образами
Выполните разархивацию при помощи команды:
tar -xvf Enterprise_complete.tar
Перейдите в директорию MD-RELEASE:
cd MD-RELEASE
Загрузите образы с помощью команды:
docker load -i all_images-*.tar
Выполните обновление .env, при необходимости, запустив setup.bat, setup.sh или setup.ps1 в зависимости от системы
Выполните команду
docker compose up -d
Обновление MultiDirectory Community
Linux
wget -O setup.sh https://raw.githubusercontent.com/MultiDirectoryLab/MultiDirectory/main/.package/setup.sh
wget -O docker-compose.yml https://github.com/MultiDirectoryLab/MultiDirectory/releases/download/v2.7.0/docker-compose.yml
wget -O traefik.yml https://github.com/MultiDirectoryLab/MultiDirectory/releases/download/v2.7.0/traefik.yml
wget -O kea-ctrl-agent.conf https://github.com/MultiDirectoryLab/MultiDirectory/releases/download/v2.7.0/kea-ctrl-agent.conf
Windows
wget -O setup.ps1 https://raw.githubusercontent.com/MultiDirectoryLab/MultiDirectory/main/.package/setup.ps1
wget -O docker-compose.yml https://github.com/MultiDirectoryLab/MultiDirectory/releases/download/v2.7.0/docker-compose.yml
wget -O traefik.yml https://github.com/MultiDirectoryLab/MultiDirectory/releases/download/v2.7.0/traefik.yml
wget -O kea-ctrl-agent.conf https://github.com/MultiDirectoryLab/MultiDirectory/releases/download/v2.7.0/kea-ctrl-agent.conf
Проверка логирования сервисов и контейнеров
Расширенное логирование
Если вы хотите, чтобы логи передавались в расширеном формате, то в файле .env укажите формат логирования:
DEBUG=1
После добавления расширенного логирования перезагрузите сервисы командой:
docker compose down; docker compose up -d
Проверка логирования контейнеров
Просматривать логи контейнеров вы можете обращаясь к контейнеру по его имени, или же по ID. Для просмотра имен и ID контейнеров воспользуйтесь командой:
docker ps
Для просмотра логов по имени контейнера в реальном времени используйте команду:
docker logs -f CONTAINER NAME # вместо CONTAINER NAME укажите имя контейнера, указанного в соответсвующим столбце.
Для просмотра логов по ID контейнера в реальном времени используйте команду:
docker logs -f CONTAINER ID # вместо CONTAINER NAME укажите имя контейнера, указанного в соответсвующим столбце.
Просмотр файлов логирования MULTIDIRECTORY
Файлы логирования MULTIDIRECTORY располагаются в каталоге /MultiDirectory/logs. Записываются 4 вида файлов логирования в следующем формате:
- admin_dd-mm-yyyy.log — в данный файл ведется логирование действий в WEB-интерфейсе администратора.
- kadmin_dd-mm-yyyy.log — в данный файл ведется логирование Kerberos (если он ранее был настроен).
- ldap_dd-mm-yyyy.log — в данный файл ведется логирование действий по протоколам ldap и ldaps.
- mfa_dd-mm-yyyy.log — в данный файл ведется логирование двухфакторной аутентификации (если ранее она была настроена).
Для просмотра файла логирования вы можете использовать команду:
tail -f admin_dd-mm-yyyy.log # файл admin используется как пример
Проверка версии MULTIDIRECTORY
Проверка версии в web-интерфейсе
Для проверки версии в web-интерфейсе нажмите на значок шестеренки и выберите пункт «Настройка MULTIDIRECTORY».

В открывшемся окне выберите пункт «О программе».

Проверка версии на сервере
Для проверки версии MULTIDIRECTORY в контейнере Docker используйте команду:
docker image inspect ghcr.io/multidirectorylab/multidirectory | grep VERSION
Проверка версии при помощи API
Для проверки версии MULTIDIRECTORY через API перейдите по ссылке https://your-domain.ru/api/docs.
Примечание
Замените «your-domain.ru» на имя вашего домена.

Вопросы и ответы
Вопрос: Как обновить сертификаты Kerberos?
Ответ:
- Удалите старые сертификаты
krbcert.pemиkrbkey.pemв папке../MultiDirectory/certs/. - Перезагрузите MULTIDIRECTORY командой:
docker compose down; docker compose up -d
Вопрос: Контейнер traefik_certs_dumper выдает ошибку:
ERROR | extra.dump_acme_certs:dump_acme_cert.39 - Error loading TLS certificate, exiting...
Ответ: Неправильное имя сертификатов или их отсутствие. Проверьте папку ./certs.
Файлы сертификатов должны строго называться:
cert.pemprivkey.pem
Шаги для генерации или добавления сертификатов описаны ниже.
Вопрос: Контейнеры multidirectory-ldap-server-* не запускаются (статус «Error») В логах:
File "/app/ldap_protocol/server.py", line 176, in _read_acme_cert
raise acme_exc from err
SystemError: Let's Encrypt certificate not found. The `acme.json` file might not have been generated or lacks certificate details.
This can also occur if the certificate failed to generate for localhost, as Let's Encrypt only issues certificates for public domains.
Try deleting and recreating the `acme.json` file, or consider using a self-signed certificate for local environments or closed networks.
Ответ: Проблема с генерацией сертификата. Выполните:
- Перейдите в папку
../MultiDirectory/. - Выполните команду для генерации сертификата (замените
your-domain.ruна имя вашего домена):
openssl req -nodes -new -x509 -keyout ./certs/privkey.pem -out ./certs/cert.pem -subj '/C=RU/ST=Moscow/L=Moscow/O=Global Security/OU=Multifactor/CN=your-domain.ru'
Вопрос: Я хочу чтобы MULTIDIRECTORY работала с моим сертификатом, что мне для этого нужно сделать?
Ответ: Для добавления самоподписанных сертификатов выполните следующие действия:
- В файле
traefik.ymlзакомментируйте следующие строки:
# certificatesResolvers: # md-resolver: # acme: # tlschallenge: true # email: support.md@multifactor.com # storage: /letsencrypt/acme.json
P.S.: названия сертификатов обязательно должны быть:
- privkey.pem
- cert.pem
Вопрос: Контейнер при запуске возвращает ошибку «137»
Ответ: Для устранения выполните одно из действий:
- Добавьте Swap-файл в папку MULTIDIRECTORY (пример инструкции);
- Увеличьте объем ОЗУ;
- Очистите память от сторонних процессов.
Вопрос: Я хочу добавить сертификат для ldaputil (только для Let’s Encrypt)
Ответ:
- Загрузите сертификат и обновите хранилище:
wget -O /usr/local/share/ca-certificates/isrgrootx1.crt https://letsencrypt.org/certs/isrgrootx1.pem update-ca-certificates
- В файл
ldap.confдобавьте строку:
TLS_CACERT /etc/ssl/certs/isrgrootx1.pem
Вопрос: При работе в веб-интерфейсе меня перенаправляет на страницу входа (установлено на виртуализации: QEMU, Proxmox и т.п.)
Ответ:
- Посмотрите логи контейнера dragonfly.
- Если есть ошибка:
An attept to execute an istruction failed. The root cause might be an old hardware. Exiting...
То необходимо установить тип виртуализации CPU: host / host passthrough.
Вопрос: После установки, я немогу войти в систему, при этом установка прошла корректно и без ошибок.
Ответ:
- Посмотрите логи контейнера dragonfly.
- Если есть ошибка:
An attempt to execute an instruction failed.The root cause might be an old hardware. Exiting...
Выполните проверку вашего процессора на поддержку AVX инструкций.
grep flags /proc/cpuinfo | head -1 | tr ' ' '\n' | grep -i avx
Если вывод команды оказался пустым, ваш процессор не соответствует минимальным техническим требованиям, для корректной работы контейнера dragonfly.
Вопрос: В ходе установки, возникает ошибка связанная с недоступностью 53-го порта.
Пример ошибки:
Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint traefik: failed to bind host port 0.0.0.0:53/tcp: address already in use
Ответ:
- Занятый порт 53 системой.
Выполните следующую команду, DNS сервера можно изменить на другие:
sudo bash -c 'F=/etc/systemd/resolved.conf; DNS="1.0.0.1 8.8.4.4"; cp -a "$F"{,.bak.$(date +%Y%m%d-%H%M%S)} 2>/dev/null || true; grep -q "^\[Resolve\]" "$F" || printf "\n[Resolve]\n" >>"$F"; sed -i -E "/^[[:space:]]*#?[[:space:]]*DNSStubListener[[:space:]]*=.*/d; /^[[:space:]]*#?[[:space:]]*DNS[[:space:]]*=.*/d" "$F"; awk -v dns="$DNS" '\''{print} /^\[Resolve\]$/ {print "DNS="dns; print "DNSStubListener=no"}'\'' "$F" > "$F.tmp" && mv "$F.tmp" "$F"; ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf; systemctl restart systemd-resolved; echo OK'