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.

17 Kommentare zu “Sophos UTM: Monitoring der Mail Queues”

  1. 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

  2. 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

  3. 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“

  4. 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

      1. 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 „“

        1. Hallo Christian,
          ich habe die gleiche Meldung wie Du. Was hast Du genau geändert?

          Gruß Björn

  5. 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

  6. 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

  7. 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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.