Zimbra+LDAP

 Приветствую всех обладателей Zimbra.

Недавно познакомился с этим продуктом. В итоге приняли решение его внедрять. Внедрение, разбор полетов, настройка, запуск перезапуск все легло на меня. Я довольно много шерстил по инету пока знакомился сZimbra, неплохой хелп, даже отличный на ZimbraWiki.
Но вот работающего скрипта синхронизации ZIMBRA + LDAP так и не нашел. Пришлось изобретать свой собственный велосипед. Путь написания был довольно долгим и муторным, но думаю что скрипт пригодится не только мне, но и послужит в дальнейшем кому-нибудь основой для его целей. Думаю что мне будет приятно вложить свои 5 копеечек во всемирную копилку.

Я постараюсь как можно подробней описать и рассказать как работает скрипт.


Задача.

В организации МЕГО_ДОМЕН.ру поднят и успешно функционирует АД. Заносятся новые пользователи. Жили не тужили. Но вдруг возникла необходимость переехать на свой email и мало того чтобы переехать, необходимо его привязать к АД и не только привязать но чтобы и старых пользователей не обидеть. А условия такие:

1.       Переезд с одного сервера на другой должен пройти совершенно не заметно.
2.       При блокировки пользователя в АД блокируется его почта
3.       При создании пользователя и почты в АД, автоматически создается пользователь в Zimbra
4.       Логин(АД)=почте(Zimbra)(по крайне мере чтобы можно было зайти на почту(zimbra) по email(АД)
          но с паролем(АД) , пароль(АД)=пароль(Zimbra)
5.       При удалении почты из АД, автоматически удаляется почта из Zimbra.

И как было это все осуществить, не было не одной мысли и идеи. Но кто копает и делат тот всегда откопает и сделает. Решение проблемы находилось постепенно и поэтапно я лишь теперь передам его суть.         
   Суть заключается в том что Zimbra работает (как мне объеснили знающие люди) почти как и Exchange. Вот только одна проблемка и там и тут логин пользователя и email должны совпадать. Что я только не делал. В общем долго ли коротко ли но был выработан алгоритм. Выяснилось, что если на Zimbra создать пользователя (любого например test) завести в АД такого же пользователя с таким же логином, на Zimbra поднять проверку подлинности (что необходимо для выполнения условий 2-4) и создавая в Zimbra для пользователя test alias test2. То можно войти на почту zimbra используя либо логин test либо его alias test2 с паролем от пользователя test в АД.
   Тут немного поясню, когда на Zimbra настроена проверка подлинности, создан ящик test@test.ru а на него навешано куча alias test1@test.ru test2@test.ru и тд. и тп. То не зависимо под каким из test вы зайдете главное чтобы основная почта на Zimbra была = логину в АД. Это и есть ключ к решению и одновременно камнем преткновения и началом головных болей.


И так скрипт.
*внимание в моем случаи МЕГО_ПОЧТА.ру и МЕГО_ДОМЕН.ру это одно и тоже.

-------------------------------------------------------------

#!/bin/bash

Domain="МЕГО_ДОМЕН.ру" # ДНС имя или IP адресс вашего Актив Директори
ADDOMAIN="ПОЧТА_ДОМЕН.ру" # имя домена которое у вас будет на почте напримертруляля@ПОЧТА_ДОМЕН.ру

LDAPSEARCH=/opt/zimbra/bin/ldapsearch # ну тут вроде бы понятно
ZMPROV=/opt/zimbra/bin/zmprov # тут вроде тоже все ясненько
DOMAIN_NAME="ПОЧТА_ДОМЕН.ру" # канечно не обезательно, но если у вас на зебре несколько доменов то тогда пригодится а так не обезательно. 
TIMESTAMP=`date +%N` # красатульная и бестолковая приблудина :)
TMP_DIR=/tmp

########################### всякие файлы где будет идти обработка
ADM_TMP=$TMP_DIR/ads_mail.lst 
ADS_TMP=$TMP_DIR/users_ads.lst
SORT_TMP=$TMP_DIR/sort.lst
ZCS_TMP=$TMP_DIR/users_zcs.lst
DIF_TMP=$TMP_DIR/users_dif.lst
SED_TMP=$TMP_DIR/SED.lst
######################################

# Переменные номбер 2
LDAP_SERVER="ldap://МЕГО_ДОМЕН.ру" # сопсно вроде и так ясно
BASEDN="dc=МЕГО_ДОМЕН,dc=ru" # пишем по слогам
BINDDN="CN=ЗЕБРА,CN=users,DC=МЕГО_ДОМЕН,DC=ру" # вот тут указывается аккаунт для синхронизации с АД, сопсно для начало его нужно в АД создать.
BINDPW="УСИПУСИ" #это сопсно пароль к акаунту ЗЕБРА
FILTER="(mail=*)" # всякие переменные
FIELDS="mail" #-------------/-/--------------

# Сначала выгружаем почту с АД мы же не хотим вносить всех пользователей. А вносим только тех у кого есть мыло
echo -n "Выгружение почты с AD... "
$LDAPSEARCH -x -H $LDAP_SERVER -b $BASEDN -D "$BINDDN" -w $BINDPW "$FILTER" $FIELDS | \
grep "@$DOMAIN_NAME" | \
awk '{print $2}' | \
sort > $ADM_TMP
echo "Found `cat $ADM_TMP | wc -l` users ($ADM_TMP)"

# Следующий шаг мы ищем в АД почту (которую мы уже выгрузили) и запоминаем её sAMAccountName (логин)
echo -n "POISK: "
cat $ADM_TMP | wc -l
for x in $(cat $ADM_TMP | sed s/^+//g);
do
echo -n " $x ";

#тут я решил показать подробно как все устроено
sv=`ldapsearch -x -h МЕГО_ДОМЕН.ру -b dc=МЕГО_ДОМЕН,dc=ру -D "cn=ЗЕБРА,cn=users,dc=МЕГО_ДОМЕН,dc=ру" -w "УСИПУСИ" -LLL "(mail=$x)" sAMaccountName | grep sAMAccountName `
un=`echo -n $sv | grep -w sAMAccountName: | awk '{split ($0, a, "sAMAccountName: "); print a[2]}' | awk '{print $1}'`
 # таким образом получаем чистый логин
un1=`echo -n $un@$DOMAIN_NAME` # сопсно к логину добавляем @ПОЧТА_ДОМЕН.ру 

# все это дело записываем в фаил
RES=$?
if [ "$RES" == "0" ]; then echo -n $un1 | sort >> $ADS_TMP ; else echo "[Err]"; fi 
done
sort $ADS_TMP > $SORT_TMP
 
# А теперь мы этот фаил сортируем по алфовиту. Это очень важно.


# Теперь выгружаем всех пользователей (аккаунты) с zimbra это нужно для составления файла, чтобы добавлять или удалять новых или старых пользователей.
$ZMPROV -l gaa $DOMAIN_NAME | sort > $ZCS_TMP
echo "Found `cat $ZCS_TMP | wc -l` users ($ZCS_TMP)"

# Теперь у нас есть 2 файла 1 с АД другой с зимброй. Сравниваем их если есть почта в Зибмре но её нет в АД ставим -. 
#Если наоборот ставим + если не то не другое ничего не ставим :)
echo "Generating diff file ($DIF_TMP)"
diff -u $ZCS_TMP $SORT_TMP | grep "$DOMAIN_NAME" > $DIF_TMP
# и канечно результат записываем в другой фаил

#####################################################
И так первый этап мы прошли у нас есть фаил в котором есть логин из АД, которые будет являться основной почтой (аккаунтом) в зимбре по которому будет проходит
проверка подлинности (это так в зимбре называется)
следующим шагом у нас идет занесение ALIAS для опредленных пользователей. Так как в АД нет таких записей как логин@ПОЧТА_ДОМЕН.ру
у меня например ПОЧТА_ДОМЕН.ру и МЕГО_ДОМЕН.ру одинаковые. Но в любовм случаи нам нужно в файле $DIF_TMP убрать @ПОЧТА_ДОМЕН.ру
 потому как мы будем производить поиск по логинам из АД, для выгрузки поля email ( в зимбре это будет наш alias для этих пользователей) 
######################################################

sed '/@ПОЧТА_ДОМЕН.ру/s/@ПОЧТА_ДОМЕН.ру//g' $DIF_TMP > $SED_TMP # результат записываем в фаил.

# Теперь шерстим этот фаил. Если напротив логина стоит + мы ищем поле email для этого логина в АД и заносим его в Зимбру а найденый email как ALIAS для этого логина 

echo -n "New USER: "
cat $SED_TMP | grep ^+ | wc -l
for i in $(cat $SED_TMP | grep ^+ | sed s/^+//g);
do
echo -n " - Adding $i ";
searchValues1=`ldapsearch -x -h $Domain -b $BASEDN -D $BINDDN -w $BINDPW -LLL "(sAMAccountName=$i)" mail`
Username=`echo $searchValues1 | grep -w mail: | awk '{split ($0, a, "mail:"); print a[2]}' | awk '{print $1}'`

printf "Creating User $Username \n"; # эту строку можно закоментить просто она удобна при отладки
$ZMPROV ca $i"@ПОЧТА_ДОМЕН.ру" passwd > /dev/null; # создаем основной аккаунт на зимбре но без пароля, так как у нас будет настроена в зимбре проверка подлинности
$ZMPROV aaa $i"@ПОЧТА_ДОМЕН.ру" $Username; # вносим ALIAS для этого аккаунта
RES=$?
if [ "$RES" == "0" ]; then echo "[Ok]"; else echo "[Err]"; fi
done

# Эта часть отвечает за удаление пользователей из зимбры. То есть есть ли есть пользователь в зимбре но его нет в АД то из зимбры он удаляется
# В данный момент у меня пока идет прибавление пользователей.
#echo -n "Old users: "
#cat $DIF_TMP | grep ^- | wc -l
#for i in $(cat $DIF_TMP | grep ^- | sed s/^-//g);
#do
#echo -n " - Deleting $i ";
#$ZMPROV deleteAccount $i > /dev/null;
#RES=$?
#if [ "$RES" == "0" ]; then echo "[Ok]"; else echo "[Err]"; fi
#done

# удаление файлов обработки удобно их просматривать при дебаге.
#rm -f $ADM_TMP 
#rm -f $ADS_TMP
#rm -f $SORT_TMP
#rm -f $ZCS_TMP
#rm -f $DIF_TMP
#rm -f $SED_TMP
-----------------------------------------------------------------------------------

Теперь для закрепления полученного материала разберем его по полочкам на примере.

Допустим у меня в АД есть:
Пользователь Вася Пупкин Медведевич
Его логин (sAMAccountName) vasiazubr
Пароль на его логин 3.14zdec
и также у него есть почта vasiok@МЕГО_ДОМЕН.ру

Как видно из исходных данных его логин и его почта разные.
После того как мы прогоним скрипт сделается следующее.

В zimbre появиться: 
пользователь vasiazubr@ПОЧТА_ДОМЕН.ру
у него будет alias vasiok@ПОЧТА_ДОМЕН.ру (в данном случаи я подставляю переменные но у нас ПОЧТА_ДОМЕН и МЕГО_ДОМЕН это одно и тоже)
и пароль для входа в zimbra у него будет 3.14zdec (так как мы настроем проверку подлинности)
 

Вывод.

Данный пользователь может зайти в zimbr-у как под vasiazubr так и под vasiok пароль будет один и тот же. Он попадает в основную почту vasiazubr@ПОЧТА_ДОМЕН.ру
НО! чтобы он отправлял свою почту от vasiok@ПОЧТА_ДОМЕН.ру придется ручками поправить в настройках его адрес с которого буду уходить письма. И тогда все будет четко.

Но в основном всегда старайтесь чтобы логин и почта были одинаковыми, потому как постоянство признак профессионализма XD.

Я тут решил добавить кое что.

Это скрипт тот что выше. Но уже с проверкой на пинг и на наличие пользователя. Думаю так будет проще для усвоения материала :)

!!!!!!!!!!!!!!!!!!!! ВНИМАНИЕ !!!!!!!!!!!!!!!!!!!!!

Скачав фаил просто удалите его разширение. .txt на конце просто оставте .sh

Замените переменные на свои и готово.

Скрипт боевой.

docs.google.com/file/d/0B--g3UL9ysp5M2tZUWliTlRLRkU/edit

4822
Прикрепленные файлыРазмер
skript.sh_.txt4.39 кб

Комментарии

и всё равно спасибо за ответы, лайкнул, и считаю что скрипт рабочий, пока всё дело в моих руках и недопониманиях в никс)
спасибо за консультации)
как вылечу постараюсь досконально выложить суть настройки зимбра с нуля. Выложу  некое ридми)
всё мне открыли доступ в гугль, пингуется, полез....
упд
похоже в ад моем не совсем всё хорошо хотя команда
ldapsearch -v -b "dc=dc1,dc=example,DC=ru" -h dc1.example.ru -D galsync -W -x "(cn=*i.doloman*)"
выдала
ldap_initialize( ldap://dc1.example.ru )
Enter LDAP Password:
filter: (cn=*i.doloman*)
requesting: All userApplication attributes
# extended LDIF
#
# LDAPv3
# base <dc=dc1,dc=example,DC=ru> with scope subtree
# filter: (cn=*i.doloman*)
# requesting: ALL
#
 
# search result
search: 2
result: 32 No such object
matchedDN: DC=example,DC=ru
text: 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, bes
 t match of:
        'DC=example,DC=ru'
это хорошо?)
 вроде поперло, как запущу отпишу, и сделаю ридми как и обещал)...
