mailcow LDAP: почему не создаются ящики сотрудников
АйТи Фреш
Linux, Docker и DevOps

LDAP в mailcow подключён, а ящики сотрудников не создаются: Attribute Mapping и квоты домена

Автор: , директор ООО «АйТи-Фреш» · · ~12 мин чтения
Письма из каталога LDAP доходят только до части почтовых ящиков mailcow, остальные остаются пустыми — лимиты домена ограничивают провижининг
LDAP подключён и письма готовы литься — но останавливаются там, где кончаются лимиты домена, а не там, где кончаются сотрудники.

Test Connection в LDAP-настройках mailcow зелёный, а ящик нового сотрудника всё равно не появляется. В большинстве случаев дело не в самом LDAP-соединении, а в Attribute Mapping, лимите Max. possible mailboxes или квоте домена. Показываю, в каком порядке я это проверяю, и разбираю кейс кинотеатра на 16 рабочих мест, где из двадцати пяти новых учёток ящики получили только девять.

Зелёный Test Connection — это ещё не работающий провижининг

Когда я подключаю LDAP или Active Directory к корпоративной почте на mailcow, первая реакция админа после успешного Test Connection обычно одна: «готово, дальше само подхватится». Это ошибка, из-за которой я потом трачу час на разбор тикета «сотрудник есть в AD, а почты у него нет». Test Connection в System → Configuration → Access → Identity Provider проверяет ровно одну вещь: что mailcow может подключиться к каталогу под указанной учётной записью и биндится. Он ничего не говорит о том, будет ли создан ящик, какой шаблон к нему применится и не упрётся ли создание в лимит домена.

Внешние источники аутентификации — Keycloak, LDAP/AD и Generic OIDC — стали официально доступны в mailcow с релиза 2025-03 (25 марта 2025 года). До этого, в превью-версии начала февраля 2025-го, провижининг был жёстко завязан на один фиксированный атрибут, а в стабильном релизе разработчики сделали сопоставление атрибутов настраиваемым — это и есть Attribute Field и Attribute Mapping, из-за которых чаще всего и рвётся автосоздание ящиков. Источник аутентификации при этом выбирается не глобально, а для каждого пользователя отдельно: часть сотрудников может продолжать логиниться через встроенную SQL-базу mailcow, а часть — через LDAP.

Когда mailcow вообще создаёт LDAP-пользователя

Здесь у админов второе типовое заблуждение: считать, что раз каталог подключён, все пользователи из AD появятся в mailcow одномоментно, как при полноценном импорте. Это не так — и это не тот сценарий, который я разбираю в статье про миграцию на mailcow через imapsync: там речь о разовом переносе писем и ящиков с другого сервера, а здесь — о постоянной синхронизации учёток с работающим каталогом. LDAP-пользователь в mailcow создаётся автоматически в двух случаях: при первом успешном входе через UI, IMAP, POP3, SMTP или SIEVE (если для него нашлось подходящее сопоставление атрибута), либо по расписанию, если включён Import Users.

Username Field — поле, по которому mailcow ищет пользователя при входе, по умолчанию равно mail: то есть ожидается, что у объекта в каталоге атрибут mail содержит именно тот адрес, под которым человек будет логиниться и получать почту. Если у части сотрудников в AD атрибут mail не заполнен или заполнен алиасом, а не основным адресом, вход у них не пройдёт ещё до всякого Attribute Mapping — и на этом этапе я в первую очередь и смотрю, у всех ли нужных объектов вообще стоит mail.

Import Users отвечает за фоновый импорт: если он включён, новые пользователи подтягиваются из LDAP без ожидания первого логина. Sync / Import Interval (min) задаёт период этой синхронизации в минутах, а Periodic Full Sync дополнительно обновляет уже существующих пользователей — то есть подхватывает изменения атрибутов, а не только новых людей. Для компании, где HR заводит сотрудника в AD за день до выхода, я всегда включаю оба параметра: иначе первый ящик появится только в момент, когда человек впервые попробует войти, а до этого письма ему падать некуда.

Схема двух путей создания LDAP-пользователя в mailcow: при первом входе и при фоновом импорте по расписанию
Ящик появляется либо при первом входе с подходящим атрибутом, либо по расписанию фонового импорта — третьего пути нет.

Attribute Field и Attribute Mapping: где на самом деле рвётся автосоздание

