Контроллер домена на Zimbra. Пошаговое руководство

Zimbra Collaboration Suite (ZCS) — программный продукт для автоматизации совместной деятельности рабочих групп. Включает в себя сервер электронной почты, антивирус, чат, совместную работу с документами, web-интерфейс. Является бесплатной альтернативой Microsoft Exchange.
 
В этой статье описывается как настроить сервер электронной почты и совместной работы ZimbraCollaboration Server (ZCS) в качестве первичного контроллера домена (PDC), обеспечивающего идентификацию пользователей рабочих станций Windows и Linux, единый доступ к общим папкам и сообщениям электронной почты. В результате мы получим сервер, работающий полностью на свободном программном обеспечении. Статья рассчитана на пользователя, мало знакомого с операционными системами Linux. Необходимость написания статьи вызвана некоторыми затруднениями, возникшими при настройке Zimbra по ссылкам из списка в конце статьи. Моменты, вызвавшие затруднения, я постарался раскрыть наиболее подробно.
Олег Карасев. email: o.karasev@gisland.ru, Skype: legus_nn
  
1. Программное обеспечение
Для выполнения примера нам потребуется выход в интернет и следующее программное обеспечение:
1)Ubuntu Linux Server edition 8.04 Long Term Support (LTS), взят тут:
(в этом же каталоге лежит 64-битная версия дистрибутива)
2)Zimbra Collaboration Suite 6 Open Source Edition for Ubuntu 8.04:
(нужен дистрибутив версии 6 для нашей версии linux server соответствующей разрядности)
3)Putty: Windows SSH Client. Подключается к серверу по протоколу SSH в режиме командной строки. В настройках программы необходимо указать кодировку UTF-8 для корректного отображения кириллицы.
4)WinSCP: Windows SCP клиент. Подключается к серверу по протоколу SSH в режиме передачи файлов. Вместе с (3) все работы в системе после установки ОС мы будем выполнять удаленно с рабочей станции Windows. В настройках программы необходимо указать кодировку UTF-8 для корректного отображения кириллицы.
5)LdapAdmin: небольшая утилитка для администрирования сервера LDAP из под Windows. В нашем примере она необязательна и применяется для контроля – убедиться, что мы все действия делаем правильно.
6)На клиентской стороне: браузер Mozilla Firefox последней версии. Хотя можно использовать Internet Explorer, но при работе с Zimbra он иногда ведет себя неадекватно или работает слишком медленно.
7)На клиентской стороне на компьютере администратора: JAVA (она нужна для некоторых модулей Webminm, для ZCS ее наличие необязательно)
http://www.java.com/ru/
 
 
2. Учетные данные
Ниже приведены учетные данные, использованные в этом примере. При установке вы будете использовать свои учетные данные. Замените нижеприведенные данные своими.
 
Домен: gisland.ru (domain base: "dc=gisland,dc=ru”)
Домен NT: GISLAND
Имя машины: mailserver
Полное имя машины: mailserver.gisland.ru
Ip адрес: 192.168.2.6
Маска подсети: 255.255.255.0
Шлюз по умолчанию: 192.168.2.1
DNS сервер пересылки: 192.168.2.1 (на него ссылается настраиваемый BIND)
Администратор компьютера: root, пароль ldap123
Временный пользователь: user, пароль: zimbra
Администратор почтового домена: admin@gisland.ru, пароль ldap123
Суперпользователь домена: “cn=config”, пароль: ldap123
Администратор домена "uid=zmposixroot,cn=appaccts,cn=zimbra”, пароль: ldap123
Пользователь домена: "uid=zmposix,cn=appaccts,cn=zimbra” пароль: zimbra

 
3. Установка операционной системы
Установка UBUNTU 8.04. После загрузки с установочного диска выбираем русский язык и начинаем установку. Если в вашей сети (как в моем случае) ip-адреса машины получают автоматически от сервера DHCP, вы попадете на экран настройки сети:

Поскольку нам нужен неизменный ip-адрес, нажимаем кнопку «вернуться», а затем “настроить сеть вручную”. Вводим ip адрес 192.168.2.6, маску подсети 255.255.255.0, шлюз 192.168.2.1, сервер DNS 192.168.2.1, имя компьютера: mailserver, имя домена gisland.ru. Дальше продолжаем установку с параметрами по умолчанию. При запросе имени пользователя вводим “user”,
при запросе пароля - «zimbra».
 
При запросе дополнительных компонентов выберем только один: «OpenSSH server». Остальные компоненты нам не потребуются или будут установлены в дальнейшем.
По окончании установки перезагружаемся. Подключаемся из PuTTY к ip- адресу 192.168.2.6 и видим экран идентификации. Вводим имя пользователя: user и пароль zimbra:
Задаем пароль суперпользователя:
user@mailserver:~$ sudo passwd root
[sudo] password for user: zimbra
Enter new UNIX password: ldap123
Retype new UNIX password: ldap123
passwd: password updated successfully 
Вводим пароль для user, затем дважды вводим новый пароль суперпользователя.
Закрываем PuTTY и запускаем ее снова. На этот раз укажем имя пользователя: root и пароль ldap123.
Запускаем WinSCP и подключаемся к нашему серверу 192.168.2.6 от пользователем root:

Слева — файловая система нашей windows-машины, справа — только что установленного сервера ubuntu. Мы можем копировать, перемещать, редактировать файлы на обеих машинах, создавать каталоги, искать файлы и.т.д.
 
 
4. Настройка и обновление операционной системы
Проверим соединение нашего сервера с интернетом. В командной строке PuTTY напишем:
root@mailserver:~# ping ya.ru
PING ya.ru (77.88.21.3) 56(84) bytes of data.
64 bytes from www.yandex.ru (77.88.21.3): icmp_seq=1 ttl=55 time=12.0 ms
64 bytes from www.yandex.ru (77.88.21.3): icmp_seq=2 ttl=55 time=12.8 ms

Работает! Для отмены нажмем CTRL+Z

Установим менеджер загрузок wget:
root@mailserver:~# apt-get install wget
На всякий случай установим файловый менеджер midnight commander (mc):
root@mailserver:~# apt-get install mc 
Запустить его можно будет, набрав команду mc в коноли.
Установим программу удаленного администрирования сервера через web-интерфейс Webmin. Для начала нам нужно скачать файл цифровой подписи:
wget http://www.webmin.com/jcameron-key.asc
и подключить его:
apt-keyaddjcameron-key.asc
Затем через WinSCP открыть файл /etc/apt/sources.list и дописать в нем путь к дистрибутиву webmin:
deb http://download.webmin.com/download/repository sarge contrib 
Также удалим в файле символы комментариев перед другими источниками (начинаются с «deb») кроме deb cdrom и сохраним файл.
Теперь обновим список источников:
root@mailserver:~# apt-get update
А после успешного обновления списка установим webmin:
root@mailserver:~# apt-get install webmin
Пропишем полное имя сервера в файле /etc/hostname. Он должен выглядеть так:
mailserver.gisland.ru
Проверим файл /etc/hosts. Он должен содержать следующие строки:
127.0.0.1 localhost
192.168.2.6              mailserver.gisland.ru               mailserver 

В завершение выполним обновление системы через интернет:

root@mailserver:~# apt-get upgrade
и перезагрузим машину:
root@mailserver:~# reboot now
 
5. Работа в Webmin. Настройка зоны DNS
После перезагрузки заходим с рабочей станции в интерфейс webminпо адресу
Укажем имя пользователя: root, пароль: ldap123 и попадем в главное окно webmin:
На главной странице показаны недоустановленные обновления webmin и самого сервера (если они есть). Обновляемся, нажав ссылку из webmin, если обновления коснулись модулей ядра – перезагружаем компьютер после обновления.
Первым делом — установим обновления webmin (кнопка “install updates now”) и недоустановленные обновления системы (ссылка Package updates). Затем — выбираем в боковом меню «webmin-webmin configuration-language» И меняем язык на русский UTF-8. Webmin заговорил по русски!
 
Для нормальной работы ZCS должна быть правильно настроена зона DNS. В реальности зона настраивается на существующем DNS сервере. В нашем примере мы установим собственный DNS сервер и настроим зону самостоятельно.
В меню Webmin выберем «неиспользуемые модули-сервер DNS BIND». Webmin скажет, что BIND не установлен и предложит его установить. Соглашаемся. После установки выберем «обновить модули» из меню. Ссылка «сервер DNS BIND» перекочевала из меню «неиспользуемые модули» в меню «службы» и при нажатии на нее теперь открывается окно настроек bind:

Нам нужно создать новую зону для домена gisland.ru. Нажмем «создать новую зону master». Укажем имя домена: gisland.ru и адрес email: admin@gisland.ru. Остальные настройки оставим по умолчанию. Нажмем “Создать”:

Для созданной нами зоны потребуется минимальная настройка: одна адресная запись и одна запись типа MX (почтовый сервер).
1)   Заходим в «адрес»: создаем запись с именем mailserverи адресом 192.168.2.6.
2)   Заходим в «почтовый сервер» поле «имя» оставляем пустым, в поле «почтовый сервер» пишем «mailserver», указываем приоритет равный 10
3)   В настройках сервера bind нажмем «перенаправление и пересылки» и введем адрес вышестоящего dns сервера пересылки: 192.168.2.1 Все запросы, кроме запросов к зоне gisland.ru будут обрабатываться этим вышестоящим сервером.
4)   Нажмем «apply zone», а затем «apply configuration» для применения изменений
Теперь, если открыть зону gisland.ru и нажать «все типы записи», мы увидим три записи: одну типа NS, одну A и одну MX:
Следующий этап — настроить систему на работу с нашим DNS. Отредактируем файл /etc/resolv.conf и поменяем в нем адрес сервера DNS. После редактирования файл должен выглядеть так:
search gisland.ru
nameserver 192.168.2.6

