четверг, 6 июня 2013 г.

Postfix + Dovecot + Dspam + LDAP(AD) на Debian Wheezy

Рано или поздно в средних(а иногда и малых) организациях появляется потребность в собственном почтовом сервере. В данной статье мы рассмотрим один из множества вариантов реализации почтового сервера на линуксе для нужд таких организаций. Итак, поехали.


В качестве 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

Сгенерируем приватный ключ и сертификат для использования 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

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

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,
#разрешить, если клиент успешно прошёл аутентификацию
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,
#отклонять, если адрес получателя не соответствует FQDN
reject_non_fqdn_recipient,
#отклонять, если домен получателя не из списка обслуживаемых
reject_unknown_recipient_domain,
#отклонять, если получатель не существует
reject_unlisted_recipient,
#запретить открытую пересылку писем через наш сервер
reject_unauth_destination
smtpd_sender_restrictions = permit_mynetworks,
#отклонять, если имя отправителя не FQDN
reject_non_fqdn_sender,
#отклонять, если для имени домена отправителя не существует A или MX запись в DNS
reject_unknown_sender_domain,
#отклонять, если адрес отправителя не существует
reject_unlisted_sender
smtpd_data_restrictions = permit_mynetworks,
#отклонять множественную рассылку с пустым адресом отправителя
reject_multi_recipient_bounce
smtpd_client_restrictions = permit_mynetworks,
#отклонить почту от клиентов, посылающих SMTP команды раньше времени
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

Обратите внимание, chroot для lmtp должен быть отключен в master.cf:

lmtp   unix   -   -   n   -   -   lmtp

Создадим каталог /etc/postfix/ldap:

root@mailsrv:~# mkdir /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

Простой командой postmap проверим работоспособность virtual_mailbox_maps.cf:

root@mailsrv:~# postmap -q "example@example.com" ldap:/etc/postfix/ldap/virtual_mailbox_maps.cf
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

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

10-logging.conf:

#лог-файл сообщений об ошибках
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

10-master.conf:

#максимальное количество процессов
default_process_limit = 100
#размер выделяемой памяти на процесс
default_vsz_limit = 64M
service imap-login {
inet_listener imap {
#отключим imap, нам нужен только imaps
port = 0
}
inet_listener imaps {
port = 993
address = *, ::
ssl = yes
}
#ограничиваемся лимитом одно соединение - один процесс(максимум 100 ввиду default_process_limit)
service_count = 1
#минимальное число процессов, всегда ожидающих соединения
process_min_avail = 5
}
service 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
}
}

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

15-lda.conf:

#сообщать о временной ошибке при приёме почты при превышении квоты пользователем
quota_full_tempfail = yes
#автоматически создавать ящик, если таковой отсутствует
lda_mailbox_autocreate = yes

15-mailboxes.conf:

#указание папок, которые должны быть в почтовом ящике пользователя
#предполагается, что "namespace inbox" определён в 10-mail.conf(он определён по-умолчанию)
namespace inbox {
#имя папки
#Черновики
mailbox Drafts {
#специальный аттрибут в IMAP, который определяет тип папки
special_use = \Drafts
#автоматически создать и подписаться на папку
auto=subscribe
}
#Спам
mailbox Spam {
auto=subscribe
special_use = \Junk
}
#Корзина
mailbox Trash {
auto=subscribe
special_use = \Trash
}
#Отправленные
mailbox Sent {
auto=subscribe
special_use = \Sent
}
#Архив
mailbox Archive {
auto=subscribe
special_use = \Archive
}
}

20-imap.conf:

protocol imap {
#подключаем плагины квоты и антиспама
mail_plugins = $mail_plugins quota imap_quota antispam
}
protocol imaps {
#подключаем плагины квоты и антиспама
mail_plugins = $mail_plugins quota imap_quota antispam
}

20-lmtp.conf:

protocol lmtp {
#подключаем плагин квот для протокола
mail_plugins = $mail_plugins quota
}
}

90-plugin.conf:

#подключаем плагин antispam(подробности здесь)
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
}

90-quota.conf:

#подключаем плагин квот
plugin {
#квота применяется к ящику каждого пользователя
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
}
service 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
}

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

Создадим в /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%.

Пожалуйста удалите устаревшую(ненужную) почту!

и выставим ему права доступа:

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

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/

В файле /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

Теперь подключимся к 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

и заполнить её необходимыми таблицами:

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

Нам осталось раздать права на некоторые файлы для корректного функционирования системы:

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.

Вот примерно такой вывод должен быть в консоли. При этом в ящик 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

Такой вывод означает, что система функционирует исправно и ваш почтовый сервер готов к эксплуатации.