Это самая частая причина «LDAP подключился, а ящиков нет» — и самая недооценённая, потому что она не выдаёт ошибки в интерфейсе, а просто молча ничего не делает. Attribute Field — это LDAP-атрибут, значение которого mailcow будет сопоставлять с шаблоном ящика. В официальном примере из документации используется атрибут otherMailbox со значением default: в поле Attribute Field указывается othermailbox, а в разделе Attribute Mapping значение default привязывается к нужному шаблону ящика. Если у объекта в AD этого атрибута нет вообще или его значение не совпадает ни с одной строкой в Attribute Mapping — пользователь не получает шаблон, а без шаблона создание ящика просто не запускается, без предупреждений и алертов.

Практический вывод: держать один произвольный, слабо документированный атрибут (тот же otherMailbox) как единственный триггер провижининга — рискованно, потому что его легко забыть проставить новому сотруднику. Я обычно выбираю атрибут, который в компании и так заполняется по регламенту при создании учётки — отдел (department) или employeeType, — и завожу привычку у HR/IT: нет нужного значения атрибута — нет почтового ящика, и это первое, что проверяют при жалобе. Отдельно стоит сверить LDAP-фильтр в настройках Identity Provider: слишком узкий фильтр (например, ограничение по OU) тихо исключает часть сотрудников из выборки ещё до Attribute Mapping, и такие люди не появятся в mailcow ни при каком атрибуте.

Если аутентификация нужна не только для почты, а для целого набора внутренних сервисов, я в части проектов вместо прямого LDAP использую промежуточный SSO. Логика и грабли Attribute Mapping там похожи, но появляется единая точка управления доступом — я подробно разбирал это в статье про развёртывание SSO на Keycloak. Для почтового сервера на 15–20 человек это обычно избыточно, а вот для компании с несколькими системами и десятками сотрудников экономит время именно на подобной диагностике.

Домен переполняется раньше, чем кажется: Max. possible mailboxes и Domain quota

Даже с идеально настроенным Attribute Mapping провижининг может остановиться на объективном лимите: у домена в mailcow есть Max. possible mailboxes — максимальное количество ящиков — и Domain quota — суммарная квота всех ящиков в этом домене в гигабайтах. Официальная диагностика LDAP отдельно требует проверять именно эти два параметра, потому что их легко упустить: домен создавался администратором один раз, до текущего штата, и с тех пор никто не возвращался к его лимитам.

Механика простая, но неочевидная на первый взгляд: если шаблон ящика, который применяет Attribute Mapping, выделяет, скажем, 10 ГБ на пользователя, а суммарная квота домена — 100 ГБ, то создать получится максимум десять ящиков, даже если реальных сотрудников втрое больше. Одиннадцатый и все следующие объекты просто не попадут в mailcow при импорте или входе — без явной ошибки в UI, которую заметит обычный пользователь, только запись в логе. Это не сбой LDAP и не ошибка Attribute Mapping — это арифметика квоты, которую нужно менять руками до массового подключения каталога.

Второй параметр — Max. possible mailboxes — работает независимо от места на диске и может остановить провижининг даже при огромной свободной квоте, если лимит по количеству ящиков был задан заниженным на этапе создания домена «про запас». Я всегда пересчитываю оба лимита перед тем, как включать Import Users на боевом домене, а не после первой жалобы «часть отдела осталась без почты».

Расчёт лимитов домена mailcow: почему при Max. possible mailboxes 14 создалось только 9 из 25 новых ящиков
Лимиты домена — это арифметика, а не аварийная ошибка: они заканчиваются тихо, без предупреждения в интерфейсе.

Кейс: кинотеатр «Вечерний сеанс», 16 рабочих мест: ящики получили девять новых сотрудников из двадцати пяти

У клиента — кинотеатра «Вечерний сеанс», 16 штатных рабочих мест плюс кассиры и билетёры на сменном графике, всего около тридцати учётных записей в AD, — LDAP к mailcow подключили за час: тест соединения зелёный, первые администраторы вошли без проблем. Через два дня выяснилось, что почту получила только часть сотрудников, а новые кассиры, заведённые перед началом сезона, — нет. Симптом был классический: в LDAP пользователь есть, в mailcow — нет, и ни в интерфейсе, ни у самих сотрудников не было ни одного сообщения об ошибке.

По порядку я проверил: Test Connection — зелёный, домен существует, Attribute Field и Attribute Mapping настроены на department=kassa с шаблоном на 5 ГБ. Дальше стало видно, что домен создавался ещё при первичной настройке почты под пять администраторских ящиков по 10 ГБ: Domain quota — 100 ГБ, Max. possible mailboxes — 14, «с запасом». Пять старых ящиков заняли 50 ГБ квоты, оставшихся 50 ГБ при шаблоне кассиров в 5 ГБ хватало на десять новых ящиков — но раньше сработал лимит по количеству: 14 минус 5 давало ровно девять. Отсюда и цифра «девять из двадцати пяти»: ровно столько успело создаться до упора в Max. possible mailboxes, остальные тихо не провижинились ни при первом логине, ни при плановой синхронизации. А если бы подняли только счётчик ящиков, через одного сотрудника упёрлись бы уже в квоту.