теперь отредактируем /etc/network/interfaces, заменив в нем значение параметра "dns-nameservers" с 192.168.2.1 на 192.168.2.6. Применим изменения: 

root@mailserver:~# /etc/init.d/networking restart
 * Reconfiguringnetworkinterfaces...                                  [ OK ] 

Проверим работоспособность DNS сервера на локальном запросе: 

root@mailserver:~# dig mailserver.gisland.ru
<часть текста вырезана>
;; ANSWERSECTION:
mailserver.gisland.ru. 38400   IN      A       192.168.2.6
<часть текста вырезана>
;; SERVER: 192.168.2.6#53(192.168.2.6) 

 То есть мы запросили у нашего сервера (SERVER: 192.168.2.6#53) адрес для mailserver.gisland.ru и получили ответ: 192.168.2.6 – все работает правильно! Проверим работоспособность DNS сервера на внешнем запросе:

root@mailserver:~# diggoogle.com
<часть текста вырезана>
;; ANSWER SECTION:
google.com.             300     IN      A       74.125.232.17
<часть текста вырезана> 

То есть мы запросили у нашего сервера адрес для google.com. Поскольку зоны google.comна нашем сервере нет, он запросил ее у вышестоящего сервера 192.168.2.1 (а тот в свою очередь — у своего вышестоящего сервера) и получил ответ: 74.125.232.17. У вас может выдаваться другой адрес ip, главное чтобы он выдавался – это означает что пересылка работает!

 

6. Установка Zimbra
При подключении с серверу через WinSCP мы по умолчанию попадаем в каталог пользователя root: /root. Скопируем дистрибутив Zimbra OpenSource 6 в этот каталог. Архив с дистрибутивом у меня назывался
 zcs-6.0.10_GA_2692.UBUNTU8.20101215171146.tgz
(у вас скорее всего версия будет более новая)
Распаковываем дистрибутив:
root@mailserver:~# cd ~
root@mailserver:~# tar -xvf zcs-6.0.10_GA_2692.UBUNTU8.20101215171146.tgz
root@mailserver:~# cd zcs-6.0.10_GA_2692.UBUNTU8.20101215171146
Устанавливаем дополнительные пакеты:
apt-get install libpcre3 libgmp3c2 sysstat
Запускаем установку:
./install.sh
Программа установки проверит зависимости и спросит какие модули устанавливать — отвечаем по умолчанию. Затем будет выполнена проверка домена и появится сообщение о том, что домен mailserver.gisland.ru не настроен. Это правильно, поскольку правильное имя домена – gisland.ru. Отвечаем Yes на запрос о смене домена и вводим «gisland.ru». Теперь ошибки быть не должно. По окончании установки мы увидим меню начальной настройки:

Зайти в меню можно по его номеру, а вернуться назад — клавишей r.
1)   Зайдем в “common configuration” (цифра 1). Зададим ldap admin password (цифра 4) равным «ldap123» и укажем часовой пояс (цифра 6) «Europe/Moscow». Вернемся в главное меню (клавиша r)
2)   Зайдем в «zimbra-ldap». Установим все пароли (клавиши 4-8) равными «ldap123»
3)   Зайдем в zimbra-store и зададим admin password (4) равным “ldap123”
Вернемся в главное меню и нажмем “a” для применения изменений. На остальные вопросы установки — отвечаем по умолчанию. Будет выполнена настройка системы, по окончании которой выведется сообщение: Configuration complete - press return to exit
 
