Skip to content

Instantly share code, notes, and snippets.

@brokendish
Last active December 10, 2015 02:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brokendish/4367515 to your computer and use it in GitHub Desktop.
Save brokendish/4367515 to your computer and use it in GitHub Desktop.
ApacheのBASIC認証で指定回数のエラーを出した場合、一定の時間アクセス制御する 処理概要 ・Apacheのエラーログからユーザなし、パスワードミスマッチを検知する ・その日付、時刻を取得する ・回数の判定(1時間以内に5回)を行う ・指定回数超えた場合は一定時間アクセス拒否する ・アクセス拒否の解除は自動的に行う ・アクセス制御したIPアドレスの情報をルート宛にメール送信する
#!/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