Исправление заняло пятнадцать минут: поднял Max. possible mailboxes до 40 (реальные тридцать учёток плюс резерв на сезонный набор), Domain quota — до 300 ГБ (5 × 10 ГБ + 35 × 5 ГБ = 225 ГБ, остальное — запас), включил Periodic Full Sync, чтобы не ждать первого входа каждого кассира. Ящики новых сотрудников появились в течение одного цикла Sync / Import Interval — я поставил его в 15 минут, для маленького штата это комфортный компромисс между нагрузкой на контроллер домена и скоростью появления новых ящиков.

Чек-лист диагностики и что контролировать дальше

Когда приходит жалоба «LDAP настроен, а ящика нет», я иду по одному и тому же порядку, а не гадаю: домен пользователя заведён в mailcow → в объекте LDAP заполнен атрибут, указанный как Username Field (по умолчанию mail) → LDAP-фильтр не отсекает этого пользователя по OU или группе → Attribute Field содержит значение, которое реально прописано в Attribute Mapping → у домена достаточно свободных Max. possible mailboxes и Domain quota под шаблон, который применится. Пять пунктов покрывают подавляющее большинство обращений, и почти всегда причина — в четвёртом или пятом.

СимптомГде смотретьТипичная причина
Ящик не создаётся вообще ни у когоTest Connection, домен в mailcowДомен пользователя не заведён в mailcow
У части сотрудников ящика нет, у части естьAttribute Field / Attribute MappingАтрибут не заполнен или значение не совпадает с картой
Ящики перестали появляться после N штукMax. possible mailboxes, Domain quotaЛимит домена исчерпан шаблоном
Новый сотрудник появляется только после первого входаImport Users, Periodic Full SyncФоновый импорт выключен

Ошибки фонового создания и синхронизации я смотрю в System → Information → Logs → Crontasks — именно там, а не в общих логах UI, видно, что происходило с последним циклом импорта; ошибки входа конкретного пользователя — в System → Information → Logs → mailcow UI. После того как провижининг заработал стабильно, я обычно добавляю почтовый сервер в общий мониторинг компании — не ради LDAP как такового, а чтобы не пропустить рост диска или падение сервиса раньше пользователей; подход к недорогому мониторингу для небольшого офиса я показывал в статье про мониторинг серверов без бюджета, а бэкапы самого mailcow после такой перенастройки домена стоит на всякий случай перепроверить вручную — у контейнера бэкапов есть свой отдельный класс проблем, я разбирал его в статье про нулевой размер архива mailcow.

Чек-лист из пяти шагов диагностики, почему LDAP-пользователь mailcow не получает почтовый ящик
В девяти случаях из десяти причина — в четвёртом или пятом пункте, а не в самом LDAP-соединении.

Частые вопросы

LDAP Test Connection зелёный — этого достаточно, чтобы быть уверенным, что провижининг работает?

Нет. Test Connection проверяет только сетевое соединение и bind-учётку. Создание ящика зависит отдельно от Attribute Field, Attribute Mapping, LDAP-фильтра и лимитов домена — Max. possible mailboxes и Domain quota.

Обязательно ли включать Import Users, или ящик создастся и так?

Ящик создаётся и без Import Users — при первом успешном входе пользователя, если для него нашлось подходящее сопоставление атрибута. Import Users добавляет фоновый импорт по расписанию, без ожидания первого логина, что удобно, когда учётку заводят заранее.

Почему часть сотрудников из одного домена получила почту, а часть — нет, хотя AD-объекты выглядят одинаково?

Чаще всего расходится значение атрибута, указанного в Attribute Field: у одних сотрудников оно заполнено и совпадает со строкой в Attribute Mapping, у других — пустое или отличается. Реже причина в LDAP-фильтре, который отсекает часть OU.

Можно ли одновременно использовать LDAP и обычные ящики на SQL-базе mailcow?

Да, источник аутентификации выбирается для каждого пользователя отдельно, а не для всего mailcow целиком. Часть сотрудников может входить через встроенную SQL-базу, часть — через LDAP или Keycloak.

Где смотреть, что происходило при последней синхронизации LDAP, если ящик так и не появился?

В System → Information → Logs → Crontasks — там видна история фоновых задач импорта и синхронизации. Ошибки входа конкретного пользователя логируются отдельно, в разделе Logs → mailcow UI.

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

© ООО «АйТи-Фреш» · Москва · Все статьи