Заходим через браузер по адресу http://192.168.2.6, вводим имя пользователя «admin» и пароль «ldap123». Добро пожаловать в Zimbra! Установочные файлы больше не нужны и их можно удалить.
 
 
 
7. Интеграция LDAPи ZCS
Теперь у нас есть действующий почтовый сервер Zimbra Colaboration Suite.
Выполнив его интеграцию в домен LDAP мы получим возможность:
1)   присоединять компьютеры с операционной системой Windows к домену gisland
2)   входить в систему на этих компьютерах, используя учетные данные пользователей Zimbra
3)   Объединять пользователей в группы, создавать на сервере общие папки, настраивать права доступа к этим папкам для пользователей zimbra
Мы получим решение на основе Linux, сходное по выполняемым задачам с Microsof tExchange и Active Directory. Работать с Zimbra можно через браузер, либо через оффлайн клиент Zimbra Desktop (наподобие Microsoft Outlook для exchange)
Основное ограничение: создаваемый домен уровня NT4 не будет поддерживать групповые политики. Это не является преднамеренным ограничением — просто служба samba, используемая в Linux, не поддерживает групповые политики Windows.
 
При выполнении этой главы внимательно и последовательно выполняйте все шаги, т. к. ошибка на каждом из этапов скорее всего приведет к неработоспособности системы в результате. Если установка выполняется на виртуальной машине — сделайте контрольный снимок (snapshot) состояния системы перед выполнением.
Для продолжения нам потребуется файл схемы samba. Скачаем его:
root@mailserver:~# apt-get install samba-doc
В числе прочих файлов будет установлен файл
/usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz
это архив, содержащий нужный нам файл схемы. Распакуем его:
root@mailserver:#
cd /tmp
cp /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz ./
gunzipsamba.schema.gz

Часть действий нужно будет выполнять от имени служебного пользователя zimbra. Для переключения к нему в консоли нужно набрать

root@mailserver:/tmp# su zimbra
zimbra@mailserver:/tmp$

 (обратите внимание на изменившийся текст приглашения в командной строки). Для возврата к суперпользователю root просто наберем

zimbra@mailserver:/tmp$ exit
exit
root@mailserver:/tmp

Переключимся на пользователя Zimbra. Установим файл схемы nis.ldif:

ldap stop
cp /opt/zimbra/openldap/etc/openldap/schema/nis.ldif /opt/zimbra/data/ldap/config/cn=config/cn=schema/cn={10}nis.ldif
cd /opt/zimbra/data/ldap/config/cn=config/cn=schema

Отредактируем файл /opt/zimbra/data/ldap/config/cn\=config/cn=\schema\cn={10}nis.ldif Заменим в нем

 dn: cn=nis,cn=schema,cn=config
 objectClass: olcSchemaConfig
 cn: nis
на
dn: cn={10}nis
 objectClass: olcSchemaConfig
 cn: {10}nis
Затем выполним:
chmod 600 cn={10}nis.ldif
ldap start
Ldap должен запуститься без ошибок:
Started slapd: pid 5490
Теперь установим ранее распакованный файл схемы для samba:
mkdir -p /tmp/ldap/schema cd /tmp/ldap
cp /tmp/samba.schema /tmp/ldap/schema
Создадим файл /tmp/ldap/test.conf следующего содержания:
include /opt/zimbra/openldap/etc/openldap/schema/core.schema
include /opt/zimbra/openldap/etc/openldap/schema/cosine.schema
include /opt/zimbra/openldap/etc/openldap/schema/inetorgperson.schema
include /tmp/ldap/schema/samba.schema

Выполним команду:

/opt/zimbra/openldap/sbin/slaptest -f /tmp/ldap/test.conf -F /tmp/ldap

Будет создан каталог /tmp/ldap/cn=config/cn=schema. Переименуем в нем файл cn={3}samba.ldif в cn={11}samba.ldif

Отредактируем файл, заменив в нем
 dn: cn={3}samba
 objectClass: olcSchemaConfig
 cn: {3}samba

 на

 dn: cn={11}samba
 objectClass: olcSchemaConfig
 cn: {11}samba

подключим файл к домену:

ldap stop
cp /tmp/ldap/cn=config/cn=schema/cn={11}samba.ldif /opt/zimbra/data/ldap/config/cn=config/cn=schema/
ldap start
Если все сделано правильно, ldap должен запуститься без ошибок. Следующий этап — установка индексов. Выполним команду:
ldapmodify -x -H ldapi:/// -D cn=config -W 
Будет запрошен пароль, введите ldap123. Затем вставьте нижеуказанный текст и нажмите CTRL+D для применения изменений
dn: olcDatabase={2}hdb,cn=config
changetype:modify
add: olcDbIndex
olcDbIndex: uidNumber eq
olcDbIndex: gidNumber eq
olcDbIndex: memberUid eq
olcDbIndex: sambaSID eq
olcDbIndex: sambaPrimaryGroupSID eq
olcDbIndex: sambaDomainName eq 

Выполните команды:

