防止在Solaris 10上发送Sendmailpowershell攻击

我想dynamic地阻止使用基于速率或连接限制的相同IP地址的特定连接。 这可能使用Solaris / IPF或一些sendmail扩展? 我想限制sendmaillogin尝试来防止暴力攻击。

在Linux中,它很容易在iptables防火墙上处理,但我一直无法find一种方法来使用ipf来限制它在防火墙层。 Sendmail有一个内置的速率限制和连接限制,但它似乎适用于所有用户,所以如果我们遇到DOS或DDOS,它会阻止所有的用户,而不是只有攻击者。

看看这里,这些是基于sendmail的指令,可以防止洪水和不良行为,也许这可以帮助你: http : //www.acme.com/mail_filtering/sendmail_config.html

我为自己使用这些configuration:

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 

此外,您可以search一个名为greypit的实现。 我对这个话题并不是最新的,但是greypit应该有ip base的连接限制,可能是solaris的版本。

另一种方法如下。 检查日志中是否存在大量的dos活动或虚假login,并使用greetpause进行访问。 如果您身份的恶意行为在您的访问中插入一行如下,并重新生成您的access.db

 GreetPause:bad.ip.dos.attacker.com 100 

从现在开始,每个来自ip或hostname的请求都需要等待100秒才能获得helo。

我反过来使用这个function,但它也可以用来阻止不需要的连接。

这些entrys的脚本只是一个cron脚本,但关心它只是获得良好的stream量的另一种方式,你必须手动重新创build您的access.db:

 #!/bin/sh declare -aa let count=0 accessmap="/tmp/access.test" logfiles="/var/log/mail.log" mailfile="/tmp/tmpmail.mail" email="[email protected]" ## 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