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:
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:
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:
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:
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
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:
Zum Vergleich die Werte im Mailmanager der UTM:
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:
Bevor ein Sensor erstellt wird, kann das Script einmal getestet werden, es sollte dann eine entsprechende PRTG Struktur zurückgegeben werden:
Wenn der Test erfolgreich ist, kann ein neuer Sensor erstellt werden:
Als Sensortyp wird “Programm/Script (Erweitert)” ausgewählt:
Der neue Sensor bekommt einen sprechenden Namen und unter “Programm/Skript” wird die zuvor erstellte PS1-Datei ausgewählt:
Kurze Zeit später sollte der Sensor nun schon die Werte liefern, diese lassen sich jetzt noch etwas aufhübschen:
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:
Hier mal eine fertige Ansicht:
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.