zimbra@mailserver:/tmp/ldap$ ldap stop
Killing slapd with pid 18335 done.
zimbra@mailserver:/tmp/ldap$ /opt/zimbra/openldap/sbin/slapindex -F /opt/zimbra/data/ldap/config -b "" uidNumber gidNumber memberUid sambaSID sambaPrimaryGroupSID sambaDomainName 
zimbra@mailserver:/tmp/ldap$ ldap start
Started slapd: pid 2725
Следующий шаг — создать учетные записи для доступа к домену.
Будут созданы учетные записи zimposix и zimposixroot. Для первой из них пароль будет “zimbra”, для второй «ldap123». При создании записей нам потребуются не сами пароли, а их хеш:
zimbra@mailserver:/tmp/ldap$ /opt/zimbra/openldap/sbin/slappasswd -s zimbra
{SSHA}aYoxkXmZeXcAMlrIbp2DvabrgfX9yhfu
zimbra@mailserver:/tmp/ldap$ /opt/zimbra/openldap/sbin/slappasswd -s ldap123
{SSHA}8RweIrittYKutqG5i5ONvY2jt25s25zl
Создадим файл  /tmp/posixusers.ldif следующего содержания, включив в него только что полученные хэши:
dn: uid=zmposix,cn=appaccts,cn=zimbra
uid: zmposix
objectClass: zimbraAccount
objectClass: organizationalPerson
cn: zmposix
sn: zmposix
zimbraAccountStatus: active
zimbraIsSystemResource: TRUE
zimbraId: 59BC2282-98CC-11DE-9492-C023E3CEB16B
description: The zimbra posix account
userPassword: {SSHA}aYoxkXmZeXcAMlrIbp2DvabrgfX9yhfu
 
dn: uid=zmposixroot,cn=appaccts,cn=zimbra
uid: zmposixroot
objectClass: zimbraAccount
objectClass: organizationalPerson
cn: zmposixroot
sn: zmposixroot
zimbraAccountStatus: active
zimbraIsSystemResource: TRUE
zimbraId: 6ED47B38-98CC-11DE-AAC1-9F159BA35B33
description: The zimbra posix root account
userPassword: {SSHA}8RweIrittYKutqG5i5ONvY2jt25s25zl
Подключим файл к домену:
ldapadd -f /tmp/posixusers.ldif -x -H ldapi:/// -D cn=config -W
Создадим файл /tmp/acl.ldif следующего содержания
dn: olcDatabase={2}hdb,cn=config
changetype:modify
delete: olcAccess
olcAccess: {0}
-
add: olcAccess
olcAccess: {0}to attrs=userPassword by anonymous auth by dn.children="cn=admins,cn=zimbra" write by dn.exact="uid=zmposixroot,cn=appaccts,cn=zimbra" write
 
dn: olcDatabase={2}hdb,cn=config
changetype:modify
delete: olcAccess
olcAccess: {9}
-
add: olcAccess
olcAccess: {9}to attrs=entry by dn.children="cn=admins,cn=zimbra" write by dn.exact="uid=zmposixroot,cn=appaccts,cn=zimbra" write by * read
 
dn: olcDatabase={2}hdb,cn=config
changetype:modify
add: olcAccess
olcAccess: {10}to dn.subtree="dc=gisland,dc=ru" by dn.children="cn=admins,cn=zimbra" write by dn.exact="uid=zmposixroot,cn=appaccts,cn=zimbra" write by dn.exact="uid=zmposix,cn=appaccts,cn=zimbra" read by * none
olcAccess: {11}to dn.subtree="ou=machines,dc=gisland,dc=ru" by dn.children="cn=admins,cn=zimbra" write by dn.exact="uid=zmposixroot,cn=appaccts,cn=zimbra" write by dn.exact="uid=zmposix,cn=appaccts,cn=zimbra" read by * none
olcAccess: {12}to dn.subtree="ou=groups,dc=gisland,dc=ru" by dn.children="cn=admins,cn=zimbra" write by dn.exact="uid=zmposixroot,cn=appaccts,cn=zimbra" write by dn.exact="uid=zmposix,cn=appaccts,cn=zimbra" read by * none
olcAccess: {13}to dn.subtree="ou=people,dc=gisland,dc=ru" by dn.children="cn=admins,cn=zimbra" write by dn.exact="uid=zmposixroot,cn=appaccts,cn=zimbra" write by dn.exact="uid=zmposix,cn=appaccts,cn=zimbra" read by * none

Подгрузим файл:

ldapmodify -f /tmp/acl.ldif -x -H ldapi:/// -D cn=config -
Выполним команды:
zmprov mcf +zimbraAccountExtraObjectClass posixAccount
zmprov mcf +zimbraAccountExtraObjectClass sambaSamAccount
Теперь нужно установить расширения администратора. Скопируем два файла zimbra_posizaccount.zip и zimbra_samba.zip из каталога /opt/zimbra/zimlets-admin-extra на свой компьютер и распакуем их в отдельные папки. В каждом из архивов есть файлы config_template.xml их нужно отредактировать, указав имя вашего домена и изменив значение параметров gidbase и uidbase на 10000. После этого измененные файлы нужно упаковать обратно в архивы.
Для установки расширений зайдите через браузер в центр администрирования Zimbra по ссылке:
https://192.168.2.6:7071/zimbraAdmin
(пользователь: admin пароль: ldap123)
Зайдем в раздел «admin extensions», нажмем кнопку “инсталляция” и укажем «переделанный» архив zimbra_posixaccount.zip, затем аналогичным образом установите zimbra_samba.zip. Обновим страницу в браузере — в меню должны появиться две новые команды:
 
 
 
 
Установка SAMBA
Переключимся в режим суперпользователя и выполним команду:
root@mailserver:/tmp# apt-get install samba libpam-ldap libnss-ldap
После установки откроется окно с дополнительными настройками пакетов, укажем:
LDAP server Uniform Resource Identifier: ldapi:///
Distinguished name of the search base: dc=gisland,dc=ru
Версия Ldap: 3
Создать запись администратора: да
Does the LDAP database require login?: no
LDAP account for root: uid=zmposixroot,cn=appaccts,cn=zimbra
LDAP root account password: ldap123 

 

