36

Настройка автоматического создания пользователей в Zimbra из AD

Суть решения в том, что нужно создавать пользователей по мере их появления в Active Directory.

Для этих целей у Zimbra есть три варианта решения:
— Auto Provisioning EAGER mode
— Auto Provisioning LAZY mode
— Auto Provisioning MANUAL mode

EAGER — Zimbra подключается к AD через заданные промежутки времени и автоматически проверяет и при необходимости создает пользователей в Zimbra.
LAZY — Учетная запись в Zimbra создается при первом входе пользователя, при условии, что в настройках домена установлен внешний механизм авторизации, естественно.
MANUAL — Администратор выполняет поиск и выбирает учетные записи, которые нужно добавить в Zimbra.

Мы решили использовать LAZY вариант, т.к. EAGER не у нас не взлетел, кроме того пользователей у нас больше 1k, и шерстить с заданной периодичностью такое количество не лучший вариант. MANUAL просто не вариант.

Для того что бы настроить auto provisioning нужно выполнить следующие действия (я выполняю под пользователем zimbra):
1. $ zmprov md zimbra.local zimbraAutoProvMode LAZY — Устанавливаю LAZY метод
2. $ zmprov md zimbra.local zimbraAutoProvAuthMech LDAP — Задаю к тип внешней авторизации.
3. $ zmprov md zimbra.local zimbraAutoProvLdapURL "ldap://10.29.1.1:389" — Сервер внешней авторизации
4. $ zmprov md zimbra.local zimbraAutoProvLdapAdminBindDn "*protected email*" — Пользователь, под которым можно подключиться к AD
5. $ zmprov md zimbra.local zimbraAutoProvLdapAdminBindPassword password — пароль пользователя
6. $ zmprov md zimbra.local zimbraAutoProvLdapSearchBase "ou=Employees,ou=Zimbra,dc=zimbra,dc=local" — Корень поиска пользователей в AD
7. $ zmprov md zimbra.local zimbraAutoProvLdapSearchFilter "(samAccountName=%u)" — фильтр поиска пользователей в AD
8. $ zmprov md zimbra.local zimbraAutoProvNotificationFromAddress *protected email* — От кого будут приходить сообщения о добавлении новых пользователей
9. $ zmprov md zimbra.local zimbraAutoProvAccountNameMap samAccountName — атрибут в AD, который содержит имя пользователя без указания домена
10. $ zmprov md zimbra.local +zimbraAutoProvAttrMap zimbraMailAlias=mail +zimbraAutoProvAttrMap sn=sn +zimbraAutoProvAttrMap description=mail +zimbraAutoProvAttrMap givenName=givenName +zimbraAutoProvAttrMap displayName=displayName — правила маппирования атрибутов из AD в Zimbra LDAP

Подробнее про параметры можно почитать на wiki Zimbra.

После этих манипуляций перезапускаю сервисы Zimbra:
$ zmcontrol restart

Alexey Egorychev

Alexey Egorychev

