Назад | Перейти на главную страницу

Как мне отловить спам с помощью Postfix?

Как мне настроить спам-ловушки с Postfix, чтобы клиенты, отправляющие на перехваченные адреса, не могли отправлять мне еще один спам?

ОБЗОР

Байесовские фильтры, сопоставление с образцом и RBL - все это часть борьбы со спамом. Эта установка предназначена для их дополнения, а не для их замены.

Обратите внимание, что я НЕ занесен в серый список. Серый список хорош в теории, но на практике он очень раздражает ваших пользователей. Некоторым это удается. Я не из таких людей.

Я установил несколько адресов электронной почты (у меня их около 10 000, но вы можете обойтись парой сотен), которые будут служить ловушками для спама. Списки этих адресов дискретно связаны с различными сайтами с высоким трафиком, где боты их найдут, а люди - нет. Эти адреса собираются, продаются спамерам, и теперь я знаю, куда войдет спам.

Postfix настроен для перенаправления сообщений на любой из этих адресов в мой сценарий spamtrap, который добавляет их в таблицу в PF, так что все дальнейшие сообщения от этого клиента попадают в мой tarpit.

Преимущества:

  • Нулевой процент ложных срабатываний (или, по крайней мере, максимально близко)
  • Ресурсосберегающий
  • Блокирует спамеров на уровне брандмауэра после их первого нарушения
  • Самовосстановление (перехваченные адреса истекают через 24 часа)

Недостатки:

  • Не подключи и работай
  • Довольно много движущихся частей

КАК?

Ваш почтовый сервер должен иметь возможность запускать PF и spamd. Насколько мне известно, это означает OpenBSD или FreeBSD. Я уверен, что эти инструкции можно адаптировать к разновидностям Linux и их брандмауэрам, но это выходит за рамки моего ответа.

Я написал это для FreeBSD. Пользователи OpenBSD должны иметь возможность адаптировать эти шаги, в основном, путем изменения путей.

Наконец, это все для Postfix 2.5+

table <spamd> persist
table <local-whitelist> persist file "/usr/local/etc/spamd/local-whitelist.txt"
  • Установить спам из портов
  • Создайте /usr/local/etc/spamd/local-whitelist.txt. PF прочитает этот файл для создания таблицы <local-whitelist>. Я рекомендую ссылаться http://www.greylisting.org/whitelisting.shtml для адресов, которые никогда не следует закрывать брезентом. Пример файла:
127.0.0.1
10.0.0.0/8

# amazon
207.171.168.0/24
207.171.180.0/24
207.171.187.0/24
207.171.188.0/24
207.171.190.0/24

# AOL
64.12.137.0/24
64.12.138.0/24
152.163.225.0/24
205.188.139.0/24
205.188.144.0/24
205.188.156.66
205.188.157.0/24
205.188.159.7

# apple
17.254.6.0/24

# ebay
66.135.197.0/24
66.135.209.0/24

# gmail
64.68.80.0/21
64.233.160.0/19
64.233.162.192/28
64.233.170.192/28
64.233.182.192/28
64.233.184.192/28
66.249.82.192/28
66.249.92.192/28
66.249.64.0/19
66.102.0.0/20
70.89.39.152/29
70.90.219.48/29
70.90.219.72/29
72.14.192.0/18
74.125.0.0/16
209.85.128.0/17
216.239.32.0/19
216.239.56.240/28

# postini
63.146.199.13/32
63.146.199.14/32
63.71.11.123/32
63.71.11.124/32
64.18.0.0/20
67.114.133.222/32
68.123.185.46/32
74.125.148.0/22
204.14.232.0/22
207.126.144.0/20
208.111.151.5/32
208.74.204.5/32

# skynet.be
195.238.2.0/24
195.238.3.0/24

# yahoo
64.94.237.0/24
66.163.160.0/19
66.196.64.0/18
66.218.64.0/19
66.218.66.0/24 
66.218.67.0/24
66.218.69.0/24
69.147.92.0/24
73.30.0.0/16
74.6.0.0/16
206.190.32.0/19
216.34.77.0/25
216.136.226.0/24
  • Перезагрузить PF

  • Создайте / usr / local / scripts / get-spamtrapped:

#!/bin/sh
/usr/local/sbin/spamdb | grep TRAPPED | cut -d '|' -f 2
  • Создайте /usr/local/etc/spamd/spamd.conf. Я также рекомендую использовать списки nixspam и ualbert.ca, но, по крайней мере, вам нужны списки перехвата спама и переопределения. (ПРИМЕЧАНИЕ: я знаю, что переопределение избыточно с правилами PF rdr - я достаточно перемещаю вещи, чтобы получить эту двойную защиту):
all:uatraps:override:nixspam:override:spamtrapped:override:

