Назад | Перейти на главную страницу

Что такое пропущенные строки в fail2ban?

Вчера в моем файле журнала были миллионы таких строк:

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 часть не соответствует всему до "Плохой протокол".