Archiv der Kategorie: Exchange Services

Exchange Service Integration unblog Technical Workarounds and Tutorials for Professionals

Exchange Junk-E-Mail Control

Outlook Junk-E-Mail aus Exchange 2019 für Postfix SMTP access control

Dieser Beitrag behandelt das vorgehen, um die von Outlook Benutzer als Junk-E-Mail blockierten SPAM Absender zu sperren, und um diese auf einem Smarthost Relay unter Postfix zu verwerfen.

Es werden die zu blockierenden Absender mit der ExchangePowerShell Abfrage unter Anwendung des cmdlet Get-Mailbox und Get-MailboxJunkEmailConfiguration ausgelesen und im ASCII Format gespeichert, anschliessend wird die Liste der blockierten Absender auf dem Postfix MTA bereitgestellt. Hierdurch werden gesperrte Absender bereits auf dem Relay abgewiesen, die Nachrichten brauchen nicht erst durch die Queue verarbeitet zu werden, sollen dabei auch nicht zum Exchange Server übermittelt werden.

Abbildung: Outlook Junk-E-Mail Blockierte Absender

Get-MailboxJunkEmailConfiguration

Das PowerShell Script JunkEmails.ps1 soll die Junk-E-Mails auslesen und in die Datei extracted-JunkEmails.asc im ASCII Format speichern.

$Smarthost = "userid@mail.domain.com:/tmp"
$User_Path = (Get-Item env:\localappdata).Value
$Junk_Path = "$User_Path\Junk"
if(!(Test-Path -Path $Junk_Path )){
    New-Item -ItemType directory -Path $Junk_Path
}
$input_file = "$Junk_Path\JunkEmails.txt"
$output_asc = "$Junk_Path\extracted-JunkEmails.asc"
$output_txt = "$Junk_Path\extracted-JunkEmails.txt"

$AllUsers = Get-Mailbox -ResultSize unlimited -RecipientTypeDetails UserMailbox | foreach {Get-MailboxJunkEmailConfiguration -Identity $_.UserPrincipalName} | fl BlockedSendersAndDomains

$AllUsers | Out-File -FilePath $output_asc -Encoding ASCII
$AllUsers | Out-File -FilePath $input_file

$regex = "\b[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b"
Select-String -Path $input_file -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_txt

& "C:\Program Files\PuTTY\pscp.exe" -i C:\Windows\system32\privkey.ppk "$output_asc" "$Smarthost"

Den Platzhalter userid durch ein Benutzer ersetzen, dieser es auf dem Linux host gibt und dieser für das kopieren der Datei verwendet werden soll. Es empfiehlt sich ein Service Account zu erstellen, dieser nur zu diesem zweck genutzt wird. Bei mail.domain.com durch den tatsächlichen Smarthost ersetzen. Es wird unter %temp% ein Ordner Junk erstellt, falls dieser nicht bereits vorhanden ist, der Ordner wird lediglich für die Verarbeitung benötigt, die darin enthaltenen Dateien müssen nicht aufgehoben werden. Zum Schluss werden die Junk-E-Mail Absender mit dem zuvor installierten PuTTY pscp.exe auf den $Smarthost kopiert.

Exchange Server Aufgabenplanung

Auf dem Exchange Server 2019 wird in der Aufgabenplanung eine neue Aufgabe erstellt. Für die zyklische Script Ausführung.

Die Option Unabhängig von der Benutzeranmeldung ausführen wählen, und Mit höchsten Privilegien ausführen aktivieren.

Im Abschnitt Trigger ein Zeitplan für alle 15 Minuten hinzufügen.

Im Abschnitt Aktion ein Eintrag für JunkEmails.ps1 bearbeiten.

Im Feld Programm/Script powershell.exe mit Pfad eintragen.

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

Im Feld Argumente die folgende Zeile mit dem Script hinzufügen.

-NonInteractive -WindowStyle Hidden -command ". 'C:\Programme\Exchange Server\V15\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto; C:\Windows\System32\JunkEmails.ps1"

Es wird das Script in der PowerShell mit der Exchange Management Shell Erweiterung ausgeführt. Wurde beim Setup von Exchange ein anderes Installations Volume als C gewählt, muss der Pfad zu den Exchange binary im Script angepasst werden.

Postfix Smarthost für Exchange Server

Auf dem Linux host auf diesem Postfix als Smarthost für den Exchange Server läuft, wird /etc/postfix/main.cf editiert.

smtpd_recipient_restrictions =
    check_sender_access hash:/etc/postfix/junkbl_access,

Ein Shell Script /usr/bin/junkbl.sh wird erstellt, zur Bereitstellung von Postfix junk mail control durch junkbl_acces.

#!/bin/bash
cat -v /tmp/extracted-JunkEmails.asc | tr , '\n' | sed 's/[{}]//g;s/[\t ]//g;/^$/d;s/\.\.\.//g;s/\^M$//g;s/BlockedSendersAndDomains://g' | grep . | sort | uniq -u | sed 's/$/\t 550 message was classified as spam/'  > /etc/postfix/junkbl_access
postmap /etc/postfix/junkbl_access

