Sophos UTM: Monitoring der Mail Queues

Ich habe nun schon einige Mails bezüglich des Monitoring der Sophos EMail Protection erhalten. Da ich in meinem privaten Umfeld ebenfalls die EMail Protection einsetze, ist dieses Thema also auch für mich interessant.

Der Mail Manager der UTM liefert schon eine ganz brauchbare Übersicht:

Sophos UTM: Monitoring der Mail Queues

Es ist aber wenig praktikabel permanent diese Übersicht im Browser geöffnet zu haben, zumal ja auch in den meisten Unternehmen eine Monitoring Software zum Einsatz kommt.

Ich benutze für das Monitoring die Software PRTG, daher gibt es auch ein entsprechendes Script für einen PRTG Sensor in diesem Artikel.

Aus den Mails die ich erhalten habe, ist es den meisten Leuten (wie auch mir) am Wichtigsten über den Zustand SMTP Queues informiert zu werden. Im Prinzip also diese drei Werte:

Sophos UTM: Monitoring der Mail Queues

Leider kann der Status der Queues nicht via SNMP oder RestAPI abgefragt werden, daher bleiben hier eigentlich nur noch SSH (Shell Zugriff) oder Screen Parsing als Möglichkeit über, um an die Werte zu kommen. Ich habe mich für den Weg via SSH und Shell Zugriff entschieden.

Zwar ist es nicht unbedingt schön, wenn ich ein Script per SSH auf der UTM einloggt, aber zumindest kommt man so relativ einfach an die Anzahl der Mails in den SMTP Queues.

Um an die Werte zu kommen habe ich ein kleines PowerShell Script erstellt, welches per SSH die Verbindung zur UTM aufbaut. Die Verbindung wird mit dem Benutzer “loginuser” hergestellt. Root Zugriff wird vom Script nicht benötigt.

Damit der Shell Zugriff funktioniert sind die folgenden Einstellungen in der Konfiguration der UTM nötig:

Sophos UTM: Monitoring der Mail Queues

Unter “Zugelassene Netzwerke” kann eingeschränkt werden, welche Netze oder Hosts Zugriff auf die SSH Shell der UTM haben. In meinem Fall ist dies nur das interne Netz und der Server welcher das Script ausführt.

Die UTM versendet bei jedem erfolgreichen SSH Login eine Mail an den Administrator. Es ist in diesem Fall also nötig die E-Mail Benachrichtigung für erfolgreiche SSH Logins abzuschalten, da sonst bei jedem Lauf des Scripts eine Warnung per Mail versendet wird:

Sophos UTM: Monitoring der Mail Queues

SNMP Traps können weiterhin verwendet werden, der Trap Empfänger kann ja ggf. so konfiguriert werden, dass erfolgreiche Logins von der IP des Hosts (welcher das Script ausführt) nicht gleich als problematisch angesehen werden (SIEM Systeme).

Die Vorbereitung der UTM ist damit abgeschlossen, weiter geht es mit dem eigentlichen PowerShell Script.

PowerShell Script zum Auslesen der UTM Mail Queues

Damit die SMTP Queues der UTM ausgelesen werden können, ist das Posh-SSH Modul erforderlich, dieses Modul ermöglicht es mittels PowerShell eine SSH Verbindung herzustellen. Auf aktuellen Windows Betriebssystemen ist die Installation des Moduls mittels NuGet schnell erledigt:

Install-Module Posh-SSH

Sophos UTM: Monitoring der Mail Queues

Das folgende Script kann nun verwendet werden um die Mails der SMTP Queues auszulesen, die ersten drei Zeilen müssen an die eigene Umgebung angepasst werden (Loginuser muss in der Regel nicht verändert werden):

$UTMHostNameorIP = "utm.domain.local"
$Loginuser = "loginuser"
$LoginUserPassword = "SecurePassword1"

$LoginUserPasswordSec = ConvertTo-SecureString $LoginUserPassword -AsPlainText -Force
$LoginCreds = New-Object System.Management.Automation.PSCredential($Loginuser,$LoginUserPasswordSec)
#Connect SSH Session
try {
 $ConnectSSHSession = New-SSHSession -ComputerName $UTMHostNameorIP -Credential $LoginCreds -AcceptKey:$true
}
catch {
 write-host "Can't connect to UTM"
}
#Query Quarantine
try {
  $StrQuarantine = (Invoke-SSHCommand -Command "find /var/storage/chroot-smtp/spool/quarantine -type f | wc -l" -Index $ConnectSSHSession.SessionId).Output
  [int]$Quarantine = [convert]::ToInt32($StrQuarantine, 10)
 }
