Ниже приводится инструкция для настройки почтовой системы в следующей связке:
Postfix + Dovecot + SpamAssassin + ClamAV + PostGrey + TLS + MySQL + LDAP
Подробные версии пакетов:
- postfix-2.9.3,1
dovecot-1.2.17 (+ dovecot-sieve + dovecot-lda + dovecot-sasl)
clamav-0.97.5_1
clamsmtp-1.10_3
p5-Mail-SpamAssassin-3.3.2_6 (+ DCC + Pyzor + Razor)
mysql-server-4.1.25
postgrey-1.34_4
openssl-1.0.1_4
openldap-sasl-server-2.4.31
Документация про каждую софтину будет приводится по ходу статьи. В конце статьи будут указаны полезные источники.
Перед началом
Перед началом настройки примем следующие данные за основу. Эти данные будут меняться в зависимости от своей среды (имя домена, ip-адрес внутренний, ip-адрес внешний, имя хоста):
- Локальный ip-адрес: 192.168.0.90
Имя домена: mydomain.com
Имя хоста (с именем домена): mail.mydomain.com
Описание установки будет приведено с полным содержанием конфигурационных файлов, описанием всех опций в каждом конфигурационном файле и также с описанием всех действий.
Также надо отметить, что стандартные комментарии во всех конфигурационных файлах удалены и оставлены лишь параметры для настройки. Также удалены ненужные строки из конфигурационных файлов и оставлены лишь те строки, которые дают требуемый функционал. При этом, каждый параметр (или группа параметров) прокомментированы – зачем нужен тот или иной параметр и что он регулирует.
Также, по настройке конфигурационных файлов будут приводиться ссылки на маны или другую документацию.
Порядок установки и настройки ПО в данном руководстве обеспечит установку правильных пакетов сразу же, что избавит от необходимости потом что-либо переустанавливать, править зависимости и т.д.
Установка LDAP-server
Почему LDAP?
1. Вся адресная книга может храниться в LDAP. Это позволяет контакты всей организации в одном месте и подключаться к ней с любого компьютера. При этом можно не бояться, что система на клиенте «полетит» и все контакты будут утеряны.
2. При этом можно проводить репликацию между LDAP-серверами, что предоставляет прекрасную отказоустойчивость и безопасность.
3. Ldap-сервер легко масштабируем, прост в администрировании и настройке.
Итак, поехали: установка.
Код: Выделить всё
# cd /usr/ports/net/openldap24-server
# make config
- BDB
DYNAMIC_BACKENDS
SEQMOD
SYNCPROV
TCP_WRAPPERS
Код: Выделить всё
# make install clean
Код: Выделить всё
************************************************************
The OpenLDAP server package has been successfully installed.
In order to run the LDAP server, you need to edit
/usr/local/etc/openldap/slapd.conf
to suit your needs and add the following lines to /etc/rc.conf:
slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"'
slapd_sockets="/var/run/openldap/ldapi"
Then start the server with
/usr/local/etc/rc.d/slapd start
or reboot.
Try `man slapd' and the online manual at
http://www.OpenLDAP.org/doc/
for more information.
slapd runs under a non-privileged user id (by default `ldap'),
see /usr/local/etc/rc.d/slapd for more information.
************************************************************
Требуемые нам файлы конфигурации находятся в трех папках:
- /etc/rc.conf
/usr/local/etc/openldap/slapd.conf
/usr/local/etc/openldap/ldap.conf
Требуемые маны по настройке:
Код: Выделить всё
# man ldap.conf
# man slapd.conf
Начнем с rc.conf. Добавим в него следующие строки:
Код: Выделить всё
slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://localhost/ ldap://192.168.0.90/"'
Код: Выделить всё
#Корень сервера
BASE dc=mydomain,dc=com
#адрес, куда подключаться нашему серверу. Можно указывать в виде имени
URI ldap://127.0.0.1/
Код: Выделить всё
# man ldap.conf
Код: Выделить всё
#Тут идут подключения различных схем. Последняя схема качается отсюда
#(http://www.lissyara.su/articles/freebsd/mail/postfix+dovecot+spamassasin+clamav+ldap+mysql/).
# Там же будут лежать файлы для заполнения БД данными
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/misc.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/openldap.schema
include /usr/local/etc/openldap/schema/postfix.schema
#Уровень логирования
loglevel 256
#максимальное количество сообщений, возвращаемых при поиске
sizelimit 500
#Количество секунд, в течение которых сервер будет пытаться обработать запрос
timelimit 3600
#Через сколько секунд сбрасывать зависшее соединение
idletimeout 5
#Различные файлики
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
modulepath /usr/local/libexec/openldap
logifile /var/log/openldap/slapd.log
#Модуль какой БД загружать
moduleload back_bdb
#Сразу на будущее настраиваем права доступа к разделам наших контейнеров
access to *
by self write
by users read
by anonymous auth
access to dn.children="ou=accounts,dc=mydomain,dc=com"
by dn="cn=vmail,ou=accounts,dc=mydomain,dc=com" read
by anonymous auth
#Как хранить пароли в базе
password-hash {CLEARTEXT}
#БД для хранения
database bdb
#Суффикс для базы
suffix "dc=mydomain,dc=com"
#рутовая запись для ldap-сервера. Это главный юзер, наш админ
rootdn "cn=test,dc=mydomain,dc=com"
#Пароль в хеше
rootpw {MD5}I8FDgI7m39sARCwYJMawkQ==
#Где хранить данные?
directory /var/db/ldapdatabase
#Как индексировать данные?
index objectClass eq
Для перенастройки нам надо добавить следующую строку в syslog.conf (не забываем предварительно создать директорию openldap в /var/log):
Код: Выделить всё
local4.* /var/log/openldap/slapd.log
Код: Выделить всё
#/etc/rc.d/syslogd restart
Примечание: Пароль для rootpw можно сгенерировать при помощи следующей команды:
Код: Выделить всё
# slappasswd -h {MD5}
New password:
Re-enter new password:
{MD5}CY9rzUYh03PK3k6DJie09g==
После этого запустим наш сервер LDAP:
Код: Выделить всё
# /usr/local/etc/rc.d/slapd start
Проверяем, запустился ли наш сервер (должны получить что то такое):
Код: Выделить всё
#ps –axuw | grep slap
ldap 79143 0.0 0.8 406560 16660 ?? Ss Thu11AM 0:09.44 /usr/local/libexec/slapd -h ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://localhost
Создадим в системе группу и пользователя vmail - через этого юзера мы будем подключаться к LDAP для считывания информации об аккаунтах.
Код: Выделить всё
# pw add group vmail
# pw adduser vmail -g vmail -d /nonexistent -c "Virtual Mail Accounts" -s /sbin/nologin
# passwd vmail
Код: Выделить всё
dn: dc=mydomain,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: mydomain.com
description: My Organization
businessCategory: Form of Organization
telephoneNumber: 111111
facsimileTelephoneNumber: 111112
street: Some Street 69
o: Test
dn: ou=accounts, dc=mydomain,dc=com
objectClass: top
objectClass: organizationalUnit
ou: accounts
dn: cn=vmail,ou=accounts, dc=mydomain,dc=com
objectClass: top
objectClass: person
cn: vmail
sn: vmail
dn: vdo=vDomain,ou=accounts, dc=mydomain,dc=com
objectClass: TopPostfix
vdo: vDomain
dn: vuo=vUsers,ou=accounts,dc=mydomain,dc=com
objectClass: TopPostfix
vuo: vUsers
dn: vruo=vRRU,ou=accounts,dc=mydomain,dc=com
objectClass: TopPostfix
vruo: vRRU
dn: vao=vAlias,ou=accounts,dc=mydomain,dc=com
objectClass: TopPostfix
vao: vAlias
dn: vto=vTransport,ou=accounts,dc=mydomain,dc=com
objectClass: TopPostfix
vto: vTransport
Код: Выделить всё
# ldapadd -x -W -D "cn=test,dc=mydomain,dc=com" -f /ГдеТамВашФайлик/имяФайла.ldif
Создадим где-нибудь файлик virtual-users.ldif и сделаем его следующего содержания:
Код: Выделить всё
dn: cn=test,vuo=vUsers,ou=accounts,dc=mydomain,dc=com
objectClass: top
objectClass: posixAccount
objectClass: VUPostfix
objectClass: person
objectClass: inetOrgPerson
sn: test
cn: test
initials: test
mail: test@mydomain.ru
o:TEST
description: Test Users
homeDirectory: mydomain.ru/test/
vuQuota: 1048576
vuActive: 1
vuAuth: 1
vuUserrealm: mail.mydomain.com
uidNumber: 1004
gidNumber: 1002
uid:test
• homeDirectory – указано относительное местоположение домашней директории. Это нормально. В дальнейшем, когда мы будем настраивать pop3 и smtp сервер, мы поймем, почему тут указывали именно так.
• uidNumber – uid пользователя vmail. Доступ к почте имеет этот пользователь
• gidNumber – gid группы vmail.
Эти параметры надо указывать исходя из настроек своей среды.
Добавим информацию в БД LDAP:
Код: Выделить всё
# ldapadd -x -W -D "cn=test,dc=mydomain,dc=com " -f virtual-users.ldif
Код: Выделить всё
# ldappasswd -W -S -D "cn=test,dc=mydomain,dc=com" "cn=vmail,ou=accounts,dc=mydomain,dc=com"
# ldappasswd -W -S -D "cn=test,dc=mydomain,dc=com" "cn=test,vuo=vUsers ,ou=accounts,dc=mydomain,dc=com "
Предположим, что наш сервер обслуживает 2 домена – mydomain.com и mydomain-second.com.
Создаем где-нибудь файлик virtual-domain.ldif следующего содержания:
Код: Выделить всё
dn: vd=mydomain.com,vdo=vDomain,ou=accounts,dc=mydomain,dc=com
objectclass: VDPostfix
vdName: mydomain.com
vdStatus: 1
vdDescription: Primary Domain
vdClasses: MyUserSender
vd: mydomain.com
dn: vd=mydomain-second.com,vdo=vDomain,ou=accounts,dc=mydomain,dc=com
objectClass: VDPostfix
vdName: mydomain-second.com
vdStatus: 1
vdDescription: Secondary Domain
vdClasses: MyUserSender
vd: mydomain-second.com
Код: Выделить всё
# ldapadd -x -W -D "cn=test,dc=mydomain,dc=com " -f virtual-domain.ldif
Все модификация и добавления данных в базу производились в соответствии со схемой postfix.schema.
Вы можете просмотреть её или даже изменить по своему усмотрению и/или нуждам.
Теперь проведем установку postfix только для того, чтобы создать необходимые директории, которые нам понадобятся для дальнейшей настройки. Полная настройка Postfix будет производиться ниже по ходу статьи.
Единственное, что не забудьте создать домашний каталог виртуального пользователя (в данном случае в /usr/home/) и дать права на эту директорию пользователю vmail и группе vmail:
Код: Выделить всё
# cd /usr/home
# mkdir virtualmail
# cd virtualmail
# mkdir mydomain.com
# mkdir mydomain-second.com
# cd /usr/home/
# chown –R vmail:vmail virtualmail/
Код: Выделить всё
Установка SSL и Postfix (только установка)
Установим OpenSSL из портов, хотя после установки FreeBSD в системе уже есть установленный стандартный OpenSSL. Мне всегда как то спокойнее устанавливать версию из портов, предварительно обновив их.
Код: Выделить всё
# cd /usr/ports/security/openssl
# make config
- Shared
Threads
SSE2
ASM
ZLIB
SCTP
MD2
Код: Выделить всё
# make install clean
Код: Выделить всё
OpenSSL shared libraries have been installed in:
/usr/local
..................
Здесь много текста про shared libraries, маны к ним, про ldd и т.д.
..................
Copy /usr/local/openssl/openssl.cnf.sample to /usr/local/openssl/openssl.cnf
and edit it to fit your needs.
..................
Снова текст в стиле блаблабла
..................
For more information, and contact details about the security
status of this software, see the following webpage:
http://www.openssl.org/
Это нам понадобиться чуть позже.
Установка завершена. Переходим к настройке, - проведем подготовку перед началом создания сертификатов для POP3- и SMTP-серверов.
Сначала добавим информацию об SSL в make.conf, чтобы каждое новое приложение собиралось с поддержкой OpenSSL:
Код: Выделить всё
# echo "WITH_OPENSSL_PORT=YES" >> /etc/make.conf
- /etc/ssl
/usr/local/openssl/
- /usr/local/openssl/openssl.cnf.sample - это файл конфигурации OpenSSL, установленного из портов.
/etc/ssl/openssl.cnf.old - это файл конфигурации стандартного OpenSSL, идущего вместе с установленной системой
Код: Выделить всё
# mv /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf.old
# cd /usr/local/openssl
# mv openssl.cnf.sample openssl.cnf
Теперь, при установке других сервисов у нас в системе уже будет OpenSSL, что позволит нам с легкостью создавать сертификаты и подключать их.
Теперь установим SMTP-сервер Postfix.
Установка и настройка Postfix
Устанавливаем PostFix из портов:
Код: Выделить всё
# cd /usr/ports/mail/postfix
# make config
- PCRE
SASL2
DOVECOT
TLS
OPENLDAP
TEST
SPF
- KQUEUE
SSL
LDAP
Код: Выделить всё
Warning: you still need to edit myorigin/mydestination/mynetworks
parameter settings in /usr/local/etc/postfix/main.cf.
See also http://www.postfix.org/STANDARD_CONFIGURATION_README.html
for information about dialup sites or about sites inside a
firewalled network.
BTW: Check your /etc/aliases file and be sure to set up aliases
that send mail for root and postmaster to a real person, then
run /usr/local/bin/newaliases.
install -o root -g wheel -m 555 /usr/ports/mail/postfix/work/postfix-2.9.4/auxiliary/rmail/rmail /usr/local/bin/rmail
install -o root -g wheel -m 555 /usr/ports/mail/postfix/work/postfix-2.9.4/auxiliary/qshape/qshape.pl /usr/local/bin/qshape
install -o root -g wheel -m 444 /usr/ports/mail/postfix/work/postfix-2.9.4/man/man1/qshape.1 /usr/local/man/man1
===> Installing rc.d startup script(s)
Would you like to activate Postfix in /etc/mail/mailer.conf [n]? y
Код: Выделить всё
To enable postfix startup script please add postfix_enable="YES" in
your rc.conf
If you not need sendmail anymore, please add in your rc.conf:
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
And you can disable some sendmail specific daily maintenance routines in your
/etc/periodic.conf file:
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"
Код: Выделить всё
# ee /etc/rc.conf
Код: Выделить всё
postfix_enable="YES"
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"
Установка и настройка Dovecot (POP3-сервера Dovecot с Sieve, LDA и SASL)
"Dovecot — свободный IMAP- и POP3-сервер, разрабатываемый в расчёте на безопасность. Особенности сервера Поддержка форматов почтовых ящиков mbox и Maildir, высокое быстродействие благодаря индексации содержимого ящиков. Честно говоря я очень доволен этой прогой!"(с)
Dovecot уже будет установлен в системе, потому что при установке postfix’a мы выбирали опции для dovecot и устанавливали его.
Вы можете проверить, установлен ли postfix набрав следующую команду:
Код: Выделить всё
# pkg_version -v | grep dovecot
dovecot-1.2.17 = up-to-date with port
После завершения установки в папке /usr/local/etc/ появятся следующие конфигурационные файлы:
- dovecot.conf - основной файл конфигурации нашего POP3-сервера
dovecot-ldap.conf - файл для настройки работы с LDAP.
Кроме того, в папке /usr/local/share/examples/dovecot/ Вы сможете найти примеры настройки и описание тех же конфигурационных файлов.
Сначала нам необходимо добавить информацию о dovecot в файл автозагрузки (пусть стартует сразу при загрузке системы):
Код: Выделить всё
# ee /etc/rc.conf
Код: Выделить всё
dovecot_enable="YES"
Код: Выделить всё
#Базовая директория, где хранятся .pid-файлы, файлы авторизации и другие необходимые для #работы сервера данные
base_dir = /var/run/dovecot/
#Какие протоколы мы будем использовать
protocols = pop3s
#Разрешить или запретить авторизацию plain
disable_plaintext_auth = no
#Отключать ли клиентские IMAP-, POP3-соединения при выключении dovecot. Если эта опция #установлена в “no”, То можно проводить апгрейд dovecot без принудительного отключения #клиентов
shutdown_clients = yes
#Логи, пути и их стиль
log_path = /var/log/dovecot/dovecot-main.log
info_log_path = /var/log/dovecot/dovecot-debug.log
log_timestamp = "%b %d %H:%M:%S "
#Настройки SSL
ssl = yes
ssl_cert_file = /etc/ssl/mail.mydomain.com-dovecot-cert.pem
ssl_key_file = /etc/ssl/mail.mydomain.com-dovecot-unen-key.pem
ssl_ca_file = /etc/ssl/mydomain.com-dovecot-CAcert.pem
verbose_ssl = yes
#Директория для авторизации. Тут создаются сокеты при авторазации.
login_dir = /var/run/dovecot/login
#Так как у нас используется отдельный пользователь для проведения логина (а не рутовый), то #ставим эту опцию в yes.
login_chroot = yes
#Пользователь, под которым запускается процесс логина.
login_user = dovecot
#Максимальный объем процесса логина
login_process_size = 64
#Создавать на каждый логин-соединение отдельный процесс. При использовании TLS опция “yes” #является предпочтительной
login_process_per_connection = yes
#Количество логин-процессов для прослушивания новых соединений
login_max_processes_count = 35
#Приветствие сервера
login_greeting = You want some mail, do you?
#Как вести логирование процесса логина
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s
#Где находятся почтовые каталоги. Эта настройка определяется значениями из файла dovecot-#ldap.conf.
mail_location = maildir:%h
#Пользователь и группа, которые имеют доступ к почте. Через этого пользователя будет #производиться получение почты. Т.е. пользователь vmail и группа vmail должна иметь доступ к #почтовым каталогам
mail_uid = vmail
mail_gid = vmail
#Группа, которая периодически используется для привилигированных операций. Как правило тут #стоит группа mail, для доступа к каталогу /var/mail.
mail_privileged_group = vmail
#разрешать ли пользователям полным доступ к почтовым каталогам
mail_full_filesystem_access = no
#Опция для отладки
mail_debug = yes
#Как логировать отладку
mail_log_prefix = "%Us(%u): "
#Использовать дотлокинг
dotlock_use_excl = yes
#Подробный вывод процессов использования сервара. Выводит имя пользователя и ip-адресс.
verbose_proctitle = yes
#Валидные uid/gid для пользователей. Это устанавливается для того, чтобы обезопасить себя от #того, что никто не сможет залогиниться, как демон.
first_valid_uid = 1004
last_valid_uid = 1004
first_valid_gid = 1002
last_valid_gid = 1002
#Максимальное количество подключений. Когда достигается указанный лимит, новые #пользователи не имеют возможности подключиться к системе.
max_mail_processes = 115
#Сохранять почту при помощи LF, а не с использованием CR+LF. Эта опция ускоряет работу #сервера.
mail_save_crlf = no
#При копировании сообщения сохранять жесткие ссылки. Это также оказывает хорошее влияние #на производительность
maildir_copy_with_hardlinks = yes
#Настройка протокола pop3. По сути небольшие настройки для корректных отображения писем в #почтовых клиентах конечных пользователей.
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
#Настройки для локального доставщика. Вызов локального доставщика производится на стороне #SMTP-сервера, котгда тот принял письмо и думает, кому его отдать, чтобы положить в нужное #место. Этот вызов мы настроим, когда дойдем до конфигурирование Postfix’a.
protocol lda {
#Адрес, куда пересылать различную информацию, например сообщения о работе сервера или #отчеты о проблемных письмах
postmaster_address = it
#Имя хоста
hostname = mail.mydomain.com
#Сокет для авторизации
auth_socket_path = /var/run/dovecot/auth-master
#Как вести логирование для локального доставщика
deliver_log_format = mail from %f: %$
#Какой плагин использовать для локального доставщика
mail_plugins = sieve
mail_plugin_dir = /usr/local/lib/dovecot/lda
#Путь к отправке
sendmail_path = /usr/local/sbin/sendmail
#Автоматически ответы об отвержении писем
rejection_subject = Rejected: %s
rejection_reason = Your message to <%t> was automatically rejected:%n%r
#Пути лог-файлов
log_path = /var/log/dovecot/deliver-error.log
info_log_path = /var/log/dovecot/deliver-info.log
}
#Время жизни кешированной сессии для авторизации. Залогинившись первый раз, информация #об авторизации будет храниться это время.
auth_cache_ttl = 3500
#Как проводить авторизацию. Нужен нижний регистр (L) и имя пользователя (u) с доменным #именем
auth_username_format = %Lu
#Подробности авторизации
auth_verbose = yes
#Вести отладку авторизации
auth_debug = yes
#Настройки для авторизации
auth default {
#Поддерживаемые механизмы авторизации
mechanisms = plain login digest-md5 cram-md5
#База, в которой хранятся данные о паролях
passdb ldap {
args = /usr/local/etc/dovecot-ldap.conf
}
#База, в которой хранятся данные о пользователях.
userdb ldap {
args = /usr/local/etc/dovecot-ldap.conf
}
#Пользователь, который выполняет контроль авторизации. Он получает пароли и имена #пользователей.
user = dovecot-auth
#Настройки мастер-сокета. Месторасположение, права и пользователь/группа, имеющие право #доступа. Этот блок используется для «пускания» пользователей на сервер для получения почты.
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
group = vmail
}
#Настройки клиент-сокета. Месторасположение, права и пользователь/группа, имеющие право #доступа. Этот блок используется для работы SASL.
client {
#Запомните этот путь. Он будет использован в дальнейшем для Postfix при настройке SASL-#авторизации через dovecot.
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
#Где искать наш плагин
plugin {
#Запомните название файла, оно потребуется ниже
sieve_before=/usr/local/lib/dovecot/lda/before.sieve
}
Код: Выделить всё
# pw adduser dovecot-auth –g mail –d /nonexistent –c “dovecot-auth” –s /sbin/nologin
Настройка sieve.
В соответствии с конфигурацией
Установим сам фильтр:
Код: Выделить всё
# cd /usr/ports/mail/dovecot-sieve/
# make install clean
Переходим в каталог /usr/local/lib/dovecot/lda/. Создаем файл before.sieve. В него пишем:
Код: Выделить всё
require "fileinto";
if anyof (header :contains "Subject" "SPAM")
{
fileinto "spam";
}
else
{
keep;
}
Код: Выделить всё
# sievec /usr/local/lib/dovecot/lda/before.sieve
Кусок настроенного конф. файла dovecot.conf включает поддержку SASL-аутентификации (см. ниже). Дальнейшие необходимые настройки уже будут проводиться на стороне Postfix’a.
Код: Выделить всё
…
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
Подключение к LDAP
Приведем dovecot-ldap.conf к следующему виду:
Код: Выделить всё
hosts = localhost
dn = cn=vmail,ou=accounts,dc=mydomain,dc=com
dnpass = ThisIsMyPassword
ldap_version = 3
base = ou=accounts, dc=mydomain,dc=com
deref = never
scope = subtree
user_attrs = homeDirectory=home=/usr/home/virtualmail/%$,uidNumber=uid,gidNumber=gid
user_filter = (&(objectClass=posixAccount)(mail=%u))
pass_attrs = mail=user,userPassword=password
pass_filter = (&(objectClass=posixAccount)(mail=%u))
default_pass_scheme = PLAIN
Сгенерируем сертификаты для SMTP- и POP3-сервера.
Для SMTP
Подготовим перловский скрипт, который будем использовать. В качестве рабочей папки будем использовать папку certs:
Код: Выделить всё
# cd /usr/local/openssl
# mkdir certs
# cp misc/CA.pl certs/
# sed -I .old 's/365/1095/' openssl.cnf
Код: Выделить всё
# cd /usr/local/openssl/certs
# export OPENSSL=/usr/local/bin/openssl #данная команда актуальна для BASH'a. Для других оболочек может использоваться SETENV
# ./CA.pl -newca
Теперь создаем запрос на сертификат:
Код: Выделить всё
# ./CA.pl -newreq
Также можно указать значение как *.example.com.
Теперь из этого запроса создаем сертификат:
Код: Выделить всё
# ./CA.pl -signreq
Сделаем копии этих файлов и потом воспользуемся ими для настройки Postfix'а (далее укажем их в конфиге). Копировать будем в каталог postfix'a - /usr/local/etc/postfix/ssl – там необходимо создать эту папку ssl перед продолжением.
Код: Выделить всё
# cp newcert.pem /usr/local/etc/postfix/ssl/mail.mydomain.com-cert.pem
# cp newkey.pem /usr/local/etc/postfix/ssl/mail.mydomain.com-encrypted-key.pem
# cp demoCA/cacert.pem /usr/local/etc/postfix/ssl/mydomain.com-CAcert.pem
# cp demoCA/private/cakey.pem /usr/local/etc/postfix/ssl/mydomain.com-encrypted-CAkey.pem
Код: Выделить всё
# openssl rsa -in mail.mydomain.com-encrypted-key.pem -out mail.mydomain.com-unencrypted-key.pem
Код: Выделить всё
# openssl x509 -in mydomain.com-CAcert.pem -inform PEM –out mydomain.com-CAcert.cer -outform DER
Код: Выделить всё
# chmod 644 /usr/local/etc/postfix/ssl/mydomain.com-cert.pem /usr/local/etc/postfix/ssl/mydomain.com-CAcert.pem
# chmod 400 /usr/local/etc/postfix/ssl/mail.mydomain.com-unencrypted-key.pem
Покомандно:
Код: Выделить всё
# cd /usr/local/openssl
# mkdir certs
Код: Выделить всё
# cp misc/CA.pl certs/
# sed -I .old 's/365/1095/' openssl.cnf
Иии, поехали - запускаем создание СА:
Код: Выделить всё
# cd /usr/local/openssl/certs
# export OPENSSL=/usr/local/bin/openssl
Код: Выделить всё
# ./CA.pl –newca
Теперь создаем запрос:
Код: Выделить всё
# ./CA.pl –newreq
Теперь подписываем:
Код: Выделить всё
# ./CA.pl –signreq
Код: Выделить всё
# cp newcert.pem /etc/ssl/mail.mydomain.com-dovecot-cert.pem
# cp newkey.pem /etc/ssl/mail.mydomain.com-dovecot-en-key.pem
# cp demoCA/cacert.pem /etc/ssl/mydomain.com-dovecot-CAcert.pem
# cp demoCA/private/cakey.pem /etc/ssl/mydomain.com-encrypted-CAkey.pem
Код: Выделить всё
# openssl rsa -in mail.mydomain.com-dovecot-en-key.pem -out mail.mydomain.com-dovecot-unen-key.pem
Итак, после генерации сертификата (переделываем его в расширение cer - виндовое расширение - и делаем в формате DER - также для виндов), надо будет его передать на машины под управление Windows и установить:
Код: Выделить всё
# openssl x509 -in mydomain.com-dovecot-CAcert.pem -inform PEM -out mydomain.com-dovecot-CAcert.cer -outform DER
Код: Выделить всё
# chmod 644 /etc/ssl/mail.mydomain.com-dovecot-cert.pem /etc/ssl/mydomain.com-dovecot-CAcert.pem
# chmod 400 /etc/ssl/mail.mydomain.com-dovecot-unen-key.pem
Код: Выделить всё
# cd /var/log
# mkdir dovecot
# cd dovecot
# touch dovecot-main.log
# touch dovecot-debug.log
# touch deliver-error.log
# touch deliver-info.log
# /usr/local/etc/rc.d/dovecot start
Starting dovecot.
# ps -axuw | grep dovecot
root 35587 46.0 0.7 13656 3488 ?? R 5:53PM 0:06.24 ssl-build-param /var/db/dovecot/ssl-parameters.dat
root 35586 0.0 0.7 13652 3480 ?? Ss 5:53PM 0:00.01 /usr/local/sbin/dovecot -c /usr/local/etc/dovecot.conf
dovecot-auth 35588 0.0 0.8 13836 3836 ?? S 5:53PM 0:00.01 dovecot-auth
dovecot 35589 0.0 0.9 13732 4392 ?? S 5:53PM 0:00.01 pop3-login
dovecot 35590 0.0 0.9 13732 4392 ?? S 5:53PM 0:00.01 pop3-login
dovecot 35591 0.0 0.9 13732 4392 ?? S 5:53PM 0:00.01 pop3-login
root 35593 0.0 0.3 9748 1276 0 S+ 5:53PM 0:00.00 grep dovecot
Сейчас у нас есть:
1. Настроенный LDAP-сервер, в котором есть необходимые данные для работы нашего домена. Он настроен и работает в полноценном режиме.
2. У нас есть POP3s-сервер. Соединение с этим сервером шифруется при помощи TLS-сертификата, который мы создали при помощи OpenSSL, который также установили из портов.
3. У нас есть УСТАНОВЛЕННЫЙ, но не настроенный SMTP-сервер – Postfix. Также для него у нас уже созданы сертификаты TLS, а также подготовлена SASL-аутентификация через dovecot.
Также в косвенной степени для него мы подготовили правило для доставщика писем, которое будет обрабатываться после того, как Postfix получит письмо, отдаст его SA на проверку не спам ли это.
Сейчас мы установим все фильтры, которые будут использоваться в нашей системе – ClamAV, ClamSMTP, SpamAssassin (а к нему Razor-Agents, Pyzor + все это в MySQL) и Grey-listing.
После того, как у нас будут установлены все фильтры и будут составлены конфигурационные файлы под них, - мы их подключим к Postfix.
Также я сразу же приведу конечный конфиг Postfix’a. После этого мы все это запустим и протестируем.
Фильтры
ClamAV
Начнем с установки ClamAV. Идем в нужный нам порт:
Код: Выделить всё
# cd /usr/ports/security/clamav
# make config
- ARC
ARJ
LHA
LLVM
TESTS
UNRAR
UNZOO
Код: Выделить всё
# make install clean
Код: Выделить всё
# cd /etc/ && ee rc.conf
Код: Выделить всё
clamav_clamd_enable="YES" #Собственно, сам антивирус
clamav_freshclam_enable="YES" #Софтина для обновления антивирусных баз
Необходимая информация, в общем то, находится в мане:
Код: Выделить всё
# man clamd.conf
Приведем его к следующему виду:
Код: Выделить всё
#Лог-файл, где его хранить. Не забудем потом создать соответствующую папку в нежном месте
LogFile /var/log/clamav/clamd.log
#Отключает системный блок, которые не даст ClamAV запускатьтся несколько раз с одним и тем #же конфигом.
LogFileUnlock no
#Отключаем ограничение на максимальный размер лог-файла.
LogFileMaxSize 0
#Логировать время записей
LogTime yes
#Вести логирование «чистых» файлов, не содержащих вырусы
LogClean yes
#Вести ли логирование через сислог?
LogSyslog no
#Подробное логирование
LogVerbose yes
#Где наш pid-файл (файлы, отображающий идентификатор процесса clamd)
PidFile /var/run/clamav/clamd.pid
#Временная директория. Туда складыватются файлы для проверки
TemporaryDirectory /var/tmp
#БД откуда брать инфу о вирусах
DatabaseDirectory /var/db/clamav
#Локальный сокет, для прослушивания «демоном». Через этот сокет будет осуществляться связь с #clamsmtpd (см. настройку ниже).
LocalSocket /var/run/clamav/clamd.sock
#Права на сокет
LocalSocketMode 660
#Удалять ли зависший сокет после неудачного завершения раобты
FixStaleSocket yes
#Максимальная очередь подключений
MaxConnectionQueueLength 100
#Эта опция необходима, если проверка ведется по удаленному протоколу. Т.е. другая машина #передает файл на проверку на эту машину. Эта опция регулирует максимальный разрем такой #передачи
StreamMaxLength 10M
#Максимальное количество потоков, запускаемых одновременно
MaxThreads 30
#Таймаут на ожидание данных от сокета
ReadTimeout 150
#Таймаут, после которого антивирус сбрасывает соединение, если от клиента не поступает #никаких дальнейших команд
CommandReadTimeout 5
#Максимальная очередь проверки
MaxQueue 100
#Максимальная рекурсия директорий. Внутри проверяемого файла может быть много вложенных #папок. Эта опция говорит, насколько «глубоко» имеет смысл заходить.
MaxDirectoryRecursion 20
#Следовать ли при проверке папок символическим ссылкам
FollowDirectorySymlinks yes
#То же самое, но при проверке файлов
FollowFileSymlinks yes
#Сканировать файлы и директории на других файловых системах
CrossFilesystems yes
#Самопроверка (например, актуальность базы или файлов) каждые…
SelfCheck 1800
#Когда попадает вирус, то как о нем сообщать?
VirusEvent /bin/echo "VIRUS ALERT: %v" >> /var/log/clamav/virus.log
#Разрешать доступ связанным группам?
AllowSupplementaryGroups no
#Пользователем, от котоого запускать проверку
User clamav
#Переключаться ли на фоновую работу
Foreground no
#Далее идут настройка для самого процесса сканирования
DetectPUA yes
IncludePUA Spy
IncludePUA Scanner
IncludePUA RAT
AlgorithmicDetection yes
ScanPE yes
ScanELF yes
DetectBrokenExecutables yes
ScanOLE2 yes
ScanPDF yes
ScanMail yes
ScanPartialMessages no
PhishingSignatures yes
PhishingScanURLs yes
PhishingAlwaysBlockSSLMismatch no
PhishingAlwaysBlockCloak no
ScanHTML yes
ScanArchive yes
#Максимальный объем сканирования. Именно такой объем будет просканирован
MaxScanSize 10M
#Максимальный размер файла, который может быть передан на сканирование
MaxFileSize 10
#Максимальная глубина сканирования архивов
MaxRecursion 20
Код: Выделить всё
#где хранятся базы
DatabaseDirectory /var/db/clamav
#Место для лог-файла
UpdateLogFile /var/log/clamav/freshclam.log
#Логирование сообщения с указанием времени
LogTime yes
#Подробное логирование
LogVerbose yes
#Логирование через syslog
LogSyslog no
#Где наш файл-идентификатор процесса
PidFile /var/run/clamav/freshclam.pid
#Владелец базы
DatabaseOwner clamav
#Разрешить ли доступ дополнительным группам
AllowSupplementaryGroups no
#Откуда тянуть обновления базы
DNSDatabaseInfo current.cvd.clamav.net
DatabaseMirror database.clamav.net
#Сколько раз в день проверять наличие обновления для баз
Checks 24
ScriptedUpdates yes
#Извещать сам антивирусник о том, что базы обновились
NotifyClamd /usr/local/etc/clamd.conf
#Переключаться в в фоновые режим или нет
Foreground no
#Проверять ли целостность базы после обновлений
TestDatabases yes
Не забываем создать требуемые директории под логи:
Код: Выделить всё
# cd /var/log/
# mkdir clamav
ClamSMTP
Переходим в нужный нам порт:
Код: Выделить всё
# cd /usr/ports/security/clamsmtp
# make config
LOCAL
И далее:
Код: Выделить всё
# make install clean
Про настройку clamsmtp можно почитать в мане:
Код: Выделить всё
# man clamsmtpd.conf
Переименуем этот файл в clamsmtp.conf:
Код: Выделить всё
# mv clamsmtpd.conf-sample clamsmtpd.conf
Код: Выделить всё
#Адрес smtp-сервера куда слать проверенные почтовые сообщения. Схема такая: сначала #почтовик (Postfix) получает письмо. Отдает его на порт 10025 (см. настройку «Listen» в данном #конфиге) антивируснику clamsmtp. Тот в свою очередь, через сокет (см. настройку «ClamAddress» #в данном конфиге и настройку «LocalSocket» в конфиге ClamAV) , отдает письмо на проверку #ClamAV. Через сокет же письмо возвращается в clamsmtp и через порт 10026 (Вот эта настройка #ниже «OutAddress») вгружается обратно в Postfix.
OutAddress: 10026
#Максимальное количество одновременных соединений, которые буду обслуживаться
MaxConnections: 100
#Таймаут на получение данных при новом подключении инициированном из сети
TimeOut: 180
#Актуально для медленных соединений. Пока еще не завершена проверка файла на медленном #соединении, будет посылаться команда, поддерживающая такое соединение
KeepAlives: 0
#Адрес, где демон «слушает»
Listen: 127.0.0.1:10025
#Сокет, через который можно подключиться к ClamAV (см. настройку clamd.conf – настройка должна указывать на тот же сокет-файл, что и в конфиге clamd.conf)
ClamAddress: /var/run/clamav/clamd.sock
#Переписываем заголовок после проверки
Header: X-Virus-Scanned: ClamAV using ClamSMTP
#Директория для временных файлов. Она должна быть доступна как clamsmtpd, так и clamav
TempDirectory: /tmp
#Что делать при обнаружении вируса. В данном случае сообщение просто отбрасывается.
Action: drop
#так как сообщения отбрасываются, то и карантин нам не нужен
Quarantine: off
#Пользователь, под которым запускается сервис.
User: clamav
Код: Выделить всё
# echo 'clamsmtpd_enable="YES"' >> /etc/rc.conf
А если быть совсем точным, то мы начнем с установки мускула.
Перейдем в порт, запустим установку:
Код: Выделить всё
#cd /usr/ports/databases/mysql41-server
#make install clean
Я вырал данную версию мускула из-за того, что у меня на этом же серваке вертится и сайт. Сайт работает на очень старой админке, которая, в свою очередь, работает только на этой версии мускула. Этим я лишь хочу сказать, что вы можете установить любую другую версию мускула, например, - самую последнюю.
После установки выполняем следующие шаги. Сначала говорим, что база данных должна принадлежать пользователю mysql, который появится в системе сразу после завершения установки мускула:
Код: Выделить всё
# mysql_install_db --user=mysql
Код: Выделить всё
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/local/bin/mysqladmin -u root password 'new-password'
/usr/local/bin/mysqladmin -u root -h mail.mydomain.com password 'new-password'
See the manual for more instructions.
You can start the MySQL daemon with:
cd /usr/local ; /usr/local/bin/mysqld_safe &
You can test the MySQL daemon with the benchmarks in the 'sql-bench' directory:
cd sql-bench ; perl run-all-tests
Please report any problems with the /usr/local/bin/mysqlbug script!
Затем, сделаем этого пользователя владельцем необходимых файлов:
Код: Выделить всё
# chown -R mysql:mysql /var/db/mysql
Код: Выделить всё
# ee /etc/rc.conf
mysql_enable=”YES”
Код: Выделить всё
# /usr/local/bin/mysqld_safe -user=mysql &
Код: Выделить всё
# /usr/local/bin/mysqladmin -u root password "МойПарольКмускулу"
Код: Выделить всё
# mysql -u root mysql
> UPDATE user SET Password=PASSWORD('mysql_root_password') WHERE User='root';
> DELETE FROM user WHERE User=' '; #ЗДЕСЬ УДАЛИТЬ ПРОБЕЛ МЕЖДУ КАВЫЧКАМИ!
> FLUSH PRIVILEGES;
> QUIT;
Скопируем наш конфигурационный файл в /var/db/mysql/ и дадим правильные права:
Код: Выделить всё
# cp /usr/local/share/mysql/my-medium.cnf /var/db/mysql/my.cnf
# chmod 640 /var/db/mysql/my.cnf
Код: Выделить всё
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking
key_buffer = 256M
max_allowed_packet = 10M
table_cache = 256
sort_buffer_size = 8M
read_buffer_size = 4M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 8
log-bin
server-id = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
Код: Выделить всё
# cd /usr/ports/mail/p5-Mail-SpamAssassin/
# make config
- AS_ROOT
SPAMC
DKIM
SSL
GNUPG
MYSQL
RAZOR
DCC
Код: Выделить всё
# make install clean
Код: Выделить всё
# sa-update
Сразу хочу отметить, что в данной инструкции будет настраиваться только глобальные настройки. Т.е. в MySQL будет хранится только AWL (autowhitelisting - история каждой переписки и оценивание на её основе последующих писем, и данных bayes - собственно правила обучения. Когда мы будет "кормить" фильтр письмами ham и spam, то он будет считывать письмо и заносить соответствующие данные в базу о том, что считать спамом, а что нет. Вот эти данные и будут храниться в SQL).
Начнем с создания БД.
Для начала сообщим фильтру необходимые параметры для запуска. Занесем в rc.conf следующие строчки:
Код: Выделить всё
spamd_enable="YES"
spamd_flags="-d -x -u spamd -H /var/spool/spamd -s /var/log/spamassassin/spamd.log -m 16 -q"
Код: Выделить всё
use mysql;
insert into user (Host, User, Password) values('localhost','spamassassin',password("SApassword"));
insert into db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv) values('localhost','spamassassin','spamassassin','Y','Y','Y','Y');
create database spamassassin;
quit
Код: Выделить всё
# cd /usr/local/share/doc/p5-Mail-SpamAssassin/sql
# mysql -h localhost -u root -p spamassassin < awl_mysql.sql
# mysql -h localhost -u root -p spamassassin < bayes_mysql.sql
Установку Pyzor необходимо выполнить из портов, хотя он должен быть установлен вместе с фильтром (проверьте это):
Код: Выделить всё
# cd /usr/ports/mail/pyzor
# make install
Установка и настройка Razor-Agents
Установку Razor-Agents необходимо выполнить из портов, хотя он должен быть установлен вместе с фильтром (проверьте это):
Код: Выделить всё
# cd /usr/ports/mail/razor-agents
# make install
Установка и настройка DCC
Установку DCC необходимо выполнить из портов:
Код: Выделить всё
# cd /usr/ports/mail/dcc-dccd
# make install
Теперь переходим к конфигу. Он лежит в папке /usr/local/etc/mail/spamassassin/ - local.cf.
Приводим его к такому виду:
Код: Выделить всё
#Переписывать заголовок. Именно по этой записи будет ориентироваться локальный доставщик и #его плагин sieve, который мы настроили ранее. Если заголовок будет переписан и в нем будет #содержаться слово SPAM, то такое письмо не попадет в конечный ящик пользователей.
rewrite_header Subject *****SPAM*****
#режим модификации сообщения, если оно расценено как СПАМ. В данном случае у нас #модифицируется заголовок сообщения. В случае, если здесь параметр будет указан 1, то #оригинальное сообщение будет сохранено и прикреплено к новому, если письмо будет #расценено как спам.
report_safe 0
#не проверять сообщения из этих подсетей
trusted_networks 192.168.0.
#Метод блокировки файлов при обращении к ним, во избежание повреждения файлов.
lock_method flock
#Сколько должно набрать письмо баллов при оценке, чтобы быть расцененым, как спам
required_score 5.0
#Использовать БД bayes при анализер
use_bayes 1
#Использовать автообучение. После каждого анализа база анализированных писем пополняется
bayes_auto_learn 1
#Игнорировать следующие заголовки
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status
#Минимальное количество проанализированных писем перед тем, как SA «примется за работу»
bayes_min_ham_num 50
bayes_min_spam_num 50
#Минимальный балл, необходимый SA, чтобы он добавил в БД письмо, расцененное, как НЕспам
bayes_auto_learn_threshold_nonspam 0.001
#Минимальный балл, необходимый SA, чтобы он добавил в БД письмо, расцененное, как спам
bayes_auto_learn_threshold_spam 12.0
#Где хранится bayes
bayes_store_module Mail::SpamAssassin::BayesStore::MySQL
#параметры подключения к MySQL
bayes_sql_dsn DBI:mysql:spamassassin:localhost
bayes_sql_username spamassassin
bayes_sql_password :tknfzCbcntvf6969
#Где хранится AWL
auto_whitelist_factory Mail::SpamAssassin::SQLBasedAddrList
#параметры подключения к MySQL
user_awl_dsn DBI:mysql:spamassassin:localhost
user_awl_sql_username spamassassin
user_awl_sql_password :tknfzCbcntvf6969
user_awl_sql_table awl
#Использовать ли pyzor
use_pyzor 1
# Использовать ли razor. Аналогично можно поступить с DCC (но у меня он не включен)
use_razor2 1
#Не обращаться к RBL спискам
skip_rbl_checks 1
#Раздел для плагинов. Не используется у меня
ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
# Put here some data, if you want make work the plugin
endif # Mail::SpamAssassin::Plugin::Shortcircuit
На этом настройка SA закончилась.
GreyListing
Для постфикса есть специальный "свой" грейлистинг - postgrey.
Устанавливается и настраивается довольно (если не ОЧЕНЬ) просто.
Код: Выделить всё
# cd /usr/ports/mail/postgrey
# make install clean
Код: Выделить всё
postgrey_whitelist_clients
postgrey_whitelist_recipients
В файле whitelist_recipients (белый список адресатов), вы можете указать список адресатов, на которых не распространяется действие серого списка.
Определяйте содержимое этих файлов по своему желанию.
Теперь идем в rc.conf и добавляем следующие строки:
Код: Выделить всё
postgrey_enable="YES"
postgrey_flags="--delay=300 --max-age=31 --inet=localhost:10023 -d"
Дополнительные параметры можно посмотреть в мане (man postgrey или в справке perldoc postgrey). Тут мы определили время, на которое передача сообщения откладывается (300 секунд = 5 минут), время на которое наш сервер "запомнит" адрес (31 день) и, наконец, на каком порту слушаться.
Теперь можно настраивать конфиг postfix и запускать весь софт, проверять работу.
Настройка Postfix
Требуемые для настройки почтового сервера файлы лежат в папке /usr/local/etc/postfix:
- main.cf
master.cf
Код: Выделить всё
#различные директории
queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
data_directory = /var/db/postfix
alias_maps = hash:/etc/mail/aliases
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
#Месторасположение различной документации (данные пути не являются обязательными)
html_directory = /usr/local/share/doc/postfix
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = /usr/local/share/doc/postfix
#Права
mail_owner = postfix
default_privs = nobody
#Сетевые настройки
myhostname = mail.mydomain.com
mydomain = localhost
myorigin = $mydomain
inet_interfaces = all
mydestination = $mydomain, $myhostname, localhost.$mydomain, localhost.$myhostname, localhost
mynetworks_style = host
mynetworks = 127.0.0.0/24
inet_protocols = ipv4
#Какое приветствие выдавать при подключении к серверу
smtpd_banner = $myhostname ESMTP $mail_name
#Отладка
debug_peer_level = 5
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
#Где искать команду «послать почту» Postfix’a. Используется для вставки в очередь писем.
setgid_group = maildrop
###Включаем поддержу SASL
#Включение поддержки старых почтовых клиентов для исп-я авторизации
broken_sasl_auth_clients = yes
#включение поддержки SASL
smtpd_sasl_auth_enable = yes
#используем авторизацию dovecot
smtpd_sasl_type = dovecot
#Указываем путь к тому же сокету, что указан в конфиге dovecot.conf в блоке
#socket listen {
# master {
# path = /var/run/dovecot/auth-master
# mode = 0600
# user = vmail
# group = vmail
# }
# client {
# path = /var/spool/postfix/private/auth
# mode = 0660
# user = postfix
# group = postfix
# }
# }
smtpd_sasl_path = /var/spool/postfix/private/auth
#Realm для SASL аутентификации
smtpd_sasl_local_domain = $mydomain
#Запрет анонимной аутентификации
smtpd_sasl_security_options = noanonymous
#Включаем поддержку TLS
#сообщать клиентам о поддержке TLS
smtpd_use_tls = yes
smtpd_tls_security_level = may
#использовать аутентификацию SMTP только для TLS-соединений
smtpd_tls_auth_only = yes
#местонахождение закрытого ключа сервера
smtpd_tls_key_file = /usr/local/etc/postfix/ssl/mail.mydomain.com--unencrypted-key.pem
#местонахождение сертификата сервера
smtpd_tls_cert_file = /usr/local/etc/postfix/ssl/mail.mydomain.com -cert.pem
#местонахождение самоподписного доверенного сертификата
smtpd_tls_CAfile = /usr/local/etc/postfix/ssl/mydomain.com-CAcert.pem
smtpd_tls_session_cache_database = btree:/var/db/postfix/smtpd_tls_session_cache
#детальность сообщений о TLS-активности, выводимых в лог
smtpd_tls_loglevel = 3
#3апрашивать заголовки сообщений с информацией о версии протокола и алгоритме шифрования
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl/sasl_passwd
#имя устройства-генератора псевдослучайных чисел (PRNG)
tls_random_source = dev:/dev/urandom
#Настраиваем виртуальных пользователей
virtual_transport = dovecot
virtual_mailbox_base = /usr/home/virtualmail
virtual_mailbox_domains = ldap:$config_directory/ldap/virtual_domain.cf
virtual_minimum_uid = 100
virtual_uid_maps = ldap:$config_directory/ldap/virtual_uid.cf
virtual_gid_maps = $virtual_uid_maps
virtual_mailbox_maps = ldap:$config_directory/ldap/virtual_mailbox_recipient.cf
virtual_alias_maps = ldap:$config_directory/ldap/virtual_aliases.cf
#Делаем необходимые настройки, чтобы наш локальный доставщик dovecot для виртуальных #пользователей работал
dovecot_destination_recipient_limit = 1
mailbox_transport = dovecot
smtpd_sender_login_maps = ldap:$config_directory/ldap/virtual_sender_login.cf
#Фильтр антивируса clamSMTP. Здесь мы говорим, чтобы письмо отправлялось на порт 10025, #который слушается clamSMTP (см. конфиг clamSMTP)
content_filter = clamsmtpd:127.0.0.1:10025
receive_override_options = no_address_mappings
###Боремся против спама
#1. Ограничиваем размер сообщения
message_size_limit = 10485760
#2. Изменяем коды ответов об ошибках для того, чтобы у спамеров было меньше озможностей #для анализа, почему их сообщение не проходит
invalid_hostname_reject_code = 550
non_fqdn_reject_code = 550
unknown_address_reject_code = 550
unknown_client_reject_code = 550
unknown_hostname_reject_code = 550
unverified_recipient_reject_code = 550
unverified_sender_reject_code = 550
unknown_local_recipient_reject_code = 550
#3. Затем необходимо запретить использование адресов, отличных от определенных в документе #RFC-821, запретить использование
# команды VRFY и потребовать обязательное использование команды HELO/EHLO
strict_rfc821_envelopes = yes
disable_vrfy_command = yes
smtpd_helo_required = yes
smtp_always_send_ehlo = yes
smtpd_hard_error_limit = 8
smtpd_delay_reject = yes
#4. Ограничения
smtpd_etrn_restrictions =
permit_mynetworks,
reject
smtpd_helo_restrictions=
permit_mynetworks,
reject_invalid_helo_hostname,
reject_non_fqdn_hostname,
reject_invalid_hostname,
check_helo_access hash:/usr/local/etc/postfix/checks/access_helo
smtpd_data_restrictions=
permit_mynetworks,
reject_multi_recipient_bounce,
reject_unauth_pipelining
smtpd_sender_restrictions=
check_sender_access hash:/usr/local/etc/postfix/checks/access_sender,
permit_sasl_authenticated,
permit_mynetworks,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
reject_unlisted_sender,
reject_unverified_sender,
check_sender_access hash:/usr/local/etc/postfix/checks/access_sender
smtpd_recipient_restrictions=
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination,
#Здесь мы включаем поддержку грейлистинга. Передаем письмо на проверку на порт 10023, #который прослушивается нашим postgrey (см. конфиг postgrey)
check_policy_service inet:127.0.0.1:10023,
reject_unauth_pipelining,
reject_unknown_client_hostname,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unverified_recipient,
reject_unlisted_recipient,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
reject_unverified_sender,
smtpd_client_restrictions=
permit_sasl_authenticated,
reject_plaintext_session,
check_client_access hash:/usr/local/etc/postfix/access_client,
check_client_access pcre:/usr/local/etc/postfix/access_client.pcre
#5. Временные интервалы. Все задержки указаны в соответствии с RFC 2821
smtpd_timeout=5m
smtpd_starttls_timeout=5m
smtp_mail_timeout=5m
smtp_rcpt_timeout=5m
smtp_data_init_timeout=2m
smtp_data_xfer_timeout=3m
smtp_data_done_timeout=10m
maximal_queue_lifetime=4d
bounce_queue_lifetime=4d
queue_run_delay=30m
minimal_backoff_time=3h
maximal_backoff_time=5h
#6. Проверки заголовков
header_checks=pcre:$config_directory/checks/header_check
mime_header_checks=pcre:$config_directory/checks/mime_check
permit_mynetworks - разрешить доступ из доверенных сетей
permit_sasl_authenticated - разрешить доступ клиентам, прошедшим процедуру аутентификации SMTP
reject_unauth_destination - если наш сервер является конечной точкой следования почтового сообщения (сервер может быть релеем для других доменов, но в нашем случае эта возможность не используется) запретить отправку сообщений, получатели которых находятся за пределами доменов, описанных в параметрах $mydestination, $inet_interfaces и $virtual_maps (говоря другими словами, запретить Postfix быть открытым релеем)
reject_unauth_pipelining - запретить некорректное использование команд конвейерной обработки
check_client_access hash:... - проверить, разрешен ли доступ в файле, являющемся параметром данного ограничения (файл access_client имеет формат, описанный в access(5), его содержимое и рекомендации по использованию приведены ниже)
check_client_access pcre:... - ограничение аналогично предыдущему, за исключением того, что используется другой формат файла (файл access_client.pcre имеет формат, описанный в pcre_table(5), его содержимое приведено ниже)
reject_unknown_client_hostname - запретить доступ клиентам, не зарегистрированным в DNS
check_helo_access hash:... - проверить, разрешено ли выданное клиентом приветствие в файле, являющемся параметром данного ограничения (файл имеет формат, описанный в access(5), его содержимое и рекомендации по использованию приведены ниже)
reject_invalid_helo_hostname - запретить доступ, если имя хоста, содержащееся в выданном клиентом приветствии, имеет некорректный синтаксис
reject_non_fqdn_helo_hostname - запретить доступ, если имя хоста, содержащееся в выданном клиентом приветствии, не является FQDN
check_sender_access hash:... - проверить, разрешен ли адрес отправителя сообщения в файле, являющемся параметром данного ограничения (файл имеет формат, описанный в access(5), его содержимое и рекомендации по использованию приведены ниже)
reject_non_fqdn_sender - запретить доступ, если адрес отправителя сообщения имеет некорректный формат
reject_unknown_sender_domain - запретить доступ, если для имени домена адреса отправителя не существует A или MX запись в DNS
reject_unverified_sender - запретить доступ, если адрес отправителя не может быть проверен (механизм проверки описан в Postfix Address Verification Howto)
reject_non_fqdn_recipient - запретить доступ, если адрес получателя сообщения имеет некорректный формат
reject_unknown_recipient_domain - запретить доступ, если для имени домена адреса получателя не существует A или MX запись в DNS
reject_unverified_recipient - запретить доступ, если адрес получателя не может быть проверен (механизм проверки описан в Postfix Address Verification Howto)
Теперь приводим master.cf к следующему виду:
Код: Выделить всё
smtp inet n - n - - smtpd
#Этой строкой мы добавляем фильтр контента письма – подключаем на spamassassin
-o content_filter=spamassassin
smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
pickup fifo n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr fifo n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
### Здесь настраивается передача письма в clamSMTP и опции для этой передачи
clamsmtpd unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
-o smtp_enforce_tls=no
#А здесь мы пихаем проверенное письмо обратно Postfix’у (см. конфиг clamsmtpd.conf, где указан #порт 10026). Сами clamsmtp и clamav взаимодействуют через сокет
127.0.0.1:10026 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
###Здесь мы подключаем наш фильтр с параметрами
spamassassin unix - n n - - pipe
flags=Rq user=spamd argv=/usr/local/bin/spamc -u spamd -e /usr/local/sbin/sendmail -f $sender $recipient
###Здесь мы включаем с параметрами доставщик почты для виртуальных пользователей
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/local/libexec/dovecot/deliver -f ${sender} -d ${recipient}
Создаем в папке /usr/local/etc/postfix папку ldap.
В нее кладем следующие файлы:
- transport.cf
virtual_domain.cf
virtual_quota.cf
virtual_uid.cf
virtual_aliases.cf
virtual_mailbox_recipient.cf
virtual_sender_login.cf
Код: Выделить всё
(пусто)
Код: Выделить всё
bind = yes
bind_dn = cn=vmail,ou=accounts,dc=mydomain,dc=com
bind_pw = lamerionok69
server_host = 127.0.0.1
server_port = 389
search_base = vdo=vDomain,ou=accounts,dc=mydomain,dc=com
query_filter = (&(vdName=%s)(vdStatus=1))
result_attribute = vdName
result_format = %s
version = 3
scope = sub
Код: Выделить всё
bind = yes
bind_dn = cn=vmail,ou=accounts,dc=mydomain,dc=com
bind_pw = lamerionok69
server_host = 127.0.0.1
server_port = 389
search_base = vao=vAlias,ou=accounts,dc=mydomain,dc=com
query_filter = (&(vaName=%s)(vaStatus=1))
result_attribute = vaMail
result_format = %s
version = 3
Код: Выделить всё
bind = yes
bind_dn = cn=vmail,ou=accounts,dc=mydomain,dc=com
bind_pw = test
server_host = 127.0.0.1
server_port = 389
search_base = vuo=vUsers,ou=accounts,dc=mydomain,dc=com
query_filter = (&(mail=%s)(vuActive=1)(vuAuth=1))
result_attribute = homeDirectory
result_format = %s
version = 3
Код: Выделить всё
(пусто)
virtual_sender_login.cf
Код: Выделить всё
bind = yes
bind_dn = cn=vmail,ou=accounts,dc=mydomain,dc=com
bind_pw = test
server_host = 127.0.0.1
server_port = 389
search_base = vuo=vUsers,ou=accounts,dc=mydomain,dc=com
query_filter = (&(mail=%s)(vuActive=1)(vuAuth=1))
result_attribute = mail
result_format = %s
version = 3
Код: Выделить всё
bind = yes
bind_dn = cn=vmail,ou=accounts,dc=mydomain,dc=com
bind_pw = lamerionok69
server_host = 127.0.0.1
server_port = 389
search_base = vuo=vUsers,ou=accounts,dc=mydomain,dc=com
query_filter = (&(mail=%s)(vuActive=1)(vuAuth=1))
result_attribute = uidNumber
result_format = %s
version = 3
В нее кладем следующие файлы:
- access_sender
access_helo
access_client
access_client.pcre
header_check
mime_check
access_sender:
Код: Выделить всё
пусто
Код: Выделить всё
# postmap access_sender
access_helo
Код: Выделить всё
127.0.0.1 REJECT Your server configured incorrectly
localhost REJECT Your server configured incorrectly
localhost.localdomain REJECT Your server configured incorrectly
localhost.mydomain.com REJECT Your server configured incorrectly
192.168 REJECT Your server configured incorrectly
mail.mydomain.com REJECT Your server configured incorrectly
Код: Выделить всё
# postmap access_helo
Код: Выделить всё
пусто
Код: Выделить всё
# postmap access_client
access_client.pcre
Файл access_client.pcre предназначен для блокировки абонентов dial-up, кабельных и xdsl сетей, которые не сочли нужным зарегистрировать "нормальное" имя в DNS. Большая часть таких абонентов - СПАМеры. Если Вам все же нужно принимать сообщения от одного из таких абонентов, добавьте его имя хоста или IP-адрес в файл access_client, рассмотренный выше. Файл access_client.pcre имеет следующее содержимое (коды ошибок и сообщения, выдаваемые при блокировке клиентов, можно изменить на свое усмотрение):
Код: Выделить всё
/[ax]dsl.*\..*\..*/i REJECT Your message looks like SPAM
/\.dsl.*\..*\..*/i REJECT Your message looks like SPAM
/cable.*\..*\..*/i REJECT Your message looks like SPAM
/client.*\..*\..*/i REJECT Your message looks like SPAM
/dhcp.*\..*\..*/i REJECT Your message looks like SPAM
/dial.*\..*\..*/i REJECT Your message looks like SPAM
/dialup.*\..*\..*/i REJECT Your message looks like SPAM
/dslam.*\..*\..*/i REJECT Your message looks like SPAM
/host.*\..*\..*/i REJECT Your message looks like SPAM
/node.*\..*\..*/i REJECT Your message looks like SPAM
/pool.*\..*\..*/i REJECT Your message looks like SPAM
/ppp.*\..*\..*/i REJECT Your message looks like SPAM
/user.*\..*\..*/i REJECT Your message looks like SPAM
Код: Выделить всё
/^Content-(Type|Disposition):.*namespace:*=.*\.com/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.exe/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.acm/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.ax/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.bat/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.bin/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.bpl/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.cat/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.cmd/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.cpl/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.dat/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.dll/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.dpl/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.drv/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.inf/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.ini/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.msc/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.nls/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.ocx/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.olb/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.pif/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.rom/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.scr/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.sys/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.tlb/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.vbs/ REJECT
/^Content-(Type|Disposition):.*namespace:*=.*\.vxd/ REJECT
Код: Выделить всё
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)com)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)exe)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)acm)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)ax)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)bat)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)bin)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)bpl)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)cat)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)cmd)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)cpl)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)dat)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)dll)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)dpl)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)drv)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)inf)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)ini)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)msc)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)nls)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)ocx)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)olb)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)pif)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)rom)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)scr)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)sys)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)tlb)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)vbs)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)vxd)(\?=)?"?\s*$/ REJECT
Проверяем еще раз файл rc.conf:
Код: Выделить всё
# cat /etc/rc.conf
postfix_enable="YES"
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
dovecot_enable="YES"
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
clamsmtpd_enable="YES"
mysql_enable="YES"
spamd_enable="YES"
spamd_flags="-d -x -u spamd -H /var/spool/spamd -s /var/log/spamassassin/spamd.log -m 16 -q"
postgrey_enable="YES"
postgrey_flags="--delay=300 --max-age=31 --inet=localhost:10023 -d"
slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://localhost/ ldap://192.168.0.90/"'
Код: Выделить всё
# cd /usr/local/etc/
# rc.d/clamav-freshclam start
Код: Выделить всё
# rc.d/clamav-clamd start
# rc.d/clamsmtpd start
# rc.d/sa-spamd start
# rc.d/postgrey start
# rc.d/postfix start
mysql-server – он у нас уже запущен
dovecot start – он у нас уже запущен
slapd – он у нас уже запущен
На этом настройка заканчивается.
Литература
Основные статьи:
Postfix + Dovecot + SpamAssasin + Clamav с аворизацией в LDAP или MySQL
Postfix + SASL + LDAP + Courier-IMAP + SSL
Почтовая система среднего офиса на базе Postfix
TLS/SSL
Postfix TLS Support
Postfix + TLS + SASL on FreeBSD
ClamAV/clamSMTP
Подключение ClamAV антивируса к postfix на FreeBSD
SpamAssassin + MySQL + PostFix
My SpamAssassin MySQL How-To
Postfix и Spamassassin: Как фильтровать спам
PostGrey
Postgrey. Установка и настройка грейлиста
Ldap
См. основные статьи
Postfix vs Spam
Filtering spam with Postfix
Общее
Postfix Configuration Parameters
Postfix Howtos and FAQs
Раздел вопросов вынесу в отдельный пост

Надеюсь, сие чтиво будет хоть кому-нибудь полезно...