Рано или поздно в средних(а иногда и малых) организациях появляется потребность в собственном почтовом сервере. В данной статье мы рассмотрим один из множества вариантов реализации почтового сервера на линуксе для нужд таких организаций. Итак, поехали.
В качестве SMTP сервера мы будем использовать postfix, в качестве IMAP - dovecot. В связке postfix-dovecot за все локальные операции(доставка почты в ящики, аутентификация) будет отвечать dovecot. База пользователей будет находиться в LDAP(AD). Передача информации будет происходить по защищенному соединению(SMTP over SSL и IMAP over SSL) без возможности использования обычного(незащищенного) соединения. Ещё один момент, который стоит отметить, это использование на сервере антиспам-фильтра dspam. Информацию об обучении dspam мы будем хранить в MySQL, но есть возможность хранить в PostgreSQL или файловом виде. Postfix, dovecot и dspam будут обмениваться информацией по протоколу LMTP. Вся система будет функционировать на ОС Debian GNU/Linux 7.0 (Wheezy). Система будет обслуживать один домен, но при желании легко изменяется под нужды нескольких доменов.
Сразу стоит отметить, что здесь предполагается существование базы пользователей в LDAP. Все настройки подключения к базе пользователей показаны на примере openLDAP, адаптация под Active Directory не составляет большого труда(изменениям подвергнутся лишь несколько строк). Внутренний домен - domain.com, почтовый - example.com.
Вот теперь приступим к практической реализации задуманного.
Начнём с установки необходимых пакетов:
Сгенерируем приватный ключ и сертификат для использования postfix-ом и dovecot-ом:
Следует отметить, что наши сертификаты будут самоподписанными и в клиентских почтовых программах будет выдано предупреждение о неизвестном сертификате. Вы также можете воспользоваться коммерческими центрами сертификации для получения заверенного ими сертификата.
Конфигурационные файлы postfix находятся в каталоге /etc/postfix. Основной конфигурационный файл main.cf создадим с нуля, вписав в него только минимально необходимые параметры. Итак, main.cf:
В файле master.cf раскомментируем вот эту строчку:
Обратите внимание, chroot для lmtp должен быть отключен в master.cf:
Создадим каталог /etc/postfix/ldap:
а в нём файл /etc/postfix/ldap/virtual_mailbox_maps.cf:
Простой командой postmap проверим работоспособность virtual_mailbox_maps.cf:
Теперь займемся dovecot-ом. Его конфигурационные файлы находятся в /etc/dovecot. Рассмотрим детальней. Основной конфиг - это dovecot.conf. Создавать новые файлы мы не будем, мы будем только вносить изменения в уже существующие. Поэтому здесь рассмотрим только те параметры, которые изменяем, параметры, которые по-умолчанию, рассматривать не будем. Список необходимых файлов:
dovecot.conf — конфигурационный файл dovecot;
dovecot-ldap.conf.ext — настройки для подключения к серверу LDAP;
conf.d/10-auth.conf — параметры процесса аутентификации;
conf.d/10-director.conf — параметры Dovecot Director;
conf.d/10-logging.conf — параметры ведения логов;
conf.d/10-mail.conf — параметры хранения ящиков;
conf.d/10-master.conf — параметры сервисов;
conf.d/10-ssl.conf — параметры SSL/TLS;
conf.d/15-lda.conf — параметры LDA;
conf.d/20-imap.conf — параметры протокола IMAP;
conf.d/20-lmtp.conf — параметры протокола LMTP;
conf.d/90-plugin.conf — параметры плагинов;
conf.d/90-quota.conf — параметры настройки квот;
conf.d/auth-ldap.conf.ext — параметры используемой базы данных пользователей(в данном случае LDAP);
Итак, начнём с dovecot.conf:
10-auth.conf:
10-logging.conf:
10-mail.conf:
10-master.conf:
10-ssl.conf:
15-lda.conf:
15-mailboxes.conf:
20-imap.conf:
20-lmtp.conf:
90-plugin.conf:
90-quota.conf:
auth-ldap.conf.ext:
dovecot-ldap.conf.ext:
Создадим в /etc/dovecot скрипт quota-warning.sh:
и выставим ему права доступа:
Для использования dovecot-ом TLS при подключении к LDAP серверу необходимо прописать в /etc/ldap/ldap.conf(если Active Directory, то не требуется):
Создадим пользователя vmail и раздадим права доступа на каталог, в котором будет хранится почта(от имени этого пользователя dovecot будет управлять письмами в почтовых ящиках пользователей):
Dspam написан на Си, поэтому у него нет проблем с производительностью(хотя в этом мире всё условно и относительно). Обучение будет производиться для всего домена, а не для каждого пользователя в отдельности, так что результатами обучения будут пользоваться все пользователи нашего домена. Теперь приступим к конфигурированию антиспама. Здесь поступим как с postfix-ом - создадим новый конфиг только с необходимыми параметрами, а старый просто скопируйте, например, в dspam.conf.old:
В файле /etc/dspam/default.prefs задаются настройки по-молчанию(по части Preference) и имеют более высокий приоритет, чем dspam.conf. Нам остаётся изменить в default.prefs только одно значение:
Для того, чтобы результаты обучения применялись ко всем пользователям, создадим файл /var/spool/dspam/group с таким содержимым:
Для того, чтобы dspam работал как демон, внесём изменения в файл /etc/default/dspam:
Теперь подключимся к mysql. Для этого нам нужно создать в mysql базу dspam:
и заполнить её необходимыми таблицами:
Настроим подключение к базе в специально подготовленном файле dspam.d/mysql.conf:
Нам осталось раздать права на некоторые файлы для корректного функционирования системы:
Теперь dspam готов к обучению. Обучение с помощью плагина dovecot-antispam будет проходить автоматически, если вы перемещаете в папку "Спам" письмо или наоборот - из папки "Спам". Но для нормального старта(так как база обучения пуста) лучше обучить dspam вручную с помощью набора спама, если у вас таковой имеется. Это можно сделать, например, так:
И напоследок, нам осталось протестировать нашу систему. Начнём с тестирования postfix-а.
Проверим, как наш сервер отправляет почту. Подключимся к 25 порту, который используется для соединения MTA-to-MTA(порт 465(smtps) и порт 587(submission) используются для MUA-to-MTA соединений):
Вот примерно такой вывод должен быть в консоли. При этом в ящик hostmaster@example.com будет доставлено письмо. Теперь проверим функционирование dovecot. Воспользуемся методом, описаным здесь
Такой вывод означает, что система функционирует исправно и ваш почтовый сервер готов к эксплуатации.
В качестве SMTP сервера мы будем использовать postfix, в качестве IMAP - dovecot. В связке postfix-dovecot за все локальные операции(доставка почты в ящики, аутентификация) будет отвечать dovecot. База пользователей будет находиться в LDAP(AD). Передача информации будет происходить по защищенному соединению(SMTP over SSL и IMAP over SSL) без возможности использования обычного(незащищенного) соединения. Ещё один момент, который стоит отметить, это использование на сервере антиспам-фильтра dspam. Информацию об обучении dspam мы будем хранить в MySQL, но есть возможность хранить в PostgreSQL или файловом виде. Postfix, dovecot и dspam будут обмениваться информацией по протоколу LMTP. Вся система будет функционировать на ОС Debian GNU/Linux 7.0 (Wheezy). Система будет обслуживать один домен, но при желании легко изменяется под нужды нескольких доменов.
Сразу стоит отметить, что здесь предполагается существование базы пользователей в LDAP. Все настройки подключения к базе пользователей показаны на примере openLDAP, адаптация под Active Directory не составляет большого труда(изменениям подвергнутся лишь несколько строк). Внутренний домен - domain.com, почтовый - example.com.
Вот теперь приступим к практической реализации задуманного.
Начнём с установки необходимых пакетов:
root@mailsrv:~# aptitude update && aptitude safe-upgrade
root@mailsrv:~# aptitude install postfix postfix-ldap openssl dovecot-core dovecot-ldap dovecot-imapd dovecot-lmtpd dovecot-antispam dspam libdspam7-drv-mysql
root@mailsrv:~# aptitude install postfix postfix-ldap openssl dovecot-core dovecot-ldap dovecot-imapd dovecot-lmtpd dovecot-antispam dspam libdspam7-drv-mysql
Сгенерируем приватный ключ и сертификат для использования postfix-ом и dovecot-ом:
root@mailsrv:~# openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/mail-cert.pem -keyout /etc/ssl/private/mail-key.pem
root@mailsrv:~# chmod 644 /etc/ssl/certs/mail-cert.pem
root@mailsrv:~# chmod 400 /etc/ssl/private/mail-key.pem
root@mailsrv:~# chmod 644 /etc/ssl/certs/mail-cert.pem
root@mailsrv:~# chmod 400 /etc/ssl/private/mail-key.pem
Следует отметить, что наши сертификаты будут самоподписанными и в клиентских почтовых программах будет выдано предупреждение о неизвестном сертификате. Вы также можете воспользоваться коммерческими центрами сертификации для получения заверенного ими сертификата.
Postfix
Конфигурационные файлы postfix находятся в каталоге /etc/postfix. Основной конфигурационный файл main.cf создадим с нуля, вписав в него только минимально необходимые параметры. Итак, main.cf:
#-------------------------------------базовые параметры-------------------------------------
#домен почтового сервера
mydomain = example.com
#полное имя(FQDN) почтового сервера
myhostname = mail.example.com
#доменное имя, прибавляемое к имени локальных пользователей при отсылке ими почты
myorigin = $mydomain
#доверенные сети
mynetworks = 192.168.1.0/24, 127.0.0.0/8
#не пересылать почту для посторонних доменов
relay_domains =
#список интерфейсов, на которых postfix будет принимать почту
inet_interfaces = all
#каталог для очереди postfix
queue_directory = /var/spool/postfix
#максимальное время нахождения сообщения о недоставке в очереди
bounce_queue_lifetime = 1d
#максимальное время нахождения сообщения в очереди
maximal_queue_lifetime = 3d
#таблица верификации почтовых адресов
address_verify_map = proxy:btree:$data_directory/verify_cache
#отключить периодическую очистку таблицы верфикации
address_verify_cache_cleanup_interval = 0
#максимальный размер сообщения
message_size_limit = 52428800
alias_maps = hash:/etc/aliases
#---------------------------------настройка аутентификации----------------------------------
#включить SASL аутентификацию
smtpd_sasl_auth_enable = yes
#плагин, проводящий аутентификацию
smtpd_sasl_type = dovecot
#файл, через который плагином будет проводиться аутентификация
smtpd_sasl_path = private/auth
#какие методы аутентификации не использовать для TLS сессий
smtpd_sasl_tls_security_options = noanonymous, nodictionary, noactive
#включить возможность использовать клиенты, использующие устаревшую модель аутентификации
broken_sasl_auth_clients = yes
#----------------------------------------настройка TLS---------------------------------------
#RSA сертификат
smtpd_tls_cert_file = /etc/ssl/certs/mail-cert.pem
#приватный RSA ключ(с правами 0400)
smtpd_tls_key_file = /etc/ssl/private/mail-key.pem
#файл кэша TLS сессий сервера Postfix
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
#файл кэша TLS сессий Postfix SMTP клиента
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
#исключим устаревшие протоколы SSLv2 и SSLv3
smtpd_tls_protocols = !SSLv2, !SSLv3
#-----------------------------------настройка ограничений-----------------------------------
#отклонять команду ETRN
smtpd_etrn_restrictions = reject
#требовать от удаленного клиента представляться с помощью команд HELO или EHLO
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks,
#-----------------ошибка 550 - почтовый ящик не найден(согласно RFC 5321)-------------------
#выдавать ошибку 550 при срабатывании ограничений reject_unknown_sender_domain или reject_unknown_recipient_domain
unknown_address_reject_code = 550
#выдавать ошибку 550 при срабатывании ограничения reject_unverified_recipient
unverified_recipient_reject_code = 550
#выдавать ошибку 550 при срабатывании ограничений reject_non_fqdn_helo_hostname, reject_non_fqdn_sender или reject_non_fqdn_recipient
non_fqdn_reject_code = 550
#выдавать ошибку 550 при срабатывании ограничения reject_multi_recipient_bounce
multi_recipient_bounce_reject_code = 550
#выдавать ошибку 550 при отсутствии получателя
unknown_local_recipient_reject_code = 550
#-------------------------------настройка виртуальных почтовых ящиков--------------------------------
#виртуальный транспорт доставки сообщений в ящики
virtual_transport = lmtp:unix:/var/run/dspam/postfix
#список виртуальных доменов
virtual_mailbox_domains = $mydomain
#список всех доступных адресов для доменов из virtual_mailbox_domains
virtual_mailbox_maps = ldap:/etc/postfix/ldap/virtual_mailbox_maps.cf
#домен почтового сервера
mydomain = example.com
#полное имя(FQDN) почтового сервера
myhostname = mail.example.com
#доменное имя, прибавляемое к имени локальных пользователей при отсылке ими почты
myorigin = $mydomain
#доверенные сети
mynetworks = 192.168.1.0/24, 127.0.0.0/8
#не пересылать почту для посторонних доменов
relay_domains =
#список интерфейсов, на которых postfix будет принимать почту
inet_interfaces = all
#каталог для очереди postfix
queue_directory = /var/spool/postfix
#максимальное время нахождения сообщения о недоставке в очереди
bounce_queue_lifetime = 1d
#максимальное время нахождения сообщения в очереди
maximal_queue_lifetime = 3d
#таблица верификации почтовых адресов
address_verify_map = proxy:btree:$data_directory/verify_cache
#отключить периодическую очистку таблицы верфикации
address_verify_cache_cleanup_interval = 0
#максимальный размер сообщения
message_size_limit = 52428800
alias_maps = hash:/etc/aliases
#---------------------------------настройка аутентификации----------------------------------
#включить SASL аутентификацию
smtpd_sasl_auth_enable = yes
#плагин, проводящий аутентификацию
smtpd_sasl_type = dovecot
#файл, через который плагином будет проводиться аутентификация
smtpd_sasl_path = private/auth
#какие методы аутентификации не использовать для TLS сессий
smtpd_sasl_tls_security_options = noanonymous, nodictionary, noactive
#включить возможность использовать клиенты, использующие устаревшую модель аутентификации
broken_sasl_auth_clients = yes
#----------------------------------------настройка TLS---------------------------------------
#RSA сертификат
smtpd_tls_cert_file = /etc/ssl/certs/mail-cert.pem
#приватный RSA ключ(с правами 0400)
smtpd_tls_key_file = /etc/ssl/private/mail-key.pem
#файл кэша TLS сессий сервера Postfix
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
#файл кэша TLS сессий Postfix SMTP клиента
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
#исключим устаревшие протоколы SSLv2 и SSLv3
smtpd_tls_protocols = !SSLv2, !SSLv3
#-----------------------------------настройка ограничений-----------------------------------
#отклонять команду ETRN
smtpd_etrn_restrictions = reject
#требовать от удаленного клиента представляться с помощью команд HELO или EHLO
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks,
#разрешить, если клиент успешно прошёл аутентификацию
permit_sasl_authenticated,
#отклонять почту, если имя HELO или EHLO некорректно
reject_invalid_helo_hostname,
#отклонять почту, если имя HELO или EHLO не соответствует FQDN
reject_non_fqdn_helo_hostname,
#отклонять, если для имени HELO или EHLO не существует A или MX запись в DNS
reject_unknown_helo_hostname
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,
#отклонять почту, если имя HELO или EHLO некорректно
reject_invalid_helo_hostname,
#отклонять почту, если имя HELO или EHLO не соответствует FQDN
reject_non_fqdn_helo_hostname,
#отклонять, если для имени HELO или EHLO не существует A или MX запись в DNS
reject_unknown_helo_hostname
permit_sasl_authenticated,
#отклонять, если адрес получателя не соответствует FQDN
reject_non_fqdn_recipient,
#отклонять, если домен получателя не из списка обслуживаемых
reject_unknown_recipient_domain,
#отклонять, если получатель не существует
reject_unlisted_recipient,
#запретить открытую пересылку писем через наш сервер
reject_unauth_destination
smtpd_sender_restrictions = permit_mynetworks,#отклонять, если адрес получателя не соответствует FQDN
reject_non_fqdn_recipient,
#отклонять, если домен получателя не из списка обслуживаемых
reject_unknown_recipient_domain,
#отклонять, если получатель не существует
reject_unlisted_recipient,
#запретить открытую пересылку писем через наш сервер
reject_unauth_destination
#отклонять, если имя отправителя не FQDN
reject_non_fqdn_sender,
#отклонять, если для имени домена отправителя не существует A или MX запись в DNS
reject_unknown_sender_domain,
#отклонять, если адрес отправителя не существует
reject_unlisted_sender
smtpd_data_restrictions = permit_mynetworks,reject_non_fqdn_sender,
#отклонять, если для имени домена отправителя не существует A или MX запись в DNS
reject_unknown_sender_domain,
#отклонять, если адрес отправителя не существует
reject_unlisted_sender
#отклонять множественную рассылку с пустым адресом отправителя
reject_multi_recipient_bounce
smtpd_client_restrictions = permit_mynetworks,reject_multi_recipient_bounce
#отклонить почту от клиентов, посылающих SMTP команды раньше времени
reject_unauth_pipelining
reject_unauth_pipelining
#-----------------ошибка 550 - почтовый ящик не найден(согласно RFC 5321)-------------------
#выдавать ошибку 550 при срабатывании ограничений reject_unknown_sender_domain или reject_unknown_recipient_domain
unknown_address_reject_code = 550
#выдавать ошибку 550 при срабатывании ограничения reject_unverified_recipient
unverified_recipient_reject_code = 550
#выдавать ошибку 550 при срабатывании ограничений reject_non_fqdn_helo_hostname, reject_non_fqdn_sender или reject_non_fqdn_recipient
non_fqdn_reject_code = 550
#выдавать ошибку 550 при срабатывании ограничения reject_multi_recipient_bounce
multi_recipient_bounce_reject_code = 550
#выдавать ошибку 550 при отсутствии получателя
unknown_local_recipient_reject_code = 550
#-------------------------------настройка виртуальных почтовых ящиков--------------------------------
#виртуальный транспорт доставки сообщений в ящики
virtual_transport = lmtp:unix:/var/run/dspam/postfix
#список виртуальных доменов
virtual_mailbox_domains = $mydomain
#список всех доступных адресов для доменов из virtual_mailbox_domains
virtual_mailbox_maps = ldap:/etc/postfix/ldap/virtual_mailbox_maps.cf
В файле master.cf раскомментируем вот эту строчку:
smtps inet n - - - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
Обратите внимание, chroot для lmtp должен быть отключен в master.cf:
lmtp unix - - n - - lmtp
Создадим каталог /etc/postfix/ldap:
root@mailsrv:~# mkdir /etc/postfix/ldap
root@mailsrv:~# chmod 0700 /etc/postfix/ldap
root@mailsrv:~# chmod 0700 /etc/postfix/ldap
а в нём файл /etc/postfix/ldap/virtual_mailbox_maps.cf:
server_host = ldap_server_ip
bind = yes
bind_dn = cn=authuser,dc=company,dc=com
bind_pw = secret
#в случае AD выставить в "no"
start_tls = yes
search_base = ou=mail,dc=company,dc=com
scope = sub
query_filter = (&(objectClass=posixAccount)(mail=%s))
result_attribute = mail
bind = yes
bind_dn = cn=authuser,dc=company,dc=com
bind_pw = secret
#в случае AD выставить в "no"
start_tls = yes
search_base = ou=mail,dc=company,dc=com
scope = sub
query_filter = (&(objectClass=posixAccount)(mail=%s))
result_attribute = mail
Простой командой postmap проверим работоспособность virtual_mailbox_maps.cf:
root@mailsrv:~# postmap -q "example@example.com" ldap:/etc/postfix/ldap/virtual_mailbox_maps.cf
example@example.com
example@example.com
Dovecot
Теперь займемся dovecot-ом. Его конфигурационные файлы находятся в /etc/dovecot. Рассмотрим детальней. Основной конфиг - это dovecot.conf. Создавать новые файлы мы не будем, мы будем только вносить изменения в уже существующие. Поэтому здесь рассмотрим только те параметры, которые изменяем, параметры, которые по-умолчанию, рассматривать не будем. Список необходимых файлов:
dovecot.conf — конфигурационный файл dovecot;
dovecot-ldap.conf.ext — настройки для подключения к серверу LDAP;
conf.d/10-auth.conf — параметры процесса аутентификации;
conf.d/10-director.conf — параметры Dovecot Director;
conf.d/10-logging.conf — параметры ведения логов;
conf.d/10-mail.conf — параметры хранения ящиков;
conf.d/10-master.conf — параметры сервисов;
conf.d/10-ssl.conf — параметры SSL/TLS;
conf.d/15-lda.conf — параметры LDA;
conf.d/20-imap.conf — параметры протокола IMAP;
conf.d/20-lmtp.conf — параметры протокола LMTP;
conf.d/90-plugin.conf — параметры плагинов;
conf.d/90-quota.conf — параметры настройки квот;
conf.d/auth-ldap.conf.ext — параметры используемой базы данных пользователей(в данном случае LDAP);
Итак, начнём с dovecot.conf:
#подключаем установленные протоколы
!include_try /usr/share/dovecot/protocols.d/*.protocol
#слушаем все интерфейсы на входящие соединения
listen = *, ::
#подключаем дополнительные файлы конфигурации
!include conf.d/*.conf
!include_try /usr/share/dovecot/protocols.d/*.protocol
#слушаем все интерфейсы на входящие соединения
listen = *, ::
#подключаем дополнительные файлы конфигурации
!include conf.d/*.conf
10-auth.conf:
disable_plaintext_auth = yes
#список разрешенных символов в имени пользователя
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
#имя пользователя в нижнем регистре
auth_username_format = %Lu
#максимальное количество процессов, проводящих аутентификацию
auth_worker_max_count = 20
#механизмы аутентификации
auth_mechanisms = plain
#файл, содержащий параметры подключения к AD(ldap)
!include auth-ldap.conf.ext
#список разрешенных символов в имени пользователя
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
#имя пользователя в нижнем регистре
auth_username_format = %Lu
#максимальное количество процессов, проводящих аутентификацию
auth_worker_max_count = 20
#механизмы аутентификации
auth_mechanisms = plain
#файл, содержащий параметры подключения к AD(ldap)
!include auth-ldap.conf.ext
10-logging.conf:
#лог-файл сообщений об ошибках
log_path = /var/log/dovecot
#лог-файл информационных сообщений
info_log_path = /var/log/dovecot-info.log
log_path = /var/log/dovecot
#лог-файл информационных сообщений
info_log_path = /var/log/dovecot-info.log
10-mail.conf:
#место и способ хранения почтовых ящиков, %d - домен, %n - имя пользователя без доменной части
mail_location = maildir:/var/mail/%d/%n
#системные пользователь и группа, от имени которых будет осуществляться доступ к почте
mail_uid = vmail
mail_gid = vmail
mail_location = maildir:/var/mail/%d/%n
#системные пользователь и группа, от имени которых будет осуществляться доступ к почте
mail_uid = vmail
mail_gid = vmail
10-master.conf:
#максимальное количество процессов
default_process_limit = 100
#размер выделяемой памяти на процесс
default_vsz_limit = 64M
service imap-login {
service_count = 1
#минимальное число процессов, всегда ожидающих соединения
process_min_avail = 5
}
service auth {
service lmtp {
default_process_limit = 100
#размер выделяемой памяти на процесс
default_vsz_limit = 64M
service imap-login {
inet_listener imap {
#отключим imap, нам нужен только imaps
port = 0
}port = 0
inet_listener imaps {
#ограничиваемся лимитом одно соединение - один процесс(максимум 100 ввиду default_process_limit)port = 993
address = *, ::
ssl = yes
}address = *, ::
ssl = yes
service_count = 1
#минимальное число процессов, всегда ожидающих соединения
process_min_avail = 5
}
service auth {
unix_listener /var/spool/postfix/private/auth {
}mode = 0660
user = postfix
group = postfix
}user = postfix
group = postfix
service lmtp {
unix_listener /var/run/dspam/dovecot {
}group = dspam
mode = 0666
user = dspam
}mode = 0666
user = dspam
10-ssl.conf:
#включим поддержку SSL/TLS
ssl = yes
#укажем, где лежат сертификат и приватный ключ
ssl_cert = </etc/ssl/certs/mail-cert.pem
ssl_key = </etc/ssl/private/mail-key.pem
#не использовать протоколы SSLv2 и SSLv3
ssl_protocols = !SSLv2 !SSLv3
ssl = yes
#укажем, где лежат сертификат и приватный ключ
ssl_cert = </etc/ssl/certs/mail-cert.pem
ssl_key = </etc/ssl/private/mail-key.pem
#не использовать протоколы SSLv2 и SSLv3
ssl_protocols = !SSLv2 !SSLv3
15-lda.conf:
#сообщать о временной ошибке при приёме почты при превышении квоты пользователем
quota_full_tempfail = yes
#автоматически создавать ящик, если таковой отсутствует
lda_mailbox_autocreate = yes
quota_full_tempfail = yes
#автоматически создавать ящик, если таковой отсутствует
lda_mailbox_autocreate = yes
15-mailboxes.conf:
#указание папок, которые должны быть в почтовом ящике пользователя
#предполагается, что "namespace inbox" определён в 10-mail.conf(он определён по-умолчанию)
namespace inbox {
#предполагается, что "namespace inbox" определён в 10-mail.conf(он определён по-умолчанию)
namespace inbox {
#имя папки
#Черновики
mailbox Drafts {
#специальный аттрибут в IMAP, который определяет тип папки
special_use = \Drafts
#автоматически создать и подписаться на папку
auto=subscribe
}
#Черновики
mailbox Drafts {
#специальный аттрибут в IMAP, который определяет тип папки
special_use = \Drafts
#автоматически создать и подписаться на папку
auto=subscribe
}
#Спам
mailbox Spam {
auto=subscribe
special_use = \Junk
}
mailbox Spam {
auto=subscribe
special_use = \Junk
}
#Корзина
mailbox Trash {
auto=subscribe
special_use = \Trash
}
mailbox Trash {
auto=subscribe
special_use = \Trash
}
#Отправленные
mailbox Sent {
auto=subscribe
special_use = \Sent
}
mailbox Sent {
auto=subscribe
special_use = \Sent
}
#Архив
mailbox Archive {
auto=subscribe
special_use = \Archive
}
}mailbox Archive {
auto=subscribe
special_use = \Archive
}
20-imap.conf:
protocol imap {
protocol imaps {
#подключаем плагины квоты и антиспама
mail_plugins = $mail_plugins quota imap_quota antispam
}mail_plugins = $mail_plugins quota imap_quota antispam
protocol imaps {
#подключаем плагины квоты и антиспама
mail_plugins = $mail_plugins quota imap_quota antispam
}mail_plugins = $mail_plugins quota imap_quota antispam
20-lmtp.conf:
protocol lmtp {
#подключаем плагин квот для протокола
mail_plugins = $mail_plugins quota
}
}mail_plugins = $mail_plugins quota
}
90-plugin.conf:
#подключаем плагин antispam(подробности здесь)
plugin {
plugin {
antispam_debug_target = syslog
antispam_verbose_debug = 1
antispam_backend = dspam
antispam_signature = X-DSPAM-Signature
antispam_signature_missing = error
antispam_trash_pattern_ignorecase = Trash
antispam_spam_pattern_ignorecase = Junk;Spam;Junk.*;Spam.*
antispam_dspam_binary = /usr/bin/dspam
antispam_dspam_args = --user;dspam;--mode=teft;
antispam_dspam_result_header = X-DSPAM-Result
antispam_dspam_result_blacklist = Virus
antispam_dspam_spam = --class=spam
antispam_dspam_notspam = --class=innocent
}antispam_verbose_debug = 1
antispam_backend = dspam
antispam_signature = X-DSPAM-Signature
antispam_signature_missing = error
antispam_trash_pattern_ignorecase = Trash
antispam_spam_pattern_ignorecase = Junk;Spam;Junk.*;Spam.*
antispam_dspam_binary = /usr/bin/dspam
antispam_dspam_args = --user;dspam;--mode=teft;
antispam_dspam_result_header = X-DSPAM-Result
antispam_dspam_result_blacklist = Virus
antispam_dspam_spam = --class=spam
antispam_dspam_notspam = --class=innocent
90-quota.conf:
#подключаем плагин квот
plugin {
plugin {
service quota-warning {
plugin {
#квота применяется к ящику каждого пользователя
quota = maildir:User quota
#на все папки даётся лимит 1G
quota_rule = *:storage=1G
#на корзину даётся дополнительно 10% от общего лимита
quota_rule2 = Trash:storage=+10%%
#на папку "Спам" даётся дополнительно 20% от общего лимита
quota_rule3 = Spam:storage=+20%%
}quota = maildir:User quota
#на все папки даётся лимит 1G
quota_rule = *:storage=1G
#на корзину даётся дополнительно 10% от общего лимита
quota_rule2 = Trash:storage=+10%%
#на папку "Спам" даётся дополнительно 20% от общего лимита
quota_rule3 = Spam:storage=+20%%
plugin {
#выдавать предупреждения при превышении 95% лимита
quota_warning = storage=95%% quota-warning 95 %u
##выдавать предупреждения при превышении 100% лимита
quota_warning2 = -storage=100%% quota-warning below %u
}quota_warning = storage=95%% quota-warning 95 %u
##выдавать предупреждения при превышении 100% лимита
quota_warning2 = -storage=100%% quota-warning below %u
service quota-warning {
#скрипт, выдающий предупреждения
executable = script /etc/dovecot/quota-warning.sh
unix_listener quota-warning {
}executable = script /etc/dovecot/quota-warning.sh
unix_listener quota-warning {
mode = 0600
}auth-ldap.conf.ext:
passdb {
driver = ldap
args = /etc/dovecot/dovecot-ldap.conf.ext
}
userdb {
driver = ldap
args = /etc/dovecot/dovecot-ldap.conf.ext
}
driver = ldap
args = /etc/dovecot/dovecot-ldap.conf.ext
}
userdb {
driver = ldap
args = /etc/dovecot/dovecot-ldap.conf.ext
}
dovecot-ldap.conf.ext:
hosts = <ldap(AD)_server_ip>
dn = cn=authuser,dc=company,dc=com
dnpass = secret
#в случае AD выставить в "no"
tls = yes
auth_bind = yes
ldap_version = 3
base = ou=mail,dc=company,dc=com
deref = never
scope = subtree
user_attrs =
user_filter = (&(objectClass=posixAccount)(mail=%u))
pass_attrs = mail=user
pass_filter = (&(objectClass=posixAccount)(mail=%u))
dn = cn=authuser,dc=company,dc=com
dnpass = secret
#в случае AD выставить в "no"
tls = yes
auth_bind = yes
ldap_version = 3
base = ou=mail,dc=company,dc=com
deref = never
scope = subtree
user_attrs =
user_filter = (&(objectClass=posixAccount)(mail=%u))
pass_attrs = mail=user
pass_filter = (&(objectClass=posixAccount)(mail=%u))
Создадим в /etc/dovecot скрипт quota-warning.sh:
#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster@example.com
Subject: quota warning
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
To: $USER
Внимание!
Ваш ящик заполнен на $PERCENT%.
Пожалуйста удалите устаревшую(ненужную) почту!
PERCENT=$1
USER=$2
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster@example.com
Subject: quota warning
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
To: $USER
Внимание!
Ваш ящик заполнен на $PERCENT%.
Пожалуйста удалите устаревшую(ненужную) почту!
и выставим ему права доступа:
root@mailsrv:~# chmod 0700 quota-warning.sh
Для использования dovecot-ом TLS при подключении к LDAP серверу необходимо прописать в /etc/ldap/ldap.conf(если Active Directory, то не требуется):
TLS_REQCERT allow
Создадим пользователя vmail и раздадим права доступа на каталог, в котором будет хранится почта(от имени этого пользователя dovecot будет управлять письмами в почтовых ящиках пользователей):
root@mailsrv:~# useradd -d /var/mail -s /usr/sbin/nologin -u 5000 -U vmail
root@mailsrv:~# chown vmail:vmail /var/mail
root@mailsrv:~# chmod 770 /var/mail
root@mailsrv:~# chown vmail:vmail /var/mail
root@mailsrv:~# chmod 770 /var/mail
Dspam
Dspam написан на Си, поэтому у него нет проблем с производительностью(хотя в этом мире всё условно и относительно). Обучение будет производиться для всего домена, а не для каждого пользователя в отдельности, так что результатами обучения будут пользоваться все пользователи нашего домена. Теперь приступим к конфигурированию антиспама. Здесь поступим как с postfix-ом - создадим новый конфиг только с необходимыми параметрами, а старый просто скопируйте, например, в dspam.conf.old:
#рабочий каталог dspam
Home /var/spool/dspam
#какую библиотеку использовать для хранения информации о спаме
StorageDriver /usr/lib/i386-linux-gnu/dspam/libmysql_drv.so
#узел доставки сообщений после анализа
DeliveryHost /var/run/dspam/dovecot
#используемый протокол для доставки сообщений
DeliveryProto LMTP
#выдавать ошибку в случае провала локальной доставки сообщения
OnFail error
#доверенные пользователи на выполнение административных функций
Trust root
Trust dspam
Trust vmail
#режим обучения: обучаться на каждом письме
TrainingMode teft
#переобучаться в случае ошибок определения спама, пока ошибки не исчезнут
TestConditionalTraining on
#активировать возможность "белого списка"
Feature whitelist
#используемый алгоритм определения спама(подробнее в оф. документации)
Algorithm graham burton
Tokenizer osb
PValue bcr
#включить в заголовок X-DSPAM-Improbability запись о вероятности письма как спама
ImprobabilityDrive on
#добавлять в тему сообщения тег [SPAM]
Preference "spamAction=tag"
Preference "spamSubject=[SPAM]"
#статистические параметры(см. оф.документацию)
Preference "statisticalSedation=5"
Preference "enableBNR=on"
#поместить подпись DSPAM в заголовок
Preference "signatureLocation=headers"
#не добавлять строку с тегом спам/не спам в конец сообщения
Preference "tagSpam=off"
Preference "tagNonspam=off"
#число раз, после которых адрес из заголовка From: автоматически заносится в "белый список"
Preference "whitelistThreshold=10"
#
Preference "localStore="
#какие Preference можно изменять пользователям
AllowOverride spamAction
AllowOverride spamSubject
AllowOverride tagNonspam
AllowOverride tagSpam
AllowOverride trainPristine
AllowOverride trainingMode
AllowOverride whitelistThreshold
#не обучаться на следующих заголовках
IgnoreHeader Content-Type
IgnoreHeader DKIM-Signature
IgnoreHeader DomainKey-Signature
IgnoreHeader Message-Id
IgnoreHeader Message-ID
IgnoreHeader MIME-Version
IgnoreHeader X-Amavis-Alert
IgnoreHeader X-Amavis-Hold
IgnoreHeader X-Amavis-Modified
IgnoreHeader X-Amavis-OS-Fingerprint
IgnoreHeader X-Amavis-PenPals
IgnoreHeader X-Amavis-PolicyBank
IgnoreHeader X-AntiVirus
IgnoreHeader X-Antispam
IgnoreHeader X-Antivirus
IgnoreHeader X-Antivirus-Scanner
IgnoreHeader X-Antivirus-Status
IgnoreHeader X-Archive
IgnoreHeader X-DKIM
IgnoreHeader X-DSPAM-Result
IgnoreHeader X-DSPAM-Processed
IgnoreHeader X-DSPAM-Confidence
IgnoreHeader X-DSPAM-Probability
IgnoreHeader X-DSPAM-Signature
IgnoreHeader X-DrWeb-SpamState
IgnoreHeader X-DrWeb-SpamDetail
IgnoreHeader X-DrWeb-SpamVersion
IgnoreHeader X-HTTP-UserAgent
IgnoreHeader X-KSV-Antispam
IgnoreHeader X-Kaspersky-Antivirus
IgnoreHeader X-Mailer
IgnoreHeader X-Mozilla-Status
IgnoreHeader X-Mozilla-Status2
IgnoreHeader X-Mozilla-Key
IgnoreHeader X-Priority
IgnoreHeader X-QIP-Domain
IgnoreHeader X-QIP-Sender
IgnoreHeader X-QIP-Spam
IgnoreHeader X-RedHat-Spam-Score
IgnoreHeader X-RedHat-Spam-Warning
IgnoreHeader X-Spam
IgnoreHeader X-SpamAssassin-Clean
IgnoreHeader X-SpamAssassin-Warning
IgnoreHeader X-Spam-Checker
IgnoreHeader X-Spam-Checker-Version
IgnoreHeader X-Spam-Flag
IgnoreHeader X-Spam-Level
IgnoreHeader X-Spam-Score
IgnoreHeader X-Spam-Status
IgnoreHeader X-SpamScore
IgnoreHeader X-User-Agent
IgnoreHeader X-User-I
#не посылать пользователям уведомления
Notifications off
#настройки по-умолчанию для скрипта purge.sql
PurgeSignatures off # Stale signatures
PurgeNeutral 90 # Tokens with neutralish probabilities
PurgeUnused off # Unused tokens
PurgeHapaxes off # Tokens with less than 5 hits (hapaxes)
PurgeHits1S off # Tokens with only 1 spam hit
PurgeHits1I off # Tokens with only 1 innocent hit
LocalMX 127.0.0.1
#отключить пользовательские и системные логи
SystemLog off
UserLog off
WebStats off
#все пользователи подвергаются фильтрации, кроме указанных в /var/spool/dspam/opt-out/user.nodspam
Opt out
#не анализировать заголовок To:
ParseToHeaders off
#параметры клиент-серверной части dspam для передачи сообщений по протоколу LMTP dovecot-у
ServerPID /var/run/dspam/dspam.pid
ServerMode standard
ServerParameters "--deliver=innocent,spam"
ServerIdent "localhost.example.com"
ServerDomainSocketPath "/var/run/dspam/postfix"
ClientHost /var/run/dspam/postfix
#подключить дополнительные файлы конфигурации
Include /etc/dspam/dspam.d/
Home /var/spool/dspam
#какую библиотеку использовать для хранения информации о спаме
StorageDriver /usr/lib/i386-linux-gnu/dspam/libmysql_drv.so
#узел доставки сообщений после анализа
DeliveryHost /var/run/dspam/dovecot
#используемый протокол для доставки сообщений
DeliveryProto LMTP
#выдавать ошибку в случае провала локальной доставки сообщения
OnFail error
#доверенные пользователи на выполнение административных функций
Trust root
Trust dspam
Trust vmail
#режим обучения: обучаться на каждом письме
TrainingMode teft
#переобучаться в случае ошибок определения спама, пока ошибки не исчезнут
TestConditionalTraining on
#активировать возможность "белого списка"
Feature whitelist
#используемый алгоритм определения спама(подробнее в оф. документации)
Algorithm graham burton
Tokenizer osb
PValue bcr
#включить в заголовок X-DSPAM-Improbability запись о вероятности письма как спама
ImprobabilityDrive on
#добавлять в тему сообщения тег [SPAM]
Preference "spamAction=tag"
Preference "spamSubject=[SPAM]"
#статистические параметры(см. оф.документацию)
Preference "statisticalSedation=5"
Preference "enableBNR=on"
#поместить подпись DSPAM в заголовок
Preference "signatureLocation=headers"
#не добавлять строку с тегом спам/не спам в конец сообщения
Preference "tagSpam=off"
Preference "tagNonspam=off"
#число раз, после которых адрес из заголовка From: автоматически заносится в "белый список"
Preference "whitelistThreshold=10"
#
Preference "localStore="
#какие Preference можно изменять пользователям
AllowOverride spamAction
AllowOverride spamSubject
AllowOverride tagNonspam
AllowOverride tagSpam
AllowOverride trainPristine
AllowOverride trainingMode
AllowOverride whitelistThreshold
#не обучаться на следующих заголовках
IgnoreHeader Content-Type
IgnoreHeader DKIM-Signature
IgnoreHeader DomainKey-Signature
IgnoreHeader Message-Id
IgnoreHeader Message-ID
IgnoreHeader MIME-Version
IgnoreHeader X-Amavis-Alert
IgnoreHeader X-Amavis-Hold
IgnoreHeader X-Amavis-Modified
IgnoreHeader X-Amavis-OS-Fingerprint
IgnoreHeader X-Amavis-PenPals
IgnoreHeader X-Amavis-PolicyBank
IgnoreHeader X-AntiVirus
IgnoreHeader X-Antispam
IgnoreHeader X-Antivirus
IgnoreHeader X-Antivirus-Scanner
IgnoreHeader X-Antivirus-Status
IgnoreHeader X-Archive
IgnoreHeader X-DKIM
IgnoreHeader X-DSPAM-Result
IgnoreHeader X-DSPAM-Processed
IgnoreHeader X-DSPAM-Confidence
IgnoreHeader X-DSPAM-Probability
IgnoreHeader X-DSPAM-Signature
IgnoreHeader X-DrWeb-SpamState
IgnoreHeader X-DrWeb-SpamDetail
IgnoreHeader X-DrWeb-SpamVersion
IgnoreHeader X-HTTP-UserAgent
IgnoreHeader X-KSV-Antispam
IgnoreHeader X-Kaspersky-Antivirus
IgnoreHeader X-Mailer
IgnoreHeader X-Mozilla-Status
IgnoreHeader X-Mozilla-Status2
IgnoreHeader X-Mozilla-Key
IgnoreHeader X-Priority
IgnoreHeader X-QIP-Domain
IgnoreHeader X-QIP-Sender
IgnoreHeader X-QIP-Spam
IgnoreHeader X-RedHat-Spam-Score
IgnoreHeader X-RedHat-Spam-Warning
IgnoreHeader X-Spam
IgnoreHeader X-SpamAssassin-Clean
IgnoreHeader X-SpamAssassin-Warning
IgnoreHeader X-Spam-Checker
IgnoreHeader X-Spam-Checker-Version
IgnoreHeader X-Spam-Flag
IgnoreHeader X-Spam-Level
IgnoreHeader X-Spam-Score
IgnoreHeader X-Spam-Status
IgnoreHeader X-SpamScore
IgnoreHeader X-User-Agent
IgnoreHeader X-User-I
#не посылать пользователям уведомления
Notifications off
#настройки по-умолчанию для скрипта purge.sql
PurgeSignatures off # Stale signatures
PurgeNeutral 90 # Tokens with neutralish probabilities
PurgeUnused off # Unused tokens
PurgeHapaxes off # Tokens with less than 5 hits (hapaxes)
PurgeHits1S off # Tokens with only 1 spam hit
PurgeHits1I off # Tokens with only 1 innocent hit
LocalMX 127.0.0.1
#отключить пользовательские и системные логи
SystemLog off
UserLog off
WebStats off
#все пользователи подвергаются фильтрации, кроме указанных в /var/spool/dspam/opt-out/user.nodspam
Opt out
#не анализировать заголовок To:
ParseToHeaders off
#параметры клиент-серверной части dspam для передачи сообщений по протоколу LMTP dovecot-у
ServerPID /var/run/dspam/dspam.pid
ServerMode standard
ServerParameters "--deliver=innocent,spam"
ServerIdent "localhost.example.com"
ServerDomainSocketPath "/var/run/dspam/postfix"
ClientHost /var/run/dspam/postfix
#подключить дополнительные файлы конфигурации
Include /etc/dspam/dspam.d/
В файле /etc/dspam/default.prefs задаются настройки по-молчанию(по части Preference) и имеют более высокий приоритет, чем dspam.conf. Нам остаётся изменить в default.prefs только одно значение:
spamAction=tag
Для того, чтобы результаты обучения применялись ко всем пользователям, создадим файл /var/spool/dspam/group с таким содержимым:
dspam:shared:*
Для того, чтобы dspam работал как демон, внесём изменения в файл /etc/default/dspam:
START=yes
USER=dspam
USER=dspam
Теперь подключимся к mysql. Для этого нам нужно создать в mysql базу dspam:
root@mailsrv:~# mysql -h <mysql_server_ip> -u root -p
Enter password:
mysql> CREATE DATABASE DSPAM;
mysql> mysql> GRANT ALL PRIVILEGES ON *.* TO dspam@<mail_server_ip> IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> \q
Enter password:
mysql> CREATE DATABASE DSPAM;
mysql> mysql> GRANT ALL PRIVILEGES ON *.* TO dspam@<mail_server_ip> IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> \q
и заполнить её необходимыми таблицами:
root@mailsrv:~# mysql -h <mysql_server_ip> -u dspam -p -D dspam </usr/share/dbconfig-common/data/libdspam7-drv-mysql/install/mysql
Настроим подключение к базе в специально подготовленном файле dspam.d/mysql.conf:
MySQLServer <mysql_server_ip>
MySQLUser dspam
MySQLPass dspam
MySQLDb dspam
MySQLCompress true
MySQLReconnect true
MySQLUIDInSignature on
MySQLUser dspam
MySQLPass dspam
MySQLDb dspam
MySQLCompress true
MySQLReconnect true
MySQLUIDInSignature on
Нам осталось раздать права на некоторые файлы для корректного функционирования системы:
root@mailsrv:~# chgrp vmail /etc/dspam/dspam.conf /etc/dspam/dspam.d/*
Теперь dspam готов к обучению. Обучение с помощью плагина dovecot-antispam будет проходить автоматически, если вы перемещаете в папку "Спам" письмо или наоборот - из папки "Спам". Но для нормального старта(так как база обучения пуста) лучше обучить dspam вручную с помощью набора спама, если у вас таковой имеется. Это можно сделать, например, так:
root@mailsrv:~# dspam_train dspam /path/to/spam /path/to/ham
где /path/to/spam каталог со спамом, а /path/to/ham - каталог с нормальными письмами(может быть пустой). Тестирование
И напоследок, нам осталось протестировать нашу систему. Начнём с тестирования postfix-а.
Проверим, как наш сервер отправляет почту. Подключимся к 25 порту, который используется для соединения MTA-to-MTA(порт 465(smtps) и порт 587(submission) используются для MUA-to-MTA соединений):
root@mailsrv:~# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.example.com ESMTP Postfix
helo example.com
250 mail.example.com
mail from: support@example.com
250 2.1.0 Ok
rcpt to: hostmaster@example.com
250 2.1.5 Ok
data
354 End data with.
subject: test message
it's test message from administrator
.
250 2.0.0 Ok: queued as 4E2B980068
quit
221 2.0.0 Bye
Connection closed by foreign host.
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.example.com ESMTP Postfix
helo example.com
250 mail.example.com
mail from: support@example.com
250 2.1.0 Ok
rcpt to: hostmaster@example.com
250 2.1.5 Ok
data
354 End data with
subject: test message
it's test message from administrator
.
250 2.0.0 Ok: queued as 4E2B980068
quit
221 2.0.0 Bye
Connection closed by foreign host.
Вот примерно такой вывод должен быть в консоли. При этом в ящик hostmaster@example.com будет доставлено письмо. Теперь проверим функционирование dovecot. Воспользуемся методом, описаным здесь
root@mailsrv:~# openssl s_client -connect localhost:993
..
Compression: 1 (zlib compression)
Start Time: 1370539278
Timeout : 300 (sec)
Verify return code: 18 (self signed certificate)
---
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.
a login example@example.com <password_for_example@example.com>
a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE QUOTA] Logged in
b list "" *
* LIST (\HasNoChildren \Archive) "." "Archive"
* LIST (\HasNoChildren \Trash) "." "Trash"
* LIST (\HasNoChildren \Junk) "." "Spam"
* LIST (\HasNoChildren \Sent) "." "Sent"
* LIST (\HasNoChildren \Drafts) "." "Drafts"
* LIST (\HasNoChildren) "." "INBOX"
b OK List completed.
c logout
* BYE Logging out
c OK Logout completed.
closed
..
Compression: 1 (zlib compression)
Start Time: 1370539278
Timeout : 300 (sec)
Verify return code: 18 (self signed certificate)
---
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN] Dovecot ready.
a login example@example.com <password_for_example@example.com>
a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE QUOTA] Logged in
b list "" *
* LIST (\HasNoChildren \Archive) "." "Archive"
* LIST (\HasNoChildren \Trash) "." "Trash"
* LIST (\HasNoChildren \Junk) "." "Spam"
* LIST (\HasNoChildren \Sent) "." "Sent"
* LIST (\HasNoChildren \Drafts) "." "Drafts"
* LIST (\HasNoChildren) "." "INBOX"
b OK List completed.
c logout
* BYE Logging out
c OK Logout completed.
closed
Такой вывод означает, что система функционирует исправно и ваш почтовый сервер готов к эксплуатации.
Hi,
ОтветитьУдалитьThank you for your page.
Recently I setup a homemade e-mail server and wrote a full detailed tutorial that you can find in
http://cosmolinux.no-ip.org/raconetlinux2/mail.html
using Debian Squeeze, Postfix, Dovecot, SASL, Spamassassin and Squirrel (and a Google account for SMTP relay).
I wish it is helpful to someone.
Настроил по Вашей статье, только в качестве LDAP у меня AD.
ОтветитьУдалитьЗаменил в запросах posixAccount на Person, плюс мне хотелось не использовать поле mail в AD для назначения ящиков пользователям, а использовать доменные имена пользователей.
В итоге запрос в /etc/postfix/ldap/virtual_mailbox_maps.cf имеет вид
(&(objectClass=Person)(sAMAccountName=%u)(!(userAccountControl=66050)))
в /etc/dovecot/dovecot-ldap.conf.ext
(&(ObjectClass=person)(sAMAccountName=%n))
При проверке smtp в логах выходит следующая ошибка:
/var/log/mail.log
Feb 19 04:51:47 new-mail postfix/qmgr[15328]: 35F6CA0472: from=, size=390, nrcpt=1 (queue active)
Feb 19 04:51:47 new-mail dspam[15624]: Got error 451 in response to RCPT TO: 451 4.3.0 Internal error occurred. Refer to server log for more information.#015
Feb 19 04:51:47 new-mail postfix/lmtp[18017]: 35F6CA0472: to=, relay=new-mail.domain.com[/var/run/dspam/postfix], delay=15223, delays=15223/0.01/0/0.05, dsn=4.3.0, status=deferred (host new-mail.domain.com[/var/run/dspam/postfix] said: 421 4.3.0 Deferred: 451 4.3.0 Internal error occurred. Refer to server log for more information. (in reply to end of DATA command))
/var/log/dovecot
Feb 19 15:51:47 auth: Error: ldap(user@domain.com): Connection appears to be hanging, reconnecting
Feb 19 15:51:47 auth: Error: ldap(user@domain.com): ldap_search(base=dc=domain,dc=com filter=(&(ObjectClass=person)(sAMAccountName=user))) failed: Operations error
Feb 19 15:51:47 auth: Error: ldap(user@domain.com): ldap_search(base=dc=domain,dc=com filter=(&(ObjectClass=person)(sAMAccountName=user))) failed: Operations error
Feb 19 15:51:47 lmtp(18019): Error: user user@domain.com: Auth USER lookup failed
Помогите разобраться в чём ошибка.
команда
ОтветитьУдалитьpostmap -q "example@company.com" ldap:/etc/postfix/ldap/virtual_mailbox_maps.cf
проходит?
попробуйте ещё /etc/dovecot/dovecot-ldap.conf.ext с такими настройками
hosts = ad_ip_address:389
ldap_version = 3
auth_bind = yes
dn = cn=authuser,dc=company,dc=com
tls = no
dnpass = passwd_of_vmail
base = dc=company,dc=com
scope = subtree
deref = never
user_filter = (&(userPrincipalName=%u)(objectClass=person))
pass_filter = (&(userPrincipalName=%u)(objectClass=person))
pass_attrs = userPassword=password
user_attrs =
postmap -q "example@company.com" ldap:/etc/postfix/ldap/virtual_mailbox_maps.cf
ОтветитьУдалитьexample@company.com
a login example@company.com blablabla
* OK Waiting for authentication process to respond..
a NO [UNAVAILABLE] Temporary authentication failure. [mail:2014-02-21 07:17:12]
В логе /var/log/dovecot
Feb 21 13:17:10 auth: Error: ldap(example@company.com): Connection appears to be hanging, reconnecting
Feb 21 13:17:10 auth: Error: ldap(example@company.com,127.0.0.1,): ldap_search(base=dc=company,dc=com filter=(&(ObjectClass=person)(sAMAccountName=example))) failed: Operations error
Feb 21 13:17:10 auth: Error: ldap(example@company.com): ldap_search(base=dc=company,dc=com filter=(&(ObjectClass=person)(sAMAccountName=example))) failed: Operations error
Feb 21 13:17:10 lmtp(19162): Error: user example@company.com: Auth USER lookup failed
^C
Читал другие статьи и там везде упоминается необходимость ввода сервера почты в домен с использованием kerberos и winbind.
Может проблема как раз в этом ?
покажите свой dovecot-ldap.conf.ext
Удалитьgrep -v "^#" /etc/dovecot/dovecot-ldap.conf.ext
Удалитьhosts = 1.2.3.4
dn = cn=authuser,ou-test,dc=company,dc=com
dnpass = secret
tls = no
auth_bind = yes
ldap_version = 3
base = dc=company,dc=com
deref = never
scope = subtree
user_attrs =
user_filter = (&(userPrincipalName=%u)(objectClass=person))
pass_attrs = userPassword=password
pass_filter = (&(userPrincipalName=%u)(objectClass=person))
Есть статья на вики довекота, рекомендую просмотреть
Удалитьhttp://wiki2.dovecot.org/AuthDatabase/LDAP
Плюс, попробуйте еще так поиграться параметрами:
hosts = ip:389
dn = auth_user@company.com
dn_pass = password
auth_bind = yes
auth_bind_userdn = %Lu
pass_filter = (userPrincipalName=%Lu)
user_filter = (userPrincipalName=%Lu)
Плюс поиграйтесь с аутентификацией на клиенте в виде user:pass, user@domain:pass
Могу посоветовать утилиту ldapadmin для подключения к серверу AD через ldap использую указанные в файле параметры http://www.ldapadmin.org
Заработало с такими параметрами.
Удалитьhosts = ip:3268
dn = cn=authuser,ou-test,dc=company,dc=com
auth_bind_userdn = %Lu
pass_filter = (userPrincipalName=%Lu)
user_filter = (userPrincipalName=%Lu)
Огромное спасибо за помощь !
Этот комментарий был удален автором.
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьК сожаление, с керберосом я не взаимодействовал, поэтому могу только дать ссылки на вики, где расписано, как настраивать.
УдалитьА можно ли к этой связке добавить roundcube webmail? и будут ли доменные пользователи также авторизовываться
ОтветитьУдалитьЕсли честно, то я не пробовал. Но уверен, что должно. Насколько я понимаю, веб морде всё равно какой метод аутентификации используется.
Удалитьа в вашем варианте как пользователь получает почту? через почтового клиента или по web
ОтветитьУдалитьВ моем случае почта работает через почтового клиента. Но веб интерфейс, по сути, тоже клиент.
УдалитьА каким образом создаются почтовые ящики? При первом входе пользователя?
ОтветитьУдалитьДа. За это отвечает опция
Удалитьlda_mailbox_autocreate = yes
При тестировании telnet mail.domain.ua 25 - происходит такая ошибка
ОтветитьУдалитьJul 17 02:45:56 mail postfix/lmtp[2897]: A8FCE140C14: to=, relay=none, delay=50, delays=50/0.01/0/0, dsn=4.4.1, status=deferred (connect to mail.domain.ua[/var/run/dspam/postfix]: No such file or directory)
подскажите пожалуйста - где накосячил?
какие у вас права на /var/run/dspam ?
Удалитькстати, а dspam у вас запущен?
УдалитьЗдравствуйте. Настраиваю по вашей статье, только на CentOS 6.6. В папке /var/run/dspam нет файла dovecot, только postfix и dspam.pid. Dovecot 2.2.10, установлен вручную(не из репо), также собран плагин dovecot-antispam. В чем может быть проблема?
ОтветитьУдалитьа dovecot сам запущен?
ОтветитьУдалитьDovecot как раз и не стартует из-за того, что файла нет.
ОтветитьУдалитьStarting Dovecot Imap: Error: bind(/var/run/dspam/dovecot) failed: Permission denied
Error: service(lmtp): net_listen_unix(/var/run/dspam/dovecot) failed: Permission denied
Fatal: Failed to start listeners [FAILED]
/var/run/dspam/dovecot - что с правами
ОтветитьУдалить# ls -al /var/run
Удалитьdrwxrwx---. 2 dspam mail 4096 Jul 13 13:00 dspam
dspam запущен? Что внутри /var/run/dspam ?
УдалитьСейчас запущены postfix и dspam, dovecot не стартует по ошибке выше.
УдалитьВ /var/run/dspam - файлы dspam.pid и postfix (время создания - перезапуск служб).
Кстати, еще один забавный факт: dspam.conf лежит просто в корне каталога /etc , нет каталога /etc/dspam и соответственно каталогов и файлов dspam.d , default.prefs , mysql.conf . Версия dspam 3.10.2 , установлен из репозитория EPEL.
Удалитьконфиги давай смотреть будем
ОтветитьУдалить/etc/dovecot/dovecot.conf :
Удалить# Protocols we want to be serving.
protocols = imap lmtp
#!include_try /usr/share/dovecot/protocols.d/*.protocol (такой папки нет в системе, поэтому указал вручную)
# A comma separated list of IPs or hosts where to listen in for connections..
# "*" listens in all IPv4 interfaces, "::" listens in all IPv6 interfaces.
# If you want to specify non-default ports or anything more complex,
# edit conf.d/master.conf.
listen = *, ::
# Greeting message for clients.
login_greeting = ODVN's Dovecot 2.2.10 ready.
# Most of the actual configuration gets included below. The filenames are
# first sorted by their ASCII value and parsed in that order. The 00-prefixes
# in filenames are intended to make it easier to understand the ordering.
!include conf.d/*.conf
# A config file can also tried to be included without giving an error if
# it's not found:
!include_try local.conf
10-master.conf :
Удалитьdefault_process_limit = 100
default_vsz_limit = 64M
service imap-login {
inet_listener imap {
port = 0
}
inet_listener imaps {
port = 993
address = *,::
ssl = yes
}
service_count = 1
process_min_avail = 5
}
service auth {
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
service lmtp {
unix_listener /var/run/dspam/dovecot {
group = dspam
mode = 0666
user = dspam
}
}
Эти пути существуют?
ОтветитьУдалить/var/spool/postfix/private/auth
/var/run/dspam/dovecot
address = *,:: - сделай address = *
А что у тебя логи пишут то вообще? Показывай
Как вариант, попробуй настроить на POP3 или IMAP (без ssl)
и в файле dovecot.conf закоментируй listen = *, :: на время
И снова здравствуйте. Заново настроил все по вашей статье, только теперь на Debian 7.8.
ОтветитьУдалитьВсе работает, только возникло пара вопросов:
когда из локалки настраиваю почтовый клиент (Thunderbird), он не подхватывает настройки для smtps. Находит настройки такие: входящая - IMAP, порт 993, шифрование SSL/TLS, обычный пароль; исходящая - SMTP, порт 25, без шифрования, обычный пароль.
Пробовал комментировать строку в master.cf , где smtp () - smtpd, то есть оставалась только секция с smtps. Не помогло.
В чем может быть косяк? Или так и должно быть?
Здравствуйте, настроил сервер воспользовавшись вашей статьёй, в логах вот такая ошибка:
ОтветитьУдалитьSep 16 15:00:55 post dspam[3244]: Unable to initialize storage driver
Sep 16 15:01:01 post postfix/master[2944]: terminating on signal 15
Sep 16 15:01:36 post dspam[2864]: dlopen() failed: /usr/lib/i386-linux-gnu/dspam/libmysql_drv.so: /usr/lib/i386-linux-gnu/dspam/libmysql_drv.so: cannot open shared object file: No such file or dir$
Sep 16 15:01:36 post dspam[2864]: Unable to initialize storage driver
Sep 16 15:01:37 post postfix/master[2944]: daemon started -- version 2.7.1, configuration /etc/postfix
Sep 16 15:01:37 post postfix/pickup[2953]: 388D540104: uid=0 from=
Sep 16 15:01:37 post postfix/cleanup[2964]: 388D540104: message-id=<20150916120137.388D540104@post.example.ru>
Sep 16 15:01:37 post postfix/qmgr[2954]: 388D540104: from=, size=495, nrcpt=1 (queue active)
Sep 16 15:01:37 post postfix/lmtp[2966]: 388D540104: to=, orig_to=, relay=none, delay=6.6, delays=6.6/0.04/0/0, dsn=4.4.1, status=deferred (connect to post.example.ru[/var/run$
Sep 16 15:02:13 post postfix/smtpd[3178]: fatal: unexpected command-line argument: smtps
Sep 16 15:02:14 post postfix/master[2944]: warning: process /usr/lib/postfix/smtpd pid 3178 exit status 1
Sep 16 15:02:14 post postfix/master[2944]: warning: /usr/lib/postfix/smtpd: bad command startup -- throttling
1)В каталоге /usr/lib/ отсутствует папка i386-linux-gnu
2)каталог /var/run/dspam пустой
3)telnet localhost 25 не открывается
подскажите пожалуйста как исправить ошибки
Этот комментарий был удален автором.
ОтветитьУдалитьвот так написано
ОтветитьУдалитьSep 16 15:01:37 post postfix/lmtp[3258]: 06448400FC: to=, orig_to=, relay=none, delay=2913, delays=2913/0.02/0/0, dsn=4.4.1, status=deferred (connect to post.example.ru[/var/run/dspam/postfix]: No such file or directory)
А вот эта папка существует /var/run/dspam/postfix ? Dspam установлен?
УдалитьОбратите внимание, dspam должен быть запущен!
УдалитьЭтот комментарий был удален автором.
УдалитьЭтот комментарий был удален автором.
Удалить