ログ、sh、cronに基づくFreeBSDの積極的な保護

すべてのFreeBSD管理者への挨拶!



2台目のサーバーをFreeBSDにセットアップし、重要な企業情報をそこに転送して、保護について考えました。 アンチウイルス、ファイアウォール、その他の有用なシステムについては繰り返しません。これらのツールはどれも私の問題を解決しませんでした。



ログを表示すると、 タスクが自動的に発生しました。

/var/log/exim/rejectlog

/var/log/auth.log

/var/log/apache22/httpd-error.log








彼らは、 EximのサーバーとWebメールへのパスワードを見つける試みの失敗に関する情報を常に入手しました。 遅かれ早かれ、攻撃者はパスワードを取得できるため、たとえばIPFWルールにIPアドレスを追加するなどして、何らかの方法でパスワードを停止する必要があります。 また、Webサーバーでは、明らかに、phpmyadminなどの管理に関連する存在しないディレクトリやファイルを見つけて、既存の脆弱性をチェックしようとしました。



Googleとセキュリティのいくつかの側面に関するlissyaraの記事は、方向性を示唆しました。



最後の解決策は単純に見えます。cronは1分に1回shスクリプトを実行し、指定されたログをスキャンして、不幸な侵入者をipfwルールに次の形式で追加します。

deny ip from 123.123.123.123 to me







私はファイルでlissyaraのスクリプトを修正することができました:





各ログファイルについて、それぞれ独自のshスクリプトを作成しました。

mailsec.sh

nixsec.sh

websec.sh






なぜなら それらは問題を解決するためのアプローチが少し異なりますが、一般的な概念は似ています。



スクリプトは着実に電力を処理し、ブルートフォースをほとんど不可能にし、不必要に好奇心をそそるものから保護します。 蓄積された統計によると、1分間で100を超える選択試行を行うことはできませんでした。 スクリプトをコミッショニングする前、試行は24時間無数でした。



そのようなスクリプトは各サーバーにあるべきだと思います、なぜなら 保護はあまりありません。

私の経験がこれに役立つことを願っています。 コードを持ってきます。 質問に答える準備はできていません。






mailsec.sh


 #!/bin/sh #  trusted_net='192.168.' debug_log="/var/log/mailsec.log" cur_log_file="rejectlog" cur_log_dir="/var/log/exim/" #echo "Hi!" > /dev/ttyv0 #         if [ `date +%H` -eq 02 ] && [ `date +%M` -eq 04 ] then { #      echo "-= RULES STATS =-" >> ${debug_log} /sbin/ipfw show 3 >> ${debug_log} /sbin/ipfw delete 3 >/dev/null 2>&1 echo "-= RESET RULES =-" >> ${debug_log} date >> ${debug_log} } fi #         cat ${cur_log_dir}${cur_log_file} | grep "auth_login authenticator failed for" | sed 's/ (/--/' | sed 's/failed for--/failed for (/' | sort | awk '{print $1,$8}' | sed 's/\[/ /' | sed 's/\]:/ /' | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` logday=`echo ${count_IP} | awk '{print $2}' | cut -d - -f 3` logmonth=`echo ${count_IP} | awk '{print $2}' | cut -d - -f 2` logyear=`echo ${count_IP} | awk '{print $2}' | cut -d - -f 1` IP=`echo ${count_IP} | awk '{print $3}'` day=`date +%d` mon=`date +%m` yea=`date +%Y` ippresent=`/sbin/ipfw show | grep ${IP} >/dev/null 2>&1` if [ ${day} -eq ${logday} ] && [ ${mon} -eq ${logmonth} ] && [ ${yea} -eq ${logyear} ] && [ ! ${ippresent} ] then { if [ ${count_deny} -ge 6 ] && echo $IP | grep ${trusted_net} >/dev/null 2>&1 then echo "MAILSEC: (bruteforce) IP address = ${IP} attempts count = ${count_deny}.    ( IP)" >> ${debug_log} else { if [ ${count_deny} -ge 6 ] then { echo "MAILSEC: (bruteforce) IP address = ${IP} attempts count = ${count_deny}" >> ${debug_log} /sbin/ipfw add 3 deny ip from ${IP} to me >/dev/null 2>&1 } fi } fi } fi done }
      
      










