いしもち通信

お魚大好き人間の情報交換。旅先の思い出情報交換。
サーバー管理。学校でのAccess利用。PC関連情報。
社会問題。

続・ログの自動分析 補足

2020-03-14 14:13:24 | Weblog

前回示したコマンドは、基本的にcronにスクリプトとして登録して自動実行し結果を適当な
ファイルとして保存し利用することを前提としていますが、お遊びとして
任意の時に任意の時間を入れて実行できるようにしたものを作成してみました。

お遊びとは言え、100分や1000分などを引数とすることは意味がありませんので
1~59分を指定できるようにしました。(スクリプト名はxmin.sh)


#!/bin/bash
LANG=C
####################### 引数チェック ###

if [ $# -ne 1 ]; then
  echo "ERROR:引数が指定されていないか、多すぎます。"
  echo " 【使い方】xmin.sh MM (MMは1~59)"
  exit
elif [[ ! "$1" =~ ^([1-9]|[1-5][0-9])$ ]]; then
  echo "ERROR:指定された引数が違います。"
  echo " 【使い方】xmin.sh MM (MMは1~59)"
  exit
fi

############################

STIME="$1min ago"
awk '{if(substr($4,2,20)>=cftime){print $0}}' cftime=`date --date "$STIME" "+%d/%b/%Y:%H:%M:%S"` /var/log/apache2/access.log
echo "指定された時間は"$1"分です。"
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

続・ログの自動分析

2020-03-13 19:41:09 | Weblog

先の投稿で、例えば1時間前の(最新の1時間)のログだけ抽出する方法を説明しました。

Dos攻撃などに対しては、短時間のうちの異常なアクセスを検出して対応することが必要になります。
例えば、5分ごとに1分間に閾値を超えたアクセスを検出するような場合、時間を遡り繰り返しの処理が必要になります。プログラム的にはそう難しくはありませんが、先の1時間前を対象としたスクリプトを見直しスッキリしたもので対応しようと思いました。ただし、不等号が登場することはやむを得ません。時間単位なら等号(=)で00~59分までカバーできますが、分単位では等号(=)を使うと繰り返し処理にするしかありません。

今回、たった1行で分単位で遡ったログを抽出できる方法ができましたので備忘録として残しておきます。
対象ログはApacheのものにしますが何にでも応用は可能でしょう。

言語環境によっては月表示が異なりますので、LANG=Cをつけておきます。
コマンドラインから、次のように入力します。(例は10分前としています。実際には1行です。\で2行に表記)

LANG=C && awk '{if(substr($4,2,20)>=cftime){print $0}}'\
 cftime=`date --date "10min ago" "+%d/%b/%Y:%H:%M:%S"` /var/log/apache2/access.log

この例ではログ全体を表示しますが、必要なものを各自で変更してください。($0の部分)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ログの自動分析2

2020-03-05 09:51:48 | Weblog

先に投稿したiLogScannerを使ったApacheのログ分析について機能を追加しました。

異常があった場合メールで知らせるのは良いとして、いつもすぐチェックできるわけではないので
メール送信と同時に、該当IPからのアクセスを遮断する設定を追加してみました。

必要なことは

1.解析結果のログから、IPアドレス部を取り出す。

/usr/bin/nkf -w $LOGFILE | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | awk '{print $4}'
ログファイルを文字変換してIPアドレス表記にマッチさせ第4項目(IPアドレス部分)を取り出す。

2.取り出したIPアドレスをファイルに保存する。

前項を > 保存ファイル名
で保存する。

3.保存したファイルから1行ずつIPアドレスを取り出し、アクセス遮断処理をする。(件数分繰り返し)

while read line
do
 変数 $lineを使って、アクセス遮断処理を記述する
done < 保存ファイル名

の手順となります。

具体的な処理内容は環境に合わせます。

例えば、UbuntuのUFWを使うなら

sudo ufw insert 1 deny from $line to any

というような内容になります。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ログ自動分析 補足説明

2020-03-01 09:21:35 | Weblog

前回説明したログ自動分析の運用面で注意すべき点を補足しておきます。

自動実行するタイミングによっては、日付をまたぐ場合があります。
ログローテートの関係で前日の分を参照する必要が出てきます。例えば0時台(24時台)に実行して、1時間前ならば前日の23時台なので、ローテート後だとApacheの場合access.log.1を読みにいかないといけません。
したがって、if文等でファイル名を切り換える処理を入れておきます。
上記の例であれば、現在時刻の時間部分を取り出し、

if [ `date "+%H"`="00" ]; then
 参照ファイルをaccess.log.1に指定する処理
else
 参照ファイルをaccess.logに指定する処理
fi

if文の中にすべての処理を記述してもよいですが、ファイル名だけを変数に入れて
処理はif文の外に記述したほうがスッキリするでしょう。

ざっと確認したところ当方の環境では、0時10分位までならaccess.logで問題ありませんでした。
余裕をみてcronに0時15分で登録した場合は、上記の条件式が成立していました。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする