Вчера в моем файле журнала были миллионы таких строк:
Feb 25 18:00:00 mond2 sshd[29574]: Bad protocol version identification '\003' from 54.37.78.250 port 50306
Feb 25 18:00:00 mond2 sshd[29575]: Bad protocol version identification '\003' from 54.37.78.250 port 50530
Feb 25 18:00:00 mond2 sshd[29576]: Bad protocol version identification '\003' from 54.37.78.250 port 50696
Feb 25 18:00:00 mond2 sshd[29577]: Bad protocol version identification '\003' from 54.37.78.250 port 50857
Feb 25 18:00:00 mond2 sshd[29578]: Bad protocol version identification '\003' from 54.37.78.250 port 51032
Feb 25 18:00:01 mond2 sshd[29579]: Bad protocol version identification '\003' from 54.37.78.250 port 51213
Feb 25 18:00:01 mond2 sshd[29580]: Bad protocol version identification '\003' from 54.37.78.250 port 51427
Feb 25 18:00:01 mond2 sshd[29584]: Bad protocol version identification '\003' from 54.37.78.250 port 51642
Feb 25 18:00:01 mond2 sshd[29585]: Bad protocol version identification '\003' from 54.37.78.250 port 51809
Feb 25 18:00:01 mond2 sshd[29586]: Bad protocol version identification '\003' from 54.37.78.250 port 51970
И я хотел поймать их с помощью fail2ban, создав для него новый джейл. Но ничего не вышло. Теперь я попробовал тестер регулярных выражений, и он сказал мне следующее:
fail2ban-regex /var/log/auth.log.test "^%(__prefix_line)sBad protocol version identification '\\\d+' from <HOST> port"
Running tests
=============
Use failregex line : ^%(__prefix_line)sBad protocol version identificat...
Use log file : /var/log/auth.log.test
Use encoding : UTF-8
Results
=======
Failregex: 0 total
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [10] (?:DAY )?MON Day 24hour:Minute:Second(?:\.Microseconds)?(?: Year)?
`-
Lines: 10 lines, 0 ignored, 0 matched, 10 missed [processed in 0.00 sec]
|- Missed line(s):
| Feb 25 18:00:00 mond2 sshd[29574]: Bad protocol version identification '\003' from 54.37.78.250 port 50306
| Feb 25 18:00:00 mond2 sshd[29575]: Bad protocol version identification '\003' from 54.37.78.250 port 50530
| Feb 25 18:00:00 mond2 sshd[29576]: Bad protocol version identification '\003' from 54.37.78.250 port 50696
| Feb 25 18:00:00 mond2 sshd[29577]: Bad protocol version identification '\003' from 54.37.78.250 port 50857
| Feb 25 18:00:00 mond2 sshd[29578]: Bad protocol version identification '\003' from 54.37.78.250 port 51032
| Feb 25 18:00:01 mond2 sshd[29579]: Bad protocol version identification '\003' from 54.37.78.250 port 51213
| Feb 25 18:00:01 mond2 sshd[29580]: Bad protocol version identification '\003' from 54.37.78.250 port 51427
| Feb 25 18:00:01 mond2 sshd[29584]: Bad protocol version identification '\003' from 54.37.78.250 port 51642
| Feb 25 18:00:01 mond2 sshd[29585]: Bad protocol version identification '\003' from 54.37.78.250 port 51809
| Feb 25 18:00:01 mond2 sshd[29586]: Bad protocol version identification '\003' from 54.37.78.250 port 51970
`-
Так что он явно не знает, чего я хочу. Что это вообще значит, строки были пропущены? Разве он не посмотрел внимательно и забыл то, что только что прочитал? Он читал слишком быстро, чтобы действительно обработать прочитанное? Я этого не понимаю, и Интернет тоже. Есть ли этому объяснение?
И что мне нужно сделать, чтобы сопоставить и запретить эти строки журнала?
Вот регулярное выражение, с которого я начал, не знаю, хорошо ли это:
failregex = ^%(__prefix_line)sBad protocol version identification '\\\d+' from <HOST> port \d+\s*$
У меня Fail2Ban v0.9.3 на Ubuntu 16.04.
Я поиграл еще, чтобы найти рабочее решение. Единственное, что я смог найти, это удалить все, что я добавил, и добавить это только в sshd
тюрьма, в jail.local
:
failregex = ^\s*\S+\s+sshd\[\d+\]: Bad protocol version identification '.*?' from <HOST> port
Кажется, это работает. Когда я подключаюсь к netcat и ввожу текст, появляется соответствующая строка журнала и fail2ban-client status sshd
увеличивает счетчик сбоев на 1. Я не совсем уверен, потому что происходят и другие атаки (обычный фоновый шум).
Ключевое изменение в регулярном выражении не в том, чтобы чрезмерно указывать часть после «идентификации».
Я немного ржавый, но missed lines
относится к строки без совпадения против вашего регулярного выражения.
Следующая команда покажет совпадающие и пропущенные строки из вашего журнала:
fail2ban-regex --print-all-missed /var/log/auth.log.test "^%(__prefix_line)sBad protocol version identification '\\\d+' from <HOST> port"
Насколько я помню, у каждой строки будет префикс, говорящий HIT:
если регулярное выражение соответствует и MISS:
если нет совпадений.
РЕДАКТИРОВАТЬ
Сижу сейчас за компьютером, пытаюсь отладить ваше утверждение.
Во-первых, может быть, регулярное выражение немного урезано? Потому что регулярное выражение не соответствует всей строке.
Насколько я могу судить, совпадения регулярных выражений:
Feb 25 18:00:00 mond2 sshd[29574]: Bad protocol version identification '\003' from 54.37.78.250 port
50306
Заметил, что я не отметил номер порта.
Что, если вы расширили регулярное выражение, поэтому оно говорит:
^%(__prefix_line)sBad protocol version identification '\\\d+' from <HOST> port \d+
Хм ... Пробовал журнал тестов с моим собственным сервером, но он все еще не работал. Подозревая, что __prefix_line
часть не соответствует всему до "Плохой протокол".