MikroTik Скрипт: Уведомление о ошибке входа в систему

Полезный скрипт MikroTik — получение email уведомления или Telegram сообщения, при появлении в журнале устройства MikroTik сообщения об ошибке входа на устройство («login failure for user …«). Позволяет узнать о попытках подбора пароля, сообщит IP или MAC адрес устройства выполняющего попытку входа, а так же логин с которым пытаются войти на устройство.

Пример электронного письма - уведомление о ошибке входа на устройство MikroTik

Содержание

  1. Описание скрипта
  2. Создать скрипт
  3. Код скрипта
  4. Добавить скрипт в планировщик

Другие языки:
?? — MikroTik Script: Failed login attempt notification
?? — MikroTik Script: Notificación de intento de iniciar sesión fallido
?? — Script MikroTik: Notification de tentative de connexion échouée
?? — MikroTik-Script: Benachrichtigung über Anmeldefehler
?? — MikroTik-script: Melding van mislukte inlogpoging

Описание скрипта

Скрипт анализирует журнал устройства для поиска событий login failure for user, при обнаружении событий отправляет email или сообщение Telegram.

Анализирует события после времени последнего запуска (переменная ParseLogLoginEndArrayID).

Для отправки уведомлений используются функции:

Скрипт вызывает функции с названиями: EMailSendMessageFunction, TGBotSendMessageFunction. Если у вас функции имеют другое название, измените это в скрипте.

Пример Telegram сообщения - уведомление о ошибке входа на устройство MikroTik

✏️ Если вы фиксируете частые попытки входа с использованием вашего текущего логина, возможно логин стал известен злоумышленникам, лучшим вариантом будет изменить логин.

Создать скрипт

Для запуска скрипта необходимы разрешения: read, write, test, policy.

[System] -> [Scripts] -> [+] -> [Name: ParseLogLoginFailure] -> [Policy: read, write, test, policy]
MikroTik Скрипт: Уведомление о ошибке входа в систему MikroTik

Код скрипта

# Name: ParseLogLoginFailure v1.1
# Description: Device login failed notification
# Author: Yun Sergey [MHelp.pro] © 2021
# License: GPL-3.0 License
# Description, purpose and questions: https://mhelp.pro/mikrotik-script-failed-login-attempt-notification/
# More scripts Mikrotik: https://mhelp.pro/tag/mikrotik-scripts/
# Verified: RouterBOARD 952Ui-5ac2nD, RouterOS 6.48 (stable).

:local DeviceName [/system identity get name];
:local Time [/system clock get time];
:local Date [/system clock get date];
:local EmailMessageText;
:local TelegramMessageText;

:global ParseLogLoginEndArrayID;

:local IDsEvents [/log find where topics~"critical" message~"login failure"];

:local LenArrayIDs [:len $IDsEvents];
:local StartArrayID [:find $IDsEvents $ParseLogLoginEndArrayID];
:local EndArrayID ($IDsEvents -> ($LenArrayIDs-1));

#:log info "Script ParseLogLoginFailure: running.";

:if ($EndArrayID != $ParseLogLoginEndArrayID and [:tobool $ParseLogLoginEndArrayID] ) do={

    #:log info "Script ParseLogLoginFailure: new events found.";

    :for KeyArray from=($StartArrayID+1) to=($LenArrayIDs-1) do={
        :local IDMessage ($IDsEvents ->$KeyArray );
        :set EmailMessageText "$EmailMessageText \n\r  $[/log get number=$IDMessage time] - $[/log get number=$IDMessage message];";
        :set TelegramMessageText "$TelegramMessageText %0D%0A  $[/log get number=$IDMessage time] - $[/log get number=$IDMessage message];";
        }

    :set ParseLogLoginEndArrayID $EndArrayID;

    #:log info "Script ParseLogLoginFailure: events processed. Sending notifications.";

    # START SEND EMAIL
    :local SendTo "notify@mhelp.pro";
    :local Subject "\E2\9B\94 AUTH: $DeviceName [$Date $Time]";
    :local MessageText "$EmailMessageText";
    :local FileName "";
    :local SendEmail [:parse [/system script get EMailSendMessageFunction source]];
    $SendEmail SendTo=$SendTo TextMail=$MessageText Subject=$Subject FileName=$FileName;
    # END SEND EMAIL

    # START SEND TELEGRAM
    :local MessageText "\E2\9B\94 <b>$DeviceName: AUTH</b> $TelegramMessageText";
    :local SendTelegramMessage [:parse [/system script get TGBotSendMessageFunction source]];
    $SendTelegramMessage MessageText=$MessageText;
    # END SEND TELEGRAM
} else={
#:log info "Script ParseLogLoginFailure: no new messages found.";
};