Das Script entfernt Leerstellen und nicht benötigten Zeichenketten aus der PowerShell abfrage, sortiert diese und entfernt doppelte Einträge, und fügt den Suffix 550 message was classified as spam hinzu, anschliessend wird mit postmap junkbl_access.db erzeugt.

Die Datei junkbl.sh muss ausführbar sein.

$ chmod 755 /usr/bin/junkbl.sh

Ein Cronjob auf dem Smarthost für das Script junkbl.sh erstellen.

*/5 * * * * root /usr/bin/junkbl.sh >/dev/null 2>&1

Damit bei der authentifizierung mit pscp.exe der automatisierte Prozess ermöglicht wird, kann mit puttygen.exe ein Schlüsselpaar erzeugt werden, hierdurch keine Passwort Eingabe erforderlich wird. Der Private Schlüssel mit Save private key als Datei privkey.ppk kann in den Pfad C:\Windows\system32 kopiert werden, wie auch das PowerShell Script JunkEmails.ps1. Den Public Key fügt man ein mit copy & paste in die Datei .ssh\authorized_keys, unter $home von userid auf dem Linux Smarthost.

Set-MailboxJunkEmailConfiguration

Bei der täglichen Administration kann es erforderlich sein, die durch Junk-E-Mail blockierten Absender wieder aus der Liste BlockedSendersAndDomains entfernen zu müssen, dies geschieht mit folgendem Kommando in der Exchange Management Shell.

BlockedSendersAndDomains

Set-MailboxJunkEmailConfiguration -Identity username -BlockedSendersAndDomains @{Remove="ycdov@maxstore.biz","efor@chaingang.co.uk"}

Den Platzhalter username durch den Mailbox Benutzer ersetzen.

Ebenso ist es möglich, E-Mail-Absender diese unerwünschten SPAM versenden, abzuweisen durch Hinzufügen zur Liste BlockedSendersAndDomains. Es wird hierdurch ermöglicht, dies auch ohne Outlook vernehmen zu können.

Set-MailboxJunkEmailConfiguration -Identity username -BlockedSendersAndDomains @{Add="xyz@zoo367.it","elhuhzj@xintes.tv"}

Die blockierten Junk-E-Mail-Absender können zur Überprüfung ausgeben werden.

Get-MailboxJunkEmailConfiguration -Identity username | fl BlockedSendersAndDomains

TrustedSendersAndDomains

Mit der Whitelist können E-Mail-Absender von der Überprüfung ausgeschlossen werden, damit diese Nachrichten nicht irrtümlich als Junk-E-Mail erkannt und gesperrt werden könnten.

Set-MailboxJunkEmailConfiguration -Identity username -TrustedSendersAndDomains @{Add="john@blue-hotels.eu"}

Exchange 2019 SMTP external Relay einrichten

Anonyme Weiterleitung auf Exchange-Servern zulassen

Ein Open Relay ist eine sehr schlechte Sache für Messaging-Server im Internet. SMTP-Relays, die versehentlich oder absichtlich als offene Relays konfiguriert wurden, ermöglichen das transparente Weiterleiten von E-Mails von einer beliebigen Quelle über den offenen Relay-Server. Dieses Verhalten maskiert die ursprüngliche Quelle der Nachrichten und lässt sie so aussehen, als stamme die E-Mail vom offenen Relay-Server. Offene Relay-Server werden von Spammern eifrig gesucht und verwendet.

550 5.7.54 SMTP; Unable to relay recipient in non-accepted domain

Auf der anderen Seite sind anonymous relay eine häufige Anforderung für viele Unternehmen, die über interne Webserver, Datenbankserver, Montoring zur Überwachung oder andere Netzwerkgeräte verfügen, die E-Mail-Nachrichten generieren, diese Nachrichten jedoch nicht tatsächlich senden und zustellen können.

Exchange 2019 SMTP external Relay einrichten in der Powershell

Exchange Server können mit einem FrontEndTransport-Dienst auf einem Postfachserver einen dedizierten Empfangsconnector bereitstellen, der eine anonyme Weiterleitung von einer bestimmten Liste interner Netzwerkhosts ermöglicht.

Hierzu folgender Befehl in der Exchange-Verwaltungsshell ausführen, für den entsprechenden dedizierten Empfangsconnector:

PS C:\> Set-ReceiveConnector "EXCH19\Frontend Anonymous Relay" -AuthMechanism ExternalAuthoritative -PermissionGroups ExchangeServers

In diesem Beispiel der Exchange 2019 Server EXCH19 mit dem Frontend Anonymous Relay als Empfangsconnector.

Mit folgendem Befehl überprüfen, ob das anonymous Relay erfolgreich konfiguriert ist:

PS C:\> Get-ReceiveConnector "EXCH19\Frontend Anonymous Relay" | Format-List Enabled,TransportRole,Bindings,RemoteIPRanges