MailUser und MailContacts

Normalerweise gibt es in Exchange Organisationen nur Postfächer und Verteiler, selten noch öffentliche Ordner. Auch Shared Mailboxen, Räume und Office Groups Postfächer sind zuerst einmal Postfächer. Wenn externe Empfänger im Adressbuch mit aufgeführt werden sollen, dann können „MailContacts“ oder „MailUser“ angelegt werden. Ein Kontakt ist nur ein Platzhalter im Adressbuch während sich ein MailUser auch mit dem AD-Konto anmelden könnte. Oft wird dabei aber nicht bemerkt, dass die eigene Exchange Topologie so zu einem offenen Relay für diese Kontakte wird.

Der einfache Kontakt

Um das zu demonstrieren, lege ich einmal einen rudimentären Kontakt an. Das geht per Exchange PowerShell sehr einfach. Es könnte auch ein MailUser sein, was für die weitere Betrachtung keinen Unterschied macht.

[PS] C:\>New-MailContact -ExternalEmailAddress user1@msxfaq.de -name Vorname.Nachname

Name                      Alias                 RecipientType
----                      -----                 -------------
Vorname.Nachname          Vorname.Nachname      MailContact

Damit landet in meiner Exchange Organisation ein Kontakte, der per OWA sehr schnell angezeigt wird. Per Outlook kann es aufgrund der OAB-Replikation bis zu 48 Stunden dauern. Schauen Sie sich das Objekt nun aber mal genauer an, dann findet sich folgendes:

[PS] C:\>(Get-MailContact user1@msxfaq.de).emailaddresses

SmtpAddress        : Vorname.Nachname@uclabor.de
AddressString      : Vorname.Nachname@uclabor.de
ProxyAddressString : smtp: Vorname.Nachname@uclabor.de
Prefix             : SMTP
IsPrimaryAddress   : False
PrefixString       : smtp
 
SmtpAddress        : user1@msxfaq.de
AddressString      : user1@msxfaq.de
ProxyAddressString : SMTP:user1@msxfaq.de
Prefix             : SMTP
IsPrimaryAddress   : True
PrefixString       : SMTP

Das Objekt hat in den ProxyAddresses auch noch eine Mailadresse meiner eigenen Domäne (uclabor.de) bekommen. Ursache hierfür ist die Default Recipient Policy oder eine andere Richtlinie, welche die Exchange PowerShell anweist, mindestens eine Mailadresse aus dem Bereich der "Accepted Domains" zu vergeben. Das kann ich bei der Anlage auch nicht unterbinden, da es bei den Commandlets „New-Mailcontact“, "Enable-MailContact", "New-Mailuser" und "Enable-Mailuser" keine Option gibt, die Anwendung der Empfängerrichtlinien abzuschalten.

Problem 1: SMTP-Adressen blockiert

Das erste Problem ist naheliegend. Diese SMTP-Adresse Vorname.Nachname@uclabor.de ist damit geblockt und kann nicht mehr an andere legitime Benutzer zugewiesen werden. Da es immer knifflig ist, eine Mailadresse wieder frei zu bekommen, sollte man sie gar nicht erst zuweisen. Genau genommen müssten Sie also nach dem Anlegen eines Kontakte gleich noch folgendes nachziehen.

set-MailContact user1@msxfaq.de `
   -EmailAddressPolicyEnabled $false `
   -EmailAddresses "SMTP:user1@msxfaq.de"

So könnten wie die Anwendung der Empfängerrichtlinien nachträglich abschalten und die Inhalte im Feld ProxyAddresses über die Option "-EmailAddresses" einfach überschreiben. das Problem wäre keins mehr. Allerdings denkt daran natürlich niemand, wenn er einen neuen Kontakt anlegen.

Problem 2: Mail Weiterleitung

