Показаны сообщения с ярлыком Postfix. Показать все сообщения
Показаны сообщения с ярлыком Postfix. Показать все сообщения

среда, 8 февраля 2012 г.

Postfix: выборка всех получателей, кому письма не были доставлены

for i in `find /var/spool/postfix/defer/ -type f`; do cat $i | grep recipient | sed 's/=/ /' | awk '{print $2}'; done | sort | uniq

Такой командой очень удобно ловить юзеров, у кого указан кривой/не рабочий ящик.

четверг, 3 февраля 2011 г.

Установка Postfix на Debian

Удаляем старый почтовик:
apt-get remove exim4-*

apt-get install postfix -y

Далее: Postfix Configuration -> Ok. Internet Site -> Ok. Задаем hostname -> Ok.

Применяем настройки:
/etc/init.d/postfix restart

Ставим утилиту mail:
apt-get install mailx -y

Тестирум работу почты:
echo test | mail -s test test@domain.ru

Хм, странно, но у меня вот не заработало...

вторник, 14 декабря 2010 г.

Как изменить адрес, используемый для отправки почты Postfix ом другим серверам?

vi /etc/postfix/main.cf

Добавляем в самый низ:
smtp_bind_address = ...

Применяем настройки:
/etc/init.d/postfix restart

После этого все внешние почтовые сервера будут видеть указанный IP при подключении нашего сервера:
Received: from test.domain.ru ([88.198.xx.xx])
 Но если нужно сохранить работу Postfix на ВСЕХ IP адреса, то достаточно сделать в конфиге /etc/postfix/master.cf вот так:

smtp      unix  -       -       -       -       -       smtp  -o smtp_bind_address=xx.yy.zz.ww
 

пятница, 26 ноября 2010 г.

Как проанализировать, кто отправил больше всех писем в Postfix?

Легко, тулзой: pflogsumm

Ставим ее:
apt-get install -y pflogsumm

Запускаем отчет за сегодня:
pflogsumm.pl -d today /var/log/mail.log

Или за вчера:
pflogsumm.pl -d yesterday /var/log/mail.log

Понятностью и полнотой эти отчеты не блещут, но какой-никакой инструмент.

воскресенье, 21 ноября 2010 г.

Как восстановить побитый /etc/sasldb2?

Имеем вылетевшую авторизацию на Postfix (ну или любом другом сервисе, использующем SASL):
Nov 21 01:27:45 v1 postfix/smtpd[10701]: warning: SASL authentication problem: unable to open Berkeley db /etc/sasldb2: Invalid argument

При этом с правами на sasl базу данных все хорошо:
ls -la /etc/sasldb2
-rw-r----- 1 root postfix 45K 2010-11-19 15:10 /etc/sasldb2


Но при попытке задать пользователю пароль выдается ошибка:
echo qwerty | /usr/sbin/saslpasswd2 -p -a Sendmail -u test.ru username
/etc/sasldb2: file size not a multiple of the pagesize

Листинг юзеров также не пашет:
sasldblistusers2
/etc/sasldb2: file size not a multiple of the pagesize
listusers failed

Как же пофиксить?

При попытке сделать db4.6_recover все проходит визуально хорошо:
db4.6_recover -h /etc -c -v
Finding last valid log LSN: file: 1 offset 28

Но не помогает:

sasldblistusers2
/etc/sasldb2: file size not a multiple of the pagesize
listusers failed

В итоге помогло лишь (за материал огромное спасибо snkua@jabber.ru):
$ sudo db_recover -v
*db_recover: Finding last valid log LSN: file: 3 offset 399092
*db_recover: Recovery starting from [2][887112]
*db_recover: Log sequence error: page LSN 2 322820; previous LSN 2 885276
*db_recover: Recovery function for LSN 2 887886 failed on forward pass

This error is usually the result of someone removing all of
the log files from a Berkeley DB database environment. You
can never remove all of the log files without also clearing
the database file references to the log.

You should be able to salvage your data -- see the -R and -r
options to the Berkeley DB db_dump utility.

В итоге сработало следующее:
db4.6_dump /root/sasldb2_backup -r