Откроем файл /etc/ldap.conf (не путать с /etc/ldap/ldap.conf!) и заменим его содержимое на: 
host mailserver.gisland.ru
base dc=gisland,dc=ru
binddn uid=zmposix,cn=appaccts,cn=zimbra
bindpw zimbra
rootbinddn uid=zmposixroot,cn=appaccts,cn=zimbra
port 389
bind_policy soft
nss_reconnect_tries 2
uri ldap://mailserver.gisland.ru/
ssl start_tls
tls_cacertdir /opt/zimbra/conf/ca
# tell to not check the server certificate
tls_checkpeer no
# optional
pam_password md5
# where nss find the information
nss_base_passwd         ou=people,dc=gisland,dc=ru?one
nss_base_shadow         ou=people,dc=gisland,dc=ru?one
nss_base_group          ou=groups,dc=gisland,dc=ru?one
nss_base_hosts          ou=machines,dc=gisland,dc=ru?one
Выполним команды:
root@mailserver:/tmp#
ln -s /etc/ldap.conf /etc/pam_ldap.conf
ln -s /etc/ldap.conf /etc/libnss-ldap.conf
ln -s /etc/ldap.secret /etc/pam_ldap.secret
ln -s /etc/ldap.secret /etc/libnss-ldap.secret
Отредактируем файл /etc/samba/smb.conf (имя домена встречается в файле шесть раз)
[global]
 workgroup = GISLAND
 netbios name = mailserver
 os level = 33
 preferred master = yes
 enable privileges = yes
 server string =Corporate Server
 wins support =yes
 dns proxy = no
 name resolve order = wins bcast hosts
 log file = /var/log/samba/log.%m
 log level = 3
 max log size = 1000
 syslog only = no
 syslog = 0
 panic action = /usr/share/samba/panic-action %d
 security = user
 encrypt passwords = true
 ldap passwd sync = yes
 passdb backend = ldapsam:ldap://mailserver.gisland.ru/
 ldap admin dn = "uid=zmposixroot,cn=appaccts,cn=zimbra"
 #ubuntu 10  
 #ldap ssl = No
 ldap suffix = dc=gisland,dc=ru
 ldap group suffix = ou=groups
 ldap user suffix = ou=people
 ldap machine suffix = ou=machines
 obey pam restrictions = no
 passwd program = /usr/bin/passwd %u
 passwd chat = *EntersnewsUNIXspassword:* %nn *RetypesnewsUNIXspassword:* %nn *passwordsupdatedssuccessfully* .
 domain logons = yes
 logon path = \mailserver.gisland.ru%Uprofile
 logon home = \mailserver.gisland.ru%U
 logon script = logon.cmd
 add user script = /usr/sbin/adduser --quiet --disabled-password --gecos "" %u
 add machine script = /usr/sbin/adduser --shell /bin/false --disabled-password --quiet --gecos "machine account" --force-badname %u
 socket options = TCP_NODELAY
 domain master = yes
 local master = yes
[homes]
 comment = Home Directories
 browseable =yes
 read only = No
 valid users = %S
[netlogon]
 comment = Network Logon Service
 path = /var/lib/samba/netlogon
 guest ok = yes
 locking = no
[profiles]
 comment = Users profiles
 path = /var/lib/samba/profiles
 read only = No
[profdata]
 comment = Profile Data Share
 path = /var/lib/samba/profdata
 read only = No
 profile acls = Yes
[printers]
 comment = All Printers
 browseable = no
 path = /tmp
 printable = yes
 public = no
 writable = no
 create mode = 0700
[print$]
 comment = Printer Drivers
 path = /var/lib/samba/printers
 browseable = yes
 read only = yes
 guest ok = no
Выполним команды:
root@mailserver:/tmp# /etc/init.d/samba restart
 * Stopping Samba daemons [ OK ]
 * Starting Samba daemons [ OK ]
root@mailserver:/tmp# smbpasswd -w ldap123
Setting stored password for "uid=zmposixroot,cn=appaccts,cn=zimbra" in secrets.tdb
Перезагрузите компьютер
root@mailserver:~# reboot now
затем зайдем в центр администрирования Zimbra. Если предыдущие действия были выполнены верно, в меню «manage samba domains» появится новый домен GISLAND:
https://192.168.2.6:7071/zimbraAdmin/

Если домен не появился — в поиске ошибки может помочь файл лога /var/opt/zimbra.log.
Отредактируем файл /etc/nsswitch.conf заменив две строчки
passwd: compat
group: compat
на:
passwd: files ldap
group: files ldap
Отредактируем /etc/pam.d/common-account, заменив его на:
account sufficient pam_unix.so
account sufficient pam_ldap.so  
Отредактируем /etc/pam.d/common-auth, заменив его на:
auth sufficient pam_ldap.so
auth sufficient pam_unix.so
Отредактируем /etc/pam.d/common-password, заменив его на: 
password sufficient pam_unix.so
password sufficient pam_ldap.so
Отредактируем /etc/pam.d/common-session, заменив его на:
session required pam_mkhomedir.so skel=/etc/skel umask=0077
session sufficient pam_unix.so
session sufficient pam_ldap.so
session required pam_mkhomedir.so skel=/etc/skel umask=0077
Перезагрузим компьютер
root@mailserver:~# reboot now
Проверим интеграцию ZCSс доменом, создав новую группу администраторов домена в центре администрирования Zimbra:

Идентификатор группы укажем равным 500. В этом случае пользователи группы будут обладать правами локальных администраторов на компьютерах Windows.
Выполним команду:
root@mailserver:~# getent group
<текствырезан>
Domain Admins:*:500:admin
Domain Users:*:513:
Domain Guests:*:514:
Domain Computers:*:515:
Administrators:*:544:admin
Account Operators:*:548:
Print Operators:*:550:
Backup Operators:*:551:
Replicators:*:552:
В выведенном списке групп должна присутствовать только что добавленная группа DomainAdmins.
Учетная запись admin, созданная автоматически при установке Zimbra, не внесена в список записей домена (мы его настроили лишь недавно). Чтобы это исправить, я создавал временную запись tempadm с правами администратора, залогинился под ней, удалил и вновь создал учетную запись admin, зашел под ней и удалил более ненужную tempadm. Также задал пароль пользователя admin в Samba:
root@mailserver:~# smbpasswd admin
new smb password:ldap123
Зайдем в интерфейсе webminв модуль ”LDAP users and groups” и убедимся что учетная запись в домене создана:
(для того чтобы webmin смог подключиться к домену, мне пришлось в настройках модуля «LDAP Client» указать «LDAP Server Configuration» - “Use encrypted connection?“ - NO)
Выполним команду
getent passwd
и убедимся что учетная запись adminс uid=1000x в списке присутствует. Для настройки остальных групп установим пакет smbldap-tools
root@mailserver:~# apt-get install smbldap-tools
gzip -d /usr/share/doc/smbldap-tools/configure.pl.gz
perl /usr/share/doc/smbldap-tools/configure.pl
<запустится скрипт настройки, на все вопросы отвечаем по умолчанию, нажимая Enter, на два запроса пароля — вводим “ldap123”>
smbldap-populate
entry dc=gisland,dc=ru already exist.
entry ou=people,dc=gisland,dc=ru already exist.
entry ou=groups,dc=gisland,dc=ru already exist.
entry ou=machines,dc=gisland,dc=ru already exist.
adding new entry: ou=Idmap,dc=gisland,dc=ru
entry uid=root,ou=people,dc=gisland,dc=ru already exist.
adding new entry: uid=nobody,ou=people,dc=gisland,dc=ru
entry cn=Domain Admins,ou=groups,dc=gisland,dc=ru already exist.
adding new entry: cn=Domain Users,ou=groups,dc=gisland,dc=ru
adding new entry: cn=Domain Guests,ou=groups,dc=gisland,dc=ru
adding new entry: cn=Domain Computers,ou=groups,dc=gisland,dc=ru
adding new entry: cn=Administrators,ou=groups,dc=gisland,dc=ru
adding new entry: cn=Account Operators,ou=groups,dc=gisland,dc=ru
adding new entry: cn=Print Operators,ou=groups,dc=gisland,dc=ru
adding new entry: cn=Backup Operators,ou=groups,dc=gisland,dc=ru
adding new entry: cn=Replicators,ou=groups,dc=gisland,dc=ru
entry sambaDomainName=GISLAND,dc=gisland,dc=ru already exist. Updating it...
По окончании работы smbldap-populate в консоли управления будут созданы группы:
Всё! Теперь вы можете присоединять к домену GISLAND рабочие станции Windows. Для присоеднения используются учетные записи группы «DomainAdmins” (в нашем случае — учетная запись Admin) Для входа в Windows используются учетные данные пользователей Zimbra.
 
