Автор: Морсов Алексей (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.
Настройка SASL и подготовка cyradm
И так. Для почтовой системы нам понадобится установить (если они еще не установлены) следующие пакеты в систему:
Внимание: версии пакетов у вас могут отличаться. Так в частности 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).
Примечание: sqlgrey не входит в поставку ALT Linux Master 2.4, но он есть в «Сизиф» и кажется в Backports.
Так же необходимо проконтролировать, что My SQL-server установлен и запущен.
Для web-интерфейса будем использовать IMP. Для этого понадобятся пакеты:
Мы будем настраивать 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 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):
###
myhostname = mail.ricom.ru
mydomain = ricom.ru
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain, $mydomain
mynetworks = $config_directory/mynetworks
Файл mynetworks содержит список ваших доверенных сетей, например:
192.168.130.0/24
Теперь настроим таблицы пользователей, алиасы и транспорт для них:
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-соединений:
##
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
И пропишем правила доступа для smtp-соединений. Сначала попросим «представиться» и корректно формировать заголовки письма. Описания остальных правил (и для чего они именно нужны) можно (и нужно) посмотреть в SMTPD_ACCESS_README.
##
maps_rbl_domains = dul.ru
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_unauth_destination,
check_policy_service inet:127.0.0.1:2501
smtpd_sender_restrictions = permit_mynetworks,
reject_unknown_sender_domain,
reject_unverified_sender,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
check_sender_access mysql:/etc/postfix/sender_access.cf
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
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) выглядит так:
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.
Ну что же, с postfix пока закончим. Приступим теперь к настройке собственно Cyrus-Imap – нашего pop3 и imap демона :) Выбор именно Cyrus-а был основан на трех простых вещах:
Это мое субъективное мнение.
И так приступим. Для начала отредактируем файл /etc/cyrus.conf:
START {
recover cmd="ctl_cyrusdb -r"
# idled cmd="idled"
# UNIX sockets start with a slash and are put into /var/lib/imap/socket
SERVICES {
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
# nntp cmd="nntpd" listen="nntp" prefork=3
# nntps cmd="nntpd -s" listen="nntps" prefork=1
# lmtp cmd="lmtpd" listen="lmtp" prefork=0
lmtpunix cmd="lmtpd" listen="/var/spool/postfix/public/lmtp" prefork=1
# notify cmd="notifyd" listen="/var/lib/imap/socket/notify" proto="udp" prefork=1
EVENTS {
checkpoint cmd="ctl_cyrusdb -c" period=30
# Sieve or NNTP
delprune cmd="cyr_expire -E 3" at=0400
tlsprune cmd="tls_prune" at=0400
Внимание: Обратите внимание на строку с lmtpunix. Путь, указанный в ней, должен совпадать с путем, указанным в /etc/postfix/main.cf с учетом того, что Postfix завернут в chroot-jail (в данном случае в директорию /var/spool/postfix).
Теперь внесем небольшие изменения в файл /etc/imapd.conf:
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 к работе. Тут все просто. Редактируем файл /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 должна уметь его читать):
-rw-r
Поскольку все наши пользователи виртуальные, и сведения о них находятся в файлах типа 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 и команде ALT Linux. Но все же, сначала в файле /etc/amavis/amavisd.conf найдите и исправьте следующие строки:
$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_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:
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
Для начала создадим нужную базу:
Теперь сделайте таблицу нужную для Postfix. Возьмите файл postfix.sql от http://mail.ricom.ru/alt/ и просто подгрузите его командой
А теперь дадим пользователю postfix права на операции с этой базой:
В принципе Postfix-у нужно только доступ на чтение, но поскольку My SQL у нас работает только на локальном интерфейсе, то можно и дать все права. А уж если вы собираетесь использовать autospambann – то права на INSERT тоже должны быть.
Ну вот, теперь все вроде бы настроено и прописано. Осталось все это запустить и проверить.
И так, чтобы вся эта машинерия работала, нужно всех их перезапускать. И так:
# service mysqld start
# service sqlgrey start
# service cyrus-imapd start
# service postfix start
Проверяем, работает ли почта. Если все работает, убедимся что все указанные сервисы будут стартовать при загрузке системы:
Должны быть видны следующие записи:
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. Если у вас какого-то из процессов не хватает, сделайте для него:
Все. Все красиво, все хорошо. Осталось только прикрутить Web-интерфейс ко всему этому хозяйству.
IMP ставится в директорию к Apache /var/www/html/addon-modules/horde/imp/. Сам IMP реализован под Horde. После установки доступ к директориям horde/ и horde/imp/ дан только для локального хоста. Откроем дуступ к этим папкам извне. Для этого найдем в этих директориях файлы .htaccess (или создайте их с правами 640 и владельцами root.apache) и пропишите в них следующее:
Allow from all
После этого, отредактируем файл /etc/httpd/conf/httpd.conf, в самом конце которого должны быть строчки
Include conf/addon-modules/imp.conf
Теперь убедимся, что в файле /etc/httpd/conf/addon-modules.d/horde.conf есть такие строки:
Options Indexes Follow Sym Links
Allow Override Auth Config Limit
и в файле /etc/httpd/conf/addon-modules.d/imp.conf такие:
Allow Override Auth Config Limit
Теперь перезапустим сервер Apache:
и убедимся что он у нас стартует при загрузке
httpd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
Теперь осталось только настроить сам IMP. Сначала в файле horde/config/registry.php раскоментируйте строки
$this->registry['auth']['logout'] = 'imp';
а в блоке начинающемся с $this->applications['imp'] = array( исправте строку
Теперь в файле horde/imp/config/servers.php отредактируйте второй описанный сервер
'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
Не понятно многое...