Parsing file log untuk IP yang sering


12

Jadi, saya meretas ini bersama-sama saat menjalani serangan DDOS untuk menarik keluar ips nakal dari log saya. Adakah yang punya perbaikan atau saran lain untuk membuatnya lebih baik?

Inilah ide umum:

  1. hanya menarik ip dari file log
  2. urutkan mereka
  3. uniq dan hitung
  4. sortir lagi

Dan string o'pipes:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt


Tidak yakin apakah ini akan lebih baik ditanyakan di webmaster ... tapi karena itu semua menggunakan utix unix, dan baris perintah ... Saya pikir di sini akan lebih tepat.
gabe.

Tampak baik-baik saja di sini. Ini berbasis unix, dan tidak khusus untuk hal-hal web (Ini mungkin bisa berlaku untuk banyak hal berbeda di Apache atau firewall log IP)
Stefan Lasiewski

Jawaban:


7

Saya selalu menggunakan ini:

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

Dengan tailsaya dapat menetapkan batas seberapa jauh saya benar-benar ingin pergi - baik jika Anda tidak menggunakan rotate log (untuk alasan apa pun), kedua saya memanfaatkan awk- karena sebagian besar log dibatasi oleh ruang, saya Saya telah meninggalkan diri saya dengan kemampuan untuk menarik informasi tambahan (mungkin URL apa yang mereka tekan, status, browser, dll) dengan menambahkan $variabel yang sesuai . Terakhir, cacat di uniqdalamnya hanya berfungsi pada pasangan yang menyentuh - IE:

A
A
A
A
B
A
A

Akan menghasilkan:

4 A
1 B
2 A

Bukan hasil yang diinginkan. Jadi kita mengurutkan kolom pertama (dalam hal ini ips, tapi kita bisa mengurutkan kolom lainnya) lalu uniqmereka, akhirnya mengurutkan jumlah naik sehingga saya bisa melihat pelaku tertinggi.


Ya, saya menyadari masalah ini dengan uniq juga, maka jenis pertama saya untuk menempatkan semua IPS agar duplikat akan bersebelahan. Ujung ekornya bagus, juga karena mem-parsing seluruh log di sekitar 4GB bisa memakan waktu. Barang bagus, terima kasih.
gabe.

-k1redundan, (1) hanya ada satu kunci (2) sortmulai menggunakan kata pertama sebagai kunci.
Lekensteyn

7

Sepertinya Anda sedang menciptakan kembali roda fail2ban .

Lihat fail2ban. Mungkin sudah melakukan apa yang Anda inginkan, dan jika tidak, mudah untuk menyesuaikannya.


1
Itu proyek yang cukup menarik yang tidak saya sadari, terima kasih. Pada saat yang sama, saya tidak ingin menginstal apa pun pada server log yang tidak perlu, dan cukup mudah untuk melakukan apa yang sudah saya lakukan. Saya hanya mencari saran perbaikan. Terima kasih!
gabe.

Ini terlihat sangat keren, dan GPL juga.
Eli Frey

7

Marco Ceppi benar tentang awkmenjadi alat yang lebih baik untuk ini tetapi awk juga merupakan alat yang lebih baik daripada sortdan uniqkarena logika itu dapat dipindahkan ke awk. Ini tidak membuat banyak perbedaan jika Anda hanya mengekor 1000 baris tetapi jika Anda ingin melihat file log multi-manggung besar itu bisa menjadi urutan besarnya lebih cepat untuk memindahkannya ke awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -nakan melakukan apa yang Anda butuhkan tetapi jauh lebih cepat untuk file besar. Itu menciptakan array IP di awk, menggunakan alamat IP sebagai kunci dan berapa kali IP terjadi sebagai nilai.

Percepatan datang karena awk melakukan satu melewati data dan melakukan sebagian besar pekerjaan, kecuali untuk menyortir hasil akhir. Menggunakan metode lain, jika Anda memiliki 1.000.000 baris dalam log transfer, awk membaca 1.000.000 baris yang mengeluarkan 1.000.000 IP, kemudian mengurutkan seluruh 1.000.000 IP, mengirimkan 1.000.000 IP yang sekarang disortir ke uniq yang menguranginya menjadi jauh lebih kecil jumlah data sebelum memberikan itu untuk disortir. Alih-alih memutar / melakukan beberapa lintasan pada 1.000.000 IP, awk melakukan hampir semua hal dalam satu lintasan.

Menggunakan 5.513.132 garis apache log (1.1 gigs) di laptop saya, inilah perbandingan kecepatannya:

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

Sangat keren. Saya menambahkan ini ke tas trik saya.
gabe.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.