catch {
 write-host "Can't query Quarantine mails"
}
if ($Quarantine -eq 1 -or $Quarantine -eq 0) {
 $Quarantine = 0
} else {
 $Quarantine = ($Quarantine -1)/2
}
#Query Output Queue (Spool)
try {
  $StrOutput = (Invoke-SSHCommand -Command "find /var/storage/chroot-smtp/spool/output -type f | wc -l" -Index $ConnectSSHSession.SessionId).Output
  [int]$Output = [convert]::ToInt32($StrOutput, 10)
}
catch {
  write-host "Can't query Output (spool) mails"
}
if ($Output -eq 1 -or $Output -eq 0) {
 $Output = 0
} else {
 $Output = ($Output -1)/2
}
#Query corrupt  Queue
try {
  $StrCorrupt  = (Invoke-SSHCommand -Command "find /var/storage/chroot-smtp/spool/corrupt  -type f | wc -l" -Index $ConnectSSHSession.SessionId).Output
  [int]$Corrupt  = [convert]::ToInt32($StrCorrupt , 10)
}
catch {
  write-host "Can't query corrupt mails"
}
if ($Corrupt  -eq 1 -or $Corrupt -eq 0) {
 $Corrupt = 0
} else {
 $Corrupt = ($Corrupt -1)/2
}
#Disconnect SSH Session
$DisconnectSSHSession = Remove-SSHSession -Index $ConnectSSHSession.SessionId

#Write Results
write-host "Mails in Quarantine: $Quarantine"
write-host "Mails in Spool Queue: $Output"
write-host "Corrupt Mails: $Corrupt"

Das Script baut eine SSH Verbindung mit dem angegebenen Benutzer und Passwort zur UTM auf, liest die Anzahl der Dateien aus den entsprechenden Spool Verzeichnissen aus und berechnet dadurch die Anzahl der Mails die sich in den Queues befinden. Jede Mail im jeweiligen Queue-Verzeichnis besteht aus 2 Dateien (SMTP Header und Body), zusätzlich befindet sich ein Lockfile im Verzeichnis der Queue. Dies wird durch das Script berücksichtigt und entsprechend berechnet.

Hier die Ausgabe des Scripts:

Sophos UTM: Monitoring der Mail Queues

Zum Vergleich die Werte im Mailmanager der UTM:

Sophos UTM: Monitoring der Mail Queues

Sophos UTM: Monitoring der Mail Queues

Sophos UTM: Monitoring der Mail Queues

Die Werte der Queues werden in Variablen geschrieben und lassen sich beliebig weiterverwenden.

Monitoring der UTM Mail Queues mit PRTG

Das vorherige allgemeine Script habe ich etwas abgewandelt, damit sich daraus ein PRTG Sensor erstellen lässt. Die ersten Zeilen müssen an die eigene Umgebung angepasst werden (Loginuser, Passwort und UTM Hostname). Auch für dieses Script ist das PoshSSH Modul auf dem PRTG Server erforderlich.

Hier nun das Script für einen PRTG Sensor:

#User with Shell Access to Sophos UTM:
$Loginuser = "loginuser"
#Password for Loginuser:
$LoginUserPassword = "SecretPassword1"
$UTMHostnameorIP = "utm.domain.local"

#Create Credential Object
$LoginUserPasswordSec = ConvertTo-SecureString $LoginUserPassword -AsPlainText -Force
$LoginCreds = New-Object System.Management.Automation.PSCredential($Loginuser,$LoginUserPasswordSec)

#Confirm Powershell Version.
if ($PSVersionTable.PSVersion.Major -lt 3) {
	Write-Output ""
	Write-Output "1"
	Write-Output "Powershell Version is $($PSVersionTable.PSVersion.Major) Requires at least 3. "
	Write-Output ""
	Exit
}

#Connect SSH Session
try {
 $ConnectSSHSession = New-SSHSession -ComputerName $UTMHostnameorIP -Credential $LoginCreds -AcceptKey:$true
}
catch {
	Write-Output ""
	Write-Output "1"
	Write-Output "Can't connect to UTM"
	Write-Output ""
	Exit
}
#Query Quarantine
try {
  $StrQuarantine = (Invoke-SSHCommand -Command "find /var/storage/chroot-smtp/spool/quarantine -type f | wc -l" -Index $ConnectSSHSession.SessionId).Output
  [int]$Quarantine = [convert]::ToInt32($StrQuarantine, 10)
 }
