Разбор лог файлов для частых IP


12

Итак, я взломал это вместе во время DDOS-атаки, чтобы вытащить непослушные ips из моих логов. У кого-нибудь есть какие-либо улучшения или другие предложения, чтобы сделать это лучше?

Вот общая идея:

  1. вытащить только ip из файла журнала
  2. сортировать их
  3. uniq и сосчитайте их
  4. сортировать их снова

И струнные трубы:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt


Не уверен, что это лучше спросить у веб-мастеров ... но, поскольку все они используют утилиты Unix и командную строку ... Я подумал, что здесь будет более уместно.
таращиться

Кажется, хорошо здесь. Он основан на Unix и не относится к веб-ресурсам (это может относиться ко многим различным вещам в IP-
адресах

Ответы:


7

Я всегда использовал это:

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их, наконец, сортируем счетчик по возрастанию, чтобы я мог видеть самых обидчиков.


Да, я понял проблему и с uniq, поэтому я первым делом привел все IPS в порядок, чтобы дубликаты были рядом друг с другом. Кончик хвоста также хорош, так как анализ всего журнала около 4 ГБ может занять некоторое время. Хорошие вещи, спасибо.
таращиться

-k1избыточен, (1) есть только один ключ (2) sortначинает использовать первое слово в качестве ключа в любом случае.
Лекенштейн

7

Похоже, вы находитесь в процессе переизобретения колеса fail2ban .

Посмотрите на fail2ban. Он, вероятно, уже делает то, что вы хотите, а если нет, то его легко настроить.


1
Это довольно интересный проект, о котором я не знал, спасибо. В то же время я не хочу устанавливать на сервер журналов что-либо, что не нужно, и достаточно просто сделать то, что я уже делаю. Я просто ищу предложения по улучшению. Благодарность!
таращиться

Это выглядит действительно круто, и GPL тоже.
Эли Фрей

7

Марко Чеппи прав в том, awkчто он является лучшим инструментом для этого, но awk также является лучшим инструментом, sortи uniqс тех пор эту логику можно использовать awk. Это не имеет большого значения, если вы просто следите за 1000 строками, но если вы хотите посмотреть на огромный файл журнала с несколькими гигабайтами, его можно перенести на несколько порядков быстрее awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -nбудет делать то, что вам нужно, но намного быстрее для больших файлов. Он создает массив IP-адресов в awk, используя IP-адрес в качестве ключа и количество раз, которое IP-адреса встречаются в качестве значения.

Ускорение происходит потому, что awk делает один проход по данным и выполняет большую часть работы, за исключением сортировки окончательного результата. Используя другой метод, если у вас есть 1 000 000 строк в журнале передачи, awk читает эти 1 000 000 строк, выплевывая 1 000 000 IP-адресов, а затем сортирует по всем 1 000 000 IP-адресам, отправляя теперь отсортированные 1 000 000 IP-адресов в uniq, что сокращает его до гораздо меньшего количество данных, прежде чем дать, чтобы отсортировать. Вместо того, чтобы обойти / сделать несколько проходов на 1 000 000 IP-адресов, awk делает почти все за один проход.

Используя 5 513 132 строки в Apache Log (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

Очень круто. Я добавляю это к моей сумке уловок.
таращиться
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.