Archiv der Kategorie: Postfix

Spaß mit TLSA Records

Bei dem Erzeugen des Hash für einen TLSA Record kann mensch plötzlich sehr viel „Spaß“ haben.

Die geläufigste, beim Suchen zu findende Anleitung ist ja die folgende:

openssl x509 -in example.com.crt -outform DER | openssl sha256
(stdin)= 46fc14a051629364fc0bedafd87b74731c7e63af4d772127871b0bd9f2bbd29c

soweit so gut. Also einen ensprechden Hashwert erzeugt und per DNS publiziert. Im nächsten Schritt versuchen wir mal den Eintrag zu validieren unter Verwendung von z.B.: https://www.huque.com/bin/danecheck oder https://dane.sys4.de/

Und was müssen wir feststellen: Der Hashwert ist ungültig! – aber warum?

Ok, also auf ein Webseiten gegangen um einen TLSA Hash zu erstellen (z.B.: https://de.ssl-tools.net/tlsa-generator)

Hups, warum kommt die Webseite auf ein anderes Ergebnis als openssl in der Shell?

Möglicherweise ein openssl Problem? – Probieren wir mal einen anderen Rechner aus – das gleiche Ergebnis wie vorher – ist ja auf der einen Seite gut und sollte auch so sein – aber warum kommt die Webseite auf ein anderes Ergebnis als ich?

Beim Suchen bin ich nun über den einen Blogeintrag gestolpert:
Hier gibt es einen Codeschnipsel zum erzeugen des TLSA Records … Probieren wir den doch mal aus – und? – das gleiche Ergebnis wie die Webseiten ….

Hier der besagte Codeschnipsel als bash script:

#!/bin/bash
server=`hostname -f`
tlsa=$(openssl x509 -in $1 -noout -pubkey |
 openssl pkey -pubin -outform DER |
 openssl dgst -sha256 -binary |
 hexdump -ve '/1 "%02x"')
echo -e "_25._tcp.$server. IN TLSA 3 1 1 $tlsa\n"

Ist ein wenig aufwendiger – führt aber zu einem offensichtlich „schönerem“ Ergebnis.

Und für’s nächste mal:

posttls-finger -t30 -T180 -c -L verbose,summary gruppe04.de

und selber überprüfen …

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