8. Дополнительная настройка
При создании учетной записи в Zimbra мы использовать ее пароль как для входа в Windows, так и для входа в почту. При этом может возникнуть два досадных недоразумения:
1)Пользователь меняет свой пароль через web-интерфейс почты Zimbra, но его пароль в windows остается прежним
2)Пользователь меняет свой пароль Windows (например, командой «сменить пароль»). Поскольку изменения пароля производятся в LDAP, в котором Zimbra хранит учетные данные, можно было бы предположить, что пароль в Zimbra сменится автоматически. Он и меняется, но.... только после перезагрузки сервера Zimbra. Похоже, zimbra кэширует пароли и загружает их из LDAP только при запуске. Это нас естественно не устраивает!
Первую проблему я решил установкой расширения zimbraSambaPassword, взятого на:
Вторую — настройкой идентификации Zimbra в собственном домене, как будто это внешний OpenLDAP сервер. Итак:
1)Скачиваем ZimbraSambaPasword.zip, распаковываем его, переписываем через WinSCP на наш сервер Zimbra и добавляем к установочному файлу install.sh атрибут «исполняемый» (X)
2)Установим пакет build-essential, он нужен для сборки расширения
root@mailserver:~# apt-get install build-essential 
3)Устанавливаем расширение (я записал его в папку /root на сервере):
root@mailserver:~# ./install.sh -i
Теперь при смене пароля в Zimbra пароль в Windows меняется автоматически.
Зайдем в консоль управления, раздел «домены», выберем домен Gisland.ru и нажмем кнопку «Настроить проверку подлинности»:
Фильтр LDAP: uid=%u
Поисковая база LDAP: dc=gisland,dc=ru
Жмем «далее»:

DN привязки: uid=zmposix,cn=appaccts,cn=zimbra
Пароль привязки: zimbra
Жмем “далее”, указываем любую из существующих учетных записей Zimbra, например «admin», пароль «ldap123». Должно появиться сообщение, «проверка успешно завершена». Теперь при смене пароля Windows моментально обновится и пароль Zimbra.
При желании можно также:
1)Поднять DHCP сервер для автоматического назначения IP-адресов клиентам. Сделать это достаточно просто через Webmin и в этой статье не рассматривается.
2)Выполнить резервное копирование базы данных LDAP после наполнения ее пользователями (http://wiki.zimbra.com/wiki/UNIX_and_Windows_Accounts_in_Zimbra_LDAP_and_Zimbra_Admin_UI_6.0#Disaster_Recovery)
3)   ...
 
 
9. Работа в системе
1)После настройки сервера командную строку придется открывать гораздо реже :). Общесистемные настройки можно делать через Webmin, почтовые настройки и учетные записи — через консоль управления Zimbra.
2)При создании нового пользователя для него автоматически создается домашний каталог /home/имя_пользователя. Но происходит это при первом входе в систему ЧЕРЕЗ КОМАНДНУЮ СТРОКУ. Например вы создали нового пользователя и пытаетесь открыть его домашний каталог из Windows. Вы получите сообщение об ошибке если хотя бы раз не заходили под ним из Linux
 
10. Источники, использованные при написании статьи
 
Примечание - только сейчас заметил, что при выкладывании статьи на сайт в некоторых местах текста пропали пробелы. Постараюсь исправить, но на всякий случай, оригинал статьи в формате OpenOffice тут : http://depositfiles.com/files/r82idalsv 

 

4536

Комментарии

> обратите внимание — нужно две наклонных черты после ldapi:, а в оригинале - три

По той простой причине, что ldapi - это URI, указыавющий на UNIX Domain Socket-файл. Собственно, если вы укажете просто ldapi:///, будет использован путь по умолчанию. У меня же, например, этот URI указан в полном формате, ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock (все наклонные черты после первой, URL-кодированы)

 

большая часть материала взята из (1) в списке литературы, а там - три черты. И документ помечен как "This is certified documentation". И самое главное - проверено лично - работает. Наверное можно было бы и ldapi://mailserver.gisland.ru написать - так тоже возможно было бы верно. 

ldapi://mailserver.gisland.ru

Не, вот как раз так неверно, потому что это весьма странный путь к файлу, а три черты - это просто путь к сокету по дефолту, если не ошибаюсь, дефолт этот прописывается в опциях configure

аааа, ясно. Исправлю, спасибо! 

 Что-то я как-то пытался сделать подобное, вами описанное, но благополучно свернул это процесс, когда увидел, как исключительно "красиво" выглядит диалог создания нового пользователя. Какие-нибудь smbldap-tools'ы лучше, но они не умеют заполнять атрибуты Zimbra, зато зимлеты не умеют автоматически  назначать uidNumber  и предлагать не номер группы вводить всё же, а выбирать её из списка. При этом, если не ошибаюсь, там ещё и sambaSID спрашивают, что уже вовсе издевательство.

