web-dev-qa-db-ja.com

Solaris10でのSendmailブルートフォース攻撃の防止

レートまたは接続制限に基づいて、同じIPアドレスを使用する特定の接続を動的にブロックしたい。これは、Solaris/IPFまたはsendmail拡張機能を使用して可能ですか?ブルートフォース攻撃を防ぐために、sendmailのログイン試行を制限したいと思います。

Linuxでは、iptablesファイアウォールレイヤーで簡単に処理できますが、ipfを使用してファイアウォールレイヤーで制限する方法を見つけることができませんでした。 Sendmailにはレート制限と接続制限が組み込まれていますが、すべてのユーザーに適用されているようです。そのため、DOSまたはDDOSが発生している場合、攻撃者だけでなくすべてのユーザーがブロックされます。

1
Andrew Case

ここを見てください。これらは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アクティビティや誤ったログインがないかログを確認し、アクセスにgreetpauseを使用します。悪意のある動作を特定した場合は、アクセスに次の行を挿入し、access.dbを再生成します。

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

これ以降、IPまたはホスト名からの各要求は、ヘリを取得する前に100秒待機する必要があります。

この機能を逆に使用しましたが、不要な接続をブロックするためにも使用できます。

これらのエントリを実行したスクリプトは単なる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="[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
1
evildead