Эта страница была перенесена на
altlinux.org. Текст на freesource.info заморожен.
Интернет частьНастройка почтовой системы Postfix SASL Cyrus-imap Amavisd-new Spamassassin Clamav sqlgrey IMP
Автор: Морсов Алексей (
swi@altlinux.org), 13 Февраля 2006г.
UPD: 22 июля 2005г.
UPD: 27 октября 2005г.
UPD: 28 октября 2005г.
UPD: 13 феврался 2006г.
Принимаются все вопросы, пожелания, поправки, уточнения, благодарности и прочее по указанному адресу электронной почты.
Примечание:
Данный документ описывает установку и настройку почтовой системы на базе дистрибутива ALT Linux Master 2.4 и предполагает наличие у вас необходимых навыков по работе в Linux.
Все настройки взяты с реально работающего mail-сервера.
В настройке всей этой машинерии мне очень помогли советы членов community@ ALT Linux и вот это
HOW-TO.
Содержание
Установка необходимых пакетов
И так. Для почтовой системы нам понадобится установить (если они еще не установлены) следующие пакеты в систему:
- postfix-control-1.2-alt1
- postfix-2.1.5-alt0.1
- postfix-mysql-2.1.5-alt0.1
- postfix-pcre-2.1.5-alt0.1
Внимание: версии пакетов у вас могут отличаться. Так в частности postfix входящий в состав ALT Master 2.4 не поддерживает sasl, поэтому я лично брал postfix-2.1.5-alt0.1.src.rpm от сюда
http://lakostis.elektrostal.ru/RPMS/ALM2.4/SRPMS/ (спасибо Konstantin A. Lepikhov).
Уже после написания статьи в бэкпорты к Мастеру (и в самом сизифе) весь postfix был разбит на основной и кучу отдельных модулей. Если у вас что-то из описанного здесь не заводится, проверь установлен ли соответствующий модуль для postfix. Так например для SASL авторизации должен быть установлен пакет postfix-tls. (по замечанию Vladimir V. Kamarzin).
- cyrus-sasl2–2.1.19-alt1
- cyrus-imapd-2.2.10-alt1
- cyrus-imapd-utils-2.2.10-alt1
- perl-DBD-mysql-2.90.04-alt1 (это для sqlgrey)
- php-mysql-4.3.10-alt0.M24.1 (это для IMP)
- postfix-mysql-2.1.5-alt0.1
- cyrus-sasl2–2.1.19-alt1
- libsasl2-devel-2.1.19-alt1
- libsasl2–2.1.19-alt1
- amavisd-new-20030616-alt9.2
- spamassassin-3.0.1-alt1
- libclamav-0.83-alt0.M24.1
- clamav-0.83-alt0.M24.1
- imp-3.2.5-alt1
- sqlgrey-1.4.3–1
- perl-IO-Multiplex-1.08-alt0 (для sqlgrey)
Примечание: sqlgrey не входит в поставку ALT Linux Master 2.4, но он есть в «Сизиф» и кажется в Backports.
Так же необходимо проконтролировать, что
My SQL-server установлен и запущен.
Для web-интерфейса будем использовать IMP. Для этого понадобятся пакеты:
- apache-common-1.3.33rusPL30.20-alt1.M24
- apache-1.3.33rusPL30.20-alt1.M24
- imp-3.2.5-alt1
Содержание
Настройка Postfix
Мы будем настраивать Postfix как сервер smtp с поддержкой авторизации через SASL. Всю почту, которую Postfix будет принимать, он будет отдавать Cyrus-imap по протоколу lmtp. Прежде чем попасть к Cyrus-imap почта будет проходить проверку антивирусами и спамофильтром. При приеме сообщений, Postfix будет проверять их (начиная с этапа HELO/EHLO соединения) с помощью greylisting-технологии, по некоторым online blacklist сервисам и по собственному blacklist, который будет находиться в
My SQL базе. Все пользователи почтовой системы будут виртуальными (т.е. не будут иметь соответствующих unix accounts), за исключением служебных пользователей, типа webmaster, postmaster и т.д.
И так. Сначала нам нужно объявить Postfix внешним сервисом (так как по умолчанию он доставляет только локальную почту):
Теперь отредактируем файл /etc/postfix/master.cf. Фактически включим нужные нам сервисы и фильтры:
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
smtp inet n – – – – smtpd
smtp-amavis unix – – n – 2 lmtp
- o smtp_data_done_timeout=1200
127.0.0.1:10025 inet n – n – – smtpd
- o content_filter=
- o local_recipient_maps=
- o relay_recipient_maps=
- o smtpd_restriction_classes=
- o smtpd_client_restrictions=
- o smtpd_helo_restrictions=
- o smtpd_sender_restrictions=
- o smtpd_recipient_restrictions=permit_mynetworks,reject
- o mynetworks=127.0.0.0/8
- o strict_rfc821_envelopes=yes
- o smtpd_error_sleep_time=0
- o smtpd_soft_error_limit=1001
- o smtpd_hard_error_limit=1000
#smtps inet n – – – – smtpd
# -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
#submission inet n – – – – smtpd
# -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes
#628 inet n – – – – qmqpd
pickup fifo n – – 60 1 pickup
cleanup unix n – – – 0 cleanup
qmgr fifo n – – 300 1 qmgr
#qmgr fifo n – – 300 1 nqmgr
#tlsmgr fifo – – – 300 1 tlsmgr
rewrite unix – – – – – trivial-rewrite
bounce unix – – – – 0 bounce
defer unix – – – – 0 bounce
flush unix n – – 1000? 0 flush
proxymap unix – – n – – proxymap
smtp unix – – – – – smtp
relay unix – – – – – smtp
# -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq unix n – – – – showq
error unix – – – – – error
local unix – n n – – local
virtual unix – n n – – virtual
lmtp unix – – – – – lmtp
verify unix – – – – 1 verify
#
# Interfaces to non-Postfix software. Be sure to examine the manual
Теперь отредактируем файл
/etc/postfix/main.cf. Я создал
main.cf с нуля, чтобы вписать туда только нужное мне.
Прежде всего настроим наш хост (подробности см. в
BASIC_CONFIGURATION_README):
# Local setting of host
###
myhostname = mail.ricom.ru
mydomain = ricom.ru
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain, $mydomain
unknown_local_recipient_reject_code = 550
mynetworks = $config_directory/mynetworks
Файл
mynetworks содержит список ваших доверенных сетей, например:
127.0.0.1/32
192.168.130.0/24
Теперь настроим таблицы пользователей, алиасы и транспорт для них:
# Aliases and relay
alias_maps = hash:/etc/postfix/aliases
# Mail trasport
##
mailbox_transport = lmtp:unix:/public/lmtp
local_recipient_maps = hash:/etc/postfix/local_users
virtual_alias_maps = hash:/etc/postfix/virtual
Теперь настроим SASL аутентификацию для smtp-соединений:
# SASL configuration
##
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
И пропишем правила доступа для smtp-соединений. Сначала попросим «представиться» и корректно формировать заголовки письма. Описания остальных правил (и для чего они именно нужны) можно (и нужно) посмотреть в
SMTPD_ACCESS_README.
# rejecting controls goes here
##
maps_rbl_domains = dul.ru
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_unauth_destination,
check_policy_service inet:127.0.0.1:2501
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname
smtpd_sender_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unknown_sender_domain,
reject_unverified_sender,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
check_sender_access mysql:/etc/postfix/sender_access.cf
smtpd_client_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_rbl_client relays.ordb.org,
reject_rbl_client opm.blitzed.org,
reject_maps_rbl,
reject_unauth_destination,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
check_client_access mysql:/etc/postfix/sender_access.cf
smtpd_data_restrictions = reject_unauth_pipelining
content_filter = smtp-amavis:[127.0.0.1]:10024
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
Примечание: check_policy_service – это механизм проверки, на котором и задействован sqlgrey (в нашем случае). Данный вид сервиса реализован в Postfix версии 2.1 и старше.
check_sender_access – используется для ведения нашего blacklist-а.
У меня он (/etc/postfix/sender_access.cf) выглядит так:
user=***
password=***
dbname=postfix
table=sender_access
select_field=action
where_field=sender
hosts=127.0.0.1
user и
password – это имя пользователя и его пароль в базе
My SQL имеющего доступ к указанной таблице/базе.
content_filter – собственно заставляет письмо уходить не сразу в ящик пользователя, а уходит на растерзание amivisd-new, который проверяет его сам, а так же с помощью clamav (на вирусы) и spamassassin (спамофильтр), только после чего возвращает письмо обратно Postfix и оно наконец попадает в ящик пользователя.
Так... Поскольку мы используем SASL авторизацию для smtp – нужно указать где ее (и как) брать. Для этого найдем файл
/usr/lib/sasl2/smtpd.conf (если такого файла нет, просто создайте его там) и пропишем в нем следующее:
А теперь перейдем к Cyrus-Imap.
Содержание
Настройка Cyrus-Imap
Ну что же, с postfix пока закончим. Приступим теперь к настройке собственно Cyrus-Imap – нашего pop3 и imap демона :) Выбор именно Cyrus-а был основан на трех простых вещах:
- Он поставился из коробки ALT Linux Master 2.4 по умолчанию :)
- Он имеет более мощные возможности в принципе (хотя я думаю что я использую его дай бог на 10%
- Он не так уж сложен в настройке (по крайней мере в настройке как простого pop3/imap)
Это мое субъективное мнение.
И так приступим. Для начала отредактируем
файл /etc/cyrus.conf:
# standard standalone server implementation
START {
# do not delete this entry!
recover cmd="ctl_cyrusdb -r"
# this is only necessary if using idled for IMAP IDLE
# idled cmd="idled"
}
# UNIX sockets start with a slash and are put into /var/lib/imap/socket
SERVICES {
# add or remove based on preferences
imap cmd="imapd" listen="imap" prefork=5
# imaps cmd="imapd -s" listen="imaps" prefork=1
pop3 cmd="pop3d" listen="pop3" prefork=3
# pop3s cmd="pop3d -s" listen="pop3s" prefork=1
# sieve cmd="timsieved" listen="sieve" prefork=0
# smmapd cmd="smmapd" listen="/var/lib/imap/socket/smmapd" prefork=1
# these are only necessary if receiving/exporting usenet via NNTP
# nntp cmd="nntpd" listen="nntp" prefork=3
# nntps cmd="nntpd -s" listen="nntps" prefork=1
# at least one LMTP is required for delivery
# lmtp cmd="lmtpd" listen="lmtp" prefork=0
lmtpunix cmd="lmtpd" listen="/var/spool/postfix/public/lmtp" prefork=1
# this is only necessary if using notifications
# notify cmd="notifyd" listen="/var/lib/imap/socket/notify" proto="udp" prefork=1
}
EVENTS {
# this is required
checkpoint cmd="ctl_cyrusdb -c" period=30
# this is only necessary if using duplicate delivery suppression,
# Sieve or NNTP
delprune cmd="cyr_expire -E 3" at=0400
# this is only necessary if caching TLS sessions
tlsprune cmd="tls_prune" at=0400
}
Внимание: Обратите внимание на строку с
lmtpunix. Путь, указанный в ней, должен совпадать с путем, указанным в
/etc/postfix/main.cf с учетом того, что Postfix завернут в chroot-jail (в данном случае в директорию
/var/spool/postfix).
Теперь внесем небольшие изменения в файл
/etc/imapd.conf:
admins: cyrus
sasl_pwcheck_method: auxprop
sasldb_path: /etc/sasl2/sasldb2
partition-default: /var/maildir
sendmail: /usr/sbin/sendmail
servername: mail.ricom.ru
partition-default указывает на тот каталог, где будет храниться ваша почта. У меня это
/var/maildir – которая суть отдельный раздел с файловой системой
Reiser FS (так как почта в Cyrus-Imap хранится в формате Maildir, то мне показалось это оптимальным вариантом).
ВНИМАНИЕ: – пользователь
cyrus должен иметь права на чтение и
запись в этот каталог!
Все. Остальное там можно оставить как есть. Есть там еще параметры для автосоздания ящиков в cyrus при первом обращении к нему, но я это не использовал по одной простой причине, которую я объясню ниже, в разделе
Управление пользователями.
Содержание
Настройка SASL и подготовка cyradm
Теперь проведен настройку SASL библиотеки и подготовим cyradm к работе. Тут все просто. Редактируем файл
/etc/sasl2/saslpasswd.conf:
Собственно с SASL на этом все. Вот если бы мы делали через mysql.... Но это совсем другая история :) И довольно хорошо описанная в этом вот
HOW-TO.
Теперь перейдём к подготовке cyramd. Cyramd – это интерфейс к базе Cyrus-Imap. Через него можно управлять ящиками пользователей (создавать, удалять, устанавливать права, создавать папки и т.д.). Собственно, единственное что нам понадобится, это завести в базу SASL пользователя cyrus, которого мы указали в качестве Cyrus администратор в
/etc/imapd.conf. Если вы указали там другого, соответственно нужно добавить в базу SASL вместо cyrus. Использовать root для этого не рекомендуется.
И укажите пароль когда вас попросят. А теперь внесите пользователей cyrus и postfix в группу sasl, чтобы они могли читать базу SASL.
Однако, как мы помним, Postfix запущен в chroot-jail, т.е. он будет искать базу SASL
/etc/sasl2/sasldb2 но не увидит ее. Поэтому надо ее скопировать к нему в chroot. Идем в
/var/spool/postfix/etc/ создаем там директорию
sasl2. И главное, убедимся что у файла
/etc/sasl2/sasldb2 правильные права (группа sasl должна уметь его читать):
$ ls -ld /etc/sasl2/sasldb2
-rw-r
1 root sasl 12288 Фев 24 17:47 /etc/sasl2/sasldb2
$$
Содержание
Управление пользователями
Поскольку все наши пользователи виртуальные, и сведения о них находятся в файлах типа hash (см. файл
/etc/postfix/main.cf, то нам нужно добавлять и удалять их от туда, не забывая при этом добавлять или удалять их из базы SASL. Это можно делать руками, но я написал небольшой скрипт, который автоматически выполняет эти действия и заводит ящики в Cyrus-Imap для этих пользователей.
Возможно это не самый гибкий подход, но для небольшой конторы он себя вполне оправдывает как наиболее простой в настройке. В будущем, при желании можно отказаться от hash и перейти к использованию в качестве базы данных пользователей
My SQL,
Postgre SQL или даже LDAP :)
Внимание: Мой скрипт читает файлы имен пользователей и их алиасов по жестким регулярным выражениям, попутно сортирую их по алфавиту. Так что если у вас уже есть эти файлы (см.
/etc/postfix/main.cf) то лучше просто удалите их (или переименуйте) – он сам создаст их.
Его можно взять ((
http://mail.ricom.ru/alt/ тут). Только имейте ввиду, что пароль для пользователя cyrus там прописан в чистом виде. Соответственно права на этот файл должны быть даны только root.
И так, используем скрипт
mailmgr для добавления пользователя.
Скрипт создаст ящик в Cyrus-Imap, даст пользователю cyrus права на его удаление, добавит пользователя в базу SASL (попросит ввести пароль), добавит имя пользователя в файл пользователей почтовой системы. После этого скрипт запросит алиас для пользователя. Если вы не хотите давать алиас, просто нажмите ENTER. Скрипт не умеет добавлять алиасы отдельно от имен пользователей, соответственно, если вы захотите добавить алиас в будущем, просто отредактируйте соответствующий файл.
Справку по использованию скрипта
mailmgr можно получить командой
Содержание
Настройка Amavisd-New, Clamav, Spamm Assassin и My SQL
Собственно настраивать тут особо нечего. Как говорилось «Всё уже украдено до нас» :) Спасибо создателям Amavisd-new и команде ALT Linux. Но все же, сначала в файле
/etc/amavis/amavisd.conf найдите и исправьте следующие строки:
$virus_admin = «virusalert\@$mydomain»;
$virus_quarantine_to = 'virus-quarantine';
$spam_quarantine_to = 'spam-quarantine';
это приведет к тому, что все письма опознанные как спам и вирусы, будут складываться в каталог карантина ( он указан тут же в переменной
$QUARANTINEDIR). Мне кажется это наилучший способ. Сразу удалять такие письма не хорошо, потому что и
Spam Assassin и Clamav могут ошибиться и вы потеряете нужную почту.
Обновление от 21.04.2005
Когда мне надоело забивать адреса хостов спамеров свалившихся в карантин ручками, я написал небольшой скриптик (заодно на Python потренировался) который разгребает заголовки всех писем в этой директории и закидывает их в
My SQL-евский блеклист, который использует Postfix :) Желающие могут им воспользоваться. Лежит
здесь, называется autospambann (там лежит rpm для ALT Master 2.4 и src.rpm). Скрипт записывает в лог все заголовки письма которое он внес в blacklist и удалил. Но на ваш страх и риск – письма удаляются после обработки. Хотя можете поправить в скриптике – там прозрачно.
Так же я бы поправил значения уровней для
Spam Assassin-а так чтобы он всегда маркировал письма:
$sa_tag_level_deflt = -999;
$sa_tag2_level_deflt = 6.0;
$sa_kill_level_deflt = $sa_tag2_level_deflt;
И еще, если вам необходимо посылать/получать по почте письма с файлами типа. EXE (например самораспаковывающиеся архивы или дистрибутивы), то найдите и законментируйте секцию, начинающуюся строкой
$banned_filename_re = new_RE(
Ну и теперь настроим
My SQL – наш собственный blacklist. Для этого сначала подправим файл
/var/lib/mysql/my.cnf:
[mysqld]
chroot=/var/lib/mysql
datadir=/db
bdb-logdir=/log
log=/log/queries
pid-file=/mysqld.pid
skip-locking
#skip-networking
bind-address=127.0.0.1
port=3306
socket=/mysql.sock
tmpdir=/tmp
user=mysql
Для начала создадим нужную базу:
# mysql
> create database postfix;
> exit
Теперь сделайте таблицу нужную для Postfix. Возьмите файл
postfix.sql от
http://mail.ricom.ru/alt/ и просто подгрузите его командой
# mysql -D postfix <postfix.sql
А теперь дадим пользователю postfix права на операции с этой базой:
# mysql
> grant all on postfix.* to postfix@127.0.0.1
> exit
В принципе Postfix-у нужно только доступ на чтение, но поскольку
My SQL у нас работает только на локальном интерфейсе, то можно и дать все права. А уж если вы собираетесь использовать
autospambann – то права на INSERT тоже должны быть.
Ну вот, теперь все вроде бы настроено и прописано. Осталось все это запустить и проверить.
Содержание
Запуск и проверка
И так, чтобы вся эта машинерия работала, нужно всех их перезапускать. И так:
# service amavisd start
# service mysqld start
# service sqlgrey start
# service cyrus-imapd start
# service postfix start
Проверяем, работает ли почта. Если все работает, убедимся что все указанные сервисы будут стартовать при загрузке системы:
# chkconfig --list |grep :on
Должны быть видны следующие записи:
cyrus-imapd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
postfix 0:off 1:off 2:on 3:on 4:on 5:on 6:off
mysqld 0:off 1:off 2:off 3:on 4:on 5:on 6:off
clamd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
amavisd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
sqlgrey 0:off 1:off 2:on 3:on 4:on 5:on 6:off
clamd стартуется из под
amavid. Если у вас какого-то из процессов не хватает, сделайте для него:
# chkconfig --level 345 <имя процесса> on
Все. Все красиво, все хорошо. Осталось только прикрутить Web-интерфейс ко всему этому хозяйству.
Содержание
Настройка IMP
IMP ставится в директорию к Apache
/var/www/html/addon-modules/horde/imp/. Сам IMP реализован под Horde. После установки доступ к директориям
horde/ и
horde/imp/ дан только для локального хоста. Откроем дуступ к этим папкам извне. Для этого найдем в этих директориях файлы
.htaccess (или создайте их с правами 640 и владельцами root.apache) и пропишите в них следующее:
Deny from all
Allow from all
После этого, отредактируем файл
/etc/httpd/conf/httpd.conf, в самом конце которого должны быть строчки
Include conf/addon-modules/horde.conf
Include conf/addon-modules/imp.conf
Теперь убедимся, что в файле
/etc/httpd/conf/addon-modules.d/horde.conf есть такие строки:
<Directory /var/www/html/addon-modules/horde>
Options Indexes Follow Sym Links
Allow Override Auth Config Limit
и в файле
/etc/httpd/conf/addon-modules.d/imp.conf такие:
<Directory «/var/www/html/addon-modules/horde/imp»>
Allow Override Auth Config Limit
Теперь перезапустим сервер Apache:
и убедимся что он у нас стартует при загрузке
# chkconfig --list|grep httpd
httpd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
Теперь осталось только настроить сам IMP. Сначала в файле
horde/config/registry.php раскоментируйте строки
$this->registry['auth']['login'] = 'imp';
$this->registry['auth']['logout'] = 'imp';
а в блоке начинающемся с
$this->applications['imp'] = array( исправте строку
Теперь в файле
horde/imp/config/servers.php отредактируйте второй описанный сервер
$servers['cyrus'] = array(
'name' => 'Ricom Cyrus IMAP Server',
'server' => 'mail.ricom.ru',
'protocol' => 'imap/notls',
'port' => 143,
'folders' => ,
'namespace' => 'INBOX.',
'maildomain' => 'ricom.ru',
'realm' => 'ricom.ru',
'preferred' =>
);
Ну вот и все. :) Проверяем, тестируем, наслаждаемся :)
Ссылки
Gentoo wiki
http://cyrus.org.ru/altnamespace.html#altnameconfig
Результаты тестирования
http://small.dropbear.id.au/myscripts/postfixmysql.html
Не понятно многое...