web-dev-qa-db-ja.com

頻繁なIPのログファイルの解析

そのため、DDOS攻撃を受けている間にこれを一緒にハッキングして、ログからいたずら ipsを引き出しました。誰かがそれをより良くするための改善や他の提案がありますか?

一般的な考え方は次のとおりです。

  1. ログファイルからIPのみをプルする
  2. それらを並べ替えます
  3. uniqとそれらを数える
  4. もう一度並べ替えます

そして文字列o 'パイプ:
cut --delim " " -f7 /var/log/Apache_access | sort | uniq -c | sort -rn > sorted-ips.txt

12
gabe.

私はいつもこれを使用しました:

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

tailを使用すると、本当に行きたい距離の制限を設定できます。ログローテーションを使用しない場合は(何らかの理由で)、次にawk-ほとんどのログはスペースで区切られているため、適切な$変数を追加することで、追加情報(おそらく、ヒットしたURL、ステータス、ブラウザーなど)を引き出すことができます。最後に、uniqの欠陥は、タッチペアでのみ機能します-IE:

A
A
A
A
B
A
A

生成されます:

4 A
1 B
2 A

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

7
Marco Ceppi

fail2ban ホイールを再発明している最中のようです。

Fail2banを見てください。それはおそらくあなたがすでに望んでいることをします、そしてそうでなければ、それはカスタマイズするのが簡単です。

7
Warren Young

Marco Ceppiは、awkがこのための優れたツールであることについて正しいですが、awkはsortuniqよりも優れたツールです。これは、そのロジックをawk。 1000行をテーリングするだけの場合は大きな違いはありませんが、巨大なマルチギグログファイルを確認する場合は、それをawkに移動する方が桁違いに速くなる可能性があります。

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 IPを吐き出す1,000,000行を読み取り、ソートは1,000,000 IP全体を処理し、ソートされた1,000,000 IPをuniqに送信します。これにより、はるかに小さい値に削減されます。ソートする前のデータ量。 1,000,000 IPで複数のパスをパイプする/実行する代わりに、awkは1つのパスでほとんどすべてを実行します。

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

  • 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
7
Mark McKinstry