
У меня openSMPTD
запущен почтовый сервер. Похоже, что сейчас меня атакуют методом подбора, хотя я сомневаюсь, что они доберутся. При этом я хотел бы облегчить нагрузку на свой сервер постоянными попытками входа. Я настраиваю fail2ban
бан нарушителей. Однако я не могу получить правильное регулярное выражение, и это сводит меня с ума! Я виделэта ссылка на форуме freeBSDо fail2ban
регулярном выражении, чтобы поймать его. Однако даже это регулярное выражение, похоже, не захватило пример текста, который они предоставили. Я отредактировал их регулярное выражение, но безрезультатно. Я надеюсь, что кто-нибудь сможет дать мне несколько указаний, так как я очень слаб в регулярных выражениях.
Мои файлы журнала выглядят так:
Dec 25 20:03:29 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp tls ciphers=TLSv1.2:ECDHE-RSA-AES128-SHA256:128
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp authentication user=info result=permfail
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp failed-command command="AUTH LOGIN (password)" result="535 Authentication failed"
Dec 25 20:03:30 frick mail.info smtpd[16849]: f7fa148a43b34578 smtp disconnected reason=quit
"
Давайте разберемся: строка, показывающая, что они используют метод грубой силы, выглядит так:
f7fa148a43b34578 smtp failed-command command="AUTH LOGIN (password)" result="535 Authentication failed"
Где мы видим, что аутентификация не удалась. Однако, как ни странно, openSMTPD не включает свой IP-адрес для запрета в эту строку: Нам нужно посмотреть переменный номер над ним, чтобы:
f7fa148a43b34578 smtp connected address=193.169.254.42 host=<unknown>
Где мы можем увидеть IP-адрес нарушителя. Ладно, справедливо. Текущее регулярное выражение, которое у меня есть, которое выбирает весь текст, это:
^.*smtp connected address=\w[1-9.]* host=[a-z<>]*\n*[a-zA-Z0-9_.-\s\]\[:=<>"()]*
хотя fail2ban
хочет более точную. Я не уверен, что у меня есть чистый способ получить соответствующий IP-адрес для бана, так как возможно, что два человека подключаются одновременно, а затем выбирается неправильная линия для бана.
Какие-либо предложения?
решение1
Более новым и понятным способом использования многострочного регулярного выражения было бы использование <F-...>
тегов, которые были введены в этой 0.10.0
версии и, к сожалению, до сих пор недостаточно хорошо документированы.
[Definition]
prefregex = <F-MLFID>: \w{16} </F-MLFID><F-CONTENT>.+</F-CONTENT>$
failregex = <F-NOFAIL>smtp connected address=(?:<IP6>|<IP4>)</F-NOFAIL>
smtp failed-command command="AUTH LOGIN \(password\)" result="535 Authentication failed"
<F-NOFAIL><F-MLFFORGET>smtp disconnected</F-MLFFORGET></F-NOFAIL>
Объяснение
Регулярное выражение pre-filter используется для предварительной обработки каждой строки и захвата идентификатора сеанса, который, как я предполагаю, является частью f7fa148a43b34578
, и идентификации того же сеанса, охватывающего несколько строк. Текст внутри <F-CONTENT>
— это часть, которая нас интересует и которая будет обработана failregex.
В failregex,первыйодин сопоставляет строку с IP-адресом, который понадобится, если будет выдан бан, и заключен в теги, <F-NOFAIL>
чтобы указать, что строка не считается неудачей.второйРегулярное выражение — это фактическая ошибка аутентификации, при совпадении которой fail2ban заблокирует ранее захваченный IP-адрес.последнийодна из них окружена директивой <F-MLFFORGET>
, чтобы сигнализировать о том, что пришло время сбросить захваченный идентификатор соединения (поскольку пользователь отключился), и она также заключена между <F-NOFAIL>
тегами, поскольку эта строка сама по себе также не является ошибкой.
Вы можете использовать этот fail2ban-regex
инструмент, чтобы проверить это.
Я понимаю, почему регулярное выражение из связанного поста на форуме не сработало у вас; строка отличается в нескольких частях. Так что, очевидно, вам нужно будет изменить второе failregex сверху, если вы хотите сопоставить более общие случаи (я не использую opensmtpd, поэтому не могу вам с этим помочь).