# University of Alberta greytrap hits.
# Addresses stay in it for 24 hours from time they misbehave.
uatraps:\
        :black:\
        :msg="Your address %A has sent mail to a ualberta.ca spamtrap\n\
        within the last 24 hours":\
        :method=http:\
        :file=www.openbsd.org/spamd/traplist.gz:

# Nixspam recent sources list.
# Mirrored from http://www.heise.de/ix/nixspam
nixspam:\
        :black:\
        :msg="Your address %A is in the nixspam list\n\
        See http://www.heise.de/ix/nixspam/dnsbl_en/ for details":\
        :method=http:\
        :file=www.openbsd.org/spamd/nixspam.gz:

# Trapped IPs - so we can block them without using greylisting
spamtrapped:\
        :black:\
        :msg="Your address %A has sent mail to spamtrap on this server\n\
        within the last 24 hours":\
        :method=exec:\
        :file=/usr/local/scripts/get-spamtrapped:

override:\
        :white:\
        :method=file:\
        :file=/usr/local/etc/spamd/local-whitelist.txt:
  • Установите spamd для запуска при загрузке. Обратите внимание, что вы не работаете в режиме «только черный список» и выдает ошибку 5xx, когда кто-то пытается отправить в черный список. В первом случае spamdb будет обрабатывать захваченные адреса с сохранением / истечением срока действия. Последнее - хорошие манеры. Добавьте в /etc/rc.conf:
obspamd_enable="YES"
obspamd_flags="-5"
  • Запустить spamd: /usr/local/etc/rc.d/obspamd start

  • Cronjob запускает spamd-setup в режиме только черного списка один раз в час. В режиме черного списка обновляется таблица <spamd> pf, а не внутренние таблицы spamd. Поскольку spamd просто задерживает и хранит данные, все остальное должно быть в PF. (замените XX на любую минуту часа, в которой вы хотите, чтобы он работал)

# spamd-setup
XX      *       *       *       *       root    /usr/local/sbin/spamd-setup -b
  • Создайте на своем компьютере пользователя спамоловки. Я даю ему домашний каталог для будущих расширений:
$ sudo pw useradd spamtrap -s /sbin/lologin -d /home/spamtrap -m -c "Spam Collector"
  • Создайте / usr / local / scripts / spamtrap:
#!/usr/local/bin/bash