1)Эти зимлеты были написаны для 5й версии Zimbra и в ней как раз можно выбирать группу,  не вводя ее номер. Похоже, что под версию 6 зимлеты не переделывали и они тут работают не совсем корректно. Зато одновременно создают учетку в домене и в почте :)

2)sambaSID вводить не надо, он автоматически подставляется при выборе домена 

При установке по этому мануалу, заметил несколько ошибок в настройке DNS например. Если при установке системы выбрать только OpenSSH то webmin не видит BIND DNS. Даже после установки BIND в ручную - не видит. Если установить BIND при установке системы - то все OK.

P.S. Большое спасибо - статья очень пригодилась :)

В Webmin есть кнопка "обновить список модулей", которая проверяет список установленного в системе ПО и включает/выключает соотв. модули ;)

 

 

Скажите пожалуйста, я бы хотел проделать все выше описанное но с учетом того что у меня есть Домен контролер Windows 2008, и я бы хотел что бы данный почтовый сервер работал как резервный контролер домена. 

Скажите это возможно, если да то не могли бы вы выложить здесь же описание по созданию резервного контролера домена, я бы л бы вам очень благодарен :)

 

avasyukov аватар

 Если речь про AD, то такое невозможно. Samba может быть контроллером (PDC, BDC) только для NT-домена.

опечатка тут скорее, чем ошибка, вкралась

Отредактируем файл /etc/resolv.conf и поменяем в нем адрес сервера DNS. После редактирования файл должен выглядеть так:

search gisland.ru
nameserver 192.168.2.1

правильно будет 192.168.2.6. Bind-то для этого и поднимался.

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

точно, спасибо! исправил в статье 

Есть такая ситуация:

Был старый почтовый сервер mail.firma.ru на адресе 129.168.1.100 (условно)

Сервер работал и по этому пришлось Zimbra давать mail1.firma.ru и с другим адресом, 192.168.1.101 .Со старого пользователи были перенесены на новый и старый сервер был остановлен.Теперь нужно на новом сервере сменить имя на mail.firma.ru и адрес на 129.168.1.100.Подскажите как это сделать правильно.

 

 

avasyukov аватар

Собственно, Aviriel уже ответила на форуме - http://www.ossportal.ru/forum/viewtopic.php?f=4&t=102&p=256&hilit=&sid=254ccac8f18ca866fe19040366b9ade3#p256

Ребята, не подскажите, куда копать?!!!

Если предыдущие действия были выполнены верно, в меню «manage samba domains» появится новый домен GISLAND:

 

У меня домен GISLAND не появляется. Вместо этого по очереди в браузере появляются три предупреждения (при заходе в центр администрирования тоже):

Warning! Failed to create ou=groups,dc=ubuntu,dc=local for Posix groups!

Warning! Failed to create ou=groups,dc=test,dc=com for Samba groups!

Warning! Failed to create ou=machines,dc=test,dc=com for Samba machine accounts!

 

Понимаю, что накосячил... А вот где копать? Спасибо!

 

ubuntu-10.04.2

zcs-7.0.0

судя по ou=groups,dc=ubuntu,dc=local

вы не отредактировали зимлеты и не прописали в них имя домена перед тем как устанавливать их через админ панель 

отредактировал зимлеты и выдает ошибки : 

   Не удалось инсталлировать zimlet.

   Инсталляция на сервер mailserver.test.dm... сбой

 

Возможно ли подключение Windows 7 если использовать Zimbru в качестве PDC

проверял только на XP, но скорее всего с windows 7 тоже должно работать 

Добрый вечер! скажите пожалуйста кто сможет объяснить что за ошибки? Спасибо

Делаю по иструкции написано: 

1) Если все сделано правильно, ldap должен запуститься без ошибок. Следующий этап — установка индексов.
 
Выполним команду:

 

ldapmodify -x -H ldapi:/// -D cn=config -W
Будет запрошен пароль, введите ldap123. Затем вставьте нижеуказанный текст и нажмите CTRL+D для применения изменений
dn: olcDatabase={2}hdb,cn=config
changetype:modify
add: olcDbIndex
olcDbIndex: uidNumber eq
olcDbIndex: gidNumber eq
olcDbIndex: memberUid eq
olcDbIndex: sambaSID eq
olcDbIndex: sambaPrimaryGroupSID eq
olcDbIndex: sambaDomainName eq
 
 
После нажатии CTRL+D выходит сообщение:

ldap_modify: Other (e.g., implementation specific) error (80)
        additional info: index attribute "memberUid" undefined

2)  

zimbra@mailserver:/tmp/ldap$    ldap stop

Killing slapd with pid 18335 done.

zimbra@mailserver:/tmp/ldap$   /opt/zimbra/openldap/sbin/slapindex -F /opt/zimbra/data/ldap/config -b "" uidNumber

gidNumber memberUid sambaSID sambaPrimaryGroupSID sambaDomainName

 

выходит сообщение:

  slap_str2ad(memberUid) failed 17 (Undefined attribute type)

 

 

1)Пользователь меняет свой пароль через web-интерфейс почты Zimbra, но его пароль в windows остается прежним

2)Пользователь меняет свой пароль Windows (например, командой «сменить пароль»). Поскольку изменения пароля производятся в LDAP, в котором Zimbra хранит учетные данные, можно было бы предположить, что пароль в Zimbra сменится автоматически. Он и меняется, но.... только после перезагрузки сервера Zimbra. Похоже, zimbra кэширует пароли и загружает их из LDAP только при запуске. Это нас естественно не устраивает!

 

 

У меня пароли в обе стороны нормально меняются без всяких ухищрений.

Теперь нужна статья - "Резервный сервер Zimbra + BDC"

Добрый день.

Автору статьи - большое спасибо за такое подробное описание всего процесса!

С Зимброй знакомлюсь впервые и поэтому было очень интересно читать такое подробное описание.

Есть замечание, хотя возможно это частный случай: после запуска webmin и настройки необходимых служб имеет смысл "потушить" системный вэб-сервер, чтобы вэб-сервер Зимбры мог стартовать. Иначе первый не даст второму прослушивать 80 и 443 порты. Установку производил на CentOS 5.5 Зимбру брал последней версии 7.х Возможно это только в ней ставится свой вэб-сервер, а не используется системный.

