Я хочу динамически блокировать определенные соединения, использующие один и тот же IP-адрес, в зависимости от скорости или ограничения числа подключений. Возможно ли это с помощью Solaris / IPF или какого-либо расширения sendmail? Я хочу ограничить попытки входа в систему sendmail, чтобы предотвратить атаки методом перебора.
В Linux с этим легко справиться на уровне межсетевого экрана iptables, но мне не удалось найти способ использовать ipf для ограничения его на уровне межсетевого экрана. Sendmail имеет встроенное ограничение скорости и подключения, но похоже, что оно применяется ко всем пользователям, поэтому, если мы столкнемся с DOS или DDOS, он заблокирует всех наших пользователей, а не только злоумышленника.
взгляните здесь, это директива на основе sendmail, которая может предотвратить наводнение и плохое поведение, возможно, это вам поможет: http://www.acme.com/mail_filtering/sendmail_config.html
Я для себя использую эти конфиги:
FEATURE(`greet_pause',2)
define(`confTO_ICONNECT', `15s')dnl
define(`confTO_CONNECT', `3m')dnl
define(`confTO_HELO', `2m')dnl
define(`confTO_MAIL', `1m')dnl
define(`confTO_RCPT', `1m')dnl
define(`confTO_DATAINIT', `1m')dnl
define(`confTO_DATABLOCK', `1m')dnl
define(`confTO_DATAFINAL', `1m')dnl
define(`confTO_RSET', `1m')dnl
define(`confTO_QUIT', `1m')dnl
define(`confTO_MISC', `1m')dnl
define(`confTO_COMMAND', `1m')dnl
define(`confTO_STARTTLS', `2m')dnl
define(`confTO_IDENT', `0s')dnl
define(`confTO_RESOLVER_RETRANS', `7s')dnl
define(`confTO_RESOLVER_RETRY', `4')dnl
define(`confMAX_RCPTS_PER_MESSAGE', `15')dnl
define(`confMAX_DAEMON_CHILDREN',`256')dnl
define(`confCONNECTION_RATE_THROTTLE',`8')dnl
define(`confBAD_RCPT_THROTTLE', `1')dnl Sendmail v8.12+
define(`confQUEUE_LA', `10')dnl
define(`confREFUSE_LA', `30')dnl
Далее вы можете искать реализацию под названием greypit. Я не совсем в курсе этой темы, но у greypit должны быть ограничения на базовые IP-соединения, возможно, есть версия Solaris.
Другой способ заключается в следующем. Проверьте свои журналы на предмет массовых действий DOS или ложных входов и используйте приветствие при доступе. Если вы идентифицируете вредоносное поведение, вставьте следующую строку в свой доступ и повторно создайте свой файл access.db.
GreetPause:bad.ip.dos.attacker.com 100
С этого момента каждый запрос от ip или имени хоста должен ждать 100 секунд перед получением helo.
Я использовал эту функцию наоборот, но ее также можно использовать для блокировки нежелательных подключений.
Сценарий, который выполнял эти записи, был просто сценарием cron, но будьте осторожны, это всего лишь другой способ получить хороший трафик, и вам придется вручную воссоздать свой access.db:
#!/bin/sh
declare -a a
let count=0
accessmap="/tmp/access.test"
logfiles="/var/log/mail.log"
mailfile="/tmp/tmpmail.mail"
email="myemail@test.com"
## hole alle IP Eintraege aus sendmail access und packe sie in ein array mit prefix und postfix
for x in $(echo $(grep -e "^GreetP" $accessmap | cut -f 2 -d ":" | cut -f 1 -d " ")); do
a[$count]=$(echo "^"$x"|");
((count++));
done
echo Number of elements: ${#a[@]} > $mailfile
#entferne whitespaces
#entferne | am ende der Zeile
b=$(echo ${a[@]} | sed "s/ //g"| sed "s/|$//")
#nun steht in der Variable den string den wir zum filtern wollen!
#echo $b
buffer=0
buffer_changed=0
datum=$(date +%Y.%m.%d__%H:%M:%S)
for x in $(grep authid $logfiles |grep "AUTH=server"|cut -f 3 -d "[" | cut -f 1 -d "-" | sort | uniq |egrep -v -e "$b" | sed "s/ (may be forged)//"|sed "s/]//"|sed "s/, authid=/#/"
if [ $buffer -eq 0 ]; then
buffer=1
echo >> $accessmap
echo "#Eintraege vom $datum" >> $accessmap
echo >> $accessmap
buffer_changed=1
fi
echo "GreetPause:$x"| sed "s/#/ \t\t0\t#/" >> $accessmap
done
if [ $buffer -eq 1 ]; then
echo "Command: zgrep with filter $b" >> $mailfile
echo >> $mailfile
echo >> $mailfile
echo "accessmap GreetingPause:">> $mailfile
cat $accessmap | grep -B 2 "GreetPause" >> $mailfile
echo >> $mailfile
mail -s "Acessmap changed" $email < $mailfile
fi