catch {
	Write-Output ""
	Write-Output "1"
	Write-Output "Can't query Qurantine mails"
	Write-Output ""
	Exit
}
if ($Quarantine -eq 1 -or $Quarantine -eq 0) {
 $Quarantine = 0
} else {
 $Quarantine = ($Quarantine -1)/2
}
#Query Output Queue (Spool)
try {
  $StrOutput = (Invoke-SSHCommand -Command "find /var/storage/chroot-smtp/spool/output -type f | wc -l" -Index $ConnectSSHSession.SessionId).Output
  [int]$Output = [convert]::ToInt32($StrOutput, 10)
}
catch {
	Write-Output ""
	Write-Output "1"
	Write-Output "Can't query Output (spool) mails"
	Write-Output ""
	Exit
}
if ($Output -eq 1 -or $Output -eq 0) {
 $Output = 0
} else {
 $Output = ($Output -1)/2
}
#Query corrupt  Queue
try {
  $StrCorrupt  = (Invoke-SSHCommand -Command "find /var/storage/chroot-smtp/spool/corrupt  -type f | wc -l" -Index $ConnectSSHSession.SessionId).Output
  [int]$Corrupt  = [convert]::ToInt32($StrCorrupt , 10)
}
catch {
	Write-Output ""
	Write-Output "1"
	Write-Output "Can't query corrupt mails"
	Write-Output ""
	Exit
}
if ($Corrupt  -eq 1 -or $Corrupt -eq 0) {
 $Corrupt = 0
} else {
 $Corrupt = ($Corrupt -1)/2
}
#Disconnect SSH Session
$DisconnectSSHSession = Remove-SSHSession -Index $ConnectSSHSession.SessionId

#Write Results
write-host "<prtg>"

Write-Host "<result>"
Write-Host "<channel>Qurantine Mails</channel>"
Write-Host "<value>$($Quarantine)</value>"
Write-Host "</result>"

Write-Host "<result>"
Write-Host "<channel>Spooled Mails</channel>"
Write-Host "<value>$($Output)</value>"
Write-Host "</result>"

Write-Host "<result>"
Write-Host "<channel>Corrupt Mails</channel>"
Write-Host "<value>$($Corrupt)</value>"
Write-Host "</result>"

write-host "</prtg>"

Das Script kann nach der Anpassung in der PRTG Curstom Sensors\EXEXML Verzeichnis kopiert werden:

Sophos UTM: Monitoring der Mail Queues

Bevor ein Sensor erstellt wird, kann das Script einmal getestet werden, es sollte dann eine entsprechende PRTG Struktur zurückgegeben werden:

Sophos UTM: Monitoring der Mail Queues

Wenn der Test erfolgreich ist, kann ein neuer Sensor erstellt werden:

Sophos UTM: Monitoring der Mail Queues

Als Sensortyp wird “Programm/Script (Erweitert)” ausgewählt:

Sophos UTM: Monitoring der Mail Queues

Der neue Sensor bekommt einen sprechenden Namen und unter “Programm/Skript” wird die zuvor erstellte PS1-Datei ausgewählt:

Sophos UTM: Monitoring der Mail Queues

Kurze Zeit später sollte der Sensor nun schon die Werte liefern, diese lassen sich jetzt noch etwas aufhübschen:

Sophos UTM: Monitoring der Mail Queues

Mit entsprechenden Einstellungen zu den Schwellwerten der Kanäle (Alarmierung basierend auf Grenzwerten einschalten), können hier auch noch Schwellwerte für Warnung- und Fehlerzustände je Kanal eingetragen werden:

Sophos UTM: Monitoring der Mail Queues

Hier mal eine fertige Ansicht:

Sophos UTM: Monitoring der Mail Queues

Leider ist hier wie schon erwähnt das Login per SSH auf der UTM nicht so schön. Hier sollte man sich auch Gedanken über die Benachrichtigung machen, wenn die UTM viele Mails spooled, könnte es auch daran liegen, dass der Exchange Server keine Mails mehr annehmen kann. In diesem Fall wäre eine Benachrichtigung per SMS sinnvoller als per Mail.