А также еще запасной вариант:
db4.6_dump /root/sasldb2_backup -R

Но он в моем случае выдал ошибку:
db4.6_dump: /root/sasldb2_backup: DB_VERIFY_BAD: Database verification failed

Ну и после этого нужно загрузить дамп в файл и все.

суббота, 6 марта 2010 г.

четверг, 25 февраля 2010 г.

Исправленное правило для fail2ban для защиты Postfix / Debian

Необходимо заменить содержимое файла /etc/fail2ban/filter.d/sasl.conf на следующее (в стандартной версии баг в регулярном выражении):


# Fail2Ban configuration file
#
# Author: Yaroslav Halchenko
#
# $Revision: 510 $
#

[Definition]

# Option: failregex
# Notes.: regex to match the password failures messages in the logfile. The
# host must be matched by a group named "host". The tag "" can
# be used for standard IP/hostname matching and is only an alias for
# (?:::f{4,6}:)?(?P\S+)
# Values: TEXT
#

# Example:
# Feb 25 00:38:07 v1 postfix/smtpd[11100]: warning: unknown[95.79.205.2]: SASL PLAIN authentication failed: authentication failure

# fixed by FastVPS version:
failregex = : warning: [-._\w]+\[\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed: authentication failure$

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =

четверг, 28 января 2010 г.

Postfix + noexec файловые система на /tmp

В итоге получаем такой облом:
Preconfiguring packages ...
Can't exec "/tmp/postfix.config.49981": Permission denied at /usr/share/perl/5.10/IPC/Open3.pm line 168.
open2: exec of /tmp/postfix.config.49981 configure 2.5.5-1.1 failed at /usr/share/perl5/Debconf/ConfModule.pm line 59

воскресенье, 24 января 2010 г.

Защита от исходящего спама на Postfix / Debian

Чтобы запретить всем, кроме пользователя Postfix и рута соединяться с серверами на 25й порт необходимо внести в фаерволл следующие правила:

iptables -A OUTPUT -o lo -j ACCEPT # разрешаем соединения с loopback
iptables -A OUTPUT -p tcp -m tcp --dport 25 -m owner --gid-owner postfix -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 25 -m owner --gid-owner root -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 25 -j DROP


Теперь протестируем:

# id
uid=0(root) gid=0(root) groups=0(root)
# telnet smtp.mail.ru 25
Trying 94.100.177.1...
Connected to smtp.mail.ru.
Escape character is '^]'.
220 mail.ru ESMTP Sun, 24 Jan 2010 19:15:27 +0300



А все остальные пользователи получают облом:

$ id
uid=1000(nrg) gid=1000(nrg) groups=1000(nrg)
$ telnet smtp.mail.ru 25
Trying 94.100.177.1...


При этом почтовик также работает отлично:
echo test | mail -s test odintsov@test.ru

Postfix и noexec ФС

Postfix sets the execute bit to indicate that a queue file is
complete. On file systems that don't allow users to set the execute
bit on a file, Postfix will never deliver mail.


Так что с этим надо быть аккуратнее.

(c) http://archives.neohapsis.com/archives/postfix/2006-01/1916.html

среда, 20 января 2010 г.

Может ли отключение atime для файловой системы негативно сказаться на работе Postfix?

Может ли отключение atime для файловой системы негативно сказаться на работе Postfix?

Ответ: Нет

Аргументация: судя по рассылке Postfix его не использует:

> One suggestion which seemed rather interesting to me was mounting a
> filesystem with the noatime flag. I certainly don't use it in my general
> activities on a server but I was just wondering if anyone can tell me if
> postfix uses it?

Postfix doesn't use it.


И даже сам Виетс Винема (автор Postfix - http://ru.wikipedia.org/wiki/Postfix) это подтверждает:

Turning off atime updates means don't update the inode block when
a file is read.

I have many reasons to believe that would make zero difference,
because the inode block needs to be updated anyway after Postfix
accesses a queue file.

With each access, Postfix either creates or renames or deletes the
file, and/or it writes the queue file, and/or it sets the mtime
explicitly. All these require that the inode block be updated.

четверг, 14 января 2010 г.

Включение submission (smtp на альтернативном порту) в Postfix

Открываем конфиг:
vi /etc/postfix/master.cf


Ищем строку:

#submission inet n - - - - smtpd


И убираем в ее начале диез (раскомментируем).

Далее в строке submission в столбце chroot заменяем "-" на n, иначе работать не будет (из чрута не будет видно БД пользователей), то есть получится:
submission inet n - n - - smtpd

Я подозреваю, что это баг в конфигурации. Так как если просто раскомментировать строку submission (где напротив chroot стоит -), то он будет работать, но будет закрыт в чруте (заперт в определенной папке в /var/spool/....) и не будет иметь доступа к базе данных пользователей (она в /etc, а мы заперты в совершенно другой папке), следовательно, не будет возможности авторизовать пользователей, таким образом он никак не может работать.

Перезапускаем почтовик:
/etc/init.d/postfix restart


Убеждаемся, что Postfix забиндился на 587 порт:

netstat -lnpt | grep master
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 13491/master
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 13491/master


Ну и теперь перенастраиваем почтовый клиент на 587 порт :)

вторник, 12 января 2010 г.

Greylisting защита от спама в Postfix

Встречайте, Postgrey!

А на практике это работает примерно так:

telnet xx.xx.xx.xx 587
Trying xx.xx.xx.xx...
Connected to xx.xx.xx.xx.
Escape character is '^]'.
220 xx.xx.xx.xx ESMTP Postfix (Debian/GNU)
HELO 1
250 xx.xx.xx.xx
MAIL FROM:suxx@usd.eu
250 2.1.0 Ok
RCPT TO:test@suxx.us
450 4.2.0 : Recipient address rejected: Greylisted, see http://postgrey.schweikert.ch/help/suxx.us.html


А просматривать логи от него так:
cat /var/log/mail.log | postgreyreport


А вот как узнать, какие IP Postgrey сделал довременными после нескольких "нормальных" писем - вопрос сложный, так что всех интересующихся милости прошу в: /var/lib/postgrey/

среда, 6 января 2010 г.

Защита от исходящего СПАМа на Debian Lenny 5 + Postfix

Для многих хостеров стоит очень актуальная проблема - проблема защиты от исходящих спам рассылок. Какой смысл от них защищаться? Пусть себе спамят. Но причин защищаться тут две - abus`ы в адрес Вашего сервера в Датацентр (которые при их игнорировании могут легко привести к блокировке) и высокая вероятность отказа исходящей почты для остальных клиентов на сервере, т.к. после спам рассылки Ваш IP с большой (если спам рассылка будет произведена автоматическим скриптом, то вероятность этого просто огромна) вероятностью попадет в какой-либо из популярных черных списков спам-серверов. Убедил, что защищаться стоит? Думаю, да :)

Сразу оговорюсь, что для моего случая задача облегчена, т.к. PHP подключен как FastCGI и работает от имени конкретного пользователя, что очень сильно упрощает задачу борьбы со СПАМ.

Итак, рассмотрим основные пути произведения спам рассылок - это sendmail, локальное не авторизированное соединение с localhost на 25й порт (при этом логин/пароль не требуются) и удаленное/локальное авторизированное соединение (т.е. клиент со своей машины подключается и начинает сваливать нам тонны СПАМА). Также есть очень экзотический вариант, когда спам-скрипт сам соединяется с удаленными серверами, выполняя роль MTA и рассылает СПАМ самостоятельно, но этот вариант уж очень сомнителен. Давайте рассмотрим все подробно и по пунктам.

Поставим необходимый диагностический софт:
apt-get install -y --force-yes strace


Создадим необходимых юзеров
useradd spammer


 Входим под предполагаемым спамером:
su spammer


Sendmail

Через /usr/sbin/sendmail почту отправляют такие популярные программы как PHP и /usr/bin/mail.

echo "some spam" | mail -s testspam testspammail@domain.ru


В итоге выливается в:

[pid 17520] execve("/usr/sbin/sendmail", ["send-mail", "-i", "--", "testspammail@domain.ru"], [/* 16 vars */]) = 0


И при получении в строке хидеров будет следующая строчка однозначно идентифицирующая спамера:

Received: by domain.ru (Postfix, from userid 1001)


Теперь попробуем послать спам от PHP.

php -r "mail('testspammail@domain.ru', 'spamsubj','spambody');"


И получаем аналогичную картину:

[pid 17553] execve("/bin/sh", ["sh", "-c", "/usr/sbin/sendmail -t -i"], [/* 16 vars */]


Это происходит по той причине, что Linux/UNIX версии PHP отправляют почту только через sendmail, windows же версия использует SMTP на локал хост. Следовательно, письмо также будет промаркировано UID пользователя, что позволит его найти и наказать :)

Кстати, обе выше указанные записи в логе /var/log/maillog выльются в следующее (так что можно легко посредством парсинга логов вычислять нарушителей лимитов):


Jan 6 14:12:08 vrt1 postfix/qmgr[13940]: 7B112D52001: removed
Jan 6 14:14:49 vrt1 postfix/pickup[17379]: 54CF3D52001: uid=1001 from=
Jan 6 14:14:49 vrt1 postfix/cleanup[17546]: 54CF3D52001: message-id=<20100106131449.54CF3D52001@vrt1.domain.ru>



Локальное не авторизированное соединение с localhost на 25й порт

Теперь давайте с самого сервера попробуем выполнить следующие команды:

telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 vrt1.domain.ru ESMTP Postfix (Debian/GNU)
HELO 11
250 vrt1.domain.ru
MAIL FROM:spammer@spammer.ru
250 2.1.0 Ok
RCPT TO:testspammer@domain.ru
250 2.1.5 Ok
DATA
354 End data with .
spam

.
250 2.0.0 Ok: queued as 009C768180



В итоге такое письмо приедет получателю только с хидером, который никаким образом не позволяет вычислить источник:

Received: from 11 (localhost [127.0.0.1])


Логи также молчат:

Jan 6 14:32:26 vrt1 postfix/smtpd[17703]: connect from localhost[127.0.0.1]
Jan 6 14:32:52 vrt1 postfix/smtpd[17703]: 009C768180: client=localhost[127.0.0.1]
Jan 6 14:33:02 vrt1 postfix/cleanup[17705]: 009C768180: message-id=<20100106133252.009C768180@vrt1.domain.ru>
Jan 6 14:33:02 vrt1 postfix/qmgr[13940]: 009C768180: from=, size=333, nrcpt=1 (queue


В итоге необходимо запретить неавторизованный прием почты с локалхоста. Есть у Постфикса такой параметр mynetworks, который в документации описывается так:

By default, Postfix will relay mail for clients in authorized networks.

Authorized client networks are defined by the mynetworks parameter. The default is to authorize all clients in the IP subnetworks that the local machine is attached to.


Так что открываем:
vi /etc/postfix/main.cf


Видим там на строке mynetworks следующее:
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128


Заменяем на:

mynetworks =


Перезапускаем постфикс:

/etc/init.d/postfix restart


Ну и все, теперь при попытке послать спам без авторизации будет следующее:

telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 vrt1.domain.ru ESMTP Postfix (Debian/GNU)
HELO 1
250 vrt1.domain.ru
MAIL FROM:spammer@domain.ru
250 2.1.0 Ok
RCPT TO:odintsov@domain.ru
554 5.7.1 : Relay access denied


Теперь попробуем авторизироваться и послать почту.

Для начала нам понадобятся преобразованные в base64 логин и пароль:

# echo "test@suxx.us" | base64
dGVzdEBzdXh4LnVzCg==
# echo "qwerty" | base64
cXdlcnR5Cg==


Теперь отсекаем "Cg==" у закодированных значений и используем.


telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 vrt1.domain.ru ESMTP Postfix (Debian/GNU)
HELO 1
250 vrt1.domain.ru
AUTH LOGIN
334 VXNlcm5hbWU6
dGVzdEBzdXh4LnVz
334 UGFzc3dvcmQ6
cXdlcnR5
235 2.7.0 Authentication successful
MAIL FROM:test@test.ru
250 2.1.0 Ok
RCPT TO:test@domain.ru
250 2.1.5 Ok
DATA
354 End data with .

spam

.
250 2.0.0 Ok: queued as 737C6680C6


А в логах в это время:

Jan 6 15:32:31 vrt1 postfix/smtpd[18540]: connect from localhost[127.0.0.1]
Jan 6 15:33:08 vrt1 postfix/smtpd[18540]: 737C6680C6: client=localhost[127.0.0.1], sasl_method=LOGIN, sasl_username=test@suxx.us
Jan 6 15:33:13 vrt1 postfix/cleanup[18544]: 737C6680C6: message-id=<20100106143308.737C6680C6@vrt1.domain.ru>
Jan 6 15:33:13 vrt1 postfix/qmgr[18428]: 737C6680C6: from=, size=326, nrcpt=1 (queue active)
Jan 6 15:33:13 vrt1 postfix/smtp[18545]: 737C6680C6: to=, relay=ASPMX.L.GOOGLE.COM[2


Удаленное/локальное авторизированное соединение

А тут нам помогут логи из предыдущего примера :) Но в письме опять же отправитель явно никак не идентифицирован. И фишка тут в том, что поле FROM никак не контролируется.

Спам скрипт-MTA

Тут нам поможет только правило фаерволла, запрещающее соединение до 25го порта удаленных серверов всем, кроме нашего родного MTA Postfix.

воскресенье, 20 декабря 2009 г.

Postfix: разрешить прием почты только от доверенных SMTP серверов

Часто при использовании многокаскадных почтовых систем необходимо запретить серверу принимать почту от всех, кроме перечисленных списком серверов, делается это не особенно тривиально, но вполне возможно :)

Открываем конфиг:
vi /etc/postfix/main.cf


Ниже строк:

#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table


Добавляем:
mynetworks = 127.0.0.0/8, ip.ad.dr.es, ip.ad.dr.es


Далее ищем строку:

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_unlisted_recipient, reject_unverified_recipient


И заменяем на:

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unlisted_recipient, reject_unverified_recipient, reject


Итого: был удален reject_unauth_destination, добавлен reject, о них подробно ниже.

reject_unauth_destination
Reject the request unless one of the following is true:

* the resolved destination address matches $relay_domains or a subdomain thereof, and the address contains no sender-specified routing (user@elsewhere@domain),
* Postfix is the final destination: any destination that matches $mydestination, $inet_interfaces, $virtual_alias_domains, or $virtual_mailbox_domains.

The relay_domains_reject_code parameter specifies the response code for rejected requests (default: 554).


Перезапускаем Postfix:
/etc/init.d/httpd restart


Ну вот теперь все сообщения от узлов, чьи IP отличны от ip.ad.dr.es (ога, у остальных с цифреками) будуи сразу же отклоняться почтовиком, а вот клиенты, желающие отправить почту будут запущены на машинку.

вторник, 15 декабря 2009 г.

Postfix: Sender address rejected: Domain not found

Столкнулся с такой вот проблемой, но суть в том, что в /etc/postfix/main.cf все было настроено корректно, а вот в /etc/mailname (вообще первый раз этот файл на Debian заметил) был неверный хостнейм, так что берите на вооружение и этот файл :)

Задачка: заставить Postfix отправлять письма с определенного айпи в зависимости от пользователя

Как я понял, стандартно функция не поддерживается, но ничего не мешает пропатчить Postfix :) Если кому интересно - можем скооперироваться.

Postfix Smtp Outgoing IP Rotator using iptables

Да, это вполне возможно! Вот, пожалуйста.

суббота, 5 декабря 2009 г.

Как забиндить Postfix только на localhost

Стандартно Postfix биндится на все порты, что весьма несекурно, если не нужен прием почты:


netstat -ln -t
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
...
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
...


Открываем конфиг:
vi /etc/postfix/main.cf


Находим там строку:
inet_interfaces = all


И заменяем на:
inet_interfaces = 127.0.0.1


Перезапускаем Postfix:
/etc/init.d/postfix restart


И получаем секурный Postfix забинденый только на 127.0.0.1:

netstat -ln -t
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
...
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
...