nixsec.sh


 #!/bin/sh #echo "Hi!" > /dev/ttyv0 #        if [ `date +%H` -eq 02 ] && [ `date +%M` -eq 00 ] then { /sbin/ipfw delete 1 >/dev/null 2>&1 echo "-= RESET RULES =-" >> /var/log/nixsec.log date >> /var/log/nixsec.log } fi # day=`date +%d` month=`date +%m` year=`date +%Y` log_dir="/var/old_log/${year}/${month}" #     mkdir -p ${log_dir} log_file="${log_dir}/${day}_auth.log" #   cat /var/log/auth.log > /tmp/auth.log cat /dev/null > /var/log/auth.log cat /tmp/auth.log >> ${log_file} #   IP     #    cat /tmp/auth.log | grep "Invalid user" | awk '{print $10}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 2 ] then { echo "NIXSEC: (invalid user) IP address = ${IP} deny count = ${count_deny}" >> /var/log/nixsec.log /sbin/ipfw add 1 deny ip from ${IP} to me #>/dev/null 2>&1 } fi done } #     cat /tmp/auth.log | grep "Did not receive identification string" | awk '{print $12}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 2 ] then { echo "NIXSEC: (not ident) IP address = ${IP} deny count = ${count_deny}" >> /var/log/nixsec.log /sbin/ipfw add 1 deny ip from ${IP} to me >/dev/null 2>&1 } fi done } #     c   cat /tmp/auth.log | grep "but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT" | awk '{print $7}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 2 ] then { echo "NIXSEC: (break) IP address = ${IP} deny count = ${count_deny}" >> /var/log/nixsec.log /sbin/ipfw add 1 deny ip from ${IP} to me >/dev/null 2>&1 } fi done } #  ,    root cat /tmp/auth.log | grep "User root from" | awk '{print $9}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 2 ] then { echo "NIXSEC: (root attempt) IP address = ${IP} deny count = ${count_deny}" >> /var/log/nixsec.log /sbin/ipfw add 1 deny ip from ${IP} to me >/dev/null 2>&1 } fi done }
      
      










websec.sh


 #!/bin/sh #  trusted_nets='192.168. 127.0. 10.0.' debug_log="/var/log/websec.log" cur_log_file="httpd-error.log" cur_log_dir="/var/log/apache22" old_log_dir="/var/log/apache22/old" #echo "Hi!" > /dev/ttyv0 #         if [ `date +%H` -eq 02 ] && [ `date +%M` -eq 02 ] then { echo "-= RULES STATS =-" >> ${debug_log} /sbin/ipfw show 2 >> ${debug_log} /sbin/ipfw delete 2 >/dev/null 2>&1 echo "-= RESET RULES =-" >> ${debug_log} date >> ${debug_log} } fi #      day=`date +%d` month=`date +%m` year=`date +%Y` log_dir="${old_log_dir}/${year}/${month}" # Ј    mkdir -p ${log_dir} log_file="${log_dir}/${day}_${cur_log_file}" #   cat ${cur_log_dir}/${cur_log_file} > /tmp/${cur_log_file} #    cat /dev/null > ${cur_log_dir}/${cur_log_file} #    cat /tmp/${cur_log_file} >> ${log_file} #       cat /tmp/${cur_log_file} | grep "File does not exist" | sed 'y/]/ /' | awk '{print $8}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 5 ] && echo $IP | grep 192.168. >/dev/null 2>&1 then echo "WEBSEC: (files) IP address = ${IP} attempts count = ${count_deny}.    ( IP)" >> ${debug_log} else { if [ ${count_deny} -ge 5 ] then { echo "WEBSEC: (files) IP address = ${IP} attempts count = ${count_deny}" >> ${debug_log} /sbin/ipfw add 2 deny ip from ${IP} to me >/dev/null 2>&1 } fi } fi done } #      URI cat /tmp/${cur_log_file} | grep "Invalid URI in request" | sed 'y/]/ /' | awk '{print $8}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 2 ] then { echo "WEBSEC: (URI) IP address = ${IP} attempts count = ${count_deny}" >> ${debug_log} /sbin/ipfw add 2 deny ip from ${IP} to me >/dev/null 2>&1 } fi done } #     RFC cat /tmp/${cur_log_file} | grep "request without hostname" | sed 'y/]/ /' | awk '{print $8}' | sort | uniq -c | sort | { while read count_IP do count_deny=`echo ${count_IP} | awk '{print $1}'` IP=`echo ${count_IP} | awk '{print $2}'` if [ ${count_deny} -ge 2 ] then { echo "WEBSEC: (RFC) IP address = ${IP} attempts count = ${count_deny}" >> ${debug_log} /sbin/ipfw add 2 deny ip from ${IP} to me >/dev/null 2>&1 } fi done }
      
      







おそらく、shスクリプトの専門家がコードの最適化を支援できるでしょう。



All Articles