Security

防止對 Solaris 10 的 Sendmail 蠻力攻擊

  • May 24, 2011

我想根據速率或連接限制動態阻止使用相同 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 

此外,您可以搜尋名為 graypit 的實現。我對那個話題不是很了解,但是 graypit 應該有 ip base 連接限制,也許那裡有一個 solaris 版本。

另一種方法如下。檢查您的日誌中是否存在大量 dos 活動或虛假登錄,並在訪問中使用 greetpause。如果您辨識出惡意行為,請在您的訪問中插入如下一行並重新生成您的 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

引用自:https://serverfault.com/questions/269810