Анализ файлов журналов на предмет частых IP-адресов

Анализ файлов журналов на предмет частых IP-адресов

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

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

  1. вытащить IP только из файла журнала
  2. сортировать их
  3. uniq и посчитайте их
  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возможностью установить предел того, насколько далеко назад я действительно хочу зайти - хорошо, если вы не используете ротацию журналов (по какой-либо причине), во-вторых, я использую awk- поскольку большинство журналов разделены пробелами, я оставил себе возможность извлекать дополнительную информацию (возможно, какие URL они посещали, статусы, браузеры и т. д.), добавляя соответствующую $переменную. Наконец, недостаток в uniqнем работает только в соприкасающихся парах - IE:

A
A
A
A
B
A
A

Будет производить:

4 A
1 B
2 A

Не тот результат, который хотелось бы получить. Поэтому мы сортируем первый столбец (в данном случае ips, но мы могли бы сортировать и другие столбцы), затем uniqих, наконец, сортируем количество по возрастанию, чтобы я мог увидеть самых больших нарушителей.

решение2

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

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

решение3

Марко Чеппи прав, говоря, 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, затем sort проходит по всем 1 000 000 IP, отправляя теперь отсортированные 1 000 000 IP в uniq, что сокращает их до гораздо меньшего объема данных перед передачей их в sort. Вместо того, чтобы пересылать/делать несколько проходов по 1 000 000 IP, awk делает почти все за один проход.

Используя журнал Apache объемом 5 513 132 строки (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

Связанный контент