#:log info "Script ParseLogLoginFailure: script completed successfully.";
:set ParseLogLoginEndArrayID $EndArrayID;

Добавить скрипт в планировщик

Для запуска скрипта необходимы разрешения: read, write, test, policy.

[System] -> [Schedule] -> [+] -> [Name: ParseLogLoginFailure] —>  [Interval: 00:05:00] -> [Policy: read, write, policy, test]

Или выполните в терминале:

/system scheduler add name=ParseLogLoginFailure policy=read,write,policy,test on-event="/system script run ParseLogLoginFailure" interval=5m comment="Parse device log and sending failed login events"
MHelp.pro:  Добавление скрипта в Планировщик заданий MikroTik

? Вы можете настроить правила Межсетевого экрана, для блокировки брутфос-атаки — Защита MikroTik (базовая настройка безопасности устройства).

? Как создать скрипт — уведомление о ошибке входа в систему (роутер MikroTik) и отправка сообщения email или Telegram, обсуждалось в этой статье. Я надеюсь, что теперь вы сможете улучшить контроль над устройствами MikroTik получая сообщения о неудачных попытках входа, отслеживая IP адреса устройств и используемые логины, вовремя обнаружив действия злоумышленника. Однако, если вы столкнетесь с каким-то проблемами при настройке скрипта, не стесняйтесь написать в комментариях. Я постараюсь помочь.

Скрипт проверен: RouterBOARD 952Ui-5ac2nD, RouterOS 6.48 (stable).