Wenn Sie dies nicht tun, kommen wir zum nächsten Problem. Über diese Kontakt wird nun nicht nur in der Exchange Organisation eine SMTP-Adresse geblockt, was zu Konflikten mit zukünftigen Anwendern führen kann. Nun kann ich aber auch eine Mail an eben diese Adresse senden. Das funktioniert nicht nur von Internet eben „anonym“ sondern auch von extern, da auch ein Spamfilter die zweite Adresse in der eigenen Domäne als gültigen Empfänger exportiert. Es wäre sehr ungewöhnlich, wenn sie hier einen LDAP-Filter aktiv hätten, der MailContacts und MailUser ausschließt.

Folgender Test wird also anonym von intern und extern in den meisten Fällen erfolgreich sein. Da Send-MailMessage kein MX-Lookup macht, müssen Sie selbst einen Smarthost oder den Zielserver vorher ermitteln und einsetzen, z.B.: durch:

Resolve-DnsName -Type MX uclabor.de).nameexchange

Den so aufgelösten Namen können Sie dann bei Send-Mailmessage verwenden.

Send-MailMessage `
   -from user2@uclabor.de `
   -To Vorname.Nachname@uclabor.de `
   -Subject: Test `
   -Server xxxxx

Die Mail wird an diesen Server zugestellt, der diese dann aufgrund des Kontakts nach extern weiter leitet. Da Exchange den Absender nicht umschreibt, könnte die Mail bei aktiven SPF/DKIM Einstellungen natürlich noch abgelehnt werden.

So eine Funktion kann ja durchaus gewollt sein. Stellen Sie sich vor, sie möchten ihren Druckern erlauben, beim Dienstleister per Mail einen Defekt zu melden. Genau genommen müsste sich der Drucker anmelden, um eine Mail zu versenden. Ein offenes Relay von innen nach außen oder eine direkte Durchlässigkeit der Firewall der Drucker auf Port 25 würde ich nicht favorisieren, selbst wenn eine Einschränkung auf die IP-Adresse des Dienstleisters möglich wäre. Hier hilft ein Kontakt, der eine interne Mailadresse hat und Exchange diese Mails dann weiter leitet. So ein Kontakt kann von intern anonym erreichbar gemacht werden ohne gleich die Tore der Firewall oder des Mailrelays sperrangelweit aufzureißen.

Problem 3: Konvertierung zu Mailbox

Die nächste Steigerung passiert, wenn Sie aus einem MailUser eine Mailbox machen. Es kann ja mal passieren, dass eine vormals extern angestellte Person den Arbeitsgeber wechselt und zu ihnen kommt.. Das AD-Konto gibt es ja schon und da ist eine Konvertierung und Beibehaltung der vorhanden ProxyAddresses ja naheliegend. Wenn Sie aber kurz drüber nachdenken, dann erkennen Sie schon das Problem.

Da diese UserMailbox in den ProxyAddresses auch weiterhin die Mailadresse hat, die der Mitarbeiter beim früheren Arbeitgeber hat. Ist er innerhalb ihrer Umgebung weiter unter dieser Adresse erreichbar. Allerdings wird die Mail nicht an das externe System zugestellt sondern landete direkt im neuen Postfach.

Bei einer Übernahme des Mitarbeiters ist das vielleicht noch tolerierbar aber was machen Sie, wenn z.B. ein externer Dienstleister wie ich in ihrer Umgebung ein Postfach hat und an dem auch meine eigentliche Mailadresse mit dran hängt?=. Selbst wenn Sie explizit manuell meine richtige Mailadresse eintragen, verlässt das Schreiben nicht das Unternehmen und verbleibt im lokalen Postfach. Das kann ich aber in der Regel nur lesen, wenn ich bei ihnen vor Ort bin oder sonst wie aktiv für sie Tätig bin. Ansonsten würde ich den ganzen Tag nur Postfächer bei den vielen Kunden nach neuen Mails absuchen. Das funktioniert nicht.

Lösung

