<!--
  Rules for MikroTik lines forwarded by mikr (decoder: mikrotik-mikr).

  Every line is kept in the archive by the base rule (level 0, no alert).
  The rules below raise an alert only for what someone should look at.
  Wazuh stores alerts from level 3 up.
-->

<group name="mikrotik,mikr,">

  <rule id="100200" level="0">
    <decoded_as>mikrotik-mikr</decoded_as>
    <description>MikroTik $(hostname): $(mikrotik.message)</description>
  </rule>

  <!-- Sign-ins. API and REST sign-ins are automation (mikr itself, scripts) and stay silent. -->
  <rule id="100201" level="3">
    <if_sid>100200</if_sid>
    <field name="mikrotik.login">^in$</field>
    <field name="mikrotik.via" type="pcre2" negate="yes">^(?:api|rest-api)$</field>
    <description>MikroTik $(hostname): $(dstuser) signed in via $(mikrotik.via) from $(srcip)</description>
    <group>authentication_success,</group>
  </rule>

  <rule id="100202" level="7">
    <if_sid>100200</if_sid>
    <match>login failure for user</match>
    <description>MikroTik $(hostname): failed sign-in for $(dstuser) via $(mikrotik.via) from $(srcip)</description>
    <mitre><id>T1110</id></mitre>
    <group>authentication_failed,</group>
  </rule>

  <rule id="100203" level="10" frequency="6" timeframe="120">
    <if_matched_sid>100202</if_matched_sid>
    <same_srcip />
    <description>MikroTik $(hostname): repeated failed sign-ins from $(srcip), possible password guessing</description>
    <mitre><id>T1110</id></mitre>
    <group>authentication_failures,</group>
  </rule>

  <!-- Configuration changed by a person (user@address). Scheduler and script changes have neither. -->
  <rule id="100204" level="7">
    <if_sid>100200</if_sid>
    <field name="mikrotik.change">\S</field>
    <description>MikroTik $(hostname): $(mikrotik.object) $(mikrotik.change) by $(dstuser) via $(mikrotik.via)</description>
    <group>config_changed,</group>
  </rule>

  <rule id="100205" level="5">
    <if_sid>100200</if_sid>
    <field name="mikrotik.link">^down$</field>
    <description>MikroTik $(hostname): $(mikrotik.interface) link down</description>
  </rule>

  <rule id="100206" level="3">
    <if_sid>100200</if_sid>
    <field name="mikrotik.link">^up$</field>
    <description>MikroTik $(hostname): $(mikrotik.interface) link up</description>
  </rule>

  <rule id="100207" level="7">
    <if_sid>100200</if_sid>
    <match>possible SYN flooding</match>
    <description>MikroTik $(hostname): possible SYN flood</description>
    <group>attack,</group>
  </rule>

  <!-- By severity topic, for everything the rules above do not name. -->
  <rule id="100210" level="10">
    <if_sid>100200</if_sid>
    <field name="mikrotik.topics" type="pcre2">(?:^|,)critical(?:,|$)</field>
    <match negate="yes">login failure for user</match>
    <description>MikroTik $(hostname) critical: $(mikrotik.message)</description>
  </rule>

  <!-- ssld errors are TLS handshakes that failed, mostly scanners knocking on SSTP. -->
  <rule id="100211" level="3">
    <if_sid>100200</if_sid>
    <field name="mikrotik.topics" type="pcre2">^ssld,</field>
    <description>MikroTik $(hostname): failed TLS handshake: $(mikrotik.message)</description>
  </rule>

  <rule id="100212" level="5">
    <if_sid>100200</if_sid>
    <field name="mikrotik.topics" type="pcre2">^(?!ssld,)(?!.*(?:^|,)critical(?:,|$)).*(?:^|,)error(?:,|$)</field>
    <description>MikroTik $(hostname) error: $(mikrotik.message)</description>
  </rule>

  <rule id="100213" level="3">
    <if_sid>100200</if_sid>
    <field name="mikrotik.topics" type="pcre2">(?:^|,)warning(?:,|$)</field>
    <match negate="yes">possible SYN flooding</match>
    <description>MikroTik $(hostname) warning: $(mikrotik.message)</description>
  </rule>

</group>
