Archiv der Kategorie: MSAD

LDAP Abfrage für einen vorgelagerten Postfix

Wie so schon in Beiträgen wie diesen beschrieben, kann ein Postfix wunderbar dem Netzwerkinternen Exchange Server vorgeschaltet werden. Bei der LDAP Abfrage gegenüber dem AD möchte mensch natürlich nur gültige eMailadressen annehmen und dem Exchange Server weiter leiten. Dafür reicht der folgende LDAP Query Filter prinzipiell aus:

query_filter = (|(mail=%u@%d)(uid=%u)(proxyAddresses=*smtp:%u@%d*))
result_attribute = mail

Allerdings kann es in einer Domainumgebung vorkommen, daß Menschen eine Organisation verlassen und der Account z.B. zu einem Bestimmten Zeitpunkt auslaufen / gesperrt werden. Diese Information wird im AD bei dem Benutzer in dem Attribut „accountExpires“ gespeichert. Der Defaultwert ist dabei in Dezimal: 9223372036854775807 oder auch 0x7FFFFFFFFFFFFFFF als Hexadezimalwert. Die entsprechende Dokumentation des Attributes kann bei Microsoft im Artikel ms675098 gefunden werden.

Darüber hinaus ist es möglicherweise nicht gewünscht, daß für deaktivierte Accounts / gesperrte Accounts überhaupt eMails angenommen werden. Ob ein Account gesperrt ist oder welchen zustand dieser so gerade hat, wird im AD bei dem Benutzer im Attribut „userAccountControl“ abgespeichert.

Ein aktivierter Account hat den Dezimalwert 512, ein aktivierter Account ohne ablaufenden Kennwort wird Dezimal als 66048 repräsentiert. Beide werte sind also für aktive Accounts

query_filter = (&(|(mail=%u@%d)(uid=%u)(proxyAddresses=*smtp:%u@%d*))(&(accountExpires=9223372036854775807)(|(userAccountControl=512)(userAccountControl=66048))))

Diese Abfrage filtert demnach a) die gültige eMailadresse, b) ob der Account nicht Abgelaufen ist und c) ob der Account aktiviert ist.

Bei der Abfrage ob ein Account aktiviert ist, stellt sich hier das Problem, daß ein Account gerade deaktiviert wurde oder in Zukunft deaktiviert, eMails aber noch angenommen werden sollen (z.B.: um per auto-replay mitzuteilen, daß mensch nicht mehr dabei ist und zukünftig andere Personen zuständig sind)

Mit Hilfe der Powershell lässt sich die aktuelle Zeit einfach in einen entsprechenden Zeitstempel umrechnen und ausgeben

PS> (Get-Date).ToFileTime()

Der Filter lässt sich wie folgt anpassen:

query_filter = (&(|(mail=%u@%d)(uid=%u)(proxyAddresses=*smtp:%u@%d*))(&(accountExpires>=130954282658740101)(|(userAccountControl=512)(userAccountControl=66048))))

somit werden eMails an einen Account, der eine kleinen kleineren Zeitstempel, als der in der Abfrage, hat, nicht mehr zugestellt. Diesen Zeitstempel muß mensch ggf. regelmäßig im Filter der LDAP Abfrage anpassen.

Mit dem bisher gebauten filter sind leider keine Exchange eMail Gruppen berücksichtigt. Um diese zu berücksichtigen erweitern wir den Filter um die Frage nach der „objectClass„.

query_filter = (&(|(mail=%u@%d)(uid=%u)(proxyAddresses=*smtp:%u@%d*))(|(&(accountExpires>=130954282658740101)(|(userAccountControl=512)(userAccountControl=66048))(objectClass=person))(objectClass=group)))

Was genau macht dieser Filter jetzt?

  1. gibt es die eMailadresse: ja
  2. ist das Object eine Gruppe: ja
    => alles schick: gibt die eMailadresse zurück
  1. gibt es die eMailadresse; ja
  2. ist das Object ein Benutzer: ja
  3. ist der Benutzer weder gesperrt noch abgelaufen?: ja
    => alles schick: gibt die eMailadresse zurück