Как управлять файлом журнала с помощью grep или awk?

Я пытаюсь получить файл / var / log / secure log и показать только тип журнала «Failed Password», который появляется не менее 3 раз. Есть ли способ сделать это с помощью только команд Linux? AWK? Grep?

Пример безопасного журнала,

Mar 20 08:38:28 localhost sshd[21895]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=mail.queued.net user=root Mar 20 08:38:31 localhost sshd[21895]: Failed password for root from 207.210.101.209 port 2854 ssh2 Mar 20 15:38:31 localhost sshd[21896]: Received disconnect from 207.210.101.209: 11: Bye Bye Mar 20 08:38:32 localhost unix_chkpwd[21900]: password check failed for user (root) Mar 20 08:38:32 localhost sshd[21898]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=she 

из этого файла журнала я ожидаю, что ничего не скажу, потому что есть только 1 строка «Неверный пароль», но позволяет сказать, что было 4 строки «Failed Password», с тем же IP-адресом – я хочу отобразить IP-адрес, который, вероятно, пытается перенаправить меня. ,

Это всего лишь способ выполнить эту работу. Вместо имени пользователя, я предпочитаю подсчитывать, сколько раз определенный IP-адрес пытается подключиться к моему хосту, потому что тогда я могу в конечном итоге его запретить.

 awk '/Failed password/{ z[$11]++; } END{ for (i in z){ if (z[i]>3) printf("%s attemps %s times.\n", i, z[i]) } }' /var/log/secure 

(Конечно, это может быть команда oneliner, я отступом для повышения удобочитаемости.)

Объяснение:

awk читает файл журнала по строкам. Если строка содержит строку /Failed password/ increment, элемент массива z[$11]++ index на $11 (т. Е. IP-адрес): я использую это как счетчик. В конце найдите в массиве z[$11] и напечатайте только IP-адреса, которые пытались подключиться более 3 раз.
Вы можете настроить проверку и распечатать сообщение по своему усмотрению.


Если вы беспокоитесь о попытках грубой силы, могу ли я предложить вам использовать существующий инструмент Fail2ban, который сканирует файлы журналов и запрещает IP-адреса, которые показывают вредоносные знаки (например: слишком много сбоев паролей, поиск эксплойтов и т. Д.). , Его легко понять и настроить в соответствии с вашими потребностями.

 $ awk '/Failed password/{for(i=1;i<=NF;i++)if($i~/for/)user[$(i+1)]++}END{for(j in user){if(user[j]>3){printf("%s : %s times failed\n",j,user[j])}}}' /var/log/secure