27 thoughts on “Sophos UTM: Monitoring der Mail Queues”

  1. Ich habe auch noch das Problem, dass immer 2 E-Mails im Spooled angezeigt werden. Die Zeile habe ich schon angepasst.

    „find /var/storage/chroot-smtp/spool/output -type f -name ‚-D‘ | wc -l“

    Reply
  2. hi everybody
    i found this article , cause i’ve got a „spam campain“ on my Sophos Utm after a stolen password, and i was looking for a method to observe the mailqueue , and to be warn if the queue was too heavy !
    i’m using nagios as monitoring tools, then i create a nagios plugin in bash, to connect to the utm sophos using ssh+public key (no password so !)
    i can put threshold and to be notify
    Thanks for your idea !
    bonne année 2022

    Reply
  3. Guten Morgen,
    super Beiträge, auch noch in 2021 :)

    Konnte jemand das Problem von Henning und Alexander mit den „zu viel“ angezeigten Einträgen lösen?
    Ich hätte auch gerne nur die, die in der Weboberfläche angezeigt werden.

    Lieben Gruß
    Christian

    Reply
    • Hallo Christian,
      pro Mail werden mehrere Dateien in dem Spool-Ordner erzeugt, daher die Multiplikation. Es genügt, den find wie folgt auf eine Datei einzugrenzen, habe mich hier im Beispiel auf die „*-D“ Dateien begrenzt.
      find /var/storage/chroot-smtp/spool/output -type f -name „*-D“

      Sieht jetzt im Vergleich zur GUI gleich aus.

      Grüße
      Ulrich

      Reply
      • Hallo Ulrich,

        ich habe das gleiche Problem. Habe es gemäß deinem Vorschlag angepasst, doch leider zeigt er mir auch bei komplett leerem Spool folgendes an:
        Spooled Mails
        2

        Hast du eventuell noch eine Idee woran das liegen kann?
        Oder habe ich die Zeile falsch angepasst?
        ‚find /var/storage/chroot-smtp/spool/output -type f -name „*-D“ | wc -l‘

        mit freundlichen Grüßen
        Daniel

        Reply
  4. Super Artikel.
    Leider sind im Spool Ordner alte Dateien, die der Mail Manager nicht anzeigt. Wenn man die Files löscht erscheinen sie nach 2 Minuten wieder. Daher wird leider der Wert verfälscht.
    Ordner: /var/storage/chroot-smtp/spool/output/1/msglog
    Die Files sind älter als ein Jahr. Klein und nicht vom Inhalt relevant (Fehlermeldungen).

    Reply
  5. Hallo Frank,

    vielen Dank für deinen tollen Beitrag!

    Als Ergänzung:
    Wir verschieben grundsätzlich alle Mails mit doc/docx und xls/xlsx-Files in die Quarantäne, und wollten dies überwachen, da hier eine manuelle Prüfung stattfindet, in der Vergangenheit aber ab und an vergessen wurde.

    Dazu haben wir dein Skript erweitert und durchsuchen das Quarantäne-Verzeichnis mit folgendem SSH-Command:
    grep -rnw ‚/var/storage/chroot-smtp/spool/quarantine‘ -e ‚Content-Type: application/msword;‘ | wc -l
    Hier kann je nach Bedard der Content-Type durch den entsprechenden Mime-Type ersetzt werden.

    Nochmals vielen Dank für deine super Beiträge!

    Gruß
    Bernhard

    Reply
  6. Hallo Frank,
    dank – cooles script – lange danach gesucht.
    Folgendes Problem bei mir:
    x64/x86 Powershell sind auf unrestricted
    das script in der x64 ps ausgeführt liefert korrekte werte zurtück.
    das script in der x86 ps ausgeführt liefert:
    PS C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML> .\utm-Mailqueue.ps1

    1
    Can’t connect to UTM

    zurück. Soweit ich weiß, nutzt PRTG für PS Sensoren die x86 ps .. ?
    Wo liegt (mein) Fehler ?=

    Grüße,
    Stefan

    Reply
    • Hallo Frank,
      dank – cooles script – lange danach gesucht.
      Folgendes Problem bei mir:
      x64/x86 Powershell sind auf unrestricted
      das script in der x64 ps ausgeführt liefert korrekte werte zurtück.
      das script in der x86 ps ausgeführt liefert:
      PS C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML> .\utm-Mailqueue.ps1

      1
      Can’t connect to UTM

      zurück. Soweit ich weiß, nutzt PRTG für PS Sensoren die x86 ps .. ?
      Wo liegt (mein) Fehler ?=

      Grüße,
      Stefan

      Wer lesen kann ist klar im Vorteil ;)
      “ Frank sagt:7. Februar 2019 um 08:07 “
      lösung war:
      programmScript psx64.exe Parameter
      -f=“PS_UTM_MailManagerSensor.ps1“

      Reply
  7. Hallo,

    habe gerade mal das Skript getestet, jedoch passen bei mir die Zahlen nicht wirklich.

    Mails in Quarantine: 11129 (3812)
    Mails in Spool Queue: 59 (18)
    Corrupt Mails: 0 (0)

    In Klammer steht immer die Zahl welche im Mail Manager ersichtlich sind.

    Getestet mit der UTM-Version: 9.510-5

    Reply
  8. Hallo Frank,
    erst einmal Dank für deine tolle Arbeit!
    Christian hat geschrieben, dass die Ausgabe nicht in XML erfolgt und dass hierfür Anpassungen notwendig sind.
    Ich erhalte die gleiche Fehlermeldung. Kannst Du uns sagen, was für Anpassungen im Skript nötig sind, damit es funktioniert. Danke schon einmal im Voraus!
    Gruß Björn

    Reply
  9. Hallo,

    cooler Denkanstoß. Wäre ja schön, wenn Sophos endlich solche Werte auch als API oder SNMP anbieten würde. Auch der Clusterstatus wäre wichtig, im Monitoring zu haben.
    Wenn jemand ein Bash Script für Nagios / Check_MK hat, wäre eine Hinweis hier auf der Seite klasse.

    Danke

    Erik

    Reply
  10. Hallo,
    also das ganze müsste dann so angepasst werden.

    #Write Results

    write-host „“

    Write-Host „“
    Write-Host „Qurantine Mails“
    Write-Host „$($Quarantine)“
    Write-Host „Mails“
    Write-Host „Mails“
    Write-Host „“

    Write-Host „“
    Write-Host „Spooled Mails“
    Write-Host „$($Output)“
    Write-Host „Mails“
    Write-Host „Mails“
    Write-Host „“

    Write-Host „“
    Write-Host „Corrupt Mails“
    Write-Host „$($Corrupt)“
    Write-Host „Mails“
    Write-Host „Mails“
    Write-Host „“

    write-host „“

    Mit dem dazufügen von :
    Write-Host „Mails“
    Write-Host „Mails“
    Spart mans ich das anpassen der Einheiten nachträglich über das Webinterface.

    Direkt ausführen konnte ich es bei mir jedoch nicht, musste den PShelper verwenden damit das als 64bit Script gestartet wird; http://prtgtoolsfamily.com/downloads/sensors „psx64″ und ausführen dann programmScript psx64.exe Parameter
    -f=“PS_UTM_MailManagerSensor.ps1“

    Reply
  11. Hallo Frank,

    super Idee, ich habe es gerade versucht einzurichten, aber PRTG meldet folgenden Fehler:
    „XML: Das zurückgelieferte XML entspricht nicht dem erwarteten Schema. (Code: PE233) — JSON: Das zurückgelieferte JSON entspricht nicht der erwarteten Struktur (Invalid JSON.). (Code: PE231)“

    In der Powershell liefert es korrekt die Daten. Habe die aktuellste Version 18.4.46.1754+ im Einsatz.
    Eine Idee woran dies liegen mag?

    MfG
    Christian

    Reply
      • Skript muss wie folgt in der Ausgabe angepasst werden:

        #Write Results

        write-host „“

        Write-Host „“
        Write-Host „Qurantine Mails“
        Write-Host „$($Quarantine)“
        Write-Host „“

        Write-Host „“
        Write-Host „Spooled Mails“
        Write-Host „$($Output)“
        Write-Host „“

        Write-Host „“
        Write-Host „Corrupt Mails“
        Write-Host „$($Corrupt)“
        Write-Host „“

        write-host „“

        Reply
  12. Hi Frank,

    Wiedermal klasse vorbereitet!
    Wäre es möglich in der ersten Ausgabe (ohne PRTG) eine Mail an eine beliebige E-Mail Adresse zu versenden? Uns geht es hier um eine stündliche Anzeige der Ques – das würde uns sehr viel Arbeit sparen ….

    Beste Grüße

    Reply
  13. Hallo Frank,

    Danke für den Denk Anstoß. Denke man kann in der utm noch mehr mit ssh anfangen..

    Ich seh den Sensor für die waf bei dir. Kannst du uns erhellen was da hinter steckt? Simpel den Aufruf von Owa oder auch mehr infos?

    Lg. Sebastian

    Reply
  14. hey Frank.

    Toller Artikel. Ich schleiche um so eine Lösung auch schon immer wieder rum. Nur wir setzen nagios ein. Aber mit deiner Vorlage sollte auch das lösbar sein. Danke für deine tolle Seite!

    Reply

Leave a Comment