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
Прикрепленные файлы | Размер |
---|---|
skript.sh_.txt | 4.39 кб |
Комментарии
16/03/2011 - 09:54
Спасибо автору, очень помог. Вот бы еще имя,фамилия пользователя из АД переносились, цены б не было ;)
16/03/2011 - 12:27
Какие-то у меня сомнения есть в том, что это способно помочь, потому что авторизация пользователей Zimbra в AD есть "из коробки".
16/03/2011 - 12:40
Авторизация есть, создания почтовых ящиков для пользователей АД нету...
16/03/2011 - 12:42
Сорри, понял, что статья немного не о том... Вообще можно попробовать это сделать с OpenLDAP+backend meta+overlay translucent - тогда ещё проще будет. Но заниматься этим не хочется, поскольку не вижу необходимости никакой: если бы речь шла об автоматческой авторизации пользователей домена по керберос-тикету, в этом ещё был бы какой-то смысл, а так я не очень понимаю, в чём проблема завести всех, кого нужно, в Зимбра руками.
16/03/2011 - 12:45
Руками 200 пользователей? Потом в ручную добалять/удалять? Как-то неохота :)
16/03/2011 - 13:46
Ну на самом деле вносить Имя фамилию это не проблема. Добавить буквально несколько строг в конфиг. А именно в то место где мы создаем полльзователя и 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`
# вот тут мы будем искать имя фамилию (точнее поле в котором это будет писаться думаю что будет как-то так)
#searchValues2=`ldapsearch -x -h $Domain -b $BASEDN -D $BINDDN -w $BINDPW -LLL "(sAMAccountName=$i)" mail` # только вместо поле которое мы будем искать надо поставить не mail а например поле name
ну и потом каким-то способом с помощью zmprov подставим переменную как на примере ниже.
Username=`echo $searchValues1 | grep -w mail: | awk '{split ($0, a, "mail:"); print a[2]}' | awk '{print $1}'`
-------------------------------------------------------------
.............
-------------------------------------------------------------
$ZMPROV aaa $i"@ПОЧТА_ДОМЕН.ру" $Username; # вносим ALIAS для этого аккаунта
RES=$?
if [ "$RES" == "0" ]; then echo "[Ok]"; else echo "[Err]"; fi
done
В моем случаи это не нужно было. Так как пользователи юзают почтовызх клиентов мелкомягких (такая политика компании) а уже там к ней прекручена адресная книга LDAP (из АД).
Насчет автоматизации я пока не особо парюсь потому как появилась проблема, Zimbra отваливается через несколько часов. После последней клизмы она работает стабильно уже больше суток. Решение и выводы пока не публикую, потому как идет опкатка. Так небольшие наработки и вопросы все в форуме постю. Как разберусь обезательно запишу в блог.
Я рад что кому-то скрипт помог. И буду рад ещё больше если кто предложит альтернативу более компактную и функциональную. Всегда интересно.
16/03/2011 - 13:47
Желаю удачного дня.
16/03/2011 - 13:50
Спасибо. То что нужно. Тестил вариант на перле, работал нормально в 6 версии, в 7 русские символы в ФИО отображаться вЗимбре стали некорректно, разобраться сложно, не силен в этом. Если надо могу код выложить.
07/04/2011 - 13:34
Тоже пробовал этот скрипт, ничего не получилось.
Зато нашел элегантное решение импортировать учетные записи АД средствами zimbra (ZCS 7, Ubuntu 10.04 x64).
В консоли управления Сервис-Перенос учетной записи есть мастер переноса, который без проблем помогает перенести учетные записи из Active Directory в Zimbra. Причем переносит без дублирования записей, которые успел уже вручную занести. Удивляюсь, почему этот способ не описан. Искал долго.
16/04/2014 - 11:48
И я так же удивлен, почему не описана процедура переноса пользователей с помощью встроенного мастера... там так же через LDAP можно задать различные фильтры.
PS
Zimbra Collaboration Suite 8.0.7 Open source edition.
16/04/2014 - 23:13
Точнее она была но она была вроде как связана с эксчанджейм. Помоему... Но скрипт в первую очередь создавался не для переноса писем. А для автоматического создания пользователей. В зимбре. Просто слишком долго мне своим ребятам говорить что да как создавать какие нюансы. А так написал скрипт. Ребята в ад вбили пользователя. И он появился через 10 минут в зимбре. А за это время они уже и комп поднастроили. И осталось только почту настроить на пользовательском компе. И мне меньше головной боли. А уже если что там совсем беда с почтой то званят мне. А на момент внедрения зимбры вбивать 500 человеков руками ну его нафиг.
Изначально цель была такая.
И то я считаю этот скрипт огромнейшим костылищем. И описывал его именно под свой случай. Я не настаиваю на том чтобы использовался только он. Мне он пригодился только 2 раза :) Но зато как это удобно знать что тут лежит заметочка и можно оп и посмотреть почитать и скопировать. Изначально я скрипты на основе которых делал свой увидел на англ форуме зимбры :).
Ка-а-ароче. Я вам кстатит буду благодарен если вы напишете мануальчик по переносу, который можно осуществить уже средствами самой зимбра. Ну а также если есть автоматическая привязка её к ад. Чтобы и там и там всё было огонь. Будет вам огромное спасибо.
К сожалению написание статей от меня сейчас очень сильно затруднено. Я просто физически не успеваю слишком много дел. Да кстати я тут потихонечку готовлю мануальчики по IP телефонии на основе Elastix так что я думаю должны в скором времени появится статейки по нему от меня.
P.S. спс за отзывы. Я рад что пусть и не пригодилася скрипт зато благодоря ему человек оставил комент и этот комент комуто помог. Этож Здорово.
17/04/2014 - 04:59
По поводу мануала... а давайте попробуем.
И раз уж те, у кого возникает вопрос об импорте пользователей из AD в каталог Zimbra, скорее всего попадут на этот форум, то свои шаги я размещу здесь.
Задача:
Имеется домен AD CompanyGroup.local, деление по фирмам осуществляется посредством OU. По требованиям бизнеса, каждая фирма, входящая в состав группы компаний, должна обладать своим собственным почтовым доменом, например firm1.ru, firm2.ru, firm3.ru etc.
Решение:
Регистрируем почтовый домен для каждой фирмы, создаем эти домены в Zimbra, настраиваем проверку подлинности как "Внешний Active Directory" (в терминалогии Zimbra).
В AD, прописываем каждому пользователю атрибут -EmailAddress, в зависимости от его принадлежности к OU.
Я делал это посредством PowerShell:
NB: Если у вас в AD заполнены поля почтового адреса для сотрудника, то данные команды их заменят новыми значениями: sAMAccountName@firmN.ru.
Собственно на этом, подготовка к импорту закончена.
Импорт:
Через консоль администрирования, заходим последовательно в пункты Средства и миграция/Перенос учетной записи/Мастер переноса
Запускается Мастер Переноса.
На 1-й странице мастера (Введение) устанавливаем значение полей следующим образом:
На 3-й странице мастера (Параметры массового создания) я выбрал использование одного и того же пароля для всех создаваемых пользователей. Но на самом деле, этот параметр нам не важен, т.к. настроена аутентификация через AD.
На этой же странице, поля "узел SMTP" и "порт SMTP" оставляем пустыми.
На 4-й странице (Подключение каталога)
Убираем галочку с поля "Автоматически создавать отсутствующие домены", указываем URL LDAP, DN привязки, пароль привязки.
Так как мы не собираемся импортировать отключенные учетные записи (в т.ч. и шаблоны учетных записей), то строка фильтра LDAP принимет следующий вид:
(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
Более подробно, про использование фильтров AD описано на TechNet'е, статья Active Directory:Использование LDAP-фильтров. (ссылку приводить не стал, т.к. правила форума читал по диагонали ;) ).
В поисковой базе LDAP указываем базу поиска. В моем случае, я выгружал пользователей поэтапно, отдельно по каждой фирме, соответственно для 1-й фирмы: ou=Пользователи Фирмы 1, ou=Фирма 1,dc=companygroup,dc=local
Ну вот собственно и все.
Жмем далее, готово. При этом имеется возможность сохранить список импортированных (и не импортированных) пользователей в формате csv.
Желаю успехов, и буду рад, если кому-нибудь сие пригодится.
PS
DruGoeDeLo, my respest and best regards!
17/04/2014 - 08:24
09/04/2011 - 01:30
На мой взгляд, проблема в том, что и автор, и тот, кто ему задание давал, увлеклись технической реализацией, но забыли о принципиальной концепции того, что делают.
В итоге получилось, что один и тот же пользователь хранится в двух LDAP-каталогах, причём не находящихся в состоянии синхронизации друг с другом. Фактически это два разных объекта, два разных пользователя.
А самый главный мега-косяк вообще всей этой конструкции - в том, что люди вообще непонятно для чего ставили Zimbr'у: получается, первичным источником информации об объекте "Сотрудник" является Active Directory. Но при этом предполагается, что средством коллективной работы является Zimbra, которая AD использовать именно как хранилище настроек - не умеет.
В итоге мы в общем случае получили дублирование данных об одних и тех же объектах IT-инфраструктуры, что можно было бы частично компенсировать только написанием полноценного инструмента синхронизации между AD и OpenLDAP, что не только сложное, но и неблагодарное занятие: ведь всё равно часть настроек будет только в учётке Zimbra, потому что соотв. атрибутов в AD просто нет!
И здесь принципиально правильных выходов только два:
1) Отказаться от AD и построить инфраструтуру Windows-домена на Samba 3+Zimbra (по этому поводу здесь была замечательная статья)
2) Не использовать Zimbra, а пользоваться либо специализированным ПО, ориентированным на работу с AD (да-да, это MS Exchange), либо неспециализированным, но всё же худо-бедно работать с AD умеющим - eGroupWare, например.
Вообще же если вы строите инфраструктуру на OpenSource, делайте это. Если вы подсели на иглу Microsoft - седите на ней и дальше. Полумеры и костылеподобные решения аля "заплаты от Васи Пупкина" - это инфантилизм на грани маразма.
12/04/2011 - 08:51
Интересные отзывы. А не чо что например АД до моего прихода уже было купленно настроено и функионировало уже наверное как лет 5. Да да именно АД необоходим как воздух. Ну а если не понравилось то ну чтоуж теперь. Ну и 7 версия зимбры мне не понравилась. Сыровата она. А так меня вполне удовлитворило. Кароче не понравилось ну что уж тут теперь предложите свою идею.
26/05/2011 - 07:26
Товарищи, лучше помогите настроить GAL в 7-ой версии.... Уже все перепробывал, не могу натравить на Ad(2003).
Тест проходит, но контакты не отображает
22/06/2011 - 11:27
такая же проблема с GAL в 7 версии. Никто случаем не нашел ответ на вопрос?
22/06/2011 - 14:12
В общем кому интересно, проблему решил. Весь затык был в том, что по умолчанию фильтр для AD в зимбре настроен на работу и поиск почты по атрибуту mailNickname (который используется например в Exchange). А в AD2003 по умолчанию для этих целей используется атрибут mail.(посмотреть можно через оснастку ад - свойства - редактор атрибутов) Соответственно необходимо изменить злосчастный фильтр.
Все команды выполняем из под пользователя zimbra:
1.zmprov gcf zimbraGalLdapFilterDef >> /tmp/someconfigfile
2.меняем значение mailNickname внутри файла на mail
3.подсовываем его обратно используя zmprov mcf zimbraGalLdapFilterDef < /tmp/someconfigfile. или так как описано здесь.
4. заходим в консоль управления по вебке и проверяем в настройке gal находит ли определенный майл или нет.
24/06/2011 - 06:08
команда
zmprov mcf zimbraGalLdapFilterDef < /tmp/someconfigfile
не срабатывает
04/07/2011 - 10:54
Собственно решил не портить саму статью.
И дописать в коментах. Скрипт на данный момент прикручен в кроне на исполнение каждый 10 минут. В моем случаи (проведя нехитрые подсчеты) это наилучшая зона комфорта. Есть только 1 нюанс это то что когды вы будете скрипт загонять в crontab не забудьте указать полные пути до исполняемы команд.
Например команда ldapsearch
в скрипте она выгядет вот так
sv=`ldapsearch -x -h МЕГО_ДОМЕН.ру -b dc=МЕГО_ДОМЕН,dc=ру -D..........
а для запуска в crontab и чтобы все работало нужно сделать так.
sv=`/opt/zimbra/bin/ldapsearch -x -h МЕГО_ДОМЕН.ру -b dc=МЕГО_ДОМЕН,dc=ру -D.......
После небольших исправлений скрипт заработал как часы.
Единственная проблема если падает все и АД тоже (например перебой с электричеством) то как назло zimbra поднимается быстрее AD и скрипт запускается тоже. Вот только если AD поднимется после ZImbra то скрипт похерет все почтовики. Поэтому советую прикрутить в скрипт проверку доступности AD (у самого пока руки не дошли, если сделаете раньше выложите скрипт буду очень благодарен)
21/10/2011 - 18:43
При выполнении скрипта выдаюет такую вот ошибку
Выгружение почты с AD... ldap_bind: Invalid credentials (49)
additional info: 80090308: LdapErr: DSID-0C090334,
у кого нибудь возникало данная ошибка?
28/10/2011 - 08:28
что-то гдето с переменными не так.
или что-то гдето не от туда взяли.
В ообще можно отладить всё это дело ручками рописав команду запроса/поиска по АД и посмотреть что она выдаст (или запишет в фаил и исходя из этого уже смотреть что за ошибка)
1. разбейте скрипт на несколько частей
2. каждую часть прогоните по несколько раз дабы понять как всё устроенно.
3. скрипт рабочий :). и работает не только у меня а ещё у парочки моих знакомых и у человека гдето в штатах.
Анализ Анализ и ещё раз Анализ. Вопервых какую ос вы используете. Во вторых какая версия у вашей зимбры. Ведь расположение програмок таких как ldapsearch может быть разное. Больше информации пожалуйста.
25/10/2011 - 17:04
что нужно удалить в данном скрипте чтобы он не конектился к АД, а брал с фтп файлик csv и делал сравнение на основе находящихся в этом файлике данных.
тобишь в csv тупо
имя, почта
имя, почта
практически такая же аналогия что и у вас.
на счет того чтобы закачать файлик с фтп это без проблем, а как сделать так чтобы он взял за основу эти данные
28/10/2011 - 08:44
о_О
ну как же так. Вообщето скрипт сравнивает 2 файла. Если внимательн присмотреться к коду. приведите в вид фали который будете брать с фтп в вид который обробатывает скрипт и сравнивайте 2 файла кто вам мешает?
Вроде же все просто
А удалить надо часть, в которой скрипт оброщается к АД. Так как я везде писал коменты (почти каждой строчки), думаю найти эту часть большого труда не составит.
28/10/2011 - 12:44
ZImbra 7, но уже разобрался проанализировав полностью скрипт, изменил под себя, сейчас просто тупо ищет логин и мыло в выгруженных с фтп файлах, сейчас пытаюсь сделать так чтобы заполнял поля ФИО выгруженные с АД. Потом выложу полностью реализованные схему может кому и пригодится. Еще вопрос как прописать необходимый пароль с которым будут создаваться все пользователи?
28/10/2011 - 15:51
ну так как у меня стоит ад то у меня проверка подлиности проходит.
А так по идее можно ставить какой-то стандартный там. Командочка zmproov
$ZMPROV ca $i"@ПОЧТА_ДОМЕН.ру" passwd > /dev/null
кто мешает вместо /dev/null указать пароль?
28/10/2011 - 16:21
ставил не прокатывает, появляется файлик под именем пароля, а то шифрованный пароль я так понял
только когда пытаюсь зайти по паролю не пускает
30/10/2011 - 23:53
я тут правда чуть попутал с командой. Прости мой косяк вот тут http://wiki.zimbra.com/wiki/Zmprov
если посмотреть то выглядит это вот так
zmprov ca joe@domain.com test123 displayName JSmith
Я думаю это то что тебе надо.
P.S. а насчёт скрипта канечно выкладывай будет очень интересно его посмотреть. Так сказать жду с нетерпением.
30/11/2011 - 08:39
Автору статьи больше спасибо.
Не могли бы вы еще подсказать - может ли зимбра работать со сторонним имап сервером?
У нас уже есть работающий почтовый imap сервер. Хотелось бы продолжать использовать его как основной сервер, а зимбру как необязательное дополнение. (когда то давно смотрел eGroupWare - воту нее как раз есть подобная возможность).
На данный момент с imap сервером используем Roundcube, но он не так функционал.
30/11/2011 - 08:51
Немного не понял вопроса. Zimbra умеет делать imap. Вас интересует миграция с другово почтовика? Или что-то ещё.
У меня вооброжение богатое вдруг понапридумываю ещё чего лищнего. Вы опишите проблему чуть подробнее например на форуме там умных очень много. Так что думаю решение для вас найдём довольно быстро.
P.S. а за спасибо, спасибо ;)
30/11/2011 - 10:26
На форуме описал подробнее чего хочется от зимбры
07/02/2012 - 09:12
Добрый день!!!
Я чайник в линуксе но zimbru поставил, мне она тоже очень понравилась вот теперь бы хотел реализовать по вашему методу привязку к АД, но я совершенно не силён в написании скриптов ищу информацию на эту тему...
Опишите пожалуйста хотябы в 2 словах, как вы создаёте ваш скрипт и куда помещаете и вообще как он запускается?
07/02/2012 - 11:58
всё просто
если нету пароля для рута создаём проль для рута
Заходим под root
su
создаём фаил где угодно пусть будет домашняя директория например /home/zimbrauser и файлик назовём 11111111111.sh
далее устанавливаем ему chmod 755
и chown zimbra:zimbra
сто такое chmod и chown я не буду говорить это так сказать будет домашним заданием :)
а дальше всё просто.
Заходим под пользователем zimbra (этот пользовател уже существует, если канечно саму zimbru уже поставили)
su zimbra
Дальше заводим скрипт в crontab под пользователем zimbra
crontab -e
и в самом низу файла после слов
# ZIMBRAEND -- DO NOT EDIT ANYTHING BETWEEN THIS LINE AND ZIMBRASTART
Дописываем слудующее
Теперь каждый десять минут у тебя будет запускаться твой скрипт.
P.S. советую почитать что такое crontab, chmod, chown.
И не спешить всё делать внимательно. Очень подробно изучить и вникнуть в смысловую нагрузку скрипта. В общем не спешить и во всё вникать и стараться самому :).
Желаю удачи в трудовой деятельности.
07/02/2012 - 12:04
спасибо большое я всё сделал уже только вот ошибка вываливается
помогите с ней разобраться?
sudo ./ad.sh
Выгружение почты с AD... Found 1 users (/tmp/ads_mail.lst)
POISK: 1
dimon@ad.ru ./ad.sh: строка 45: LDAPSEARH: команда не найдена
Found 0 users (/tmp/users_zcs.lst)
Generating diff file (/tmp/users_dif.lst)
New USER: 1
Old users: 0
строка 45: LDAPSEARH: команда не найдена
система ubuntu 10.4 64х zimbra 7
07/02/2012 - 12:09
по вашему скрипту 45 строка это тут
sv=`ldapsearch -x -h ad.ru -b dc=ad,dc=ru -D "cn=zimbra,cn=users,dc=ad,dc=ru" -w "123456" -LLL "(mail=$x)" sAMaccountName |
07/02/2012 - 12:30
могу дать совет.
запусти отдельно прямо из консоли ldapsearch -x -h ad.ru -b dc=ad,dc=ru -D "cn=zimbra,cn=users,dc=ad,dc=ru" -w "123456" -LLL "(mail=$x)" sAMaccountName | sAMaccountName
вот только переменную $x замени скажем так на какую-нибудь почту заведомо известную и созданную у тебя в AD
07/02/2012 - 12:43
Спасибо за совет? но вы уже описывали решение мой проблеммы выше где вы писали
ldapsearch поменять на полный /opt/zimbra/bin/ldapsearch у меня так все решилось всё добавляется только ещё есть одна ошибка последний как бы вопрос:
- Adding Dimon Creating User dimon@ad.ru
ERROR: account.ACCOUNT_EXISTS (email address already exists: dimon@ad.ru at DN: uid=dimon,ou=people,dc=ad,dc=ru)
[Err]
в принципе всё работает, но всё равно хотелосьбы безупречной работы скрипта ???
07/02/2012 - 12:53
:)
я предвидел этот вопрос мой юный....
В прочем это не из этой оперы.
Всё на самом деле очень просто.
Это означает что у человека лоигн и почта одинаковые :)
То есть, пусть в ад есть логин vasia и есть почта у этого васи vasia@ad.ru
скрипт смотрит аха у этого пользователя есть почта:
шаг1
создать почту в зебре такую же как и его логин (необходимо для того, чтобы проходила проверка подлинности и пароль в ад и в зебре был одинаковый)
vasia@ad.ru
шаг2
создать почтовый ящик (а именно из AD взять почтовый адрес и перенсти его на зибру в алиас)
EROOR такой почтовый ящик уже существует.
Вот собственно и всё :) вот что означает это ошибка.
Если в ад логин пользователя и название почты у него разные например:
логин vasia
а почта
vasia123@ad.ru
то ошибки не выйдет :)
07/02/2012 - 13:17
Точно!!! :) Спасибо за пояснение и терпение, а я бы и не подумал об этом, хорошую статью написали и ещё тут благодоря коментам много вопросов решается))).
07/02/2012 - 13:31
всегда всегда пожалуйста.
но если посмотрите ещё статьи то я дальше делаю проверки к серверу AD ведь если AD ляжет то вся почта просто тупо удалиться и так далее.
Прикрутиль к скрипту ещё 2 проверки. Но в итоге у нас зачудил сервак и что самое поганое он проходил 2 проверки
а вот время откликов на команды ldapsearch он отрабатывал через раз.
Ну собственно и почта удалилась через одного а потом и просто тупо вся. Вот такой вот был результат локальной сетевой атаки. Казалось бы :). Посему скрипты пока снята с автоматики и вопрос отложен в дальний ящик пока найдётся свободное время. И советую много много раз подумать об установки его в crontab взвесить все за и против и ковсему к этому делать бек апы почтовых адресов и их содержимого вот вам скриптик к этому делу. Нарыл я идеи и ссылки на ossportal
Внимание фаил EmailBacup.list не удаляется автоматически нет командочки ремув в конце файла. Данный скриптик проходит опкатку у меня на серваке. И думаю над интерфейсом. И руки пока не дошли по причине ооочень большой занятости. В последнее время сам с ебя офигеваю. Нету времени даже мануалы по zabbix выложить хотя уже готовы. В общет то что я ответил это скорее ОФИГЕННОЕ стечение обстоятельств :).
А так рад что скрипт пригодился :) Желаю удачи.
P.S. хотя как выход синхронизацию на проверку почты можно делать позно ночью где-ниубдуь в час ночи, а пользователям говорить мол ребята!! Почта будет завтра работать :)
07/02/2012 - 14:12
Вы знаете, я думаю лудше этим скриптом в ручную пользоваться, а то и в правду опасно АД ляжет удялятся все!
07/02/2012 - 14:17
я у себя за коментил crontab у меня не так много пользователей будет человек 200 думаю лудше ручками их по вношу если понадабится раскоментирую :) ну и ваши советы расмотрю по бэкапу и что нить сам поищу будут новости напишу!!!.
07/02/2012 - 15:37
имхо :
1.лучше скриптом пользоваться один раз для импорта учеток и потом ручками создавать удалять
2.скрипт лучше писать не в кронтаб зимбры, а в кронтаб рута. мухи отдельно, котлеты отдельно.
07/02/2012 - 19:35
на самом деле в какой crontab его занести ваще пофигу :)
просто скрипт работает под пользователем zimbra поэтому чтобы не потерять логическую цепочку я обычно делаю так :).
Но тут кому как удобно и у кого какие принципы.
А вот насчёт постоянства.
Я с тобой согласен. Нежелательно держать такие вещи в автоматике темболее уже лично у меня были приценденты когда скрипт сначало удалил всю почту, потом я сделал проверки, а потом из-за сетевой атаки он опять всё к чертям послал. Теперь я думаю над очередными проверками и пока никаких идей. После разбора полётов сетевой вирус был присечен. И виновники и подозрительные люди были заблочены. В общем лихо нас так пробороздило. Вот теперь думаю как бы и от этого обезопаситься. Есть одна мысли.
Например перед каждым запросом в ад делать проверку на полученый ответ. Если там какой ой мол ерор нет ответа. Скрипт останавливается. Ну и так далее. Но это уже моя головная боль.
А в автомате он. Потому что меня не дергают по мелочам наши админы. Вроде и показал как удалять и добавлять. Но всёравно есть один кадр который даже если запишет побоиться делать. А заниматься этим каждый минут 10 или 5 у меня просто напросто нет на это времени и сил никаких не хватит. Я можно сказать упростил не им а себе жизнь.
А на автомате что не говори чертовски удобно щёлк забил и готово и больше никаких мыслей.
Так как сейчас мы расширяемся в услугах предоставления интернета в приоритетных задачах у меня стоит не почтовый сервер. Много чего каждый день допиливаем придумываем и внедряем на ходу. А ещё бывает косячат монтажники не так подключили не туда воткнули. А щас головная боль как подружить оборудование между собой да так чтобы ещё и антенки были бы видны на транковых канальчиках. В общем мама мия.... :( Так что когда руки дойдут до скрипта я даже и не знаю Но как дойдут тут же всё опишу и расскажу.
Кстати лишбы не сглазить. Думаю что на деньках будет свободное время в рамере пару часов и наконецто выложу мануалы по мониторингу. Тьфу тьфу тьфу (тра раза)
P.S. а всётаки чертовски приятно что кому то мой скрипт пригождается :). Всё я пошёл от компа пойдём с женой сходим на прогулку для бюлижайшего кофе. Настал долгожданый вечер отдыха. Всем Удачи!!!
18/06/2012 - 16:01
доброго дня.
А подскажите как можно сделать выгрузку в Зимбру контактных данных, таких как номер телефона, организаци, адрес и т.п.?
19/06/2012 - 07:32
Как я уже писал выше
..."запусти отдельно прямо из консоли ldapsearch -x -h ad.ru -b dc=ad,dc=ru -D "cn=zimbra,cn=users,dc=ad,dc=ru" -w "123456" -LLL "(mail=$x)" sAMaccountName | sAMaccountName"...
Я думаю достаточно просто добавить поиск по ещё одной переменной... Дай бог памяти помоему это переменная называется "telephoneNumber". Но в любом случаи я думаю можно воспользоваться справочником по переменным команды ldapsearch
http://linux.die.net/man/1/ldapsearch
Кстати наименование переменной я отгодал.
Желаю удачи.
P.S. Если хотите добавлять новую переменную то вам придётся не мало поправить год. Чтобы её туда впихнуть. Советую внимательно его изучить и окончательно разобраться именно что он делает и на время отладки скрипта внимательно посмотреть выводимые файлы.
14/08/2012 - 12:15
Исправте пожалуйста небольшой недочетег не "cn=zimbra,cn=users,dc=ad,dc=ru" а "cn=zimbra,OU=users,dc=ad,dc=ru"
14/08/2012 - 12:33
Это если правильно.
Но у меня работает так. В принципе я выкладываю скрипт который работает у меня. Скопировал прямо с сервера. Поэтому если вдруг не будет работать как у меня но работает как написал ты. Это гуд. Надпись не стирай вдруг кому пригодится.
15/08/2012 - 05:09
Я так понимаю основа взята отсюда? http://www.zimbra.com/forums/administrators/30856-active-directory-script-import-users-zimbra.html
15/08/2012 - 07:27
Это перво источник.
Всё началось именно от туда :). Там и коменты мои есть. Но так как сайт англо язычный. А вот в на русском языке этого нема. Я решил облегчить жизнь людям и выложил это дело сюда. Как-то так
15/01/2013 - 23:28
16/01/2013 - 07:31
16/02/2013 - 11:37
18/02/2013 - 07:40
первый rus.ru
второй prikol.ru
третий jaja.ru
А тебе нужно чтобы каждый почтовый ящик был в своём. Но если у тебя только один домен. То везде можешь (подставлять) только его. У меня опльзователи крутятся на внутреннем серваке (серых IP ) а в инет я просто пробросил порты (точнее не я а мой коллега. Не пускает он меня к ISA серверу :D)
P.S. спасиб за отзыв не думал что столько лайков соберу со своей статьи.
26/02/2013 - 09:17
26/02/2013 - 09:11
24/01/2014 - 11:52
отношусь к вашему скрипту как к дитю собственному, написал переписал, но похоже выход только один, окно.
root sudo ./111.sh не выдает никаких сообщений
назначил ему(111.sh) юзера на выполнение zimbra(дефаулт инсталл) из под рут
был вариант что такой пользователь не найден и он в тмп создавал файл с логом, сейчас вариант вообще не сработал, прошу о помощи что не так)))
ставил по инструкции http://qw1mb0.blogspot.ru/2013/07/zimbra-804-ubuntu-1204.html
ubuntu 12.04.04
zimbra 8.0.6
исходные данные
AD без сасля поэтому -h убрал
####
mx запись zimbra.example.ru
узел сделаны zimbra 192.168.5.20
####
хост с зимброй zimbra.example.ru(192.168.5.20)
host с доменом example.ru (192.168.5.11)
####
crontab -s
*/5 * * * * путь /111.sh
######
собсно сам текст скрипта
Заранее спасибо за пинок в нужную сторону)
27/01/2014 - 07:40
1. Коментим все блоки.
2. Раскоменчиваем 1 блок. На поиск юзеров. (ActiveDirectoryMail)
3. Проверяем что выполнил скрипт (если данные верны, раскоменчиваем второй блок).
4. И так до самого конца. Промежуточные файлы удаляем ручками после каждого запуска скрипта.
Таким образом ты увидишь где у тебя затык.
Так же обязательно посомтри в АД если логин пользователя начинается с Большой буквы то сделай её маленьким. Потому как если сравнивать список логинов(почты) из ад и список логинов (почты) из зибмра, то с АД у тебя логин придёт с заглавной буквы, а точно такой же с сзимбра придёт с прописной. И что ты думаешь? правильно скрипт сного попытается создать уже существующий аккаунт, а потом его удалить. И так до бесконечности.
И так. Логин в ад должен писаться с прописной буквы. Ну или как-то прикручивать заглавные буквы к скрипту. Мне было в падлу и поэтму в ад я прошерстил все логины.
Да и последнее... скрипт на сколько я помню должен запускаться из под пользователя zimbra. И в крон табе заноси его тоже из под пользователя zimbra
Как перейти к этому опльзователю. Заходим под пользователем root
А дальше всё просто пишем
su zimbra
и нажимаем интер.
Пароля спрашивать не должен.
P.S. фаил должен иметь
chmod 755
owner name
zimbra
Group name
zimbra
28/01/2014 - 16:35
пишу:
root@zimbra:/home/maila# /opt/zimbra/bin/ldapsearch -D "cn=zebra,dc=example,dc=ru" -x -W -b "dc=example,dc=ru" example.ru
всё равно вылазит.
в ldap.conf выставил url ldap://example.ru ldap://example.ru:389
в самой зимбре тест успешен, толкните на мысль)
За ответы большое спасибо...
29/01/2014 - 07:39
Повторюсь ещё разок
Да и последнее... скрипт на сколько я помню должен запускаться из под пользователя zimbra. И в крон табе заноси его тоже из под пользователя zimbra
Как перейти к этому опльзователю. Заходим под пользователем root
А дальше всё просто пишем
su zimbra
и нажимаем интер.
Пароля спрашивать не должен.
29/01/2014 - 09:44
zimbra@zimbra:/home/maila$ /opt/zimbra/bin/ldapsearch -D "cn=zebra,dc=example,dc=ru" -x -W -b "dc=example,dc=ru" emaple.ru
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
файл в крон не добавлен(пока не работает, не вижу смысла в этом)
example.ru Active Directory
zimbra.example.ru host pochta
в АД сасл не используется...
какие настройки и логи выложить?
29/01/2014 - 09:58
/opt/zimbra/bin/ldapsearch -x -H ldap://example.ru -b dc=example,dc=ru -D "CN=galsync,CN=users,DC=example,DC=ru" -w password "(sAMAccountName=*)" | grep login | awk -F' ' '{ print $2 }'
И так что тут что значитpassword это пароль пользователя galsync который используется чтобы из зимбры попасть в ад или делать выгрузку из ад. login введи сюда логин пользователя заведомо существующего в ад (желательно с почтой которой).
У меня при вводе этой команды возвращается мой логин
drugoedelo (потому что есть совпадения grep drugoedelo)
1. если вывидет ошибку копипасть ошибку сюда в коменты.
2. если выведит твой логин.
Значит в коде есть ошибка при обращении к ад буква например русская стоит. Используй пример обращения к ад который я тебе дал в коменте.
Удачи.
P.S. Если не существует пользователя (у меня это galsync) создай его.
29/01/2014 - 10:09
так и дополнение ldap://dc1.example.ru это ссыль на Актив Директори
29/01/2014 - 10:14
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
29/01/2014 - 10:27
У меня при такой ошибке раньше почта нафиг вся удалялась.
Это означает что у тебя траблы в сети. Либо сервер ад не успевает обрабатывать запросы, либо тебе его кто-то в сети спамит. У меня в сети это был троян. Оххх он нам жизнь подсластил в своё время. Но был найден и локализован. После этого сервер Ад все гда был в доступе. Ну а я добавил проверку пингов и запросов в скрипт.
29/01/2014 - 10:25
ошибка неверный пароль.
Меняй пароль на более простой, пароль не должен содержать ][';/.,
попробуй чисто буквеныый какой-нибудь
29/01/2014 - 10:32
скрипт отрабатывает хорошо запросы уходят правильно.
Единственное тебе осталось разобраться нет ли вирусов в сети это раз.
И какие политики в самом ад ты используешь. Длинные ли у тебя пароли, имеет ли право пользователь galsync делать выгрузку или может у него админские права. В какой директории он у тебя хранится. Я делал как можно проще папочка users в корне и вперёд. Если у тебя длинный путь до него то делай запросы используя этот логин с указанием пути к нему. В общем ты сейчас заниматься будешь тем чем и я в своё время :D
В общем желаю удачи. Если что по скрипту то пиши постораюсь помочь
29/01/2014 - 10:43
29/01/2014 - 10:58
ldap://dc1.example.ru -b dc=dc1,dc=example,dc=ru -D "CN=zebra,CN=Users,DC=example,DC=ru" -w zebraru1 "(sAMAccountName=*)" | grep i.doloman | awk -F' ' '{ print $2 }
<
то что делать?
29/01/2014 - 12:36
Гугл в помощь :D
Я скажу по другому
играйся с параметрами строчки (теперь ты хоть какой-то ответ получаешь)
кстати | awk -F' ' '{ print $2 }
не обязательно это я немног сглупил.
попробуй ввести команду
ldap://dc1.example.ru -b dc=dc1,dc=example,dc=ru -D "CN=zebra,CN=Users,DC=example,DC=ru" -w zebraru1 "(sAMAccountName=*)" | grep zebra
посмотри что она выдаст, внимательно читай что она выдаёт, делай выводы.
К сожалению я не могу за тебя решить обсалютно все вопросы потому что:
1. Я не могу и не буду читать весь твой код потому что не я его писал (мне и моего хватает выше крыши а также повседневных задач), но общие или схожие проблемы могу посмотреть или смоделировать у себя(к сожалению твою проблему смоделировать не смог но подсказал тебе куда смотреть, по моему мнению).
2. Точного ответа тебе никто не даст, если он канечна не столкнулся с этой проблемой.
3. Пробуй много разных методов. Болит голова отдахни и лучше попробуй завтра.
попробуй посмотреть что выдаст команда
ldap://dc1.example.ru -b dc=dc1,dc=example,dc=ru -D "CN=zebra,CN=Users,DC=example,DC=ru" -w zebraru1 "(sAMAccountName=*)"
также советую почитать http://xgu.ru/wiki/LDAP
попробуй поделать другие запросы.
Это называется поиск, локализация и решение проблемы.
Мне в своё время это послужило хорошей отправной точкой.