Es gibt für diesen Fall leider keine perfekte „automatische“ Lösung, da über die Empfängerrichtlinien immer eine Policy angewendet wird, die auch eine „accepted Domain“ enthält. Ich sehe daher zwei Lösungswege:

  • Empfängerrichtlinie mit eigener Domain
    Sie könnte eine Richtlinie extra für Kontakte anlegen, die in der Priorität ganz hoch steht und eine Domäne nutzt, die sie nicht stört, z.B. „@kontake.ihrefirma.tld“. Dann hätten die Kontakte zwar immer noch eine Mailadresse in ihrer Domäne aber sie stört nicht mehr die eigentlich primären Anwender. Außerdem können Sie einfach diese Objekte per LDAP filtern
  • ProxyAddresses nachträglich anpassen
    Es hindert sie natürlich niemand daran, nachträglich bei bestehenden Kontakten die Verwaltung durch die Empfängerrichtlinien abzuschalten und die ProxyAddresses entsprechend zu bereinigen. Beachten Sie aber die Kontakte, die sie tatsächlich als „Relay Kontakte“ betreiben.

Der aus meiner Sicht einfachste Weg ist eine eigene Empfängerrichtlinie, weil sie damit zumindest für zukünftige Kontakte an nichts mehr denken müssen. Die Domain muss zwar autoritativ sein aber kann auf dem externen Spamfilter geblockt werden und intern lassen Sie sich alle Wege offen.

Eine umfangreiche Bereinigung der bestehenden Kontakte ist immer ein Risiko und reduziert zwar etwas das OAB aber durch viele Änderungen werden alle Benutzer auch wieder ein neues OAB herunter laden. Dennoch stelle ich gerne ein Codebeispiel bereit

Get-MailContact | foreach {
   Set-Mailcontact `
      -Identity $_.identity `
      -EmailAddresses "SMTP:$($_.primarysmtpaddress)" `
      -EmailAddressPolicyEnabled $false 
}

Sie könnten sich natürlich überlegen, ob sie erst mal ihr Messagetracking auswerten, um die aktiven Benutzer zu finden. Das ist relativ einfach, da Exchange diese Information ja per Default schon 30 Tage vorhält. Sie könnten also jeden Tag auswerten, welche SMTP-Adressen heute Mails gesendet und empfangen haben und so über einige Monate eine Datenbank erstellen. So sollten sich "inaktive Mailadressen" dann doch schnell erkennen und letztlich eliminieren lassen.

Drum prüfe...

Beide Lösungen bewirken aber, dass eine bislang vergebene Adresse natürlich entfernt wird. Nun gibt es ja durchaus Adressen, die ihre Daseinsberechtigung haben. Auf der anderen Seite soll der Großteil der Adressen ja weg. Da wäre es doch nett, wenn sie erst mal deren Verwendung prüfen könnten. Exchange führt keine Statistik pro Mailbox, auch wenn ich das ganz interessant finden würde. Aber Exchange liefert uns die Daten über das Message Tracking schon fast frei Haus. Leider hält Exchange per Default nur 30 Tage vor, wenn Sie dies nicht angepasst haben. Zudem sind in einer normalen Exchange Umgebung schon einige Mails unterwegs, so dass die Auswertung einige Zeit dauern wird.

Wenn ihnen die 30 Tage nicht reichen, können Sie rückwirkend natürlich versuchen, die früheren Messagetrackinglogs z.B. auf der Datensicherung zurück zu holen. Einfacher wird es aber sein, einfach die bestehenden Logs auszulesen und sich zu jeder Mailadresse zu merken, wann die letzte Nachricht an diese Adresse gegangen ist oder von diese Adresse versendet wurde.

Wenn Sie diese Auswertung dann täglich wiederholen und einige Monate betreiben, dann finden Sie langsam schon die Adressen heraus, die in ihrem System nur noch brach liegen.

Weitere Links