Авторские статьи

Моя борьба со спамом.


Любой админ рано или поздно сталкивается с вопросом создания своего почтового сервера. А современные реалии таковы, что Интернет давно уже не место группки учёных, которые, как в космосе, пытаются найти друг друга. Современный Интернет - это вывел сервер во внешнюю сеть и тебе боты, хакеры и другие нехорошие сущности тут же пытаются напихать грязных писек по самые помидоры. Один из бичей почтового протокола - это спам.

Самая лучшая статья по борьбе со спамом, на мой взгляд, это статья, мною уважаемого Маламута, Фильтрация спама на уровне SMTP протокола. Я его статью здесь не буду цитировать и приводить куски. Лучший вариант - перейти по ссылке и прочесть. Главная мысль и я с ней согласен на 200%, что защита от спама - это не какие-то списки спамеров, которым мы будем делать атата и не давать писа́ть нам письма. Лучшая защита - бить спамеров на подлёте. Спамеры, запуская свои спам-машины, в которых вы одна из миллионов строк в базе данных, долбятся в наши почтовые сервера, торопясь и нарушая стандарты. Этим можно и нужно пользоваться. В своё время, прочитав статью Маламута и доверившись ему, я сделал всё, что он описал в своей статье, вдумчиво прочитав про каждый параметр Postfix, который упоминался в статье. Благодаря фильтрации на уровне SMTP, количество спама уменьшилось в разы. В помощь протоколу SMTP, как Чип и Дейл, спешат протокол Sender Policy Framework (SPF) и грейлистинг. А-а-а, попался, скажет внимательный читатель, всё-таки есть списки! Нет, скажу я вам, нету списков. SPF помогает отсеивать спамеров, которые прикрываются чужими почтовыми доменами. Спамер лезет со своего IP адреса, подставляя что он дескать mail.google.com, но проверка SPF записи выявит, что у mail.google.com другие IP адреса и сразу же можно резать данного лицемера-спамера. Грейлистинг (серые списки) с помощью Postgrey - это демон, который "просит" адресата при полнейшем соблюдении стандарта отправить письмо попозже. Будет ли спамер отсылать вам письмо попозже? Думаю вряд ли, учитывая многомиллионные базы у спамеров и нагрузку на их почтовые очереди.

И вот на этом этапе, когда всё вроде успокоилось и устаканилось, родилась гениальная мысль! Нужно всех спамеров, что долбятся в мой почтовый сервер занести в чёрный список аппаратного файрвола Cisco ASA (Adaptive Security Appliance), который защищает периметр DMZ.

Извините за мой подход в виде скриптов, но вот так я себе помогаю в работе. Нужен первый скрипт log2sql.sh, который будет парсить лог postfix и заносить в базу данных IP адрес спаммера и количество его попыток втюхать вам спам.

Комментарии по скрипту:

  • По дефолту мой postfix начинает каждую строку в журнале примерно так: Nov 27 13:46:53 mail postfix. Я вызываю скрипт на каждой 58 минуте каждого часа через /etc/crontab и мне нужно найти в журнале /var/log/mail.log все строки данного часа и данного дня. В приведённом примере мне нужно найти Nov 27 13 и для этого нужен вызов даты на английском LANG=en_US /bin/date '+%b %e %H'
  • Из кучи строк нам нужны строки, идентифицирующие спамеров. Шаблоны строк лежат в maska_spammers.txt и там строки типа
    cannot find your reverse hostname
    Host not found
    need fully-qualified hostname
    does not resolve to address
  • После парсинга у вас появится файл spammers2.log, в котором число попыток и через пробел IP адрес спамера. В цикле while мы заносим информацию из файла в БД. И тут хочется заострить ваше внимание на элегантном решении с помощью ON DUPLICATE KEY UPDATE, которое позволяет одной строкой делать INSERT, если записи с таким IP адресом в базе НЕТ и делать UPDATE, если такой IP адрес есть. Для этого в БД поле spammers.ip объявлено UNIQUE.
#!/bin/sh
# vasilisc.com
# log 2 sql
# заносим в БД спамеров, чтобы облегчить жизнь Postfix
USERNAME="userlogin"
PASSWORD="password2your_bd"
HOST="127.0.0.1"
DATABASE="postfix"
DATEEVENT=`LANG=en_US /bin/date '+%b %e %H'`
# берём строки за текущий час текущего дня и месяца
/bin/grep -F "${DATEEVENT}" /var/log/mail.log | \
# проверка лога на строки идентифицирующие спамеров
/bin/grep -F --file=maska_spammers.txt | \
# проверка на всякий случай чтобы в логах ничего не мелькнуло похожее на нас
# чтобы не занести сами себя в чёрные списки
/bin/grep -vE "(127.0.0.1|192.168.|172.16.|10.0.|localhost|81.21.|176.97.)" | \
# находим IP адреса и кол-во их повторов
/bin/grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | /usr/bin/sort | /usr/bin/uniq -c > spammers2.log
while read countip ip    
do   
    echo $countip" - "$ip   
    # дополнительная проверка - есть ли у IP доменное имя?
    a=$(dig -x ${ip} +short @1.1.1.1)
    if [ -z "$a" ]; then
        echo "FAILURE";
        # нет у него записи A - реально спамер!
        /bin/echo "INSERT INTO spammers SET ip='${ip}', countip=${countip} ON DUPLICATE KEY UPDATE countip=countip + ${countip}" | /usr/bin/mysql --user=${USERNAME} --host=${HOST} --database=${DATABASE}
    fi
done < spammers2.log
exit 0

