From: Sergey Levashev (aka Chek) <chek@alt.ru.>
Newsgroups: email
Date: Mon, 20 Oct 2005 14:31:37 +0000 (UTC)
Subject: Установка и настройка почтовой системы на базе Posfix
Вторая редакция. В которой Винни-пух... зачитался. В которой я
постараюсь учесть все спасибы, замечания и конструктивную критику
читателей.
- Postfix (http://postfix.org) - MTA
- PostgreSQL (http://postgresql.org) - БД
- Courier-Authlib (http://www.courier-mta.org) - Демон и библиотека аутентификации
- Courier-Imap (тамже) - IMAP и POP демон
- Maildrop (тамже) - MDA
- SqWebMail (тамже) - Веб-интерфейс для работы с почтовыми ящиками
- ClamAV (http://www.clamav.net/) - Фриварный антивирус
- SpamAssassin (http://spamassassin.apache.org/) - Убийца и маркировщик спама
- AWStats (http://awstats.sourceforge.net/) - Генератор статистики.
Преамбула
После двух недель блуждания по далёким серверам и надоедания гуглу
вопросом как связать постгрю с сендмейлом без перестройки формата базы я
нашел патчик для связки с базой. http://blue-labs.org/software/sm-pgsql/
Принцип работы не понравился.
Это было тогда, а сейчас есть сервер на базе postfix'a с довольно таки
разросшейся базой пользователей, соответственно и возросшимся потоком
спама. Я уже было начал материться благим матом, но потом вспомнил про
такой замечательный сайт www.faqs.org который ни раз меня выручал ибо
там можно покурить замечательные маны, которые из-за содержания
тетраэрфэцэола называют RFC.
Помимо RFC 822, который многние горе-админы забывают читать, там есть
RFC 1123 (очень полезный документ) и 2505. Последний должен быть более
интересен администраторам небольших компаний т.к. на крупных серверах
идёт большой поток деловой корреспонденции с криво настроенных серверов.
Я долго матерился, когда посмотрел что у меня помимо спама начало
зарезаться на сервере.
Например, сервер одной туристической фирмы (не будем называть его имени)
в хело мне выдал domain.tld, после чего был успешно послан по старой
дороге.
В прошлой статье я специально не привязывал процесс установки ПО к
платформам, ссылаясь на документацию.
Объясняю почему так. Мне неприятно читать статьи по типу "Ставим ЭТО на
ЭТО (версия прилагается)".
Особенно когда ещё приводятся скрипты под эту платформу. Бросаешь это
чтиво и начинаешь изучать INSTALL и README,который есть в любой софтине.
Администратор всёравно знает как ставить софт на администрируемую им
платформу, поэтому чтоб не толочь воду в ступе лучше описать подводные
камни, которые обязательно встретятся. Это моё мнение, я не хочу
огорчить, расстроить или оскорбить авторов таких статей.
И всё же. Весь перечисленный софт есть в rpm, портежах Генты и портах
FreeBSD за исключением AWStats. Я бы был признателен администраторам,
которые приведут startup скрипты и замечания по установке для платформ
на которые нет собранных пакетов вышеперечисленного ПО.
Итак, постараемся исправить сложившуюся ситуацию и описать процесс
установки с нуля.
Что нам нужно.
Для начала надо завести на ДНСе запись типа A с именем нашего будущего
сервера и указываем в нашем домене MX на наш будущий почтовый сервер.
Потом добавляем в обратную зону PTR на наше имя. Обязательно к
исполнению и обжалованию не подлежит, если не хотим проблем с отправкой
почты на другие сервера.
Устанавливаем PostgreSQL, заводим пользователя, разрешаем ему стучаться
в базу. Если сложно читать документацию, постовляемую с посгрей -
воспользуйтесь поиском.
Кратко от FDS:
# su postgres
bash-3.00$ createuser test
Разрешить новому пользователю создавать базы? (y/n) n
Разрешить новому пользователю создавать пользователей? (y/n) n
CREATE USER
bash-3.00$ createdb postfix
CREATE DATABASE
bash-3.00$
bash-3.00$ psql postfix
Добро пожаловать в psql 7.4.8 - Интерактивный Терминал PostgreSQL.
Наберите: copyright для условий распространения
h для подсказки по SQL командам
? для подсказки по внутренним slash-командам (команда)
g или ";" для завершения и выполнения запроса
q для выхода
postfix=#grant all on database postfix to test;
GRANT
postfix=#q
летим в каталог /var/lib/pgsql/data/pg_hda.conf
пишем
host postfix test 10.0.0.1/32 trust
где 10.0.0.1 это ip mail server-а
Собственно о формате БД. Для virtual_mailbox_maps нужно два поля: имени
пользователя с доменом и пути до ящика. При использовании maildrop,
который использует courier-authlib для получения пути до ящика, второе
поле необязательно. Для courier-authlib нужно имя пользователя, пароль
(открытый или хэшированный в MD5), путь до ящика, владельца и группу
владельца ящика, квоту, полное имя пользователя, дополнительные
параметры, которые указываются через запятую в одном поле.
По поводу квоты. Это очень призрачный параметр у курьера. Смысла его
использования я до сих пор не понял т.к. почта всё равно принимается
MTA.
Параметрам main.cf postfix'a virtual_uid_maps и virtual_gid_maps,
которые отвечают за владельца и группу почтовых ящиков, мы установим
статическое значение - uid и gid пользователя vmail, которого надо
завести на системе. Соответственно теже значения должны отдаваться
courir-authlib'у.
Для примера возмём таблицу mailusers на БД mail:
login varchar(50) unique, pass varchar(50), path varchar(100), fullname varchar(50)
login - имя пользователя с доменом, pass - некриптованый пароль, path - путь до ящика,
fullname - полное имя пользователя.
Этого хватит. Остальное мы зададим в запросе.
Устанавливаем Courier-Authlib и модуль для работы с постгресом. Для
rpm-based - courier-authlib и courier-authlib-pgsql.
PGSQL_HOST хост.где.находится.база
PGSQL_PORT 5432
PGSQL_USERNAME имя
PGSQL_PASSWORD пароль
PGSQL_DATABASE база данных с пользователями и их паролями
PGSQL_SELECT_CLAUSE SELECT login as username,'' as cryptpw,
pass as clearpw,506 as uid,
506 as gid,'/mailboxes/'||substring(c.login from 1 for 1)||'/'||c.login as home,
'' as maildir,
30 as quota,fullname,
'disableimap' as options
where login = '$(local_part)'||'@'||'$(domain)';
#'/mailboxes/'||substring(c.login from 1 for 1)||'/'||c.login as home -- пользовательские ящики с путями /mailboxes/первая_буква_логина/логин
# просто мне так больше нравится.
#gid 506 и uid 506 - пользователь vmail, которому будет принадлежать вся почта
Читаем документацию. Запускаем.
Затем устанавливаем Courier-Imap и Maildrop.
в /etc/maildroprc пишем:
`test -f $HOME/.mailfilter`
if ( $RETURNCODE == 0 )
{
include '.mailfilter'
if ( $QUIT )
REASON="users's filter"
}
to 'Maildir/.'
Это нужно для того, чтобы в директории ящика пользователя при
необходимости можно было создать индивидуальные правила в файлике
.mailfilter
Устанавливаем SpamAssassin 3.1.0
Читаем документацию, устанавливаем все необходимые перловые модули и DCC.
Razor2 не является открытым - не используем.
Если нет startup скрипта, можете воспользоваться нижеприведённым
spamd.rc
--virtual-config-dir=/mailboxes_conf/%u используется для создания
индивидуальных настроек. spamd будет работать от пользователя clamav.
Подробности в документации.
Правим файлы /etc/mail/spamassassin/v310.pre и init.pre на свой вкус и
цвет. Ниже приведу свои настройки.
Потом подсовываем sa-learn писем 300-400 spam'a и 300-400 ham'a.
Подробности по [[code]]sa-learn --help[[/code]] Если попалась
корреспонденция в idx (формат аутлука), то в mailbox можно перегнать
перловым скриптом mbx2mbox (ищем в гугле).
В данной конфигурации проскакивает 3% спама на мой ящик, жалоб от
пользователей не было.
% make tidy
% make -f Makefile.init makefiles
'CCARGS=-DHAS_PGSQL -I/usr/local/include/pgsql'
'AUXLIBS=-L/usr/local/lib -lpq'
Then just run 'make'.
собираем, устанавливаем. Заводим пользователя vmail. О том как связать
postfix и clamav через clamsmtpd читаем
http://www.nixp.ru/cgi-bin/go.pl?q=articles;a=clamav_postfix
В /etc/postfix/access разрешаем хостам отправлять почту через нас
Перенаправляем всю почту на наш хост в виртуал, правим /etc/postfix/transport:
то.что.указано.в.myhostname virtual:
Опять же мне так больше нравится. Теперь нет локальных пользователей.
Не забудем поправить myorigin на наш домен.
В /etc/postfix/virtual у нас теперь алиасы виртуальных пользователей,
alias_maps и alias_database не возымеют над виртуальными пользователями
никакой власти, а локальных у нас теперь нет.
mynetworks = hash:/etc/postfix/access, cidr:/etc/postfix/access.cidr
#cidr нужен чтоб разрешать сети по маскам так как в хеше это невозможно
mynetworks_style = subnet
in_flow_delay = 1s
content_filter = scan:127.0.0.1:10025
receive_override_options = no_address_mappings
#Про это мы уже где-то читали...
smtpd_client_restrictions =
check_client_access hash:/etc/postfix/access,
permit_mynetworks,
# reject_unknown_client, я уже писал выше про кривую настройку некоторых серверов, поэтому не используем
reject_rhsbl_client sbl-xbl.spamhaus.org,
reject_rhsbl_client bl.spamcop.net,
reject_rhsbl_client combined.njabl.org,
reject_rbl_client sbl-xbl.spamhaus.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client combined.njabl.org,
check_client_access regexp:/etc/postfix/client_check.pcre
transport_maps = hash:/etc/postfix/transport
virtual_mailbox_domains = тут пару-тройку наших доменов, исключая mydestination
virtual_mailbox_base = /mailboxes
virtual_transport = maildrop
virtual_mailbox_maps = pgsql:/etc/postfix/mailbox.pgsql
virtual_uid_maps = static:506
#пользователь vmail
default_process_limit = 200
virtual_gid_maps = static:506
virtual_mailbox_limit = 51200000
#с maildrop не работает
#пока не нашел универсальное решение проблемы размера ящика
Теперь подробнее о файлах /etc/postfix/mailbox.pgsql и
/etc/postfix/client_check.pcre В /etc/postfix/mailbox.pgsql мы указываем
посфиксу каким макаром искать пользователя в БД
hosts = адрес машины с БД
user = владелец БД
password = соответственно пароль
dbname = mail #то, что приводили для примера
query = SELECT substring(c.login from 1 for 1)||'/'||c.login||'/Maildir/' from mailusers where login = '%u'||'@'||'%d';
Таким образом наличие пути говорит о наличии ящика на сервере.
В /etc/postfix/client_check.pcre зафильтруем всякие adsl'и и диалапы с
кабельным ТВ откуда не идёт ничего хорошего (исходный вариант нашел на
опеннете)
/(modem|dia(l|lup)|dialin|dsl|p[cp]p|cable|catv|poo(l|les)|dhcp|client|customer|user|[0-9]{6,})(-|.|[0-9])/ 550 Are you spamer?
/([0-9]{,4}-[0-9]{,4}-[0-9]{,4}-[0-9]{,4})/ 550 Are you spamer?
/([0-9]{,4}.[0-9]{,4}.[0-9]{,4}.[0-9]{,4}.{4,})/ 550 Are you spamer? If you think that the system is mistaken, please report details to abuse@mydomain.ru
Т.к. maildrop не умеет автоматом создавать директорию ящика, придётся его этому обучить.
В master.cf правим:
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}
на
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/etc/postfix/test -d ${recipient}
/etc/postfix/test
#!/bin/bash
if ! test -d /mailboxes/${2:0:1}/$2; then
mkdir /mailboxes/${2:0:1}/$2 && /usr/local/bin/maildirmake /mailboxes/${2:0:1}/$2/Maildir ;
fi
/usr/local/bin/maildrop $@
exit $?
SpamAssassin можно теперь сделать индивидуально или глобально, также
пользователи могут иметь свои white и black листы (читаем документацию)
для глобальной проверки почты spamassassin'om в /etc/maildroprc
Добавляем в начало:
if ( $SIZE < 256000 ) # Filter if message is less than 250k
{
#Если хотим, чтобы спам зарезался на месте:
if ( /^X-Spam-Status: *Yes/)
{
to "/dev/null"
}
Для проверки индивидуально - делаем тоже самое в файле
/mailboxes/firs_char_of_user/user/.maildroprc Если хотим сделать
красивее, то создаём файлик /mailboxes/scheck, в него пишем:
if ( $SIZE < 256000 ) # Filter if message is less than 250k
{