MikroTik Script: Notificación de inicio de sesión exitoso en el dispositivo o simple analizador de registros MikroTik

El artículo será más interesante para los especialistas que usan una pequeña flota de dispositivos (que no usan un servidor separado, para un sistema de monitoreo o registro), usuarios domésticos, aquellos que están comenzando a escribir scripts de dispositivos por primera vez y aquellos que no tienen tiempo / deseo de resolverlo.





Ejemplo de correo electrónico con eventos de inicio / cierre de sesión de usuario
Ejemplo de correo electrónico con eventos de inicio / cierre de sesión de usuario

Me impulsó a escribir mi propio guión por el deseo de simplificar los monstruosos guiones que se pueden encontrar para esta solicitud en Internet, realizando esta simple acción ( un ejemplo de un guión de MikroTik Wiki), así como para mostrar por qué los ingenieros de MikroTik hicieron imposible un método de análisis simple si no eres un residente de Londres. :)





El artículo analiza un ejemplo de una notificación sobre el inicio de sesión y el cierre de sesión de un usuario desde un dispositivo MikroTik, pero también mostrará ejemplos:





  1. Organización del tiempo en el registro del dispositivo;





  2. Analizar el registro del dispositivo, buscar eventos por criterios;





  3. Envío de notificaciones por correo electrónico;





  4. Envío de un mensaje de Telegram.





Antecedentes. ¿Por qué los scripts de análisis de registros de MikroTik son "monstruosos"?

Por monstruosidad nos referimos a una gran cantidad de lógica de escritura y construcción de la forma:





:set tmpstring ([:pick [:tostr $tmpstring] 0 $findindex] . [:pick [:tostr $tmpstring] ($findindex + [:len [:tostr $ruleop]]) [:len [:tostr $tmpstring]]])
      
      



"" , .





MIkroTik, . :)





: " "account", (UTC+06)?





/log find where time > $LastRunTime topics ~ "account"
      
      



, 23:59:59 . 12 , 00:00:00 . ?





MikroTik : , , , , "" . , /, , .





? , MikroTik 00:00:00 UTC±0:00. , .. (UTC+06), 6 , . 06:00:00 .





(UTC±0:00), , .





( ), .





, , MikroTik id , (.id , , 0).





  • ParseLogAccountEndArrayID - .id ;





  • IDsEventsAccount .id , "account" - (: , ). 1000 , ;





  • LenArrayIDs - , StartArrayID - ( ID ), EndArrayID - 1( 0).





  • .id (IDsEventsAccount) .id (ParseLogAccountEndArrayID) (.. "account") (ParseLogAccountEndArrayID) - ( / ) ;





  • "account", (IDsEventsAccount) , " +1" ( ) " -1" (.. 0);





  • .id (IDMessage) ;





  • email, MikroTik;





  • Telegram , %0D%0A ;





  • ParseLogAccountEndArrayID ID "account" (EndArrayID).





  • email;





  • Telegram;





: read, write, test, policy.





[System] -> [Scripts] -> [+] -> [Name: ParseLogAccountEvents] -> [Policy: read, write, test, policy]





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

:global ParseLogAccountEndArrayID;

:local IDsEventsAccount [/log find where  topics ~ "account"];

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

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

    :local StartArray [:find $IDsEventsAccount $ParseLogAccountLastRunID];

    :for KeyArray from=($StartArrayID+1) to=($LenArrayIDs-1) do={
        :local IDMessage ($IDsEventsAccount ->$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 ParseLogAccountEndArrayID $EndArrayID;

    # START SEND EMAIL
    :local SendFrom "ToMail@mail.ru";
    :local PasswordMail "yourpassword";
    :local SmtpServer [:resolve "smtp.mail.ru"];
    :local UserName "FromMail@mail.ru";
    :local SmtpPort 465;
    :local UseTLS "tls-only";
    :local SendTo "ToMail@mail.ru";
    :local Subject "\F0\9F\94\93 AUTH: $DeviceName [$Date $Time]";
    :local MessageText $EmailMessageText;
    /tool e-mail send to=$SendTo server=$SmtpServer port=$SmtpPort start-tls=$UseTLS user=$SendFrom password=$PasswordMail  from=$SendFrom subject=$Subject body=$MessageText;
    # END SEND EMAIL

    # START SEND TELEGRAM MESSAGE
    :local BotToken "YourBotID";
    :local ChatID "YourChatID";
    :local ParseMode "html";
    :local DisableWebPagePreview True;
    :local SendText "\F0\9F\94\93 <b>$DeviceName: AUTH</b> $TelegramMessageText";
    :local tgUrl "https://api.telegram.org/bot$BotToken/sendMessage?chat_id=$ChatID&text=$SendText&parse_mode=$ParseMode&disable_web_page_preview=$DisableWebPagePreview";
    /tool fetch http-method=get url=$tgUrl keep-result=no;
    # END SEND TELEGRAM MESSAGE

}
      
      



: read, write, test, policy.





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





:





/system scheduler add name=ParseLogAccountEvents policy=read,write,policy,test on-event="/system script run ParseLogAccountEvents" interval=5m
      
      



, MikroTik , .





Ejemplo de mensaje de telegrama
Telegram

, Logging:





[System] -> [Logging] -> [Rules] -> [+] -> [Topics]





:





[/log find where message ~ "log"]





, / , ( Firewall , MikroTik Safe Mode) .





, , .





, Telegram , , . : " Email" " Telegram", , MikroTik.





MikroTik, - .





: hAP ac lite, RouterOS 6.47.8 (stable).





PD: Este es mi primer artículo sobre Habré, se puede juzgar de forma estricta, pero justa. El artículo no proporcionará nada nuevo a los especialistas que utilizan sistemas de monitoreo o servidores de registro separados. Pero para principiantes, usuarios domésticos, administradores con una pequeña flota de dispositivos de red, espero que sea útil.








All Articles