И так, у нас уже есть настроенный 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.

Все действия в этой статье выполняются от пользователя 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

в результате письма из очереди будут отправляться каждую минуту.

Всё почтовый сервер готов к использованию.

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 8-)

Обсудить данную статью можно на форуме.

8. Материалы используемые при написании данной статьи

9. Статьи по теме