40 комментариев:

  1. 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.

    ОтветитьУдалить
  2. Настроил по Вашей статье, только в качестве 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

    Помогите разобраться в чём ошибка.

    ОтветитьУдалить
  3. команда
    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 =

    ОтветитьУдалить
  4. 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.
    Может проблема как раз в этом ?

    ОтветитьУдалить
    Ответы
    1. покажите свой dovecot-ldap.conf.ext

      Удалить
    2. 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))

      Удалить
    3. Есть статья на вики довекота, рекомендую просмотреть
      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

      Удалить
    4. Заработало с такими параметрами.

      hosts = ip:3268
      dn = cn=authuser,ou-test,dc=company,dc=com
      auth_bind_userdn = %Lu
      pass_filter = (userPrincipalName=%Lu)
      user_filter = (userPrincipalName=%Lu)

      Огромное спасибо за помощь !

      Удалить
  5. Этот комментарий был удален автором.

    ОтветитьУдалить
  6. Этот комментарий был удален автором.

    ОтветитьУдалить
    Ответы
    1. К сожаление, с керберосом я не взаимодействовал, поэтому могу только дать ссылки на вики, где расписано, как настраивать.

      Удалить
  7. А можно ли к этой связке добавить roundcube webmail? и будут ли доменные пользователи также авторизовываться

    ОтветитьУдалить
    Ответы
    1. Если честно, то я не пробовал. Но уверен, что должно. Насколько я понимаю, веб морде всё равно какой метод аутентификации используется.

      Удалить
  8. а в вашем варианте как пользователь получает почту? через почтового клиента или по web

    ОтветитьУдалить
    Ответы
    1. В моем случае почта работает через почтового клиента. Но веб интерфейс, по сути, тоже клиент.

      Удалить
  9. А каким образом создаются почтовые ящики? При первом входе пользователя?

    ОтветитьУдалить
    Ответы
    1. Да. За это отвечает опция
      lda_mailbox_autocreate = yes

      Удалить
  10. При тестировании 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)
    подскажите пожалуйста - где накосячил?

    ОтветитьУдалить
  11. Здравствуйте. Настраиваю по вашей статье, только на CentOS 6.6. В папке /var/run/dspam нет файла dovecot, только postfix и dspam.pid. Dovecot 2.2.10, установлен вручную(не из репо), также собран плагин dovecot-antispam. В чем может быть проблема?

    ОтветитьУдалить
  12. 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]

    ОтветитьУдалить
  13. /var/run/dspam/dovecot - что с правами

    ОтветитьУдалить
    Ответы
    1. # ls -al /var/run
      drwxrwx---. 2 dspam mail 4096 Jul 13 13:00 dspam

      Удалить
    2. dspam запущен? Что внутри /var/run/dspam ?

      Удалить
    3. Сейчас запущены postfix и dspam, dovecot не стартует по ошибке выше.
      В /var/run/dspam - файлы dspam.pid и postfix (время создания - перезапуск служб).

      Удалить
    4. Кстати, еще один забавный факт: dspam.conf лежит просто в корне каталога /etc , нет каталога /etc/dspam и соответственно каталогов и файлов dspam.d , default.prefs , mysql.conf . Версия dspam 3.10.2 , установлен из репозитория EPEL.

      Удалить
  14. конфиги давай смотреть будем

    ОтветитьУдалить
    Ответы
    1. /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

      Удалить
    2. 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
      }
      }

      Удалить
  15. Эти пути существуют?
    /var/spool/postfix/private/auth
    /var/run/dspam/dovecot

    address = *,:: - сделай address = *

    А что у тебя логи пишут то вообще? Показывай

    Как вариант, попробуй настроить на POP3 или IMAP (без ssl)

    и в файле dovecot.conf закоментируй listen = *, :: на время

    ОтветитьУдалить
  16. И снова здравствуйте. Заново настроил все по вашей статье, только теперь на Debian 7.8.
    Все работает, только возникло пара вопросов:
    когда из локалки настраиваю почтовый клиент (Thunderbird), он не подхватывает настройки для smtps. Находит настройки такие: входящая - IMAP, порт 993, шифрование SSL/TLS, обычный пароль; исходящая - SMTP, порт 25, без шифрования, обычный пароль.
    Пробовал комментировать строку в master.cf , где smtp () - smtpd, то есть оставалась только секция с smtps. Не помогло.
    В чем может быть косяк? Или так и должно быть?

    ОтветитьУдалить
  17. Здравствуйте, настроил сервер воспользовавшись вашей статьёй, в логах вот такая ошибка:

    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 не открывается

    подскажите пожалуйста как исправить ошибки

    ОтветитьУдалить
  18. Этот комментарий был удален автором.

    ОтветитьУдалить
  19. вот так написано
    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)

    ОтветитьУдалить
    Ответы
    1. А вот эта папка существует /var/run/dspam/postfix ? Dspam установлен?

      Удалить
    2. Обратите внимание, dspam должен быть запущен!

      Удалить
    3. Этот комментарий был удален автором.

      Удалить
    4. Этот комментарий был удален автором.

      Удалить