Классная статья - у меня все по ней заработало, вот только такой вопрос. Если у меня сейчас все пользователи висят в зимбре и я хочу их перетащить в другой контроллер - то есть полностью отказаться от зимбродомена, а использовать ее только в качестве почтовика - как удалить домен?

Более точно если - я мигрировал всех пользователей и компы в новый домен, который создал на отдельном серваке, но зимбродомен все равно остался и при заведении новых пользователей он хочет назначать им ID и втыкает пользователей так же и в свой домен, но лишние действия меня что-то совсем не устраивают, вот и хочется мне от этого избавиться.  При этом хочется избавиться от зимбродомена малой кровью - что бы не повредились пользователи....  

 

 

Жаль, что эту статью больше никто не поддерживает....  Наверно домен по большому счету никто на этом хозяйстве не использует....

avasyukov аватар

Вы правы. Домен на Zimbra - красивая задача, но в реальной жизни сильная экзотика. Если домен есть, то он обычно все-таки отдельный, а Zimbra с ним интегрируется.

P.S. Спасибо за термин "статья не поддерживается" - очень метко. ) Возьму на вооружение.

Наверно домен по большому счету никто на этом хозяйстве не использует....

 

Я использую. Всё очень просто и красиво, интеграция бесшовная,  в чём проблема-то?

 Sergey, сама задача какая-то бредовая, то есть проблема в постановке вопроса:

1) LDAP-каталог - самостоятельная сущность, это просто иерархическая база данных, в которой где-то есть и ваши объекты-пользователи со своим набором атрибутов. Этот каталог могут использовать 100500 приложений и каждое может интересоваться своим определённым скопом (множеством) атрибутов

2) Zimbra сама по себе НЕ интересуется связанными с Samba атрибутами и вообще ей наплевать, входит юзер в домен или нет. "Привязываются" только расширения админ-панели, которые интегрируют её с Samba. При желании можно сделать "отсоединение" этих расширений, тогда к вам больше не  будут приставать с вопросами об атрибутах Samba и POSIX при заведении пользователя

3) Samba может работать на Гаваях, а обращаться к LDAP-каталогу в Детройте. В чём проблема и что значит "домен на отдельном сервере"??

4) Если вы собираетесь держать 2 LDAP-каталога с одними и теми же пользователями - срочно завяжите себе руки, не двигайтесь  и ничего не предпринимайте - за вами уже выехала "Скорая"...

 

1)  Про сам каталог все понятно....  Он и нужен только для хранения различных объектов.

2) А вот на счет расширений админпанели не совсем понятно....  То есть, если просто взять и отрубить в админке плагин, то типа и при регистрации нового юзера больше не будет требований воткнуть его в домен?   Просто не хочется тестировать на продуктивном сервере, а времени на установку тестового пока никак не могу выкроить - дел навалилось выше крыши..... 

3) Про самбу, как и про каталоги все ясно как 2х2 - домен на отдельном сервере означает, что Zimbra не будет просить добавить доменные атрибуты новому пользователю - всего навсего.

4) 5 баллов - Вы обладаете хорошим юмором ;)

PS А если рассматривать систему в целом и откинуть пункт с ненравящимся мне доменом, то все просто великолепно, хотя доков на русском маловато - мой напарник многое не понимает и мне приходится копаться за него - к сожалению у нас частенько возникают бредовые идеи по отношению к почтовой системе - вот и маемся....

А статья на самом деле хорошая - все ставится на 1-2-3

Sergey, да, всё, что нужно сделать - это взять и отрубить расширения админ-панели и убрать конечно лишние objectClass'ы из объектов аккаунтов (иначе при попытке заведения нового получите отлуп из-за отсутствия MUST атрибутов того же posixAccount). То есть кроме деинсталляции админ-расширений, сделайте обратное вот этому:

 

zmprov mcf +zimbraAccountExtraObjectClass posixAccount
zmprov mcf +zimbraAccountExtraObjectClass sambaSamAccount

 

Одна из лучших статей по установке Zimbra. Все подробно и по делу. Спасибо. 

Дельная статья,автору респект. Для полного смака, хотелось что бы zimbra забирала данные из ad windows server 2***, не подскажите куда рыть?

avasyukov аватар

санкс!

 Подскажите пожалуйста, все делаю по данному ману(с поправкой на свои значения и на то что дистр SLES10, а Zimbra 7). После настройки, в веб-морде домен появляется, если сделать tools-populate то группы тоже появляются, но в систему это не вносится. В логах только такая запись "zimbra sudo: nss_ldap: could not search LDAP server - Server is unavailable", больше информации нигде нет. В чем может быть причина?

 

Все супер, гоняю зимбру по полной со всеми ее вкусностями, только не могу достучатся до https к веб клиенту и ни как не получается сменить 80 порт веб клиента на любой другой. Пробовал менять порт в /opt/zimbra/config.****, ни кокого эффекта, есть мнения?

Решил, командой в zimbra

zmtlsctl both

причем команда zmtlsctl HTTPS не сработала)))

 

вопрос перенаправления 80 порта открыт

решено

zmprov ms mydomen.local zimbraMailPort порт

 

 и всё-таки, если кто-то поднял домен на zimbra, пож-та скажите, win7 к нему подключается или нет? это реально очень важный вопрос!

 Добрый день! хорошая статья, но у меня тут ошибка вышла

/opt/zimbra/openldap/sbin/slapindex -F /opt/zimbra/data/ldap/config -b "" uidNumber gidNumber memberUid sambaSID sambaPrimaryGroupSID sambaDomainName

ldif_read_file: checksum error on "/opt/zimbra/data/ldap/config/cn=config/cn=schema/cn={11}samba.ldif"

 

Проблема в том что при изменении внутренностей произошло изменненеие контрольной суммы.  Я делалв пункте "Создадим файл /tmp/ldap/test.conf следующего содержания:"
добавлял пару пустых файлов перед  "include /tmp/ldap/schema/samba.schema", так что бы samba.schema была 10 в списке, тогда при конвертации получиться нужный файл с нужными внутренностями. если надо могу прислать нормальный файлик  cn={11}samba.ldif

 

 

был бы признателен, стукни 233352266

Могу я попросить файлик cn={11}samba.ldif ?)

chronos91@mail.ru   Буду премного благодарен)

кто нибудь пробовал настраивать на samba 4.1  т к  данная версия подерживает GPO  ???