Last active
December 10, 2015 02:28
-
-
Save brokendish/4367515 to your computer and use it in GitHub Desktop.
ApacheのBASIC認証で指定回数のエラーを出した場合、一定の時間アクセス制御する 処理概要 ・Apacheのエラーログからユーザなし、パスワードミスマッチを検知する ・その日付、時刻を取得する ・回数の判定(1時間以内に5回)を行う ・指定回数超えた場合は一定時間アクセス拒否する ・アクセス拒否の解除は自動的に行う ・アクセス制御したIPアドレスの情報をルート宛にメール送信する
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# | |
# ---------------------------------------------------------------------------- | |
# ApacheのBASIC認証で指定回数のエラーを出した場合、一定の時間アクセス制御する | |
# ---------------------------------------------------------------------------- | |
# ---------- | |
# 処理概要 | |
# ---------- | |
# ・Apacheのエラーログからユーザなし、パスワードミスマッチを検知する | |
# ・その日付、時刻を取得する | |
# ・回数の判定(1時間以内に5回)を行う | |
# ・指定回数超えた場合は一定時間アクセス拒否する | |
# ・アクセス拒否の解除は自動的に行う | |
# ・アクセス制御したIPアドレスの情報をルート宛にメール送信する | |
# | |
# ---------- | |
# 使用環境: | |
# ---------- | |
# ファイルの更新監視には「inotify」を使用しているので、inotifyがインストールされていること。 | |
# Debian、Ubuntuの場合、「apt-get install inotify-tools」でインストール! | |
# ※カーネル2.6.13 以降 | |
# 「iptables」を使用しているのでインストールされていること。 | |
# | |
# ---------- | |
# 使用方法: | |
# ---------- | |
# 実行例1:バックグラウンドで実行 | |
# ./ApacheBasicAuthenticationWall.sh & | |
# | |
# 実行例2:フォアグラウンドで実行 | |
# ./ApacheBasicAuthenticationWall.sh | |
# ---------------------------------------------------------- | |
#****************************************************************** | |
#****************************************************************** | |
# 環境設定 | |
#------------------------------------------------------------------ | |
#********************************* | |
# ログファイルを指定 | |
#********************************* | |
loglog=/var/log/apache2/error.log | |
#loglog=/var/log/apache2/aaaaa.log | |
#------------------------------------------------------------------ | |
#********************************* | |
# 検知文字列を設定 | |
#********************************* | |
ErrorString=".+user.+not.+found.+|.+Password.+Mismatch*" | |
#------------------------------------------------------------------ | |
#********************************* | |
# 認証エラーの最大件数を設定 | |
#********************************* | |
export MAXcnT=4 | |
#------------------------------------------------------------------ | |
#********************************* | |
# 作業用ファイルを設定 | |
#********************************* | |
TempFile="./ApacheBasicAuthenticationWall_tmp" | |
#------------------------------------------------------------------ | |
#********************************* | |
# ロックファイルを設定※ atから参照するのでフルパスで記載 | |
#********************************* | |
LockNOW="/hoge/tools/ApacheBasicAuthentication_LockNOW.lst" | |
#------------------------------------------------------------------ | |
#********************************* | |
# メール送信件名を設定 | |
#********************************* | |
MailMSG="ApacheAuthentication! LOCK IP" | |
#------------------------------------------------------------------ | |
#********************************* | |
# メール送信先を設定 | |
#********************************* | |
MailTO="root" | |
#------------------------------------------------------------------ | |
#********************************* | |
# アクセス制御時間を設定 | |
#********************************* | |
LockTIME="now + 1 hours" | |
#LockTIME="now + 2 hours" | |
#LockTIME="now + 2 minutes" | |
#LockTIME="now + 30 minutes" | |
#****************************************************************** | |
#****************************************************************** | |
# | |
#-------------処理開始---------- | |
touch $LockNOW | |
#-----------------------------------------------------------------inotifywait処理開始 | |
while inotifywait -e modify $loglog; | |
do | |
#英語表記で月、日、時を取得して環境変数に入れる | |
export LANG=en | |
chkDate=`date +%b:%d:%k` | |
export CHKD=$chkDate | |
#-----------------------------------------------------------------パイプ処理開始 | |
# | |
egrep "$ErrorString" $loglog | | |
awk '{print $8":"$2":"$3":"$4}' | | |
sed 's/]//g' | | |
sort | | |
awk ' | |
BEGIN{ | |
FS=":" | |
cnt=0; | |
flg=0; | |
} | |
{ | |
chkStr=$2":"$3":"$4; | |
chkIP=$1; | |
# | |
if(chkStr==ENVIRON["CHKD"]) | |
{ | |
#1行目の処理 | |
if(NR==1) | |
{ | |
chkIP=$1; | |
chkIPold=$1; | |
} | |
#1行目以降の処理 | |
if(chkIP==chkIPold) | |
{ | |
cnt=cnt+1; | |
if(cnt>ENVIRON["MAXcnT"] && flg==0) | |
{ | |
print chkIP; | |
flg=1; | |
} | |
} | |
else | |
{ | |
flg=0; | |
cnt=0; | |
} | |
chkIPold=chkIP; | |
} | |
} | |
END{ | |
}' | | |
sort > $TempFile$$tmp | |
#-----------------------------------------------------------------パイプ処理終了 | |
#----------既にロックリストに載っているIPアドレスは処理対象から削除---開始 | |
comm -23 $TempFile$$tmp $LockNOW>$TempFile$$ | |
#----------既にロックリストに載っているIPアドレスは処理対象から削除---終了 | |
#----------TMPファイルを読み込んでアクセス制御を行う--------------開始 | |
for inIp in `cat $TempFile$$`; | |
do | |
#--------iptablesでアクセス拒否 | |
iptables -I INPUT -s $inIp -j DROP | |
echo iptables -I INPUT -s $inIp -j DROP | |
#--------アクセス制御中リストに追加する | |
echo $inIp>>$LockNOW | |
sort $LockNOW>$LockNOW$$tmp | |
cat $LockNOW$$tmp>$LockNOW | |
#--------指定時間(登録からLockTIME)でiptablesから削除し、ロックリストからも削除する--atコマンドで行う | |
echo "iptables -D INPUT -s $inIp -j DROP && cat $LockNOW|sed '/$inIp/d'>$LockNOW"|at $LockTIME | |
#echo "echo iptables -D INPUT -s $inIp -j DROP && cat $LockNOW|sed '/$inIp/d'|at $LockTIME" | |
#--------アタッカー情報をルート宛にメールを送信 | |
echo $MailMSG '\n\n' `whois $inIp|egrep -i 'country|descri|source|role'` '\n\n' "IP-ADDRESS=" $inIp '\n\n' "IPアドレスをロックしました。" '\n' "iptables -I INPUT -s $inIp -j DROP" '\n\n' "ロック解除は自動的に行われます。" '\n' "echo iptables -D INPUT -s $inIp -j DROP|at " $LockTIME '\n\n' "現在ロックしているIPは以下です。"'\n'`cat $LockNOW` |mail -s "$MailMSG" "$MailTO" | |
done | |
#----------TMPファイルを読み込んでアクセス制御を行う-------------終了 | |
#作業用TMPファイル削除 | |
if [ -e $TempFile$$ ]; | |
then | |
rm $TempFile$$ | |
fi | |
if [ -e $LockNOW$$tmp ]; | |
then | |
rm $LockNOW$$tmp | |
fi | |
if [ -e $TempFile$$tmp ]; | |
then | |
rm $TempFile$$tmp | |
fi | |
done | |
#-----------------------------------------------------------------inotifywait処理終了 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment