From: raVen <iam@raven.elk.ru>
Newsgroups: http://raven.elk.ru/
Date: Mon, 24 Jun 2003 13:01:37 +0000 (UTC)
Subject: Настройка postfix с возможностью шифрования и защиты от вирусов и спама
всё, что описано в данном how-to вы используете на свой страх и
риск. я, как автор за ваши действия и любые потери, связанные с
ними ответственности не несу. кое-что для этого how-to я взял из
how-to mysql+cyrus-sasl+courier-imap+postfix+openssl Вячеслава
Калошина <multik@multik.ru >, пусть не обижается - я не присваиваю
авторство, а information must be free.
дополнения, исправления и пожелания категорически приветствуются,
но, пожалуйста, учтите, что я не являюсь благотворительной
организацией, бесплатных консультаций не оказываю и время своё
ценю очень дорого. а данное how-to является желанием моей левой
пятки помочь кому-нибудь поднять красивую и практичную почтовую
систему.
кроме того, всё, что здесь описано - описано исключительно для
операционной системы FreeBSD 4-STABLE и для других unix-like ОС
это очень и очень вряд ли подойдёт. особенно для пингинуксов. ну
не символично ли: птица которая не умеет летать.
2. введение.
для чего всё это нужно. наша задача заключается в том, чтобы
создать близкую к идеальной почтовую систему, которая могла бы
делать с почтой абсолютно всё и без головной боли. необходимое для
этого ПО уже существует достаточно давно и нужно лишь свести его в
одно целое, чем мы и займёмся. если вы уже знакомы с данным
набором ПО, то можете пропустить остаток введения и читать дальше.
но можете и прочитать, всё таки я старался ;-)
+ postfix 2
вообще, до некоторого времени стандартным решением был
sendmail. но когда я начал заниматься *nix системами, то
postfix существовал уже как достаточно стабильный проект
(только появилась версия 1) с нормальным конфигурированием, в
котором не нужно было изучать жестокий язык sendmail а также
непонятно зачем нужный язык макросов m4. собственно postfix и
был выбран за внятное конфигурирование, до которого
sendmail'у как пешком до луны.
+ cyrus-sasl 2
собственно, другого SASL (модуля авторизации для SMTP) я не
нашёл. да и этот очень неплохо выполняет свои функции.
+ kaspersky antivirus
вот это уже всего лишь моё личное предпочтение. лаборатория
Касперского(TM) прекрасно разбирает вирусы, регулярно
пополняет антивирусную базу, да и что уж скромничать:
антивирус у них прекрасный. но всё это справедливо для их
windows-продуктов, а под *nix они программировать совершенно
не умеют. именно поэтому я не стал использовать в своей
конструкции их kavdaemon и kav/postfix, ибо их надо запускать
с привилегиями root, а этого мне совсем не хочется делать :-)
+ spamassassin
великолепный инструмент для борьбы со спамом. содержит
большое количество критериев отбора спама и письма спамеров,
которые не знают о существовании spamassassin, очень хорошо
ловит.
+ courier-imap
простой и понятный pop3/imap сервер, работает с maildir, что
нам и нужно. умеет брать данные о пользователях из
mysql/postgresql чем и отличен. больше ничего хорошего, как,
собственно, и плохого про него сказать не могу :)
+ mysql
записная книжка с sql интерфейсом. может выдать данные из
базы по запросу, а может положить данные в базу по запросу.
больше ничего не умеет, но от неё ничего и не требуется.
3. настройка mysql
в этом пункте я намеренно пропускаю описание установки и
конфигурирования mysql как sql сервера и расскажу только то, что
нужно непосредственно для работы нашей системы. делаю это я для
того, чтобы на самом начале отсеять людей ничего не понимающих из
того, что мы собираемся делать и кроме того, я уже давно потерял
интерес к mysql как самостоятельному sql серверу.
+ итак, создаём базу данных для наших программ:
create database mail;
use mail;
+ создаём таблицы с необходимыми индексами. первая таблица
transport - описания транспортов для наших виртуальных
доменов. сразу добавляем туда наш единственный домен -
raven.elk.ru с транспортом virtual.
create table transport(
domain varchar(255) not null default '',
transport varchar(255) not null default '',
comment text,
primary key(domain)
);
insert into transport(domain, transport)
values('raven.elk.ru','virtual:');
+ следующая таблица - алиасы адресов. смысл её в том, что если
postfix увидит письмо на адрес указанный в поле alias, то это
письмо будет переправлено на адрес в соответствующем поле
rcpt. адреса в полях могут принадлежать одинаковым доменам,
разным доменам, а так же там могут быть адреса, которые не
принадлежат нашим доменам ;) просто если, вдруг, письма с
такими адресами получателя будут проходить через наш MTA
(например от наших пользователей), то postfix изменит их
адреса получателя и письма уйдут туда, куда мы их отправим.
create table aliases(
alias varchar(255) not null default '',
rcpt varchar(255) not null default '',
comment text,
primary key(alias)
);
insert into aliases(alias, rcpt)
values('root@raven.elk.ru', 'iam@raven.elk.ru');
insert into aliases(alias, rcpt)
values('abuse@raven.elk.ru', 'iam@raven.elk.ru');
insert into aliases(alias, rcpt)
values('mailer-daemon@raven.elk.ru', 'iam@raven.elk.ru');
insert into aliases(alias, rcpt)
values('postmaster@raven.elk.ru', 'iam@raven.elk.ru');
insert into aliases(alias, rcpt)
values('hostmaster@raven.elk.ru', 'iam@raven.elk.ru');
insert into aliases(alias, rcpt)
values('iam@raven.elk.ru', 'me@raven.elk.ru');
+ далее идёт таблица - список наших логинов. поля login,
password и maildir очевидны, можете посмотреть на примере в
insert. единственное, хотелось бы подчеркнуть, что значения
поля maildir обязательно должны заканчиваться знаком '/'
(slash) иначе virtual (транспорт) почту будет валить в
обычный unix mailbox с соответствующим именем, а нам нужен
именно maildir. если бы не тупой mysql в качестве sql
сервера, то можно было бы установить rule и trigger, которые
бы самостоятельно заполняли поля исходя из логина, но в mysql
такого без порядочного геморроя не сделать.
поля expired, antivirus и antispam соответственно обозначают
expired ли логин, нужно ли проверять его антивирусом и
антиспамом. подобные услуги для пользователей стоит делать
платными, так как всё таки они откушивают очень много
ресурсов у почтового сервера по сравнением с обычной
доставкой почты. а антивирус вообще стоит денег, хоть тут мы
его и будем использовать бесплатно, пользуясь дыркой в
системе работы с ключами ;-) что совершенно законно, между
прочим.
insert into users(login, password, maildir)
values('me@raven.elk.ru', encrypt('password:)'), 'raven.elk.ru/me/');
insert into users(login, password, maildir)
values('test@raven.elk.ru', encrypt('password1:)'), 'raven.elk.ru/test/');
insert into users(login, password, maildir)
values('test1@raven.elk.ru', encrypt('password2:)'), 'raven.elk.ru/test1/');
+ казалось бы это всё, но нет. следующая таблица решает
проблему 'старшего брата'. здесь мы не будем обсуждать
моральную сторону этого вопроса, но ни для кого не секрет,
что очень многие гендиры корпораций желают (и получают) копии
всех писем сотрудникам на свой ящик. опция always_bcc в
postfix решает этот вопрос, но мы же крутые админы и не
хотим, чтобы начальник читал нашу личную почту, верно? да и
не только нашу. всегда существуют исключения в виде
симпатичных секретарш или других особей женского пола которые
рады отблагодарить админа за его доброту. шутка ;-)
примеры insert'ов демонстрируют систему работы скрипта,
который обрабатывает эту таблицу. первое правило:
поле type 'delivered-to'. этим правилом будут ловится все
письма, у которых в служебной строке delivered-to встретился
адрес, попавший под маску в регулярных выражениях,
соответствующую полю mask (персонально для mysql не забываем
экранировать знак back slash '' им же самим, а для перловых
регэкспов служебные символы). в поле forward_addr хранится
адрес, на который нужно копировать письмо, если оно подошло
под условия. поле what установлено в буковку 'i', что значит
(i)nclude, т.е. включающее правило. таким образом в первом
примере будет ловится вся почта для домена raven.elk.ru и
копироваться на адрес me@raven.elk.ru.
второе правило - это исключение из первого примера адреса
test1@raven.elk.ru. т.о. в комплексе этих двух правил на
адрес me@raven.elk.ru будет копироваться вся почта для домена
raven.elk.ru, исключая адрес test1@raven.elk.ru.
create table forward(
id int(10) unsigned not null auto_increment,
type varchar(50) not null default 'delivered-to',
mask varchar(255) not null default '.+',
forward_addr varchar(255) not null default 'root',
what char not null default 'i',
comment text,
primary key(id),
key what(what),
key type_mask(type, mask)
);
insert into forward(type, mask, forward_addr, what, comment)
values('delivered-to', '[a-z0-9- _]+\@raven\.elk\.ru', 'me@raven.elk.ru',
'i', 'forwarding all mail for raven.elk.ru');
+ теперь осталось создать пользователей в mysql и выдать им
соответствующие права на доступ к нашим таблицам.
пользователь mailer - это наши демоны, в числе которых будет
postfix, courier-imap и cyrus-sasl2 в лице pam-mysql :-) а
пользователь mail_admin - это эникейщик в нашей конторе,
которого можно допустить до базы через phpMyAdmin и заставить
его самого делать почтовые эккаунты юзерам, а самим
расслабляться и пить пиво ;)
grant select on mail.* to mailer@localhost
identified by 'mailer_password';
grant select, insert, update on mail.* to mail_admin@localhost
identified by 'mail_admin_password';
4. настройка MTA/MDA
в этом разделе мы начнём с конца и поставим сначала то, что нужно
основному "виновнику торжества" - postfix'у.
cyrus-sasl2
для начала поставим cyrus-sasl2. в зависимости от свежести вашего
дерева портов может быть два варианта. для более старого дерева
портов вы можете просто сделать:
cd /usr/ports/security/cyrus-sasl2
make -DWITHOUT_OTP -DWITHOUT_CRAM -DWITHOUT_DIGEST -DWITHOUT_NTLM
перед началом сборки должно вылезти красивое текстовое окошечко с
кучей опций, из которых для нас важна только одна. остальные
желательно убрать, оставив только:
[X] SASLAUTHD
после того, как cyrus-sasl2 собрался, то стандартно:
make install clean
ежели красивого окошечка не выскакивало, то, значит, у вас свежие
порты и после всех этих действий у вас все ещё не хватает нужного
нам saslauthd. его можно поставить вот таким образом:
cd /usr/ports/security/cyrus-sasl2-saslauthd
make install clean
но повторяю, что данный порт есть только в новых портах, в старых
портах он включён в порт cyrus-sasl2 и не нужен. теперь поправим
конфиг для активации этого самого saslauthd в postfix. редактируем
/usr/local/lib/sasl2/smtpd.conf:
pwcheck_method: saslauthd
теперь надо поставить pam-mysql. это делается стандартно:
cd /usr/ports/security/pam-mysql
make install clean
после прочтения и осмысливания
/usr/local/share/doc/pam_mysql/Readme добавим в /etc/pam.conf
следующие строчки:
/usr/local/etc/rc.d/saslauthd.sh start
ps ax|grep sasl
363 ?? IWs 0:00,00 /usr/local/sbin/saslauthd -a pam
367 ?? IW 0:00,00 /usr/local/sbin/saslauthd -a pam
368 ?? IW 0:00,00 /usr/local/sbin/saslauthd -a pam
369 ?? IW 0:00,00 /usr/local/sbin/saslauthd -a pam
370 ?? IW 0:00,00 /usr/local/sbin/saslauthd -a pam
если результат примерно такой, то значит всё прошло нормально,
cyrus-sasl2 поставлен и теперь можно перейти к настройке postfix.
postfix2
как обычно:
/usr/ports/mail/postfix
make install clean
должна вылезти красивая и совсем не юниксоидная ;) менюшка, в
которой нам надо выбрать следующие опции:
[X] SASL2
[X] TLS
[X] MySQL
если какой-то из опций у вас не обнаружилось, поздравляю, у вас ну
очень старые порты и надо обновлять. как это делать - не в этом
how-to да и вообще ни в каком, читайте handbook - там всё
написано. после установки порт должен сказать, что делать дальше
это мы сразу и сделаем. в /etc/rc.conf исправим:
не торопимся сохранять и закрывать /usr/local/etc/postfix/main.cf,
а допишем туда:
# с каким кодом отшивать письма от open relays:
maps_rbl_reject_code = 554
# принимать письма от:
# авторизованных клиентов
# от сетей, указанных в параметре mynetworks
# отшивать письма от:
# не для наших доменов и пользователей
# для хостов, который есть в списках open relays
# (подробности на www.ordb.org)
# наши ключи. генерируются с помощью courier-imap (далее)
#smtpd_tls_key_file = /usr/local/share/courier-imap/pop3d.pem
#smtpd_tls_cert_file = $smtpd_tls_key_file
#smtpd_tls_CAfile = $smtpd_tls_key_file
сохраняем /usr/local/etc/postfix/main.cf и напишем maps файлы для
mysql:
/usr/local/etc/postfix/sql/transport.cf:
user = mailer
password = mailer_password
dbname = mail
table = transport
select_field = transport
where_field = domain
hosts = localhost
/usr/local/etc/postfix/sql/users.cf
user = mailer
password = mailer_password
dbname = mail
table = users
select_field = maildir
where_field = login
additional_conditions = and expired = '0'
hosts = localhost
/usr/local/etc/postfix/sql/aliases.cf:
user = mailer
password = mailer_password
dbname = mail
table = aliases
select_field = rcpt
where_field = alias
hosts = localhost
/usr/local/etc/postfix/sql/gids.cf:
user = mailer
password = mailer_password
dbname = mail
table = users
select_field = 6
where_field = login
additional_conditions = and expired = '0'
hosts = localhost
/usr/local/etc/postfix/sql/uids.cf:
user = mailer
password = mailer_password
dbname = mail
table = users
select_field = 1009
where_field = login
additional_conditions = and expired = '0'
hosts = localhost
по поводу последних двух файлов нужно заметить, что реально полей
для gid и uid в таблицах нет, ибо они все одинаковые и прописаны
прямо в параметре select_field. чтобы узнать значения gid и uid
для вашей системы, вам нужно посмотреть в /etc/passwd и /etc/group
какие uid и gid принадлежат пользователю postfix (которого
добавляет порт /usr/ports/mail/postfix) и группе mail. и прописать
соответствующие значения в последних двух sql файлах.
если вы всё сделали правильно, то ваш MTA и MDA успешно настроен.
теперь нужно создать каталог virtual mailbox base и выставить ему
атрибутов:
теперь можно запускать postfix. запускаем для начала 'postfix
check' и смотрим, что он скажет на свою конфигурацию. если всё
нормально, то запускаем: 'postfix start'. если postfix на что-то
ругнулся, то надо это что-то исправить, к тому же postfix он не
настолько злобный и на всякую ерунду не ругается.
ну что ж, настала пора проверить SMTP часть нашего MTA:
telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 raven.elk.ru mail sterver
mail from: user@aol.com
250 Ok
rcpt to: me@raven.elk.ru
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
test message
.
250 Ok: queued as AB11E334F2
quit
221 Bye
Connection closed by foreign host.
если у вас в консоли всё примерно так же, как и выше, то SMTP
часть у вас работает нормально.
теперь проверим возможность авторизации:
telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 raven.elk.ru mail sterver
ehlo aol.com
250-raven.elk.ru
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-XVERP
250 8BITMIME
AUTH PLAIN bWVAcmF2ZW4uZWxrLnJ1AG1lQHJhdmVuLmVsay5ydQBwYXNzd29yZDop
235 Authentication successful
строка 'bWVAcmF2ZW4uZWxrLnJ1AG1lQHJhdmVuLmVsay5ydQBwYXNzd29yZDop'
справедлива для логина 'me@raven.elk.ru' и пароля 'password:)'.
генерируется эта строчка следующим образом:
если диалог с почтовым сервером прошёл как показано выше, то
значит авторизация работает. если же нет, то, читайте
/var/log/maillog. вероятно, вы что-то не так сделали и очень
вероятно, что чтение данного лога поможет выяснить что же
конкретно неправильно.
5. настройка POP3 сервера
роль POP3 сервера в нашей системе играет courier-imap. хоть он и
называется -imap, но умеет работать на двух разных протоколах:
IMAP и POP3. первый лично мне совсем-совсем не нужен, поэтому я
использую только второй. вот его-то мы сейчас и настроим. для
начала поставим этот самый courier-imap:
теперь сгенерируем сертификат для нашего почтового сервера. для
этого сначала нужно отредактировать
/usr/local/etc/courier-imap/pop3d.cnf:
RANDFILE = /usr/local/share/courier-imap/pop3d.rand
оно будет очень долго возиться с генерацией случайных значений, вы
в это время можете поделать чего-нибудь своё, либо пойти попить
кофе. после готовности сертификата можно запускать courier-imap:
telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Hello there.
user me@raven.elk.ru
+OK Password required.
pass password:)
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 623
.
quit
+OK Bye-bye.
Connection closed by foreign host
так как наш сертификат готов теперь можно раскомментировать tls
часть main.cf у postfix, и перезапустить его: 'postfix reload'.
теперь на ehlo он кроме всего прочего будет предлагать ещё и опцию
STARTTLS и доставлять письма на удалённые smtp тоже будет по TLS,
если удалённый сервер на ehlo среди прочего отвечает STARTTLS.
6. настройка фильтров (антивирус, антиспам и форвардер)
я сразу хотел бы заметить, что все фильтры в данном how-to
представляют собой perl скрипты со всеми вытекающими
последствиями. отсюда следует, что вам стоит сопоставить
конфигурацию своего почтового сервера с нагрузкой на него, что бы
не получилось так, что в результате работы фильтров пропускная
способность сервера оказалась меньше средней почтовой нагрузки.
например, spamassasin даже на очень хорошей машине (в моём случае
это p3-866/256ram) обычное письмо обрабатывает более 10 секунд. а
если письмо большое, то и того больше.
но в принципе ничего страшного в том, что вы сейчас настроите
фильтры нет, ибо, как можно было убедиться при создании таблиц в
mysql, всем пользователям фильтры можно отключить и письмо будет
летать мимо них, пусть загружая сервер собой чуть больше, но
нагрузка эта незначительная. если вы все ещё со мной, тогда
вперёд!
kaspersky antivirus
поставим его, родного. живёт package для BSD систем где-то в
районе ftp://ftp.avp.ru/patches/. качнём и поставим его:
cd /var/tmp
wget -c ftp://ftp.avp.ru/patches/KAVUnix4.0.3.0_UrgentUpdate1/FreeBSD/4.x/kav-W
orkStationSuit-4.0.3.1-FreeBSD-4.x.tgz
pkg_add kav-WorkStationSuit-4.0.3.1-FreeBSD-4.x.tgz
нефиг ему запускаться под рутом:
rm -f /usr/local/etc/rc.d/kavd.sh
теперь, если вы хотите использовать kavscanner совершенно законно
и нахаляву, то вам необходимо скачать вот этот файлик.
http://raven.elk.ru/unix/how-to/postfix2+cyrus-sasl2+kav+spamassassin+courier-imap+tls+mysql+FreeBSD4/kav.rar
внутри архива находится старая версия kavscanner, которая глючит при
работе со своими же ключами и при комбинации двух определённых
ключей всегда считает себя зарегистрированной. как вы правильно
догадались, эти два ключа лежат в том же архиве ;-) вам нужно
заменить kavscanner из дистрибутива бинарником из архива и
положить два ключа в /etc/AVP.
теперь нам надо подкорректировать конфиги Касперского. идём в
/etc/AVP и правим. описание конфигов есть на том же
ftp://ftp.avp.ru где-то в районе документации. там такой здоровый
pdf метров на 10, в котором подробное описание всего пакета. среди
него есть и описания конфигов. я просто привожу здесь свои
варианты конфигов. они у меня работают на нескольких серверах.
/etc/AVP/AvpUnix.ini:
так же в пакете kav-scanner идёт утилита и скрипт для обновления
антивирусных баз. утилита вроде бы нормальная, хоть и требует wget
:) а вот вот скрипт дико кривой. я не помню, что я там уже правил,
а правил, видимо всё таки много, так как отличий от стандартного
нашлось целая куча. в общем вот он этот скрипт
/etc/periodic/daily/900.kavupdater:
if [ ! -x /usr/local/bin/wget ]; then
echo "$0: wget must be installed for the updater to run" >&2
exit 1
fi
DESC="kaspersky anti-virus updater"
if [ -r ~.AVP/AvpUnix.ini ]; then
INIFILE=~.AVP/AvpUnix.ini
else if [ -r /etc/AVP/AvpUnix.ini ]; then
INIFILE=/etc/AVP/AvpUnix.ini
fi
fi
if [ -r $INIFILE ]; then
eval `egrep '^[A-Za-z]*=' $INIFILE | perl -pe 's/r//g'`
fi
if [ -n "$UpdatePath" ]; then
DPARMS="$UpdatePath"
else
if [ -n $1 ]; then
echo "warning! add updatepath in your config file AvpUnix.ini"
exit 1
fi
DPARMS=$1
fi
if [ $? -eq 0 ]; then
$KAV_PATH/kavupdater -uik="$DPARMS" -o -y -kb
exitCode=$?
case $exitCode in
8)
echo 8 - new antiviral bases not found.
;;
6)
echo 6 - found corrupted file and process stoped on it.
;;
4)
echo 4 - found corrupted file.
;;
2)
echo 2 - process stoped on corrupted file.
;;
0)
echo 0 - antiviral bases correctly loaded.
;;
*)
echo $exitCode - i dont know this exit code!
esac
else
echo "$0: network connection error." >&2
exit 1
fi
exit 0
запустите обновлялку /etc/periodic/daily/900.kavupdater. оно
должно скачать и установить все базы для kav. после этого запуск
kavscanner должен запустится проверить /tmp и ни на что не
ругаться.
spamassassin
как обычно:
cd /usr/ports/lang/perl5
make install clean
use.perl port
cd /usr/ports/mail/p5-Mail-SpamAssassin
make install clean
потянет за собой кучу байды, но она, видимо, нужна, так что
потерпите уж. perl 5.6.1 тоже нужен для фильтровых скриптов.
отредактируем конфиг spamassassin.
/usr/local/etc/mail/spamassassin/local.cf:
# подробный отчёт
clear_report_template
report тут, похоже, привалило спама, но я его узнал и отловил. письмо, которое
пришло
report находится в приложении и его можно поглядеть, вдруг я облажался и на сам
ом деле
report это не спам.
report
report вот что там внутри: _PREVIEW_
report
report детали анализа текста письма: (набрано _HITS_ очков, _REQD_ необходимо)
report _SUMMARY_
# краткий отчёт
clear_terse_report_template
terse_report --- результаты борьбы со спамом
terse_report набрано _HITS_ очков, _REQD_ требуется;
terse_report _SUMMARY_
terse_report --- конец результатов борьбы со спамом
# если нет текста
clear_unsafe_report_template
unsafe_report а вообще это письмо не содержит текста, так что лучше его не откр
ывать, так как
unsafe_report там может быть вирус или подтверждение, что Ваш адрес может получ
ать спам ;)
unsafe_report если Вы всё таки хотите поглядеть что там такое, то лучше сохрани
ть это письмо
unsafe_report как файл и поглядеть его какой-нибудь внешней безопасной программ
ой.
# переписывать поле subject
rewrite_subject 1
subject_tag new spam received:
# эти рассылки я читаю и они умудряются определяться спамом ;)
# поэтому эти адреса добавим в whitelist
whitelist_from subscribe@74.ru
whitelist_from info@suct.uu.ru
whitelist_from suct@suct.uu.ru
whitelist_from subscribe@udaff.com
whitelist_from genocide@raven.elk.ru
кроме этого нужно добавить пользователя в системе, с правами
которого будут происходить все проверки на спам и на вирусы.
пользователь должен быть вот такой, добавите сами ;-)
напишем и запустим скрипт для запуска и останова spamd - демона,
который значительно ускоряет работу spamassassin, правда отжирает
много памяти, но он того стоит.
/usr/local/etc/rc.d/spammerdaemon.sh:
запустим его и проверим, запущен ли он. результат должен быть
примерно такой:
/usr/local/etc/rc.d/spammerdaemon.sh start
ps ax | grep spam
338 ?? Is 0:07,50 /usr/local/bin/spamd -d -a -c -u filter (perl)
опять postfix
теперь вернёмся к postfix добавлять фильтры. открываем
/usr/local/etc/postfix/master.cf и дописываем туда следующие
строчки. обратите внимание, что для каждого фильтра (он же
транспорт) указано количество максимальных процессов - 10. вам
стоит поменять это на своё значение в зависимости от количества
свободной памяти на вашем сервере. в принципе если её много, то
можно оставить и 10. если мало, то лучше поставить значения
поменьше вплоть до 1.
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
# forwarder
forwarder
unix - n n - 10 pipe
flags=RD
user=filter
argv=/usr/local/raven/mail/forwarder.pl "localhost:10025" "${sender}" "${recip
ient}"
# from forwarder
localhost:10025
inet n - n - - smtpd
-o content_filter=genocide
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o mynetworks=127.0.0.0/8
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o myhostname=localhost
# antivirus
genocide unix - n n - 10 pipe
flags=R
user=filter
argv=/usr/local/raven/mail/antikav.pl "localhost:10026" "${sender}" "${recipie
nt}"
# from antivirus
localhost:10026
inet n - n - - smtpd
-o content_filter=spamfilter
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o mynetworks=127.0.0.0/8
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o myhostname=localhost
# spamfilter
spamfilter
unix - n n - 10 pipe
flags=R
user=filter
argv=/usr/local/raven/mail/std2lmtp.pl "localhost:10027" "antispam" "${sender}
" "${recipient}" "/usr/local/bin/spamc"
# from spamfilter to smtpd:10026
localhost:10027
inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o mynetworks=127.0.0.0/8
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o myhostname=localhost
а к /usr/local/etc/postfix/main.cf добавляем вот это:
# первый из цепочки фильтров:
content_filter = forwarder
# необходимо для корректной работы скриптов!
forwarder_destination_recipient_limit = 1
genocide_destination_recipient_limit = 1
spamfilter_destination_recipient_limit = 1
forwarder.pl, antikav.pl и std2lmtp.pl можно найти вот в этом архиве.
http://raven.elk.ru/unix/how-to/postfix2+cyrus-sasl2+kav+spamassassin+courier-imap+tls+mysql+FreeBSD4/scripts.rar
в каждом скрипте вначале есть мини конфигурация, в которой
необходимо как минимум прописать логин и пароль для mysql.
forwarder.pl - помощник 'старшего брата'. копирует письмо на
нужный адрес в случае необходимости. если нужного адреса нет, то
просто прокидывает письмо к следующему элементу в цепочке.
antikav.pl - антивирусный фильтр. с помощью модуля MIME::Tools
разбирает письмо на файлы, которые кладёт в /tmp, напускает на эти
файлы kavscanner и, парся его вывод, определяет что из этих файлов
заражено. заражённые файлы вычленяет из письма, собирает письмо
обратно с помощью всё того же MIME::Tools и отправляет следующему
фильтру в цепочке.
std2lmtp.pl - вообще это мелкий скрипт, который переправляет
содержимое stdin в на указанный адрес по smtp протоколу. в нашем
случае этот скрипт кроме простого перенаправления, на письмо ещё и
напускает указанную программу (spamc), которая в свою очередь
соединяется со spamd, который является самом spamassassin,
проверяет письмо на спамность и в случае необходимости помечает
его. ну а наш скрипт потом результат отправляет в smtpd, который
последний в цепочке фильтров и дальше уже идёт раскладка по
почтовым ящикам.
7. todo, хотелки, благодарности и всё остальное...
+ postgresql
как я уже упоминал в начале, mysql представляет из себя
записную книжку с sql интерфейсом. он, конечно, быстр, удобен
для определённых задач, но держать лишний sql сервер на
машине ради почты не очень хочется. сам я сейчас работаю
исключительно с postgresql и хотел сделать данную связку не
на основе mysql, а на основе postgresql. хотел - сделал и
даже начал писать how-to по нему, но есть одна большая
проблема.
почему-то после соединений postfix или courier-imap с
postgresql сервером, в памяти от них остаются процессы
postmaster в состоянии idle, которые потом закрываются и
сообщают в лог о том, что пришёл неожиданный eof от клиента.
причем происходит это только в случае, если клиентами
выступают postfix или courier-imap. pam_pgsql и мои перловые
тесты отрабатывают нормально.
если у кого-то получилось настроить postfix и courier-imap в
связке с postgresql, то, пожалуйста, расскажите мне iam@raven.elk.ru,
как вы это делали, я сделаю ещё один how-to, где вместо mysql
будет postgresql со всеми его фичами и, естественно
обязательно упомяну вас. очень уж хочется снести mysql со
своих серверов! он хоть и простой и быстрый, но память-то всё
равно жрёт ;)
+ квоты пользователей
очень нужная и незаменимая штука, если вы крупный isp, но
этого здесь вы пока что не найдёте. в postfix пока что нету
встроенной возможности делать квоты для пользователей, а
патчи, которые мне удалось найти в инете я либо не понял,
либо они не подошли к текущей версии postfix. разбираться
пока что нет времени.
в качестве временного решения могу предложить такой вариант.
запускать по крону некую программку, которая пересканит все
maildir пользователей и в случае, если пользователь превысил
свою квоту, то запишет ему (пользователю) значение '1' в поле
expired и напишет причину этого в поле comment, чтобы не
запутаться ;) пока что более умного в голову ничего не
пришло. да и не хочется использовать чужие непроверенные
патчи.
если, вдруг, у вас есть более красивое решение этой проблемы
или идеи, то напишите мне iam@raven.elk.ru, пожалуйста, мы вместе его
реализуем и добавим сюда.
+ благодарности
на самом деле мне некого благодарить за что-либо. всего
приходится добиваться самому, если даже кто-то и хочет
помочь, то не может, ибо это слишком сложно, а случаи в
которых мне нужна чья-либо помощь обычно дико-клинические...
поэтому я говорю спасибо только себе, за то, что ещё не сошёл
с ума от всего безумства жизни, за то, что ещё жив, по
прежнему быстр и рационален, хоть и постоянно занят :-(
+ me myself
последнее время участились случаи "приглашений" меня на
работу, чтобы я "поработал на перспективу", то есть если
называть вещи своими именам то называется это "за недорого, а
потом может чего-нибудь и будет".
мне такое положение вещей совсем не нравится, поэтому я сразу
объявлю свою цену, чтобы потенциальный работодатель не тешил
себя ложными надеждами. я готов бросить всё и пойти работать
на интересную мне работу, связанную с unix, информационными
технологиями, интернет и программированием всего этого добра.
но при этом начальная зарплата должна составлять не менее
$500 для Челябинска и $1000 для Москвы, про зарубежье
разговор отдельный, обсуждать буду только лично и только с
гендиректором приглашающей конторы - никаких отделов кадров.
при меньших зарплатах мне просто не интересно (в финансовом
плане) бросать то, что я сейчас имею в своей деревне, которая
называется Челябинск. в страны СНГ и прочие Хабаровски и
Владивостоки не отправлюсь ни за какие деньги.
многие сейчас скажут, что я совсем обнаглел. оно и правда
так, но спецы на дороге не валяются, так что лучше всё таки
три раза подумать, прежде чем так говорить.
1183 Прочтений • [Настройка postfix с возможностью шифрования и защиты от вирусов и спама (mail postfix freebsd imap cyrus sasl ssl virus spam tls mysql)] [08.05.2012] [Комментариев: 0]