頻繁に使用されるIPのログファイルを解析する

頻繁に使用されるIPのログファイルを解析する

そこで、DDOS攻撃を受けている間にこれをハックしていたずらログから ips を削除します。改善点や改善のための提案はありますか?

全体的な考え方は次のとおりです。

  1. ログファイルから IP のみを取得します
  2. 並べ替える
  3. ユニークで数える
  4. もう一度並べ替える

そして弦楽器のパイプ:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt

答え1

私はいつもこれを使っています:

tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1

tail実際にどのくらい遡りたいかの制限を設定できます。ログローテーションを使用しない場合(何らかの理由で)便利です。2 番目に私が利用しているのは、ほとんどawkのログがスペースで区切られているため、適切な変数を追加することで追加情報(アクセスした URL、ステータス、ブラウザーなど)を引き出すことができる機能です。最後に、接触するペアでのみ機能する$という欠点があります。つまり、次のようになります。uniq

A
A
A
A
B
A
A

以下が生成されます:

4 A
1 B
2 A

望ましい出力ではありません。したがって、最初の列 (この場合は IP ですが、他の列を並べ替えることもできます) を並べ替え、次にuniqそれらを並べ替え、最後にカウントを昇順に並べ替えて、最も違反が多いものを確認できるようにします。

答え2

どうやらあなたは今、失敗2バン車輪。

fail2ban を見てください。おそらく、すでに必要な機能が備わっていますが、そうでない場合は簡単にカスタマイズできます。

答え3

awkMarco Ceppi は、これに適したツールであることは正しいですが、ロジックを に移動できるため、sortやよりも awk の方が優れたツールです。 1000 行を tail するだけなら大した違いはありませんが、数ギガバイトの巨大なログ ファイルを参照する場合は、 に移動した方が桁違いに高速化できます。uniqawkawk

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n必要な処理は実行できますが、大きなファイルの場合ははるかに高速です。IP アドレスをキーとして、IP の出現回数を値として使用して、awk で IP の配列を作成します。

awk はデータを 1 回処理するだけで、最終出力のソート以外のほとんどの作業を行うため、速度が向上します。他の方法を使用すると、転送ログに 1,000,000 行がある場合、awk は 1,000,000 行を読み取り、1,000,000 個の IP を吐き出し、次に sort が 1,000,000 個の IP 全体を処理し、ソートされた 1,000,000 個の IP を uniq に送信します。uniq は、sort に渡す前に、データをはるかに少ない量に減らします。1,000,000 個の IP をパイプしたり、複数のパスを実行したりする代わりに、awk は 1 回のパスでほぼすべてを実行します。

私のラップトップで 5,513,132 行の Apache ログ (1.1 GB) を使用して、速度を比較します。

  • 2分45秒cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
  • 0分40秒cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n

関連情報