29 комментариев к “MikroTik Скрипт: Уведомление о ошибке входа в систему”

  1. Сообщение шлется только при втором срабатывании проверки. Вернее если неудачные попытки будут накапливатся в минимум 2х проверках

    Ответить
  2. Добрый день.
    Скажите пожалуйста, как сделать, чтобы скрипт отправлял не записи логов, а просто количество совпадений?
    Чтобы на почту или в телеграм приходил не текст логов из микрота, а просто было 10 попыток и тд?

    Ответить
    • Это усложнит скрипт, т.к. нужно будет вносить туда еще и время, за которое считать попытки, можете вместо длинного лога отправить короткий тест о самой попытке.

      Ответить
  3. Не отправляет в телеграм сообщений об неудачных попытках.
    включил логи:
    Script ParseLogLoginFailure: events processed. Sending notifications
    но сообщения не приходят.
    сама функция TGBotSendMessageFunction проверена, сообщения приходят…
    что-то не то в конструкции
    # START SEND TELEGRAM
    :local MessageText «\E2\9B\94 $DeviceName: AUTH $TelegramMessageText»;
    :local SendTelegramMessage [:parse [/system script get TGBotSendMessageFunction source]];
    $SendTelegramMessage MessageText=$MessageText;
    # END SEND TELEGRAM
    или в переменных которые ей передаются
    RouterOS 6.48.4

    Ответить
    • Здравствуйте, данный скрипт в опубликованном виде до сих пор успешно работает на роутерах MikroTik.
      Попробуйте передать как сообщение, какой-то простой текст, на английском языке. Т.к. часто отправка в телеграм сыпется из-за какого-о символа в тексте сообщения, который микротик считает служебным символом.

      Раскомментируйте строки в скрипте #:log info и попробуйте выполнить неверную попытку входа и запустите скрипт вручную.

      Ответить
  4. А можно этот скрипт переделать, чтобы он не только неудачные попытки входа на устройство мониторил, но и другие топики виду:
    critical, error, warning и так далее?

    Ответить
  5. sifa, проблем со временем решил небольшим костылем, и, также, решил проблему перебора всех записей лога

    Ответить
  6. sifa, хочу написать про кириллицу, у меня есть скрипт, работающий на этой же логике, решил я проверить вариант с кириллицей, да, действительно скрипт не отрабатывает и также он не отрабатывает последующие попытки авторизации на латинице, но как только скрипт делает следующий запуск (у меня он запускается раз в минуту), скрипт благополучно выполняется. Плюс я настроил блокировку от подбора пароля, по этому есть только несколько попыток авторизации. Так что считаю данную схему вполне защищенной. Я увидел ваш пост на форуме forummikrotik ru, так что пишите мне туда, если будут вопросы.

    Ответить
    • дополню: «как только скрипт делает следующий запуск (у меня он запускается раз в минуту), скрипт благополучно выполняется», это относится именно к моему варианту, т.к. он проверяет записи логов только за прошедшую минуту, у вас же он будет каждый раз проверять все логи полностью, а значит в такой ситуации (после кириллицы) он не возобновится до тех пор, пока логи с этой самой кириллицей не затрутся (например после ребута или затерании данных логов вследствии перезаписи по кругу), для устранения этой проблемы ваш скрипт нужно дорабатывать

      Ответить
      • Ниже написал.
        Решил проблему если кто-то ломанулся с кириллицей, сделав поиск сообщений вот таким
        :local IDsEvents [/log find where buffer=»memory» topics ~ «critical» message ~ «^login failure for user [a-zA-Z0-9]+ from»];

        Virtue, вы решили проблему по ночам (логи меняют формат времени в 00:00 (GMT+0) ?

        Ответить
        • Весь этот скрип решает эту проблему времени. 🙂 Моя статья на Habr — читать, в которой причина проблемы со временем. Т.е. делать костыли, ради обхода костылей — нет смысла. Микротик может это исправить в обновлении, после чего костыли перестанут работать, а проверку можно будет сделать еще проще.

        • Привязка к времени это минус, тут действительно реализация более правильная.
          Но если логи сохраняются, например, на флешку и выставлено 50к строк, он каждый раз проверяет эти 50к строк (а может быть выставлено и гораздо больше) ?
          Было бы еще лучше, если в глобальную переменную записывал не только последнюю найденную запись, но и в другую последнюю проверенную строку, чтобы с нее потом начинать проверять, если такое возможно конечно ?

        • Добавьте перед строкой # START SEND EMAIL, вот эту строку :set ParseLogLoginEndArrayID $EndArrayID; и скрипт будет отлично пропускать появление в логе кириллицы.
          Проблема именно в отправке кириллицы через Телеграм, при добавлении указанной строки на вашу почту будет приходить сообщение о неудачной попытке логина, а скрипт будет «падать» на моменте отправки в Телеграм. Но так как значение ParseLogLoginEndArrayID уже будет записано, следующий запуск уже будет происходить с последнего события.
          Я мог написать сюда и функцию транслитерации из кириллицы в английский, но это усложнит скрипт и будет «путем в никуда», т.к. следующий пользователь из Европы, так же напишет «скрипт не работает», так как я использую в логине ä, ö или ü, ну или мой микротик пытаются «взломать» перебирая пароли со спец.симвлоами. 🙂
          Возможно более удобным будет общаться в нашей Телеграм группе — MikroTikWorld.

      • Делать логины в MikroTik на кириллице — идея мало сказать «непопулярная». Так же как я не встречал попыток перебора пароля на кириллице.

        Sifa уже дописал вариант правки регулярными выражениями, это не привело к трудоёмкой доработке скрипта.

        Прерывание работы скрипта идет на моменте отправки кириллицы в Телеграм сообщении (письмо на почту доставляется успешно), добавьте перед строкой # START SEND EMAIL, вот эту строку :set ParseLogLoginEndArrayID $EndArrayID; и скрипт будет отлично пропускать появление в логе кириллицы.

        У меня нет цели увеличивать сложность и размеры скриптов, пытаясь предусмотреть максимально возможное количество ситуаций. Я пишу простые скрипты, по которым можно понять их работу и доработать под свои случаи.

        Блокировка неудачных попыток пароля намного проще и оперативней, делается правилами Firewall, нежели скриптами. Это указано — здесь. Можно опять же правилами Firewall доработать до полноценного fail2ban.

        Ответить
  7. sifa правильно пишет.
    Скрипт перестает работать если включить в логе отображение debug, там начинают появляться символы на любой вкус и цвет.
    Не могу воспроизвести сообщения «login failure» по всем источникам, чтобы посмотреть все возможные варианты, но проверка логов на наличие или отсутствие символов нужна…

    Ответить
      • Тот же DHCP, имена устройств легко могут быть на кириллице, в случае с windows даже по дефолту подставляется User-ПК.

        Ответить
        • YunSergey, скажите пожалуйста, проверили/поправили?
          Скрипт не работает при проявлении каких-то символов в логе ?‍♂️

        • Микротик все же ограничен, он может отправлять не все символы в текстовом сообщении Телеграм.

        • YunSergey, а затык возникает даже не на отправке сообщений с «корявыми символами», похоже скрипт перестает работать в принципе когда натыкается в логе на них =(
          Я так думаю, что в логе появляется «чтотонечитабельное», скрипт не может обработать запись через find и просто закрывается.

      • Да, кириллица проблема, но есть еще «что-то» ?
        Включил дебаг в лог, за пол часа «насыпалось» несколько тысяч строк, в них были все возможные символы (точки, все виды скобок, стрелочки, двойные точки, многоточие и тд и тп), даже когда кириллицы в логах нет, то скрипт перестает работать, а именно заметил, что ParseLogLoginEndArrayID не меняет свое значение, даже когда в логах есть свежая запись «login failure».

        Ответить
      • Решил проблему если кто-то ломанулся с кириллицей, сделав поиск сообщений вот таким

        :local IDsEvents [/log find where buffer="memory" topics ~ "critical" message ~ "^login failure for user [a-zA-Z0-9]+ from"];

        Теперь скрипт не стопорится, посмотрю, что с дебагом…
        Стоит понимать, что если логин содержит что-то кроме (a-z) (A-Z) (0-9), то стоит добавить в message~

        Ответить
  8. Ну чтоже, похоже наличие кириллицы в логе полностью парализует данный скрипт 🙂
    По сути можно первую попытку сделать с логином «привет», а потом пытаться ломиться дальше и никакие сообщения приходить не будут.
    Думаю, стоит что-то придумать на данный счет, например, сделать проверку и пропускать все события где есть что-то кроме [a-z0-9] + спец. символы.

    Ответить
    • Проще просто использовать только английский язык, а если совсем тяжело — транслит, чем «раздувать» скрипт, под все случаи и отбивая желание разбираться. 🙂
      У меня цель показать, что скрипты — это легко и глядя на мои скрипты пользователь имеет шанс научиться.

      Ответить
      • Речь не идет об использовании кириллицы.
        «Позволяет узнать о попытках подбора пароля…», если злоумышленник намеренно сделает первую попытку на кириллице, то этот скрипт перестанет работать. При определенных сценариях кириллицу можно будет использовать, чтобы «убить» все подобные скрипты, работающие с такой же логикой.

        Конечно, если цель просто «показать», то ок, да, скрипты — легко, глядя на ваши (хорошие имхо) скрипты можно научиться, но защищать должным образом этот скрипт не будет.

        Ответить
  9. Чуть чуть не дождался и сделал так же по примеру вашей статьи «MikroTik Скрипт: Уведомление о входе на устройство».
    Чутка переделал переменные и столкнулся с дублями сообщений после настройки логов на флешку, в таком случае пришлось добавить буфер /log find where buffer=»memory»…

    Жду не дождусь статьи для отправки фалов бэкапа (и логов), сохраненных в памяти микротика или всунутой флешке в телеграм =)
    Быстро найти не смог, но помню вычитывал, что не получится локально сохраненные файлы передавать в телегу…

    Ответить
    • Сейчас в статьях по MikroTik будет перерыв, нужно заняться более приоритетными делами.
      Для отправки локальных файлов из MIkroTik нужно использовать fetch, а для отправки в Telegram в хеадере параметры multipart/form-data, но об этом нужно почитать в документации.

      Ответить

Оставьте комментарий