Теперь у нас в БД есть IP адреса, которых у меня уже накопилось ~400 000 штук, количество попыток и мы можем средствами БД сортировать моральных уродов от особо рьяных до вялотекущих. Но база данных нам нужна не только, чтобы лицезреть спам-машины, но и заносить их из БД в чёрный список (всё-таки есть список!) специализированного, аппаратного файрвола Cisco ASA под названием shun. В этом shun находятся все атакующие хосты, которые сочла своим долгом занести туда автоматически Cisco ASA. По словам нашего сетевого администратора по умолчанию все хосты из shun автоматически удаляются ею через 40 дней, что для меня вполне достаточно.

Я не знаю программный интерфейс для общения с устройствами Cisco ASA. Если вы в курсе как программно общаться с такими железяками, то отпишитесь в комментариях. Поэтому мужайтесь! Ещё один, последний скрипт sql2shun.sh, который использует expect для имитации действий человека и автоматизации команд в терминале.


#!/bin/bash
# заносим спамеров из бд в shun cisco asa
# vasilisc.com
USERNAME="user"
PASSWORD="password2bd"
HOST="127.0.0.1"
DATABASE="postfix"
# применяем голову-шаблон
/bin/cp -f shun_ip_template.sh shun_ip.sh
# берём из базы спаммеров
for IPSPAMMER in `/usr/bin/mysql --user=${USERNAME} --host=${HOST} --password=${PASSWORD} --database=${DATABASE} --skip-column-names --silent --execute 'SELECT ip FROM spammers WHERE countip>50 ORDER BY countip DESC LIMIT 20'`
do
     echo "expect -re \"#\"" >> shun_ip.sh
     echo "send \"shun ${IPSPAMMER}\r\"" >> shun_ip.sh
/usr/bin/mysql --user=${USERNAME} --host=${HOST} --password=${PASSWORD} --database=${DATABASE} --skip-column-names --silent --execute "UPDATE spammers SET countip=0 WHERE ip='${IPSPAMMER}'"
done
echo "expect -re \"#\"" >> shun_ip.sh
echo "send \"exit\r\"" >> shun_ip.sh
echo "expect -re \"#\"" >> shun_ip.sh
echo "send \"exit\r\"" >> shun_ip.sh
/usr/bin/expect shun_ip.sh
exit 0

Что делает скрипт?:

  • Вначале мы берём голову-шаблон shun_ip_template.sh и затираем им файл shun_ip.sh
    Голова-шаблон shun_ip_template.sh, в котором прописано подключение к CiscoASA через ожидание нужных строк и отправки нужной информации.

    #!/usr/bin/expect -f
    set timeout 60
    set env(TERM)
    spawn ssh -c des -1 user_access_ciscoasa@IP-address-cisco-asa
    expect assword {send Password2CiscoASA\r}
    expect -re ">"
    send "enable\r"
    expect assword {send Password2CiscoASA\r}
    expect -re "#"
    send "configure terminal\r"
  • Берём из БД 20 компьютеров, рассылающих спам с числом попыток больше 50, и начинаем формировать файл shun_ip.sh строками shun ${IPSPAMMER}
  • После окончания работы вызываем сформированный файл shun_ip.sh с помощью expect, который и занесёт спамеров в shun Cisco ASA.
  • Запись о спамере не удаляется из базы данных, а просто обнуляется счётчик попыток. Через 40 дней, если с данного адреса опять начнётся попытка втюхать спам, то есть шанс накрутить себе счётчик так, чтобы выбиться в лидеры и отправиться в новое путешествие в shun.

А в конце хочется заметить, что вначале статьи я писал, что не возлагаю на списки основную роль в борьбе со спамом. Основная нагрузка ложится на правила Postfix, которые проверяют во время почтовой сессии множество параметров на соответствие требованиям RFC SMTP протокола. И всё-таки в конце статьи появляется список, который обрывает для спамеров всякую надежду на соединение с моим почтовым сервером, по крайней мере на 40 дней. Есть ли тут противоречие? Нет! Админы, которые делают упор на списки, используют DNSBL и возлагают надежды на контентную фильтрацию типа SpamAssassin. Я использую SpamAssassin и Clamav для проверки спама и вирусов, но они (проверки) идут самыми последними после правил Postfix, SPF и PostGrey. И в этом тонкая, но важная грань!

UPD от 17.07.2015
С октября 2014 года, после введения данной схемы в БД оказалось 566048 различных IP адресов, с которых были произведены массовые отправки спам-писем. В течение времени, в shun побывало 30508 IP адресов на срок 40 дней.

Утилита pflogsumm выдаёт примерные результаты за 1 неделю:

Grand Totals
------------
messages
  16365   received
  27945   delivered
      1   forwarded
     32   deferred  (435  deferrals)
     97   bounced
  33293   rejected (54%)

UPD 16.11.2020
В таблице записей 2149244. Схема за многие годы показала себя эффективной и дала моральное удовлетворение. Спамеры автоматом лезут к почтовому серверу и автоматом получают люлей уже от аппаратного файрвола CiscoASA. Легче становится почтовику и серверу антиспама с антивирусом.

UPD 26.12.2023
UserGate стал системой, выводящей всех и вся в Интернет. Помимо Postfix, ещё и Kaspersky Linux Mail Server стал подготавливать списки кто пытается отправить вирус, сделать фишинговую атаку и т.д. UserGate умеет забирать списки по http для конкретных правил, чем я и воспользовался.

Связанные материалы:
Оптимизация виртуальных серверов.
Инструмент Cisco ASDM с Ubuntu.
Сотрудничество Cisco и Canonical.
Файрвол iptables и его 21 пример использования.

Дата последней правки: 2023-12-26 17:16:45

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта