またどこかのCTOになった人のブログ

またどこかのCTOになった人が書いてます。最近はCakePHP3とConoHaのネタが多いです。

apacheのアクセスログから日付指定でアクセス数を解析してbotを遮断してみた。

とある日、突然の高アクセスにサーバが悲鳴をあげました。
個人的には「アクセスたくさんきたぜ」とちょっと喜んでしまうのですが、そうも言ってられません。
とりあえずapacheアクセスログを見ると、どうもbingのbotがきている模様。
何という節操の無さなのか。

こんな時「めんどくさいからアクセス多いIPアドレス弾く」ことをよくやります。
そのためにはどのIPアドレスからのアクセスが多いのかな? というのを調べる必要があります。
以下に書くコマンドは弊社のインフラエンジニアが教えてくれたのですが、とても便利です。

下準備

  1. apacheaccess.logを別名でコピる
  1. 対象日を決める
  1. 以下のコマンドを実行する
  grep "対象日" apachelog.txt | awk '{gsub(/"[^"]+"/, "\"***\"", $0); gsub(/\[/, "", $0);  print$0; }' | awk -F'[ ,]' '{print $13}' | sort | uniq -c > checkip.txt

対象日の部分はログの出力の仕方で変わるかもしれません。
「21/May/2017」みたいなイメージですが、この辺は環境に応じてaccess.logを見てください。

最後のcheckip.txtは結果をリダイレクトでファイル出力しているだけです。
出力されたファイルにはIPアドレスとアクセス回数が出ていると思います(多分)
あとは出力したファイルをExcelでスペース区切りだかタブ区切りだかでファイルを読み込んで
アクセス回数の列に対してソートをかければ、アクセス回数が多いIPアドレスがわかるかと思います。

偉そうに書いてますが、自分で使う時は日付変えてコピペして実行しているだけです。
インフラできる人って本当に尊敬します。

余談なんですが、アクセス回数が多いIPアドレスは一応どこからのアクセスか調べるのが吉です。
以前、とりあえず片っ端から遮断したら、その中にシステムを死ぬほど触ってたクライアントがいたことがあったので。

そんなに触らなくてもいいじゃないとちょっとだけ思いました。