Это старая версия документа.
Содержание
HOW-TO: Настройка Postfix + Dovecot + Dovecot SASL + виртуальные пользователи в LDAP + roundcubemail c адресной книгой в LDAP
Автор — Владимир (Vovan1982) Профиль на форуме
И так, у нас уже есть настроенный LDAP сервер по этой статье и внём уже есть пользователи, хотелось бы использовать данных пользователей для почтового сервера. Сформируем условия для нашего почтового сервера:
1. Пользователи являются виртуальными и находятся в базе LDAP на другом сервере
2. Алиасы пользователей так же находятся в LDAP сервере
3. Домены поддерживаемые серверов тоже находятся в LDAP
4. Существует поддержка квот, значения квот берутся из LDAP
5. В качестве логина будет использоваться email пользователя
6. Почтовые папки пользователей будут находится по адресу /home/mail/_домен_/_email_пользователя_/
7. В качестве почтового пользователя на сервере, будет пользователь vmail которого необходимо создать
8. В качестве почтовой группы на сервере, будет группа mail которая присутствует по умолчанию
9. Почтовый сервер будет работать только по защищённым соединениям т. е. pop3 соединения будут осуществляться на 995 порту либо на 110 порту с обязательно включенной опцией starttls, imap соединения будут осуществляться на 993 порту либо на 143 порту с обязательно включенной опцией starttls, smtp соединение для отправки почты пользователями будет осуществляться на 465 порту либо на 25 порту с обязательно включенной опцией starttls.
В распоряжении имеется машина со свежеустановленной Ubuntu 10.04 в процессе установки был выбран LAMP сервер, в связи с этим я здесь не буду описывать настройку apache2 + php5 + mysql.
Все действия в этой статье выполняются от пользователя root.
Прежде чем приступить к настройке самого почтового сервера необходимо немного подготовить LDAP сервер. И так, для начала нам необходимо добавить ещё одну схему в LDAP.
На сервере LDAP переходим в каталог /usr/share/gosa/contrib/plugins/fai и редактируем файл схемы fai.ldif, так как это делалось при натройке LDAP сервера т.е.: Строки в начале приводим к виду
dn: cn=fai,cn=schema,cn=config objectClass: olcSchemaConfig cn: fai
и в конце файла удаляем всё начиная с structuralObjectClass: и до конца файла.
Добавляем эту схему в LDAP
ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/share/gosa/contrib/plugins/fai/fai.ldif
Теперь открываем Gosa, в разделе Administration открываем Системы, далее жмём Действия → Создать → Сервер указываем Server name, обязательно указываем IP-адрес, по этому полю будет выставлен фильтр серверов при поиске доменов и указываем MAC-адрес, его можно указать произвольно.
Переходим на вкладку Services, жмём Действия → Создать → Service в поле Service to add выбираем Mail smtp service(Postfix) и жмём продолжить. В открывшейся странице в поле Domains to accept mail for добавляем домены которые будет обслуживать почтовый сервер, в данном случае это example.com. Жмём Сохранить, затем Ок, в результате должен появится новый сервер с названием которое мы указали в Server name.
Переходим к пользователям, создаём нового или открываем существующего, переходим на вкладку Почта, жмём Add Почта settings. Заполняем поля:
Основной адрес — здесь полностью указываем основной адрес пользователя, в данном случае это test@example.com
Размер квоты — здесь указываем размер квоты (ВНИМАНИЕ!!! размер квоты указываем в байтах. К сожалению мне не удалось найти способ преобразовывать Мб в байты при получении данных из LDAP), если хотите чтоб ящик не имел ограничений то это поле оставьте пустым.
Alternative addresses — здесь можно добавить алиасы.
Перенаправлять сообщения — если хотите чтоб сообщения доставлялись не только на основной адрес, а и на другой адрес на этом почтовом сервере, то укажите этот адрес здесь.
Далее жмём Ок, всё почтовый пользователь добавлен.
Также необходимо добавить адрес postmaster@example.com я этот адрес добавил админу samba.
1. Базовая настройка postfix.
Устанавливаем postfix
apt-get install postfix
Настраиваем базовую конфигурацию
dpkg-reconfigure postfix
Отвечаем на вопросы
Internet Site example.com оставляем пустым mail.example.com, localhost.example.com , localhost No 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/24 0 + ipv4
Применяем патч квоты Postfix
Мы должны получить исходники Postfix, патч к нему, построить .deb пакеты и установить эти .deb пакеты:
Устанавливаем необходимые пакеты для сборки
apt-get build-dep postfix
Загружаем исходники postfix
cd /usr/src && apt-get source postfix
Загружаем и применяем патч квоты
wget http://vda.sourceforge.net/VDA/postfix-vda-2.7.0.patch cd postfix-2.7.0 patch -p1 < ../postfix-vda-2.7.0.patch
Собираем пропатченный postfix
dpkg-buildpackage
Перейдем на один уровень вверх и посмотрим какие новые .deb пакеты были созданы:
cd .. && ls -1
Выбираем пакеты postfix и postfix-ldap и устанавливаем их:
dpkg -i postfix_2.7.0-1_i386.deb dpkg -i postfix-ldap_2.7.0-1_i386.deb
2. Создание сертификатов для postfix и dovecot
Генерируем Certificate Signing Request (CSR)
Создадим ключ для Certificate Signing Request (CSR)
cd /etc/ssl && openssl genrsa -des3 -out server.key 2048
здесь необходимо будет указать пароль для защищённого ключа
Теперь создадим незащищённый ключ
openssl rsa -in server.key -out server.key.insecure && mv server.key server.key.secure && mv server.key.insecure server.key
здесь необходимо будет указать пароль от защищённого ключа
Создадим CSR
openssl req -new -key server.key -out server.csr
здесь необходимо будет ответить на ряд вопросов
Country Name (2 letter code) [AU]:RU (страна) State or Province Name (full name) [Some-State]:obl-t (область) Locality Name (eg, city) []:NewCity (город) Organization Name (eg, company) [Internet Widgits Pty Ltd]: Example Ltd (название организации) Organizational Unit Name (eg, section) []:branch (название подразделения) Common Name (eg, YOUR name) []:example.com (ваш домен) Email Address []:admin@example.com A challenge password []: (оставил пустым) An optional company name []: Example
Установим ключ сервера
cp server.key /etc/ssl/private
Создаём внутренний Certification Authority (CA) Для начала создадим директории необходимые для СА сертификатов
mkdir /etc/ssl/CA && mkdir /etc/ssl/newcerts
Создаём необходимые файлы
sh -c "echo '01' > /etc/ssl/CA/serial" && touch /etc/ssl/CA/index.txt
Редактируем /etc/ssl/openssl.cnf в секции [ CA_default ] следующим образом
dir = /etc/ssl/ # Where everything is kept database = $dir/CA/index.txt # database index file. certificate = $dir/certs/cacert.pem # The CA certificate serial = $dir/CA/serial # The current serial number private_key = $dir/private/cakey.pem# The private key default_days = 3650 # how long to certify for
Создадим self-singed корневой сертификат
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -newkey rsa:2048 -out cacert.pem
здесь необходимо будет указать пароль для ключа и ответить на вопросы
Установим корневой сертификат и ключ
mv cakey.pem /etc/ssl/private/ && mv cacert.pem /etc/ssl/certs/
Создадим сертификаты для postfix и dovecot Создаём сертификат для postfix
openssl ca -in server.csr -config /etc/ssl/openssl.cnf
отвечаем на вопросы
Enter pass phrase for /etc/ssl//private/cakey.pem: пароль_от_ключа Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n] y
Установим полученный сертификат
cat /etc/ssl/newcerts/01.pem | sed -n '/-----BEGIN CERTIFICATE-----/,$p' > /etc/ssl/certs/postfix.pem
Для создания следующего сертификата необходимо в файле /etc/ssl/CA/index.txt.attr заменить значение unique_subject с yes на no
sed 's/unique_subject = yes/unique_subject = no/' /etc/ssl/CA/index.txt.attr > /etc/ssl/CA/temp && mv /etc/ssl/CA/temp /etc/ssl/CA/index.txt.attr
Создаём сертификат для dovecot
openssl ca -in server.csr -config /etc/ssl/openssl.cnf
Устанавливаем полученный сертификат
cat /etc/ssl/newcerts/02.pem | sed -n '/-----BEGIN CERTIFICATE-----/,$p' > /etc/ssl/certs/mydovecot.pem
3. Создание сертификатов для связи с LDAP
Для связи с LDAP сервером по защищённому соединению нам потребуются отдельные сертификаты.
Идём на наш LDAP сервер. Создаём папку для сертификатов почтового сервера и заходим в неё
mkdir /etc/ssl/veles-ssl && cd /etc/ssl/veles-ssl
Создаём ключ для почтового сервера
certtool --generate-privkey > mail_server_ldap_key.pem
Создаём файл mail.info следующего содержания
country = US state = North Carolina locality = Winston-Salem organization = Example Company cn = mail.example.com tls_www_client encryption_key signing_key
Первые пять значений меняйте на свои.
Создаём сертификат
certtool --generate-certificate --load-privkey mail_server_ldap_key.pem \ --load-ca-certificate /etc/ssl/certs/cacert.pem --load-ca-privkey /etc/ssl/private/cakey.pem \ --template mail.info --outfile mail_server_ldap_cert.pem
Копируем СА сертификат и переименовываем его
cp /etc/ssl/certs/cacert.pem . && mv cacert.pem mail_server_ldap_ca.pem
Теперь содержимое папки mail-ssl необходимо скопировать на почтовый сервер следующим образом файлы mail_server_ldap_ca.pem и mail_server_ldap_cert.pem необходимо положить в папку /etc/ssl/certs на почтовом сервере файл mail_server_ldap_key.pem необходимо положить в папку /etc/ssl/private на почтовом сервере.
4. Настраиваем Dovecot
Устанавливаем пакет dovecot-postfix который автоматически установит dovecot и настроит postfix на использование SASL. Также этот пакет настроит dovecot для IMAP, IMAPS, POP3, и POP3S.
apt-get install dovecot-postfix
Приступаем к настройке dovecot.
Создадим пользователя для почты
useradd -d /bin/false vmail
Создадим папку для почты и установим на неё права
mkdir /home/mail && chown vmail:mail /home/mail
Зайдём в папку dovecot
cd /etc/dovecot
На данный момент dovecot не настроен на использование виртуальных пользователей из ldap, а так же пакет dovecot-postfix разделил конфигурацию dovecot на несколько файлов
dovecot.conf auth.d/01-dovecot-postfix.auth conf.d/01-dovecot-postfix.conf
лично мне это не удобно, поэтому я сделал копию текущего dovecot.conf
mv dovecot.conf dovecot.conf.bak1
и создал свой dovecot.conf
> dovecot.conf
следующего содержания
# Поддерживаемые протоколы protocols = imap pop3 imaps pop3s managesieve log_timestamp = "%Y-%m-%d %H:%M:%S " mail_privileged_group = mail # Отключаем plaintext аутентификацию disable_plaintext_auth = yes # Включаем ssl ssl = yes ssl_cert_file = /etc/ssl/certs/mydovecot.pem ssl_key_file = /etc/ssl/private/server.key ssl_ca_file = /etc/ssl/certs/cacert.pem ssl_cipher_list = ALL:!LOW:!SSLv2:ALL:!aNULL:!ADH:!eNULL:!EXP:RC4+RSA:+HIGH:+MEDIUM # Место нахождения почтовых папок mail_location = maildir:/home/mail/%d/%u # Символы используемые для аутентификации auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@ # Допустимый интервал UID для пользователей first_valid_uid = 1000 last_valid_uid = 50000 # Интервал для группы. Минимальный GID для группы у меня выставлен в 8, т.к. под этим номером у # меня находится группа mail. first_valid_gid = 8 last_valid_gid = 50000 # Пользователь и группа от которых будет работать dovecot с почтой mail_uid = vmail mail_gid = mail # Пути к логам dovecot log_path = /var/log/dovecot.log info_log_path = /var/log/dovecot_info.log # Конфигурация IMAP протокола protocol imap { mail_max_userip_connections = 10 imap_client_workarounds = outlook-idle delay-newmail mail_plugins = quota imap_quota } # Конфигурация POP3 протокола protocol pop3 { pop3_uidl_format = %08Xu%08Xv mail_max_userip_connections = 10 pop3_client_workarounds = outlook-no-nuls oe-ns-eoh mail_plugins = quota } # Конфигурация LDA протокола protocol lda { postmaster_address = postmaster@citramon.donetsk.ua mail_plugins = sieve quota quota_full_tempfail = yes deliver_log_format = msgid=%m: %$ rejection_reason = Your message to <%t> was automatically rejected:%n%r } protocol managesieve { } auth default { # Механизмы аутентификации mechanisms = plain login # База паролей passdb ldap { args = /etc/dovecot/dovecot-ldap.conf } # База пользователей userdb ldap { args = /etc/dovecot/dovecot-ldap.conf } socket listen { master { path = /var/run/dovecot/auth-master mode = 0600 user = vmail group = mail } client { path = /var/spool/postfix/private/dovecot-auth mode = 0660 user = postfix group = postfix } } user = vmail } dict { } # Конфигурация плагинов plugin { sieve=/home/mail/%d/%u/.dovecot.sieve sieve_dir=/home/mail/%d/%u/sieve quota = maildir:User quota quota_rule = *:storage=0B quota_rule2 = Trash:ignore } # Эти опции включают отладочные сообщения, раскоментируйте их # на стадии тестирования, но потом их лучше отключить #mail_debug = yes #verbose_ssl = yes #auth_verbose = yes #auth_debug = yes #auth_debug_passwords = yes
Теперь необходимо настроить подключение к ldap, переименовываем файл настроек ldap
mv dovecot-ldap.conf dovecot-ldap-example.conf
и создаём свой dovecot-ldap.conf
> dovecot-ldap.conf
слеждующего содержания
# Хост на котором работает ldap uris = ldaps://ldap.example.com # Админ ldap и его пароль dn = cn=admin,dc=example,dc=com dnpass = secret # Пути к сертификатам для tls соединения tls_ca_cert_file = /etc/ssl/certs/ mail_server_ldap_ca.pem tls_ca_cert_dir = /etc/ssl/certs tls_cert_file = /etc/ssl/certs/mail_server_ldap_cert.pem tls_key_file = /etc/ssl/private/mail_server_ldap_key.pem # Отладочные сообщения при соединении с ldap, после окончания тестирования лучше отключить #debug_level = -1 # Поиск в ldap будет проходить не от пользователя проходящего аутентификацию auth_bind = no # Версия протокола ldap ldap_version = 3 # Где искать пользователя base = dc=example,dc=com deref = never scope = subtree # Соответствие ldpa и dovecot переменных (слева ldap, справа dovecot) pass_attrs = mail=user,userPassword=password # Фильтр для проверки паролей pass_filter = (&(objectClass=gosaMailAccount)(mail=%u)) # Здесь переменным home, uid, gid присваиваются фиксированные значения, а значение quota_rule # берётся в ldap из параметра gosaMailQuota, 1001 и 8 это uid пользователя vmail и gid группы mail user_attrs = \ =home=/home/mail/%d/%u, \ =uid=1001, \ =gid=8, \ gosaMailQuota=quota_rule=?:storage=%$B # Фильтр для выборки пользователей user_filter = (&(objectClass=gosaMailAccount)(mail=%u)) # Метод шифрования паролей в ldap default_pass_scheme = MD5
Не знаю с чем это связано но для того чтоб dovecot смог соединиться с ldap на другом сервере по tls, необходимо чтоб на сервере с dovecot присутствовал файл /etc/ldap/ldap.conf в котором находится строка
TLS_CACERT /etc/ssl/certs/mail_server_ldap_ca.pem
в ubuntu 10.04 этот файл присутствует, поэтому просто добавляем в него выше указанную строку.
echo "TLS_CACERT /etc/ssl/certs/mail_server_ldap_ca.pem" >> /etc/ldap/ldap.conf
Перезагружаем dovecot
/etc/init.d/dovecot restart
5. Настраиваем postfix
Конфигурируем main.cf
# Настраиваем tls и SASL postconf -e 'smtpd_tls_key_file = /etc/ssl/private/server.key' postconf -e 'smtpd_tls_cert_file = /etc/ssl/certs/postfix.pem' postconf -e 'smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem' postconf -e 'smtpd_tls_loglevel = 1' postconf -e 'smtpd_tls_session_cache_timeout = 3600s' postconf -e 'smtp_tls_note_starttls_offer = yes' postconf -e 'smtpd_sasl_local_domain =' # Почта будет находится в каталоге /home/mail/domain/user_mail поэтому значение home_mailbox # должно быть пустым, mailbox_command выполняться не будет поэтому тоже пусто postconf -e 'home_mailbox =' postconf -e 'mailbox_command =' # Домен почтового сервера postconf -e 'mydomain = example.com' postconf -e 'myorigin = $mydomain' # Отклонять команду ETRN postconf -e 'smtpd_etrn_restrictions = reject' # Дополнительные ограничения, применяемые сервером Postfix в контексте команды MAIL FROM postconf -e 'smtpd_sender_restrictions = reject_sender_login_mismatch, reject_unlisted_sender, reject_unknown_sender_domain' # Дополнительные ограничения, применяемые сервером Postfix в контексте команды RCPT TO postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unverified_recipient, reject_invalid_hostname, reject_multi_recipient_bounce, reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, reject_unauth_destination' # Настройка виртуальных пользователей, здесь 1001 и 8 это uid и gid пользователя vmail и группы mail postconf -e 'virtual_mailbox_base = /home/mail' postconf -e 'virtual_mailbox_domains = ldap:/etc/postfix/ldap_virtual_domains_maps.cf' postconf -e 'virtual_mailbox_maps = ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf' postconf -e 'virtual_alias_maps = ldap:/etc/postfix/ldap_virtual_alias_maps.cf' postconf -e 'virtual_uid_maps = static:1001' postconf -e 'virtual_gid_maps = static:8' postconf -e 'virtual_minimum_uid = 1000' # Устанавливаем dovecot в качестве транспорта postconf -e 'virtual_transport = dovecot' postconf -e 'mailbox_transport = dovecot' postconf -e 'dovecot_destination_recipient_limit = 1' # Настраиваем квоту postconf -e 'virtual_create_maildirsize = yes' postconf -e 'virtual_maildir_extended = yes' postconf -e 'virtual_mailbox_limit_override = yes' postconf -e 'virtual_overquota_bounce = yes' postconf -e 'virtual_mailbox_limit_maps = ldap:/etc/postfix/ldap_virtual_mailbox_limit_maps.cf' postconf -e 'virtual_maildir_limit_message = Sorry, the users mailbox is full, please try again later.' # Здесь к значениям по умолчанию добавляются $virtual_mailbox_limit_maps и # $smtpd_sender_login_maps postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $sender_bcc_maps $recipient_bcc_maps $smtp_generic_maps $lmtp_generic_maps $virtual_mailbox_limit_maps $smtpd_sender_login_maps' # Не разрешает отправку сообщений от другого пользователя # Логин пользователя для отправки сообщений и MAIL FROM должны совпадать postconf -e 'smtpd_sender_login_maps = ldap:/etc/postfix/ldap_logins.cf' # Отключаем команду VRFY postconf -e 'disable_vrfy_command = yes' # Ставить исходящие сообщения в очередь postconf -e 'defer_transports=smtp'
Теперь заходим в файл /etc/postfix/master.cf, убираем комментарий со строк
smtps inet n - - - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject
и добавляем в конец файла строки
dovecot unix - n n - - pipe flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -d ${recipient}
Осталось создать файлы запросов к LDAP серверу К сожалению мне не удалось подключиться к LDAP по защищённому соединению ldaps. При попытке подключения по ldaps или start_tls в логах появляются строки
warning: process /usr/lib/postfix/trivial-rewrite pid 1289 killed by signal 6 warning: /usr/lib/postfix/trivial-rewrite: bad command startup — throttling
и postfix наотрез отказывается принимать почту. В связи с эти файлы запросов соединяются с ldap через не защищённое соединение. Если кто решил данную проблему или знает с чем это связано, поделитесь пожалуйста буду очень признателен. Лично я перерыл весь инет но решение так и не нашёл. И так создаём файлы запросов в папке /etc/postfix
Файл ldap_logins.cf
# адрес LDAP-сервера server_host = ldap://ldap_server_ip/ # где искать людей search_base = ou=Users,dc=example,dc=com # версия протокола version = 3 # какие записи отфильтровывать # брать только тех, у кого создан почтовый акаунт query_filter = (&(objectClass=gosaMailAccount)(|(mail=%s)(gosaMailAlternateAddress=%s))) # требуемый атрибут result_attribute = mail # DN-запись для подключения к LDAP bind_dn = cn=admin,dc=example,dc=com bind_pw = secret
Файл ldap_virtual_alias_maps.cf
# адрес LDAP-сервера server_host = ldap://ldap_server_ip/ # где искать людей search_base = ou=Users,dc=example,dc=com # версия протокола version = 3 # какие записи отфильтровывать # брать только тех, у кого создан почтовый акаунт query_filter = (&(objectClass=gosaMailAccount)(|(mail=%s)(gosaMailAlternateAddress=%s))) # требуемый атрибут - мы забираем mail result_attribute = mail # DN-запись для подключения к LDAP bind_dn = cn=admin,dc=example,dc=com bind_pw = secret
Файл ldap_virtual_domains_maps.cf
# адрес LDAP-сервера server_host = ldap://ldap_server_ip/ # где искать домены search_base = ou=servers,ou=systems,dc=example,dc=com # версия протокола version = 3 # какие записи отфильтровывать # брать только текущий почтовый сервер, ip указывается текущего почтового сервера query_filter = (&(objectClass=goMailServer)(ipHostNumber=192.168.0.2)(postfixMyDestinations=%s)) # требуемый атрибут - мы забираем список доменов result_attribute = postfixMyDestinations # DN-запись для подключения к LDAP bind_dn = cn=admin,dc=example,dc=com bind_pw = secret
Файл ldap_virtual_mailbox_limit_maps.cf
# адрес LDAP-сервера server_host = ldap://ldap_server_ip/ # где искать пользователей search_base = ou=Users,dc=example,dc=com # версия протокола version = 3 # какие записи отфильтровывать # брать только тех, у кого создан почтовый акаунт query_filter = (&(objectClass=gosaMailAccount)(|(mail=%s)(gosaMailAlternateAddress=%s))) # требуемый атрибут - мы забираем квоту result_attribute = gosaMailQuota # DN-запись для подключения к LDAP bind_dn = cn=admin,dc=example,dc=com bind_pw = secret
Файл ldap_virtual_mailbox_maps.cf
# адрес LDAP-сервера server_host = ldap://ldap_server_ip/ # где искать людей search_base = ou=Users,dc=example,dc=com # версия протокола version = 3 # какие записи отфильтровывать # брать только тех, у кого создан почтовый акаунт query_filter = (&(objectClass=gosaMailAccount)(mail=%s)) # требуемый атрибут - мы забираем mail и gosaMailForwardingAddress result_attribute = mail, gosaMailForwardingAddress # по каким путям будет создаваться папка для юзера и подпапки (%d/ будет создаваться подпапка с # доменом вида domain.dom/mail_adress/) result_format = %d/%s/ # DN-запись для подключения к LDAP bind_dn = cn=admin,dc=example,dc=com bind_pw = secret
Перезагружаем postfix
/etc/init.d/postfix restart
Разрешим группе mail писать логи в файлы dovecot.log и dovecot_info.log, если этого не сделать postfix не будет принимать почту
chown root:mail /var/log/dovecot* && chmod 660 /var/log/dovecot*
На этом настройка postfix и dovecot закончена.
6. Тестирование почтового сервера
Протестируем работоспособность, отправив сообщение через telnet пользователю test.
telnet localhost 25
Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.example.com ESMTP Postfix (Ubuntu)
helo example.com
250 mail.example.com
mail from: vasiapupkin@mail.ru
250 2.1.0 Ok
rcpt to: test@example.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Пишем содержание письма
Hello LDAP user :) # жмём Enter
Ставим «.» точку и жмём Enter чтоб закончить ввод сообщения
. 250 2.0.0 Ok: queued as D5E5622CC5
quit
221 2.0.0 Bye Connection closed by foreign host.
После этого в папке /home/mail должна появится папка с названием домена в данном случае example.com, а внутри неё папка с адресом пользователя test@example.com, если не появилась лезем в логи и ищем ошибку, если появилась то всё ок.
Проверяем dovecot.
openssl s_client -host localhost -port 995
в конце ответа должно быть
+OK Dovecot ready.
user test@example.com
+OK
pass secret
+OK Logged in.
list
+OK 1 messages: 1 454 .
quit
Если ошибок нет то всё работает нормально.
7. Отправка писем из очереди
Всю почту отправляемую во внешний мир postfix ставит в очередь, для того чтоб письма из очереди доставлялись адресатам необходимо выполнить команду postfix flush. Добавим в crontab эту команду, так чтоб письма в очереди отправлялись каждую минуту
crontab -e (выбираем редактор)
и добавляем следующее
* * * * * /usr/sbin/postfix flush
в результате письма из очереди будут отправляться каждую минуту.
Всё почтовый сервер готов к использованию.
8. Настройка Roundcubemail
Скачиваем Roundcubemail
cd /usr/src/ && wget http://ignum.dl.sourceforge.net/project/roundcubemail/roundcubemail/0.4.2/roundcubemail-0.4.2.tar.gz
Распаковываем полученный архив
tar xzf roundcubemail-0.4.2.tar.gz
Перемещаем распакованные файлы
mv roundcubemail-0.4.2 /var/www/roundcubemail
Назначаем права
chown -R root:root /var/www/roundcubemail chown -R :www-data /var/www/roundcubemail/logs chown -R :www-data /var/www/roundcubemail/temp chmod 775 /var/www/roundcubemail/logs chmod 775 /var/www/roundcubemail/temp
Устанавливаем необходимые пакеты
apt-get install php5-mcrypt
Перезагружаем apache
/etc/init.d/apache2 restart
Создаём базу данных для roundcubemail
mysql -u root -p CREATE DATABASE roundcubemail; GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'password'; \q
Открываем Roundcubemail в браузере
http://IP вашего сервера/roundcubemail/installer
и начинаем конфигурировать.
Жмём START INSTALLATION
Везде должно быть ОК кроме
PostgreSQL: NOT AVAILABLE(Not installed) SQLite (v2): NOT AVAILABLE(Not installed) date.timezone: NOT OK(Could be set)
Жмём NEXT и в появившейся странице выставляем следующие значения
General configuration
product_name = ваше значение
Database setup
Database type = MySql Database server (omit for sqlite) = localhost Database name (use absolute path and filename for sqlite) = roundcubemail Database user name (needs write permissions)(omit for sqlite) = roundcube Database password (omit for sqlite) = password
IMAP Settings
default_host = ssl://localhost default_port = 993 username_domain = example.com
SMTP Settings
smtp_server = ssl://localhost smtp_port = 465 Use the current IMAP username and password for SMTP authentication = ставим галочку
Display settings & user prefs
language * = ru_RU preview_pane * = ставим галочку htmleditor * = ставим галочку draft_autosave * = never
Жмём CREATE CONFIG и скачиваем main.inc.php и db.inc.php после чего их необходимо поместить в /var/www/roundcubemail/config на сервере
Жмём CONTINUE
Видим следующее
DB Schema: NOT OK(Database not initialized)
Жмём Initialize database
Тестируем IMAP
Test IMAP config
Указываем Username и Password
Жмём Check login
Ответом должно быть
IMAP connect: OK(SORT capability: yes)
SMTP протестировать не удалось так как не смотря указанный логи и пароль тест идёт от анонимного пользователя. Но при работе всё нормально.
Всё конфигурирование Roundcubemail завершено.
Можно зайти и посмотреть как всё работает, открываем в браузере
http://IP вашего сервера/roundcubemail
Подключим два плагина, один для создания фильтров, второй для перемещения писем в папку спам.
Редактируем /var/www/roundcubemail/config/main.inc.php следующим образом
$rcmail_config['plugins'] = array('managesieve', 'markasjunk');
Подключаем конфиг файл плагина managesieve
cp /var/www/roundcubemail/plugins/managesieve/config.inc.php.dist /var/www/roundcubemail/plugins/managesieve/config.inc.php
Всё плагины подключены.
Теперь подключим адресную книгу из LDAP.
Для этого устанавливаем необходимые пакеты
apt-get install php5-ldap
и редактируем /var/www/roundcubemail/config/main.inc.php
Находим в нём раздел
// ---------------------------------- // ADDRESSBOOK SETTINGS // ----------------------------------
и приводим его к следующему виду
// This indicates which type of address book to use. Possible choises: // 'sql' (default) and 'ldap'. // If set to 'ldap' then it will look at using the first writable LDAP // address book as the primary address book and it will not display the // SQL address book in the 'Address Book' view. $rcmail_config['address_book_type'] = 'sql'; // In order to enable public ldap search, configure an array like the Verisign // example further below. if you would like to test, simply uncomment the example. //$rcmail_config['ldap_public'] = array(); // // If you are going to use LDAP for individual address books, you will need to // set 'user_specific' to true and use the variables to generate the appropriate DNs to access it. // // The recommended directory structure for LDAP is to store all the address book entries // under the users main entry, e.g.: // // o=root // ou=people // uid=user@domain // mail=contact@contactdomain // // So the base_dn would be uid=%fu,ou=people,o=root // The bind_dn would be the same as based_dn or some super user login. /* * example config for Verisign directory * */ $rcmail_config['ldap_public']['Example'] = array( 'name' => 'Example', // Replacement variables supported in host names: // %h - user's IMAP hostname // %n - http hostname ($_SERVER['SERVER_NAME']) // %d - domain (http hostname without the first part) // For example %n = mail.domain.tld, %d = domain.tld 'hosts' => array('ldap.example.com'), 'port' => 389, 'use_tls' => true, 'user_specific' => false, // If true the base_dn, bind_dn and bind_pass default to the user's IMAP login. // %fu - The full username provided, assumes the username is an email // address, uses the username_domain value if not an email address. // %u - The username prior to the '@'. // %d - The domain name after the '@'. // %dc - The domain name hierarchal string e.g. "dc=test,dc=domain,dc=com" 'base_dn' => 'ou=Users,dc=example,dc=com', 'bind_dn' => 'cn=admin,dc=example,dc=com', 'bind_pass' => 'secret', 'writable' => false, // Indicates if we can write to the LDAP directory or not. // If writable is true then these fields need to be populated: // LDAP_Object_Classes, required_fields, LDAP_rdn 'LDAP_Object_Classes' => array("top", "inetOrgPerson"), // To create a new contact these are the object classes to specify (or any other classes you wish to use). 'required_fields' => array("cn", "sn", "mail"), // The required fields needed to build a new contact as required by the object classes (can include additional fields not required by the object classes). 'LDAP_rdn' => 'mail', // The RDN field that is used for new entries, this field needs to be one of the search_fields, the base of base_dn is appended to the RDN to insert into the LDAP directory. 'ldap_version' => 3, // using LDAPv3 'search_fields' => array('mail', 'cn'), // fields to search in 'name_field' => 'cn', // this field represents the contact's name 'email_field' => 'mail', // this field represents the contact's e-mail 'surname_field' => 'sn', // this field represents the contact's last name 'firstname_field' => 'gn', // this field represents the contact's first name 'sort' => 'cn', // The field to sort the listing by. 'scope' => 'sub', // search mode: sub|base|list 'filter' => '(&(mail=*))', // used for basic listing (if not empty) and will be &'d with search queries. example: status=act 'fuzzy_search' => true, // server allows wildcard search 'sizelimit' => '0', // Enables you to limit the count of entries fetched. Setting this to 0 means no limit. 'timelimit' => '0', // Sets the number of seconds how long is spend on the search. Setting this to 0 means no limit. ); // An ordered array of the ids of the addressbooks that should be searched // when populating address autocomplete fields server-side. ex: array('sql','Verisign'); $rcmail_config['autocomplete_addressbooks'] = array('sql','Example');
Теперь в roundcube, в разделе Контакты должна быть доступна адресная книга Example с пользователями из LDAP
Как добавить другие параметры из LDAP читайте здесь.
P.S. Лично мне не удобно использовать в качестве логина email пользователя. Мой почтовый сервер обслуживает один домен, поэтому я немного модифицировал запрос получения пароля из ldap в dovecot-ldap.conf, изменив в нём одну строку с
pass_filter = (&(objectClass=gosaMailAccount)(mail=%u))
на
pass_filter = (&(objectClass=gosaMailAccount)(mail=%n@*))
при таком варианте в качестве логина нужно использовать имя пользователя (к примеру если email пользователя test@example.com то в качестве логина нужно использовать test).
Итак почтовый сервер настроен и работает, хотелось бы чтоб почта приходящая на него проверялась на наличие вирусов и на спам. Для решения этой задачи существует множество способов, лично мне в качестве спам фильтра больше нравится Dspam, но возможности amavisd-new меня тоже устраивают, поэтому в следующей статье я попробую скрестить Dspam, Amavisd-new и ClamAV
9. Материалы используемые при написании данной статьи
https://oss.gonicus.de/labs/gosa/wiki/PluginInstallationMailPostfix
http://vda.sourceforge.net/VDA/
http://www.sys-adm.org.ua/mail/dovecot.php
http://www.opennet.ru/docs/RUS/exit_setup/dovecot.html
http://hexedit.ifproject.ru/blog1.php/unix/server/postfix-dovecot-openldap?page=2
https://help.ubuntu.com/community/DovecotLDAP
http://www.postfix.org/postconf.5.html#smtpd_sender_login_maps
http://www.gentoo.ru/node/9652
http://ukhov.ru/content/ustanovka-pochtovoj-sistemy-postfixsaslcourierimappostgresql-na-freebsd
http://www.postfix.ru/viewtopic.php?p=9794
http://www.opennet.ru/keywords/postfix.html
http://www.sfr-fresh.com/unix/misc/postfix-2.7.1.tar.gz:a/postfix-2.7.1/man/man5/ldap_table.5
http://www.rfc-editor.org/rfc/rfc2254.txt
http://www.howtoforge.com/postfix-virtual-hosting-with-ldap-and-dovecot-on-ubuntu8.04
http://maint.intraset.ru/doc/dovecot.shtml
http://maint.intraset.ru/doc/postfix.shtml
http://www.opennet.ru/base/net/postfix_openldap.txt.html
https://help.ubuntu.com/10.04/serverguide/C/postfix.html
https://help.ubuntu.com/10.04/serverguide/C/certificates-and-security.html
https://help.ubuntu.com/10.04/serverguide/C/mail-filtering.html
http://www.lissyara.su/articles/freebsd/mail/postfix+dovecot+spamassasin+clamav+ldap+mysql/
http://daevy.uzps.mh.ru/?p=342
http://blogs.ungrund.org/xio/2008/08/13/roundcube-on-debian-testing/
http://muff.kiev.ua/content/roundcube-webmail-eshche-odin-pochtovyi-veb-interfeis
http://trac.roundcube.net/wiki/Howto_Install