Автоматическое занесение в черный список в Postfix

Для этого необходимо принять во внимание несколько предостережений:

  • Файл foo.d/barне имеет расширения, это не файл fooс расширением .d/bar.
  • вы также можете принять во внимание, что .bashrcне имеет расширения
  • Файлы специального каталога .и .., вероятно, следует рассматривать особым образом и считать, что они не имеют расширения.
  • какое расширение для file.tar.gz? gzили tar.gz? Как насчет holiday.picture.jpgили bash-4.4?
  • За что вы должны вернуться foo.d/? Пусто или d?

Вот, я бы сделал:

#! /bin/sh -
for file do
  case ${file##*/} in
    (?*.*) ext=${file##*.};;
    (*) ext=;;
  esac
  printf '%s\n' "$ext"
done
-1
29.06.2020, 15:27
1 ответ

ОБНОВЛЕНИЕ:

Я внес существенные изменения в решение и добавил поддержку IPv6, а также служебные операции для реализации «скользящего» черного списка для сокращения IP-адресов после того, как злоумышленники перестанут атаковать ваш сервер.

Введение:

Несмотря на то, что существует множество директив Postfix, которые могут блокировать злоумышленников, проблема с ними заключается в отсутствии сохранения памяти о таких предыдущих решениях. Таким образом, злоумышленник может бесконечно повторно подключаться, и его трафик должен повторно -не пройти те же тесты. Таким образом, конечная цель состоит в том, чтобы разорвать этот бесконечный цикл злоупотреблений и просто заблокировать нарушающий IP-адрес после того, как первый ресурсоемкий -тест не пройден.

Я открыл исходный код решения Я использую свой собственный (довольно )загруженный почтовый сервер, на котором размещено множество учетных записей для многих доменов. В двух словах, он создает SystemD Service & Timer, который запускает сценарий, использующий RegEx для очистки /var/log/maillogшаблонов злоупотреблений -для адресов IPv4 и IPv6. Тестирование до сих пор было успешным, что существенно снизило злоупотребления.

Образец, выведенный из /etc/postfix/access. Не включение одного IPv6-адреса:

213.230.115.33 REJECT
213.230.75.114 REJECT
185.66.252.78 REJECT
162.243.133.39 REJECT
104.168.159.38 REJECT
78.128.113.109 REJECT
77.40.3.227 REJECT
77.40.3.101 REJECT
61.163.192.88 REJECT
37.0.20.10 REJECT
26.189.237.221 REJECT
[2001:da8:5066:66:eda:41ff:fe1d:b27] REJECT

Кстати, заставить IPv6 работать с этим было немного непросто, но в конце концов я добился своего;-)

Стратегия внесения в черный список:

За 2,5 месяца у меня было около 1200+ IP-адресов, занесенных в черный список с использованием предыдущей версии моего репозитория, который постоянно записывал IP-адреса злоумышленников. Без механизма периодического сокращения этого списка возникнут проблемы с масштабируемостью. Мой новый подход заключается в создании скользящего черного списка :, непрерывного очистки почтового журнала от новых IP-адресов злоумышленников и удаления тех, которые больше не отображаются в почтовом журнале. Любой другой подход, который я мог придумать, основывался на произвольном количестве времени для очистки IP-адресов.

Таким образом, после смены журнала, если нарушитель не появляется в новом почтовом журнале, он НЕ будет включен в черный список -, только если он предпримет последующую попытку злоупотребления. IP-адреса занесены в черный список только на время существования почтового журнала перед ротацией.

Код

Я могу сказать, что репозиторий делает то, что написано на жестяной банке из моего тестирования. Тем не менее, я не сомневаюсь, что некоторые части могли бы быть более элегантными. Ниже приведен основной сценарий, который делает свое дело и предлагается для экспертной оценки.

Если у вас есть какие-либо мысли/предложения, давайте их выслушаем или, что еще лучше, отправьте мне запрос на вытягивание (пожалуйста, только после того, как вы протестируете свои улучшения ). Сценарий легко тестировать -, он делает все за вас, весь код хорошо прокомментирован-и также легко раскручивается.

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ:Этот сценарий работает только в том случае, если у вас есть директивы, которые считывают карту «доступа» в main.cf. Также обратите внимание, что ограничительные директивы Postfix применяются слева -до -справа , поэтому любая директива, читающая карту «доступа», должна быть слева от директив, запускающих более дорогие тесты.

Репозиторий включает скрипт для удаления всего, если вы просто хотите провести тестирование.

cat <<'EOF'> /etc/postfix/access-autoBlacklisting.sh
#!/bin/bash
#
# Author/Developer: Terrence Houlahan Linux Engineer F1Linux.com
# Linkedin: https://www.linkedin.com/in/terrencehoulahan
# License: GPL 3.0
# Source:  https://github.com/f1linux/postfix-autoBlacklisting.git
# Version: 03.20.00

# OPERATION:
# ----------
# This script PREPENDS offending IP addresses from "/var/log/maillog" to "/etc/postfix/access"
# This ensures restrictive access rules applied before permissive grants.
# Consult README.md file for more granular detail about this script and its operation.

# Stop timer from executing Blacklisting script: Existing blacklist in /etc/postfix/access is enforce enforced while the new blacklist rebuilds
systemctl stop Postfix-AutoBlacklisting.timer

# Purge blacklist: Blacklist recreated each script execution capturing both previous offending IPs as well as newest ones present in logs
sed -i '/REJECT$/d' /etc/postfix/access

# Purge the scratch file:
> /etc/postfix/access-blacklist

### Scrape log for different forms of abuse using different tests to identify abuse IPs and squirt each to same central file:
# Enable/Disable any of below tests according to your requirements. Adding your own is easy if you use my tests which isolate offending IPs as templates.

# TEST 1: Blacklist Zombie hosts from endlessly squirting spam: These are identified by no PTR record being set for them.
# This test will catch both new zombies as well as those already RBLed which should serve to stop them constantly being endlessly checked against the RBL
# IPv4 Test:
# Below commented test was found to not be 100 perecent as accurate as the one using the awk form. Have not investigated why however.
#grep "does not resolve to address" /var/log/maillog | grep -Eo "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sort -u >> /etc/postfix/access-blacklist
grep "does not resolve to address" /var/log/maillog | awk 'match($0, /([0-9]{1,3}[\.]){3}[0-9]{1,3}/) {print substr($0, RSTART, RLENGTH)}' | sort -u >> /etc/postfix/access-blacklist
# IPv6 Test:
grep "does not resolve to address" /var/log/maillog | grep -Eo "2[0-9a-fA-F]{3}:(([0-9a-fA-F]{1,4}[:]{1,2}){1,6}[0-9a-fA-F]{1,4})" | sort -u | awk '{print "["$1"]"}' >> /etc/postfix/access-blacklist


# TEST 2: Block spammers guessing account names where they know our domain:
# WARNING: this could potentially cause a block where an unintentional misspelling of an mail account name occured.
# Uncomment only if you are OK with accepting such a risk:
# IPv4 Test:
#grep "Recipient address rejected: User unknown in virtual mailbox table" /var/log/maillog | sed -rn 's/.*\[(([0-9]{,3}.){4})\].*/\1/gp' >> /etc/postfix/access-blacklist
# IPv6 Test:
#grep "Recipient address rejected: User unknown in virtual mailbox table" /var/log/maillog | grep -Eo "2[0-9a-fA-F]{3}:(([0-9a-fA-F]{1,4}[:]{1,2}){1,6}[0-9a-fA-F]{1,4})" | sort -u | awk '{print "["$1"]"}' >> /etc/postfix/access-blacklist


# Populate an array with sorted and depuplicated list of offending IPs scraped from maillog using foregoing tests:
readarray arrayIPblacklist < <( cat /etc/postfix/access-blacklist | sort -u -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | sed '/^$/d' )

# If "access" is a new empty file then the subsequent "sed" will fail. Any new file will have a zero size so the '-s' test will not equal 'true'.
# So we use negation to test "true" and echo a blank space to file. The subsequent "sed" will now execute.
# If "access" file already has whitelist entry then the 'if' statement does nothing and "sed" which follows executes as expected for a non-empty file:
if [ ! -s /etc/postfix/access ]; then echo "" > /etc/postfix/access; fi

for i in "${arrayIPblacklist[@]}"; do
        # Write list of IPS from array to TOP of "access" file to enforce restrictions BEFORE processing whitelisted "OK" addresses:
        sed -i "1i $i" /etc/postfix/access
        # Append " REJECT" (with a space prepended in front of it) after each of the IPs added to to the "access" file:
        sed -i '1s/$/ REJECT/' /etc/postfix/access
done


# Rebuild the /etc/postfix/access Berkeley DB:
postmap /etc/postfix/access

systemctl reload postfix.service

# After cycle completes and IPs written to /etc/postfix/acces we wipe array which repopulates anew upon next script execution:
unset arrayIPblacklist

systemctl start Postfix-AutoBlacklisting.timer

EOF

Заключение:

Я полагаю, что я прибыл как некая система, поддерживающая постоянство памяти о ранее заблокированных IP-адресах, чтобы предотвратить бесконечное повторение дорогостоящих тестов. Это идеально? Вероятно, не помешало бы немного полировки, но пока результаты моих тестов кажутся многообещающими.

Если вы -сыты по горло тем, что ваш почтовый сервер (s )постоянно атакуют спамеры, это быстрое и простое решение, позволяющее отключить их при первой же возможности:

https://github.com/f1linux/postfix-autoBlacklisting

-1
28.04.2021, 23:20

Теги

Похожие вопросы