Любой результат это нормально. Даже отрицательный :D
В общем дерзай давай. Как получится просто отпишись в коментах. Вдруг кто столкнётся с похожей проблемой, а твоя запись спасёт человкка от увольнения. тьфу 3 раза.
Доброго времени суток, пишу вам из окопа)
начну спрашивать с самого начала)
какие условия должны быть созданы для работы скрипта, кроме того что я сделал
1 скрипт выполняется из под zimbra
2 имеет chmod 777, chown zimbra:zimbra
3 ubuntu синхронизирована по времени с Актив Директори(далее АД) ntpdate
4 в АД есть пользователь galsync@exmaple.ru находящийся в самом верху, без каталожный так сказать.
что нужно в зимбре, и что нужно в АД?
спасибо за очередное направлени е в правильную дверь)
да вродебы.
всё ништяк.
Скрипт запустить осталось.
 Скрипт отрабатывает, но не создаются учетки АД, буду искать рабочие параметры, наверное руки или голова....
Урааа учетки зимбровские вытянулись в тмп директории)))ладно буду завтра доэксперементировать)_))))
Как же это приятно что ваш скрипт заработал, разобрался) буду ридмю писать, даже фильтры свои добавил)щас буду прикручивать поэтапно)
Поздравляю и я рад что он тебе пригодился или послужил отправной точкой.
 Всё поставилось на ура, вседаки приятно когда руки сам себе подравниваешь под надзором опытного человека, спасибо за наставления, очень благодарен. Меньше вам злых пользователей, больше средств от руков, на развитие ИТ сервисов)
рюдмю напишу, но у вас тут и так всё подробненько оказывается написано)
всем Мир..
Пи Си
дабы не потерять админки из почтовика, можно по ним условия проводить наверное?задать некое условия чтобы не трогались именно эти учетки на стороне зимбра.
В планах поднять никс систему мониторинга(забикс в приоритете), надоели падающие сервисы конторы)
Ух как давно был комент написан. А я как-то мимо прошел. По мониторингу заббикс хороший выбор. Есть ещё зеннос. Но что-то у меня с ним не сраслось. Хотя помоему и по нему маны писал небольшие. А по забиксу на сайте есть статьи по быстрому старту. Заостряю внимание на том что с начало надо прикинуть количество оборудования мониторинга, и сделать с небольшим запасом. Также внимание засотри на том сколько дней т будешь хранить инфу. Самое оптимальное это недели две три. Хранить годами. Не стоит. Так как чем больше оборудования тем сложнее будет ворочится база данных. Хотя если разнести на разные сервера.... Но я пока таким сексом не занимался :D