FreeSource: AltLinux/Документация/PostfixCyrusImap

Эта страница была перенесена на 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

Настройка Cyrus-Imap

Настройка SASL и подготовка cyradm

Управление пользователями

Настройка Amavisd-New, Clamav, SpammAssassin и MySQL

Запуск и проверка

Настройка IMP

Установка необходимых пакетов

И так. Для почтовой системы нам понадобится установить (если они еще не установлены) следующие пакеты в систему:

Внимание: версии пакетов у вас могут отличаться. Так в частности 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

Мы будем настраивать Postfix как сервер smtp с поддержкой авторизации через SASL. Всю почту, которую Postfix будет принимать, он будет отдавать Cyrus-imap по протоколу lmtp. Прежде чем попасть к Cyrus-imap почта будет проходить проверку антивирусами и спамофильтром. При приеме сообщений, Postfix будет проверять их (начиная с этапа HELO/EHLO соединения) с помощью greylisting-технологии, по некоторым online blacklist сервисам и по собственному blacklist, который будет находиться в My SQL базе. Все пользователи почтовой системы будут виртуальными (т.е. не будут иметь соответствующих unix accounts), за исключением служебных пользователей, типа webmaster, postmaster и т.д.

И так. Сначала нам нужно объявить Postfix внешним сервисом (так как по умолчанию он доставляет только локальную почту):

#control postfix server

Теперь отредактируем файл /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 (если такого файла нет, просто создайте его там) и пропишем в нем следующее:

pwcheck_method: auxprop

А теперь перейдем к Cyrus-Imap.

Содержание

Настройка Cyrus-Imap

Ну что же, с postfix пока закончим. Приступим теперь к настройке собственно Cyrus-Imap – нашего pop3 и imap демона :) Выбор именно Cyrus-а был основан на трех простых вещах:

  1. Он поставился из коробки ALT Linux Master 2.4 по умолчанию :)
  2. Он имеет более мощные возможности в принципе (хотя я думаю что я использую его дай бог на 10%
  3. Он не так уж сложен в настройке (по крайней мере в настройке как простого 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:

pwcheck_method: sasldb

Собственно с SASL на этом все. Вот если бы мы делали через mysql.... Но это совсем другая история :) И довольно хорошо описанная в этом вот HOW-TO.

Теперь перейдём к подготовке cyramd. Cyramd – это интерфейс к базе Cyrus-Imap. Через него можно управлять ящиками пользователей (создавать, удалять, устанавливать права, создавать папки и т.д.). Собственно, единственное что нам понадобится, это завести в базу SASL пользователя cyrus, которого мы указали в качестве Cyrus администратор в /etc/imapd.conf. Если вы указали там другого, соответственно нужно добавить в базу SASL вместо cyrus. Использовать root для этого не рекомендуется.

# saslpasswd2 -c cyrus

И укажите пароль когда вас попросят. А теперь внесите пользователей 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 для добавления пользователя.

# mailmgr --add morsov

Скрипт создаст ящик в Cyrus-Imap, даст пользователю cyrus права на его удаление, добавит пользователя в базу SASL (попросит ввести пароль), добавит имя пользователя в файл пользователей почтовой системы. После этого скрипт запросит алиас для пользователя. Если вы не хотите давать алиас, просто нажмите ENTER. Скрипт не умеет добавлять алиасы отдельно от имен пользователей, соответственно, если вы захотите добавить алиас в будущем, просто отредактируйте соответствующий файл.

Справку по использованию скрипта mailmgr можно получить командой

# mailmgr --help

Содержание

Настройка 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

Теперь сделайте таблицу нужную для Postfix. Возьмите файл postfix.sql от http://mail.ricom.ru/alt/ и просто подгрузите его командой

# mysql -D postfix <postfix.sql

А теперь дадим пользователю postfix права на операции с этой базой:

# mysql

В принципе 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:

# service httpd restart

и убедимся что он у нас стартует при загрузке

# 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( исправте строку

'status' => 'active'

Теперь в файле 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

Не понятно многое...