# rudimentary checking - more complex checking will be done by 
# the pfctl and spamdb commands
ADDRESS=${1%%[!0-9.]*}
if [[ ! ${#ADDRESS} = ${#1} ]]
then
        echo "Invalid characters in IP address"
        exit 1
fi
if [ ! ${ADDRESS} ]
then
        echo "Usage: $0 <address>"
        exit 1
fi



/usr/local/sbin/spamdb -t -a ${ADDRESS}
if [ "$?" -ne 0 ]
then
        echo "Failed to add ${ADDRESS} to spamdb"
        exit 1
fi
/sbin/pfctl -qt spamd -T add ${ADDRESS}
if [ "$?" -ne 0 ]
then
        echo "Failed to add ${ADDRESS} to pf"
        exit 1
fi
/usr/bin/logger -t spamtrap "Spamtrap caught ${ADDRESS}"
  • Настройте новую транспортную службу в /usr/local/etc/postfix/master.cf Postfix. Флаг X сообщает Postfix, что нужно учитывать эту окончательную доставку сообщения, чтобы спамер получил сообщение об успешном завершении. Обратите внимание на пользователя - ему нужен доступ sudo к скрипту.
# Spamtrap
spamtrapper  unix  -       n       n       -       -       pipe
  flags=X user=nobody argv=/usr/local/bin/sudo /usr/local/scripts/spamtrap ${client_address}
  • Добавить в sudoers:
nobody  ALL= NOPASSWD: /usr/local/scripts/spamtrap
  • Создайте правило транспорта, которое отправляет все сообщения, отправленные на spamtrap @ localhost, в службу spamtrapper. Смотрите 'postconf transport_maps', чтобы узнать, какой файл редактировать. По умолчанию это / usr / local / etc / postfix / transport:
spamtrap@localhost                      spamtrapper
  • Перезагрузите постфикс. Отправьте пару сообщений на spamtrap @ localhost и убедитесь, что отправляющий клиент загружен в spamdb и в таблицу <spamd> pf.
$ echo "Test" | mail spamtrap@localhost
$ spamdb | grep 127.0.0.1
TRAPPED|127.0.0.1|1253655172
$ sudo pfctl -qt spamd -T show
   127.0.0.1
$

С каждым из ваших адресов электронной почты, перехватывающих спам, должны произойти две вещи. Во-первых, он должен преобразоваться в реальный почтовый ящик, чтобы он не отклонялся во время диалога SMTP. Я использовал виртуальных пользователей с псевдонимом spamtrap @ localhost. Во-вторых, он должен соответствовать правилу check_recipient_access в Postfix и перенаправляться на spamtrap @ localhost, чтобы легальные пользователи, включенные в список получателей, никогда не увидели его. Как я сделал эту часть:

  • Добавьте в /usr/local/etc/postfix/main.cf:
virtual_maps = hash:/usr/local/etc/postfix/spamtrap_maps
smtpd_recipient_restrictions = check_recipient_access hash:/usr/local/etc/postfix/spamtrap_recipients
  • Формат spamtrap_maps:
spamtrappedaddress@domain.tld      spamtrap
  • Формат spamtrap_recipients:
spamtrappedaddress@domain.tld      REDIRECT spamtrap@localhost
  • Добавьте эти файлы в свой Makefile и проверьте.

На этом этапе все клиенты, отправляющие почту на ваши адреса спам-ловушки, должны быть добавлены в spamdb и <spamd>. Пока ничего не отправляется в спам. Чтобы задействовать весь механизм блокировки, добавьте в /etc/pf.conf и перезагрузите pf:

no rdr proto tcp from <local-whitelist> to port 25
rdr pass proto tcp from <spamd> to port 25 -> 127.0.0.1 port 8025

И это все.

ВОЗМОЖНЫЕ РАСШИРЕНИЯ

  • Было бы тривиально изменить сценарий спам-ловушки, чтобы сохранить копию сообщения в корпусе байесовского спама.

  • Если вы подписались на какие-либо службы RBL rsync, легко избавиться от возврата этих сообщений в spamd.

Ну ладно, похоже, вы закончили со своим собственным ответом. Только не вините postfix-policyd, он намного более гибкий, чем вы думаете, поскольку он предоставляет несколько механизмов для вашей борьбы со спамом:

Policyd - это плагин для защиты от спама для Postfix (на основе MySQL), который выполняет регулировку на основе серых списков, отправителя (конверт или SASL) (для сообщений и / или тома за определенную единицу времени), мониторинг / занесение в черный список спам-ловушек и автоматическое занесение в черный список HELO.

Вам не нужно использовать все эти вапоны, и вы, вероятно, будете иметь дополнительные правила в вашем smtpd_recipient_restrictions.

В любом случае, попробуйте (и прочтите документацию) или создайте собственное решение - решать вам.

В решение, представленное OP довольно сложно. Я использовал более простой подход:

Шаг 1. Настройте файл фильтра /etc/postfix/spamtraps

Это просто простой «список совпадений»: регулярное выражение (для спам-ловушки) с действием, которое применяется при встрече:

/spam(master|trap)?\@.*/i                DISCARD triggers spamtrap
/funkyspammer\@.*/i                      DISCARD triggers spamtrap

Скорректируйте свои адреса.

Шаг 2. Настройте правила в /etc/postfix/main.cf

Ищите smtpd_recipient_restrictions блокировать, и поставить соответствующее правило перед ваша сеть проверяет (меньше нагрузка), но после аутентифицированные пользователи. Например.:

smtpd_recipient_restrictions = permit_sasl_authenticated
        permit_mynetworks
        check_recipient_access regexp:/etc/postfix/spamtraps
        …

Шаг 3: перезагрузите демон

Конечно, сейчас вам нужно перезагрузить postfix, чтобы изменения вступили в силу. В зависимости от вашего дистрибутива это выполняется либо service postfix reload, /etc/init.d/postfix reloadили аналогичная команда.

Шаг 4. Теперь держите спамеров подальше

Это необязательный шаг, который вы, возможно, захотите рассмотреть: Используйте Fail2ban, и пусть он следит за вашим почтовым журналом. Как только кто-то обращается к спам-ловушке, заблокируйте этот IP-адрес (например, на 30 минут или, может быть, на 1 час - не делайте это слишком долго, поскольку спамер может использовать динамический IP-адрес, который вскоре станет «невиновным»).

просто быстрый совет: используйте postfix-policyd, примеры включены в config ...

настроить его как службу политики в вашем smtpd_recipient_restrictions в вашем main.cf, то есть:

## call policyd
check_policy_service inet:127.0.0.1:10031,

работает как чудо-спамтрап вместе с включенными серыми списками. Удачи!

если кому-то нужен образец сценария для шага 4, мы идем ...

grep 'your_spamtrapaddress1@domain.com' /var/log/maillog >/tmp/badips_raw
grep 'your_spamtrapaddress2@domain.com' /var/log/maillog >>/tmp/badips_raw

egrep -o -e "[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}\.[0-9]{2,3}" /tmp/badips_raw >> /tmp/badips_nu

sort -u /tmp/badips_nu > /tmp/badips

rm -rf /tmp/badips_raw
rm -rf /tmp/badips_nu


while read ip
do
fail2ban-client set postfix-sasl banip $ip
done < /tmp/badips


rm -rf /tmp/badips