FreeBSD and Linux sysadmin. Know many systems like mailsystems, DB, WWW stack. Automation with salt, ansible. Monitoring with nagios, zabbix.

  • Redrick Shuhart

    Здравствуйте! А как быть если учетки в домене с кириллицей? Режим EAGER подгружает только пользователей с латинским логином в sAMAccountName. Кто-нибудь сталкивался с подобным?

    • У Вас в sAMAccountName кириллица, я правильно понимаю?

      • Redrick Shuhart

        именно так

      • Полагаю, что такой фокус не пройдет. Выбор кириллицы в качестве почтового адреса, мягко говоря, странный шаг.

        Почитайте про «Внешняя учетная запись LDAP для проверки подлинности». Но не уверен, что Вам оно поможет.

      • Redrick Shuhart

        ok. спасибо за ответ! тогда буду пробовать spnego по атрибуту mail

  • Алексей Кашавкин

    Добрый день, а в какой конфиг непосредственно заносится эта информация? Я просто ошибочно указал пользователя, фильтр и атрибуты. Это можно поправить теперь только в конфиге?

    • Добрый день!

      Можно их перезадать той же командой, например:
      $ zmprov md zimbra.local zimbraAutoProvLdapSearchBase "ou=Old-Employees,ou=Zimbra,dc=zimbra,dc=local"

  • Юлия Владимировна

    В общем и целом, режим EAGER работает, и даже маппит пользователей по email:

    zmprov md zimbra.test.ru zimbraAutoProvAccountNameMap «mailNickname »
    zmprov md zimbra.test.ru zimbraAutoProvAttrMap «sn=sn»
    zmprov md zimbra.test.ru +zimbraAutoProvAttrMap «description=description»
    zmprov md zimbra.test.ru +zimbraAutoProvAttrMap «cn=displayName»
    zmprov md zimbra.test.ru +zimbraAutoProvAttrMap «givenName=givenName»
    zmprov md zimbra.test.ru zimbraAutoProvBatchSize «20»
    zmprov md zimbra.test.ru zimbraAutoProvLdapAdminBindDn «cn=zimbra,cn=users,dc=test,dc=local»
    zmprov md zimbra.test.ru zimbraAutoProvLdapAdminBindPassword «test123»
    zmprov md zimbra.test.ru zimbraAutoProvLdapBindDn «cn=zimbra,cn=users,dc=test,dc=local»
    zmprov md zimbra.test.ru zimbraAutoProvLdapSearchBase «dc=test,dc=local»
    zmprov md zimbra.test.ru zimbraAutoProvLdapSearchFilter «(&(ObjectCategory=person)(mail=*)(ObjectClass=user))»
    zmprov md zimbra.test.ru zimbraAutoProvLdapURL «ldap://192.168.0.2:389»
    zmprov md zimbra.test.ru zimbraAutoProvMode «EAGER»
    zmprov md zimbra.test.ru zimbraAutoProvNotificationBody «Your account has been auto provisioned. Your email address is ${ACCOUNT_ADDRESS}.»
    zmprov md zimbra.test.ru zimbraAutoProvNotificationFromAddress «*protected email*»
    zmprov md zimbra.test.ru zimbraAutoProvNotificationSubject «New account auto provisioned»
    zmprov ms mailzimbra.test.ru zimbraAutoProvPollingInterval «1m»
    zmprov ms mailzimbra.test.ru zimbraAutoProvScheduledDomains «zimbra.test.ru»

    но при такой конфигурации, не проходит авторизация AD, что скорее всего из-за поля «Имя учетной записи» в которую маппится mailNickname. Но в zimbra есть такое поле как: «Внешняя учетная запись LDAP для проверки подлинности:», если туда вставить: sAMAccountName=userName, по идее должна проходить авторизация проходить по этому полю, но увы и ах… не срабатывает.

    Режим проверки подленности «Внешний Active Directory».

    Может кто сталкивался с таким, подскажите :)

    • Юлия, здравствуйте.

      1. zimbraAutoProvAccountNameMap должна содержать имя пользователя без домена. В поле «mailNickname» точно содержиться имя пользователя?
      Именно под этим пользователем учетка полезет в Zimbra. Не знаю по каким причинам Вам не подходит sAMAccountName.

      2. во «Внешняя учетная запись LDAP для проверки подлинности:» для конкретного пользователя нужно прописывать конкретное значение пользователя во внешнем LDAP(AD), например:
      uid=test1,ou=people,ou=external,dc=com

      И у Вас очепятка в копипасте: zimbra.test.ru и mailzimbra.test.ru. Будем предполагать, что речь об одном домене.

      • Юлия Владимировна

        Алексей, приветствую!
        1. Мне не подходит sAMAccountName по причине того, что имена пользователей в AD заведены как ur.ts1508311412et@ni1508311412kpupv1508311412, а email: ur.ts1508311412et@ni1508311412kpup.1508311412v1508311412. По этому я использую mailNickname.

        Для того, чтобы пользователь мог авторизоваться со своими данными из AD, пытаюсь использовать «Внешняя учетная запись LDAP для проверки подлинности», но либо я её настраиваю не верно, либо тогда не понимаю, почему она не работает.

        uid в AD не заполнено, а заполнять пользвателям порядка 200 это тотал.

        За место этого, в поле «Внешняя учетная запись LDAP для проверки подлинности»:
        uid=test1,ou=zimbra,dc=test,dc=ru

        Прописываю:
        cn=test1,ou=zimbra,dc=test,dc=ru

        В общем, хелп :)

        Да, очепятка :) речь идёт об одном домене.

      • Юлия Владимировна

        Если вы хотите авторизовываться в Zimbra под ur.ts1508311412et@ni1508311412kpup.1508311412v1508311412, но при этом проверять учетку ur.ts1508311412et@ni1508311412kpupv1508311412, то «Внешняя учетная запись LDAP для проверки подлинности» это вполне вариант.

        Что в логах, при попытке авторизоваться под пользователем с прописанным cn=test1,ou=zimbra,dc=test,dc=ru

        Есть еще вариант, когда пользователь в Zimbra авторизовывается под ur.ts1508311412et@ni1508311412kpupv1508311412 в AD, но получает email ur.ts1508311412et@ni1508311412kpup.1508311412v1508311412. В этом случае надо использовать +zimbraAutoProvAttrMap.

        Как использовать ZimbraAuthLdapExternalDn (Внешняя учетная запись LDAP для проверки подлинности):
        https://wiki.zimbra.com/wiki/External_LDAP_authentication_with_zimbraAuthLdapExternalDn

      • Юлия Владимировна

        При попытке авторизоватся в логах пишет следующее:

        2015-10-27 15:16:16,118 INFO [qtp509886383-2459:https://127.0.0.1:7071/service/admin/soap/GetDomainInfoRequest%5D [ip=127.0.0.1;ua=ZCS/8.6.0_GA_1182;] soap — GetDomainInfoRequest elapsed=0

        2015-10-27 15:16:16,132 INFO [qtp509886383-2460:http://127.0.0.1:8080/service/soap/AuthRequest%5D [oip=192.168.0.124;ua=zclient/8.6.0_GA_1182;] SoapEngine — handler exception: authentication failed for [ymikhaylova], account not found

        2015-10-27 15:16:16,132 INFO [qtp509886383-2460:http://127.0.0.1:8080/service/soap/AuthRequest%5D [oip=192.168.0.124;ua=zclient/8.6.0_GA_1182;] soap — AuthRequest elapsed=1

        2015-10-27 15:16:16,137 INFO [qtp509886383-2459:https://127.0.0.1:7071/service/admin/soap/GetDomainInfoRequest%5D [ip=127.0.0.1;ua=ZCS/8.6.0_GA_1182;] soap — GetDomainInfoRequest elapsed=0

        2015-10-27 15:16:50,363 INFO [qtp509886383-2461:http://127.0.0.1:8080/service/soap/AuthRequest%5D [oip=192.168.0.124;ua=zclient/8.6.0_GA_1182;] SoapEngine — handler exception: authentication failed for [y.mikhaylova], account not found

        2015-10-27 15:16:50,363 INFO [qtp509886383-2461:http://127.0.0.1:8080/service/soap/AuthRequest%5D [oip=192.168.0.124;ua=zclient/8.6.0_GA_1182;] soap — AuthRequest elapsed=1

        2015-10-27 15:16:50,374 INFO [qtp509886383-2462:https://127.0.0.1:7071/service/admin/soap/GetDomainInfoRequest%5D [ip=127.0.0.1;ua=ZCS/8.6.0_GA_1182;] soap — GetDomainInfoRequest elapsed=0

      • Юля, задача, конечно, интересная.

        Я предлагаю попробовать следующий вариант:

        1. zimbraAutoProvAccountNameMap «mailNickname » — сюда должно подставляться vpupkin

        2. Добавить +zimbraAutoProvAttrMap mail=mail в настройки autoprov

        3. ZimbraAuthLdapExternalDn Использовать нет необходимости.

        Сам я такой фокус не делал, и к сожалению, сайчас нет тестовой среды для проверки, но мысль в следующем:

        Механизмом Auto Provisioning создавать пользователей с uid вида vpupkin. В этом случае авторизация в AD должна проходить спокойно без дополнительных телодвижений, вроде ZimbraAuthLdapExternalDn т.к. учетки совпадают. Но Zimbra при этом создаст в своем ldap запись, что почта этого аккаунта — ur.ts1508311412et@ni1508311412kpupv1508311412

        Для маппирования полей внешнего LDAP(AD) и LDAP zimbra при Auto Provisioning есть директива +zimbraAutoProvAttrMap, где можно попробовать сказать, что в поле mail Zimbra записать соответствуещее поле из AD — +zimbraAutoProvAttrMap mail=mail, где в поле mail AD лежит ur.ts1508311412et@ni1508311412kpup.1508311412v1508311412

        Думаю, попробовать можно.

      • Юлия Владимировна

        Да, мысль конечно хорошая с добавлением +zimbraAutoProvAttrMap mail=mail, но на одном из форумов написано:

        Is not possible to autoprov the attribs «mail» and «zimbraMailAlias» they are «inmutables».
        Поэксперементировав, данное высказывание полностью подтерждаю, не возможно маппить атрибут «mail».
        Видимо он авторизует только по «Имя учетной записи», но при этом можно исользовать «ZimbraAuthLdapExternalDn» для авторизации через AD.

      • Спасибо за feedback. Буду знать по поводу «mail» и «zimbraMailAlias».

        Жаль, что идея провалилась.

        Я сейчас посмотрел в LDAP Zimbra — поле ZimbraAuthLdapExternalDn есть, можно попробовать мапить ))

        Если постигнет неудача, то можно прописывать так:
        zmprov ma *protected email* ZimbraAuthLdapExternalDn "$value"

        С ZimbraMailAlias не понятно что делать )

      • Юлия Владимировна

        Да, но тогда тут встаёт вопрос о том, как бы
        zmprov ma ur.ts1508311412et@ni1508311412kpup.1508311412v1508311412 ZimbraAuthLdapExternalDn «$value»
        Сделать на все 200 аккаунтов автоматически :)

      • При autoprov, похоже никак.

        Разве только отдельным скриптом, запуская его по cron.

        Я писал скрипт на python, который получал список пользователей из AD и создавал из них Distributed Lists в Zimbra для большего количества пользователей, поэтому вижу такой путь, эта дорога известна )))

      • Юлия Владимировна

        Эх… хотелось бы без скрипта) Как решу данную задачку — отпишусь ;)

      • Было бы здорово.
        Удачи!

      • Dmitry

        Здравствуйте.
        Я тут сейчас тоже пытался настроить автосоздание с формированием почтового адреса из поля mail в AD, но, конечно, ничего не вышло. Я так понимаю, что ZimbraAuthLdapExternalDn можно мапить при autoprov. Не стал пробовать, т. к. такой вариант как-то не очень подходит.
        Я так понял, что даже добавление синонимов через autoprov невозможно, т. к. алиас — это отдельная запись в БД ZIMBRA, в которой указывается TargetID для основной записи Account, куда должна приходить почта.
        К какой конфигурации вы пришли в результате? Напишите, пожалуйста хотя бы кратко.
        Спасибо.

      • Мне вот тоже интересно. @disqus_ztbEfwYVOE:disqus у Вас какая версия zimbra?

  • Shell

    Здравствуйте. Спасибо за статью. Сделал, как вы пишите. Но увы… При попытке войти в почту через web, zimbra пишет, что неверный логин — пароль. Помогите, пожалуйста, разобраться. Спасибо.

    • Доброго времени суток!

      Убедитесь, что верно указан пользователь, под которым происходит подключение к LDAP, в той ли OU происходит поиск пользователей..

      Стоит посмотреть что в этот момент в логах..

      Мало информации для диагностики.

      • Shell

        Приветствую. Спасибо, что ответили. Проблем с ldap нет. OU прописал корневую, т.е. искать во всем домене. К слову… Если создать пользователя вручную, при этом настроить авторизацию через AD, то все проходит гладко. Логи пусты к сожалению. Может я не там смотрю? Вы уж пните меня, пожалуйста, в правильное место. С зимброй ранее просто не сталкивался. Имел опыт лишь с exim. Спасибо.

      • В этом случае, можно попробовать запросить данные в LDAP с Zimbra, например,
        ldapsearch -LLL -H ldap://ad.example.com:389 -x -D ‘aduserldap’ -w ‘password’ -b ‘ou=test,dc=example,dc=com’ ‘(&(objectClass=person)(mail=*))’ SAMAccountName uid uidNumber

        Логи должны лежать в /opt/zimbra/log.
        Стоит посмотреть в /opt/zimbra/log/mailbox.log при попытке логина нового пользователя.

      • Shell

        Здравствуйте. Прошу прощения за задержку в ответе.
        ldapsearch выдает следующее:

        ldap_bind: Invalid credentials (49)
        additional info: 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1

        При попытке зайти под юзером в вэб очень большой лог, сюда выкладывать? Спасибо.

      • Напишите на почту. Я постараюсь помочь =)

      • Ivan

        Здравствуйте, а какое было решение предыдущего вопроса? Если оно было вообще)

        А то я столкнулся с аналогичной проблемой

        ldap_bind: Invalid credentials (49)
        additional info: 80090308: LdapErr: DSID-0C0903A9, comment:
        AcceptSecurityContext error, data 52e, v1db1

      • Здравствуйте!

        handler exception: authentication failed for [user], account not found

        Похоже, что zimbra не может авторизироваться в AD. Если ldapsearch вернул пользователей, то в настройках zimbra припишите те же авторизацонные данные.

      • Ivan

        Совсем запутался уже, решил опробовать метод EAGER. Один раз он у меня успешно отработал. Но немного не так. Хотел, чтобы ящики пользователей создавались из поля mail в АД. Теперь вообще не работает. Удалил пользователей и не могу добиться, чтобы создались хотя бы по cn.

        Вот один в один ситуация

        http://community.zimbra.com/collaboration/f/1886/t/1092532

        а не подскажите как снести все проделанные при помощи zmprov настройки и попробовать по новой?

      • Перезадать тем же zmprov. Когда я экспериметировал, я писал скрипт, который выполнял пл очереди все zmprov. В случае неудачи правил его и запускал заново.

      • Ivan

        Есть некоторые успехи

        zmprov md domain.ru zimbraAutoProvMode EAGER
        zmprov md domain.ru zimbraAutoProvBatchSize 500
        zmprov md domain.ru zimbraAutoProvAuthMech LDAP
        zmprov md domain.ru zimbraAutoProvLdapURL «ldap://serv2008.ad.domain.ru:3268»
        zmprov md domain.ru zimbraAutoProvLdapAdminBindDn «*protected email*»
        zmprov md domain.ru zimbraAutoProvLdapAdminBindPassword pass
        zmprov md domain.ru zimbraAutoProvLdapSearchBase «ou=allusers,DC=ad,DC=domain,DC=ru»
        zmprov md domain.ru zimbraAutoProvLdapSearchFilter «(mail=*)»
        zmprov md domain.ru zimbraAutoProvLdapBindDn “%u”
        zmprov md domain.ru zimbraAutoProvNotificationFromAddress ur.ni1508311412amod@1508311412nikhc1508311412ep1508311412
        zmprov md domain.ru zimbraAutoProvAccountNameMap mail=%n
        zmprov md domain.ru +zimbraAutoProvAttrMap zimbraMailAlias=mail +zimbraAutoProvAttrMap sn=sn +zimbraAutoProvAttrMap description=mail +zimbraAutoProvAttrMap givenName=givenName +zimbraAutoProvAttrMap displayName=displayName
        zmprov ms mail.domain.ru +zimbraAutoProvScheduledDomains domain.ru
        zmprov ms mail.domain.ru zimbraAutoProvPollingInterval 1m

        External Group LDAP Search Base:
        ou=allusers,dc=ad,dc=domain,dc=ru
        External Group LDAP Search Filter:
        (&(objectClass=user)(objectClass=person)(!objectClass=computer)(!userAccountControl:1.2.840.113556.1.4.803:=2))
        External Group Handle Class Name:
        com.zimbra.cs.account.grouphandler.ADGroupHandler

        С таким конфигом зимбра ругается.

        2015-07-04 20:34:00,267 INFO [AutoProvision] [] autoprov — auto creating account in EAGER mode: ur.ni1508311412amod@1508311412vonav1508311412i.v1508311412@domain.ru, dn=»CN=Владимир П. Иванов,OU=oftalmology,OU=allusers,DC=ad,DC=domain,DC=ru»
        2015-07-04 20:34:00,267 WARN [AutoProvision] [] autoprov — unable to auto create account, dn=»CN=Владимир П. Иванов,OU=oftalmology,OU=allusers,DC=ad,DC=domain,DC=ru»

        Откуда зимбра два раза домен мой вставляет? и как ей объяснить, что этого делать не надо)))
        ps Имена и фамилии изменены

      • Ivan

        хотя как вариант сейчас придумал потереть в АД в поле mail везде мой домен, но это как то не красиво.

      • А зачем делать поиск по полю mail в AD?

        zmprov md domain.ru zimbraAutoProvLdapSearchFilter «(mail=*)»

      • Ivan

        Суть в том, что у всех пользователей заполнено поле mail и ящики должны создаваться именно оттуда. Логины не у всех красивые для почты, да и политика в организации такова, что почта — «первая буква имени».»фамилия»@»домен». Фильтр как раз отбирает по полю mail из АД. samAccountName — это хорошо, а вот был бы такой же для поле mail. Но похоже увы. Так что выход похоже один, убирать у пользователей домен в поле mail.

      • Теперь мысль я понял.
        В статье я указал ссылку на wiki.

        EAGER mode: required
        LAZY mode: optional (if not using zimbraAutoProvLdapBindDn)
        MANUAL mode: optional (if not using zimbraAutoProvLdapBindDn)

        LDAP search filter template for account auto provisioning.
        For LAZY and MANUAL modes, either zimbraAutoProvLdapSearchFilter or zimbraAutoProvLdapBindDn
        has to be set. If both are set, zimbraAutoProvLdapSearchFilter will take precedence.

        Supported place holders:
        %n = username with @ (or without, if no @ was specified)
        %u = username with @ removed
        %d = domain as foo.com
        %D = domain as dc=foo,dc=com

        Я могу быть не прав, но попробуйте прописать, например:

        zmprov md zimbra.local zimbraAutoProvLdapSearchFilter «(mail=%u@%d)»