Gecloude, paranoide Sicherheit

Gecloude, paranoide Sicherheit

Du hast etwas Zeit über und magst lange Texte? Sicherheit in der IT ist genau Dein Ding? Dann lies Dir mal bitte folgende zwei Fallbeispiele durch und entscheide für Dich selbst wie funktionierende Sicherheit hier jeweils aussehen müsste.

Runde 1: Passwortaustausch hipp und modern

Wie überträgt man Passwörter für zum Beispiel IpSec? In derselben Email wie die Proposals? Wohl besser nicht. Also per Fax? Nein, Fax ist total veraltet - wer nutzt den noch so etwas? Per Telefon? Nein, sicherlich nicht. Ist ja noch älter als Fax und das hatten wir ja bereits. Brief? Zu langsam. Email wäre besser. Ach, moment: Stopp. Nein. Zwar gut aber irgendwie doof. Modern und hipp ist "Cloud". Warum also nicht eine Passwort-Austauch-Cloud? Mit Ende-zu-Ende-Verschlüsselung. Jetzt wird alles gut.

Frage

Die Idee ist doch super. Und sicher ist das auch. Ich erkläre mal das Verfahren: Ich erstelle ein zufälliges Passwort welches ich jemand Drittem übertragen muss. Nun melde ich mich an der Webseite eines Cloud-Dienstes an. Das Formularfeld mit dem Passwort wird allerdings bevor es an die Cloud geschickt wird noch entsprechend verschlüsselt. Per Javasript in meinem Webbrowser. Was da also übertragen wird ist ein bereits verschlüsseltes Passwort. Dazu kommt, dass die Seite per https geöffnet ist. Also nochmals verschlüsselt. Das so verschlüsselt übertragene verschlüsselte Passwort wird in der Passwort-Austausch-Cloud abgelegt. Nun muss die Cloud-Plattform dem Empfänger noch mitteilen, dass es hier ein Passwort für ihn gibt. Zum Beispiel per Mail. Also erhält der Empfänger einen Download-Link, kann via https das verschlüsselte Passwort verschlüsselt übertragen und in seinem Webbrowser per JavaScript wieder entschlüsseln. Voila, schon sieht er das von mir erstellte Passwort im Klartext.

Schlüssel

Doch Moment, das Ganze hat doch irgendwo einen Haken. Eine Plattform, welche jemand Drittes darüber informiert, dass ein Passwort da ist. Eine Plattform in der Cloud. Die wird wohl via Email benachrichtigen. Könnte ich, anstatt eine zusätzliche Plattform zu verwenden, hier nicht direkt eine Email an den Empfänger senden? Ja, klar - das könnte ich tun. Das würde die Cloud-Plattform einsparen. An der Sicherheit des Verfahrens hätte sich so noch nichts geändert: Ich verschlüssele das Passwort bevor ich es übertrage, übertrage es irgendwie, der Empfänger entschlüsselt das Passwort. Das "übertrage es irgendwie": Ist doch egal ob Cloud-Plattform oder Email?

Doch schon wieder stopp, halt. Die Cloud-Plattform könnte den Download auf einmal beschränken. Ok, da seh ich jetzt gedanklich zwei Dinge über die man mal nachdenken könnte:

  • Es gibt Virenscanner die aus Sicherheitsgründen von zu herunter ladenden Inhalten einen Prefetch machen. Der erste Downloadversuch könnte also bereits beim Scanner scheitern. Zugegeben selten, habe ich aber schon mehrfach erlebt.
  • Das hier finde ich ist der spannendere Punkt: Was macht der Empfänger mit diesem einmaligen Download? Er speichert ihn. Damit er ihn öfters lesen kann. Einmal übertragen, aber beliebig oft lesen. Das kann ich nicht beeinflussen. Richtig? Richtig. Dann hätte es auch eine Mail getan: Einmal übertragen, aber beliebig oft lesen. Finde den Unterschied.

Ihr seht schon, es braucht vom Grundsatz her keine Passwort-Austausch-Cloud-Plattform. Email kann das auch. Doch schon wieder Moment, stopp: Da ist doch noch was anderes? Einen ganz wichtigen Punkt habe ich noch gar nicht angesprochen: Ich verschlüssele das Passwort im Browser bzw. für die Mail und übertrage... Ja mit was hab ich den das Passwort verschlüsselt? Mit einem Passwort? Ach, spannend. Und wie übertrage ich dies? Per Email? Ja klar, mit dem Link zum Download bzw. dem verschlüsselten Passwort... Ach nein, Selbstironie Ende. Ich versuche dem gegenüber das Passwort via Telefon zu übertragen. 64 Zeichen: Groß- und Kleinbuchstaben. Dazu noch Ziffern. Schlimmer sind die Sonderzeichen. Da sind einige dabei wo ich nicht mal weiß wie die heißen. Kann Dir nicht passieren? Ok, wie heißen den die beiden hier `und ´? Oder diese beiden hier: ° und µ? Vor allem letzterer: Zeichen wie µ gibt es viele. Bei mir auf meiner Tastatur ist sogar das hier drauf ». Nur weil keine Taste damit beschriftet ist, ist es trotzdem da und kann verwendet werden. Was jetzt?

Nein, Telefon macht hier wenig Spaß. Dann lieber eine Textdatei an eine Email angefügt: 50 nummeriere Zeilen mit möglichen Passwörtern. Dazu geht der Telefonanruf an den Empfänger mit dem Hinweis Zeile 12, allerdings alle "a" durch "@" ersetzen, das gleiche für "3" welches zum "Ä" wird usw.

Diese Variante braucht einen Telefonanruf und eine Email. Wer will kann die vermeintliche Sicherheit noch zusätzlich erhöhen in dem er die Datei per einmaligem Downloadlink anbietet. Das können inzwischen viele der Dateiplattformen für die Cloud. Bevor wir jetzt an der Stelle ebenfalls wieder ausschweifen mal eine Zusammenfassung der bisherigen Situation.

Ausrufezeichen

Zusammenfassung Fall 1

Ok, lasst uns mal 1:1 zusammenzählen was wir erarbeitet haben: Eine Plattform welche Passwörter verschlüsselt um diese verschlüsselt zu übertragen... Irgendwann müssen diese Daten entschlüsselt werden. Wieder per Passwort? Das hat das Problem der Klartextübertragung des Passwortes nur an eine andere Stelle verschoben. Es gibt weiterhin ein Passwort welches im Klartext vorliegt. Aber hat sich die Sicherheit dadurch verbessert? Nicht wirklich: Das Verfahren wurde komplexer, komplexere Verfahren sind anfälliger für Fehler. Und was ist wenn der Download nur einmal angeboten wird? Das würde ja bedeuten, dass es möglich ist das verschlüsselte Passwort bei der Übertragung abzufangen. Ansonsten könnte man den Download mehrfach anbieten: Es kommt doch eh nur die berechtigte Person dort hin. Oder doch nicht? Dieses Problem versuche ich zu umgehen indem ich den Download nur einmal anbiete. Es ist möglich, die Daten abzugreifen. Jetzt speichert der Empfänger die Daten irgendwo. Weil er sie nicht gleich braucht sondern erst in ein paar Tagen dazu kommt. Warum auch immer. Es ist möglich, die Daten abzugreifen. Ihr seht schon: Hat nichts an der Sicherheit geändert, nur der Ort wo ich die Daten abgreifen muss wurde geändert. Komplexität löst keine einfachen Probleme.

Und eine kritische Frage zum Schluss: Gibt es eine große, bekannte und etablierte Plattform zum Austauschen von Passwörtern die diesem Verfahren folgt? Was wäre wenn diese von einem der großen Konzernen mit fragwürdigem Ruf zum Thema Datenschutz angeboten werden würde? Na dann lieber auf den Codeplattformen git und Co gesucht. Da findet sich was. Dank opensource ist das sicher. Ach, ist das so? Den Quellcode selbst geprüft? Du vertraust der Person welche behauptet sie hätte den Quellcode geprüft? Was soll schon passieren, ist doch opensource. Ich mag opensource, das ist kein Geheimnis. Aber wenn das so wäre, wäre opensource per Defintion fehlerfrei. Das ist ein Reifegrad an Software den selbst kommerzielle Produkte wohl nie erreichen werden.

Runde 2: Emails abholen

Die Woche war noch nicht vorbei als folgende Anfrage auf meinem Schreibtisch gelandet ist: Der Besitzer einer Domain betreibe eine Groupware Lösung. Wenn nun Emails von einem Postfach an ein anderes Postfach innerhalb dieser Groupware Lösung übertragen werden, werden diese Daten verschlüsselt übertragen. Ja, das machen moderne Groupware Systeme so. Wenn aber nun eins der Postfächer an jemand externes weitergeleitet werden müsste: Was ist dann? An dieser Stelle will der Kunde ebenfalls sicher stellen, dass die Emails verschlüsselt übertragen werden. So wie wenn das intern wäre. Den Kunden treibt die Angst vor Man-In-The-Middle Angriffen. Ein verständliches Anliegen.

Fragezeichen

Als Lösung für dieses Thema wurde folgendes Vorgehen vorgeschlagen: Eine Weiterleitung an den extern Mailserver via SMTP ist unerwünscht. Stattdessen wäre ein abholen der Mails via IMAP gewünscht. Allerdings sollte sichergestellt werden, dass der IMAP-Server das richtige Zertifikat vorweist. Doch wann ist ein Zertifikat gültig? Die übliche Vorgehensweise ist prüfe ob der Name des Zertifikats zum  zu kontaktierenden Host passt, dass das Zertifikat im Gültigkeitszeitraum liegt und, dass der Aussteller des Zertifikats in der Liste der vertrauenswürdigen Herausgeber liegt.

Hilft das allerdings gegen Man-In-The-Middle? Nein, nur bedingt. "Gültige" Zertifikate sind ein leichtes zu bekommen. Am sichersten wäre dies Prüfung zu erweitern: In dem man den Fingerabdruck des Zertifikats mit prüft. Allerdings muss man jetzt jedes mal den Fingerabdruck aktualisieren wenn die Gegenseite das Zertifikat verlängert. Und das kann oft der Fall sein - vor allem dann, wenn eines der kostengünstigen Zertifikate mit kurzer Laufzeit verwendet wird. Aber nein, das will der Kunde nicht. Zu aufwändig. Eine allgemeine Prüfung des Zertifikats reicht aus.

Fragen über Fragen

Finde den Fehler. Schon einmal darüber nachgedacht was eigentlich erreicht werden sollte? Und was tatsächlich erreicht wird? Da passt eins und eins alles andere als zusammen. Der Kunde will, dass Emails von seinem System sicher zu einem Dritten weitergeleitet werden. Erreicht wird, dass der Dritte prüft von welchem Server er die Mails abholt. Spannende Frage: Was ist wenn er das nicht prüft? Würde das der Kunde mitbekommen? Nein, tut er nicht. Nächste Frage: Der Kunde will, dass die Daten sicher zum Dritten übertragen werden. Per IMAP. Prüft der Kunde wer da gerade die Emails abholt? Also ob der wo gerade den Benutzernamen und das Passwort eingibt auch wirklich der ist den er vorgibt zu sein? Die Sicherheit ist an der Stelle reduziert auf den Benutzernamen und das Passwort. Egal wo und wie verschlüsselt wird. Benutzername und Passwort. Die kann jeder eingeben und verwenden wo diese Daten kennt. Egal ob berechtigt oder nicht.

Das kann so also nicht funktionieren und muss anders gelöst werden. Nur wie? Deswegen rasch nochmal die vier Gründe für Verschlüsselung aufgetischt:

  1. Vertraulichkeit
  2. Integrität
  3. Authentizität
  4. Verbindlichkeit

Na, das trifft es doch! Der Kunde will, dass nur der berechtigte Dritte die Daten, also die Emails, lesen darf. Seine Beweggründe sind gefunden, es sind die üblichen Verdächtigen. Nur wie werden die bei IMAP erreicht? Das Ziel, welches der Kunde will sind die 4 gezeigten Punkte. Und die erreicht man über die üblichen, verdächtigen Wege: Der IMAP-Server muss sicherstellen, dass er nur dann Emails überträgt wenn der Benutzer "ausreichend", gemäß den 4 Punkte, authentifiziert ist. Das kann zum Beispiel dadurch passieren, dass der IMAP-Server neben seinem eigenen Zertifikat noch gleich noch für die Authentifizierung das vom IMAP-Client prüft. Nur wenn er dieses kennt, dann ist alles ok. Oder, wer den Schritt nicht mag: Den IMAP-Server hinter ein VPN gepackt. VPN bringt von sich aus ebenfalls die obigen 4 Punkte mit.

Zusammenfassung Runde 2

Es ist hilfreich zu erkennen welche Ziele erreicht werden sollen. Mit dem Blick auf die genau definierten Ziele lassen sich geeignete Wege dorthin erarbeiten. Schwammige Ziele ergeben schwammige Lösungen die in der Regel nur bedingt das tun was man eigentlich erreichen wollte.

Die Absicht des Zieles war klar, der vorgeschlagene Lösungsweg mag im ersten Moment stimmig klingen. Eine kritische Prüfung ob das Ziel damit wirklich zu erreichen ist kann allerdings nie schaden. Der genaue, zweite Blick lohnt sich.

Ausrufezeichen
Sorry

Finale

Ist das oben erklärte die ultimative Lösung für die beiden Fälle? Sicherlich nicht. Zeigt die Diskussion, dass beim Thema Sicherheit durchaus Gesprächsbedarf besteht? Sicherlich ja.

Die Schwierigkeit beim Katz- und Mausspiel ist zu wissen wer die Katze ist. Übertragen auf die beiden Beispiele: Die Schwierigkeit ist zu erkennen welches Ziel wirklich erreicht werden sollte. Sobald dieser wichtige Punkt erkannt ist, ist der Rest rasch erledigt.

Sicherheit first, Bedenken last. Mein Bedenken first wegen der Sicherheit die last endlich auf der Strecke bleibt: total out. Ich bin wohl genauso rückständig und zurückgeblieben wie die alte analoge Telefonie: Total out. Wer jetzt Parallelen zu den aktuellen Bezahlterminals für eletronic cash sucht: Total out. Aber es mag sich am Horizont ein Licht auftun: Man könnte der analogen und veralteten Telefonie einen modernen, digitalen Anstrich verpassen. Dann wäre man eventuell wieder mehr bereit einfach mal zum Telefonhörer zu greifen und nachzufragen...

Sie haben kein Recht auf Ihre Meinung. Sie haben ein Recht auf Ihre fundierte Meinung. Niemand ist berechtigt zur Ignoranz.

Quelle Bild: Wikipedia (https://de.wikipedia.org/wiki/Harlan_Ellison#/media/Datei:Harlan_Ellison_at_the_LA_Press_Club_(cropped).jpg)

Harlan Ellison
US-amerikanischer Schriftsteller, Drehbuchautor und Kritiker
parallel rsync

parallel rsync

Große Datenmengen lokal via rsync kopieren

Folgende Ausgangssituation: Aufgrund warum auch immer muss eine große Datenmenge von einem Verzeichnis in ein anderes kopiert werden. Rahmenbedingung: Die Daten sollen so lange wie möglich weiterhin zugreifbar sein. Die Lösung: Kopie via rsync. Denn rsync überträgt ab dem zweiten Lauf nur noch die Änderungen an den Daten. Das macht man so lange bis es kaum noch Änderungen gibt. Danach stoppt man die Dienste, ein letzter rsync Lauf, Austausch der Verzeichnisnamen, Dienste wieder starten und fertig.

GroupWise POA via rsync kopieren

Ein sehr großes POA eines GroupWise Systems muss an einen anderen Ort kopiert werden. Der konkrete Auslöser in diesem Fall: Das darunter liegende NSS-Dateisystem soll von 32 nach 64 Bit migriert werden. Rahmenbedingung: Der Emailserver soll nur so kurz wie irgendwie möglich unterbrochen werden. Die Lösung: Kopie via rsync. Denn rsync überträgt ab dem zweiten Lauf nur noch die Änderungen an den Daten. Das macht man so lange bis es kaum noch Änderungen gibt. Danach stoppt man die GroupWise Dienste, ein letzter rsync Lauf, Austausch der Verzeichnisnamen, Dienste wieder starten und fertig.

Ok, die Ausgangsbasis mag eine andere sein. Aber unterm Strich liest sich das eine gleich wie das andere, oder? Zusammengefasst soll eine große Datenmenge lokal in ein anderes Verzeichnis verschoben werden. Bei näherer Betrachtung dieser Daten fallen mir zwei Dinge auf: Es handelt sich um mehrere Terabyte und diese sind in sehr, sehr vielen kleinen Dateien gespeichert. Also all das was man braucht wenn man schnell fertig sein will -Ironie Ende-. Nein, ernsthaft. Das ist gar nicht gut. Das klingt nach sehr, sehr langer Laufzeit.

Warum rsync und kein einfacher cp ist ja bereits durch. Mein Problem ist so lange bekomme ich keine Downtime genehmigt. Also rsync gestartet. Der läuft auch rasch an und macht sich ans Werk. Die zu kopierende Dateiliste wird erstellt, das dauert halt etwas. Aber dann geht die Kopiererei auch schon los. Die ersten Megabyte und auch ziemlich rasch die ersten Gigabyte erscheinen im Ziellaufwerk. Apropos rsync: Die Geschwindigkeit die rsync lokal erreichen kann ist limitiert durch die Geschwindigkeit der verfügbaren Platten. Eine VM mit einem All-Flash-Array im Hintergrund. Ok, das rennt. Sollte man meinen. Denn irgendwie tut der rsync gerade nichts mehr: Die Meldungen bleiben stehen, es werden kaum noch Daten kopiert. Das ist alles so langsam und träge. Ein Blick in top: rsync will Unmengen an RAM, macht CPU Last ohne Ende während der Disk-IO gegen 0 geht. An der Stelle habe ich auch schon mal erlebt, dass der Verfügbare RAM durchaus ausgehen kann sofern hier nur wenig Reserven da sind. Ein Blick ins dmesg verrät einem sofort ob der gefürchtete OOM-Killer unterwegs war...

Aber was kann man tun? Die erste Suche war ohne Ergebnis. Die Geschwindigkeit richtet sich nach dem lokalen Plattendurchsatz. Das passt aber hier nicht ganz ins Bild. Also mal die zu kopierenden Daten betrachtet. Der allergrößte Brocken liegt bei GroupWise im Ordner offiles. Direkt unterhalb von diesem gibt es 256 weitere Unterordner in denen dann die eigentlichen Daten liegen. Die Terabyte an Daten liegen also größtenteils in 256 Ordner verteilt die jeweils nur wenige Gigabyte groß sind. Na damit lässt sich doch was anfangen. Also was kann man tun?

GNU parallel

GNU parallel

Im Sinne von "teile und herrsche" (https://de.wikipedia.org/wiki/Teile-und-herrsche-Verfahren) kann man unlösbare Probleme lösen indem man sie in kleinere Teilprobleme zerlegt. Die Lösung dieser Unterschritte ergibt in Summe die Gesamtlösung.

In diesem Falle lässt sich der offiles Ordner in seine 256 "Einzelteile" zerlegen. Jeder dieser Ordner ist überschaubar bzgl. der Größe und die Anzahl der Dateien. Und damit es schneller geht werden diese Einzelteile anstatt allesamt einer nach dem anderen parallel abgearbeitet. Ich habe mich auf gleichzeitig 8 Verzeichnisse festgelegt: Das hat die Hardware super weggesteckt und sogar keiner der GroupWise Anwender hat sich beklagt, dass die Performance während eines Kopiervorgangs schlechter geworden wäre. Hier heißt es ggf. erstmals ausprobieren und sachte heranzutasten was ein geeigneter Wert für gleichzeitige Kopiervorgänge wäre.

Mit etwas geschickter bash Programmierung wäre es kein Thema die parallelen Jobs selbst zu verwalten. Aber wozu? Mit "parallel" aus den GNU Tools gibt es ein praktisches Werkzeug welches einem genau diese Arbeit abnimmt. Leider fehlt es vielen Linux Distributionen in den verfügbaren Paketen. Jedoch ist es aus den Quellen rasch übersetzt. Diese, sowie eine ausführliche Anleitung, finden sich auf der Homepage des GNU Projektes: https://www.gnu.org/software/parallel/.

 

Meine Lösung

Meine Lösung ist ein kurzes bash Skript welches im Kopf die beiden NSS Verzeichnisse als Quell- und Zielverzeichnis gelistet haben. Im Quellverzeichnis wird zunächst nach sämtlichen offiles Ordnern gesucht - ich habe hier Server stehen auf denen mehr als nur ein POA installiert sind. Im nächsten Schritt wird alles außer den offiles kopiert. Im folgenden Schritt werden anschließend alle offiles Unterordner via parallel aufgerufenen rsync Befehlen kopiert.

Bisher habe ich die Kopieraktion abgebrochen da nichts mehr vorwärts ging. Jetzt war der Erstsync innerhalb eines Tages fertig, die folgenden Läufe brauchten nur wenige Stunden. Vor der eigentlichen Umstellung wurde gerade nochmals eine knappe Stunde für den sync benötigt. Das passt, die Stunde Downtime im GroupWise bekomme ich im Rahmen der üblichen Wartungsfenster locker den Kunden gegenüber argumentiert.

NSS Kenner mögen jetzt fragen was mit den Trustees ist. Eine übliche GroupWise Installation legt keine Trustess an, somit gäbe es auch keine zu kopieren. Und falls doch: Ein nss /help zeigt den aktuellen Status und mittels nss /ListXaatrNWmetadata lässt sich eine xml-Datei aktivieren in der sämtliche Trustess gelistet sind. Diese Datei wird von rsync, sofern vorhanden, einfach mitkopiert. So können die Trustess auf dem Ziellaufwerk übernommen werden. Im Novell / MicroFocus / NetIQ NSS Migration Guide ist diese Variante mit rsync ausführlich beschrieben: https://www.novell.com/documentation/open-enterprise-server-2018/stor_nss_lx/data/t42v5hiqjnzn.html#t42v6m36om8w. Ich habe diesen Ansatz lediglich parallelisiert.

Und hier nun das von mir verwendete Hilfsskript. NSS Trustees werden zumindest erwähnt - ich habe halt wie bereits gesagt bei GroupWise keine im Einsatz. Somit sind die Trustee Blöcke rein informativer Natur.

#!/bin/bash

#
# Ein GroupWise NSS rsync Skript ;-) Mal kucken ob es damit besser läuft...
#

#
# 2019-12-13, Gehirn-Mag.Net: Init... (ob der Wochentag was aussagen soll?)
#

# sehr frei nach: https://www.novell.com/documentation/open-enterprise-server-2018/stor_nss_lx/data/t42v5hiqjnzn.html#t42v6m36om8w


# Source und Dest - wichtig der / am Ende!
SDIR=/media/nss/GROUPWISE/
DDIR=/media/nss/GROUPWISE64/
THREADS=8
#DRYRUN=--dry-run
LDIR=/tmp/gwrsync
START="$(date)"


# Logdir vorbereiten, alte Logs löschen
mkdir -pv $LDIR
find $LDIR -type f | xargs -n 50 rm -v

# NSS zumindest mal Trustee Status ausgeben
echo "nss /ListXattrNWmetadata <-- Sollte an sein ;-)"
nss /help | grep -A1 Xattr

# offiles Ordner suchen
cd $SDIR
find . -maxdepth 2 -type d -name "offiles" | cut -d/ -f2- > /tmp/gwrsync.exclude

# Alles außer offiles
rsync                                                       \\
   $DRYRUN                                                  \\
   -vv -r -h -lXHtS --stats --delete                        \\
   --exclude-from /tmp/gwrsync.exclude                      \\
   --exclude ._NETWARE/                                     \\
   --exclude '~DFSINFO.8-P'                                 \\
   --log-file=${LDIR}/wo-offiles.log                        \\
   $SDIR $DDIR

# Offiles
echo "--------------------------------------------------------------------"
echo "OFFILES"
while read FOLDER; do
   echo $FOLDER
   PO=$(echo $FOLDER | rev | cut -d'/' -f2 | rev)
   find ${SDIR}${FOLDER} -mindepth 1 -maxdepth 1 -type d |  \\
      parallel -j${THREADS}                                 \\
      rsync $DRYRUN -vv -r -h -lXHtS --stats --delete       \\
      --log-file=${LDIR}/{#}-{%}-${PO}-{/}.log              \\
      {} ${DDIR}${FOLDER}
done < <(cat /tmp/gwrsync.exclude)

# Trustees kopieren - ich hab halt keine ;-)

# Hinweis auf NSS wieder an ;-)
echo -e "\\n\\nnss ListXattrNWmetadata ggf. noch deaktivieren ;-)"
echo $START
date
exit

 

Warum das Ganze?

Der Auslöser war die schlichte Tatsache, dass auf dem GroupWise Server als Dateisystem für die Daten NSS verwendet wird - in der 32 Bit Version. Jetzt gibt es keine direkte Migrationsmöglichkeit von NSS 32 auf 64 Bit. Der offizielle Weg von MircoFocus sieht vor, dass man die Daten entsprechend kopiert. Das kann das NSS Migrationstool machen oder man kopiert mit Linux Bordmitteln. Ich habe mich für die Linux-Variante entscheiden. Und da mir das zu lange dauerte via parallel nachgeholfen.

Letztendlich zeigt diese Lösung, dass man sicherlich nicht alle, aber einige Kopierjobs parallel abgearbeitet deutlich beschleunigen kann. Im Falle GroupWise gibt es einige Verzeichnisse und noch ein paar mehr Dateien. Und es gibt den offiles Ordner. Dieser Ansatz lässt sich auf viele andere, große Kopierjobs, erfolgreich übertragen.

RBLs von Spamhaus: Irgendwie anders herum…

RBLs von Spamhaus: Irgendwie anders herum…

Jeder der eine Emailadresse hat oder sogar einen eigenen Mailserver betreibt weiß es: UCE oder Spam ist einfach nur lästig... Zeit was dagegen zu tun. Blacklists sollen es sein. Dumm nur, wenn die von Spamhaus nicht mag...Doch der Reihe nach, was ist passiert? Folgendes Szenario: Ein kleiner Server steht irgendwo bei einem der großen Hoster im Schrank. Funktioniert alles wunderbar. Nur wenn man eine Testabfrage an Spamhaus senden will passiert rein gar nichts:

# host 2.0.0.127.zen.spamhaus.org d.gns.spamhaus.org
;; connection timed out; no servers could be reached

Hm, seltsam... Eigentlich hat man mit einer anderen Antwort gerechnet. Der gleiche Befehl am heimischen PC oder über eine andere Internetverbindung ausgeführt liefert hingegen das erwartete Ergebnis:

# host 2.0.0.127.zen.spamhaus.org d.gns.spamhaus.org
Using domain server:
Name: d.gns.spamhaus.org
Address: 194.68.44.148#53
Aliases: 

2.0.0.127.zen.spamhaus.org has address 127.0.0.2
2.0.0.127.zen.spamhaus.org has address 127.0.0.10
2.0.0.127.zen.spamhaus.org has address 127.0.0.4

Jetzt wird es seltsam. Also mal das Internet nach Rat gefragt 😉

Ursachensuche

Das war nach kurzer Suche rasch erledigt. Spamhaus sperrt komplette Internetbereiche vorm Zugriff auf Ihre Listen wenn Sie der Meinung sind, dass Server in diesem Segment "böse Dinge" tun. Ich lasse an der Stelle die Links die ich dazu gefunden habe mal weg - denke die haben in dem Artikel nichts zu suchen da unterm Strich jeder Serverhoster von diese Problem betroffen sein könnte. Es sollten sich genügend Erfahrungen von anderen Benutzern vom Internet zu diesem Thema finden lassen. Oder man macht den obigen Schnelltest und überzeugt sich selbst 😉

Erschwerte Rahmenbedingungen

Naja, was wird man wohl tun können bzw. müssen? Also mal der Reihe nach alles durch probiert:

  • host 2.0.0.127.zen.spamhaus.org liefert einen Timeout. Wenn das gleich bei einem neu aufgesetzten Server passiert steht in der resolv.conf wohl noch der bzw. die DNS-Server vom Hoster drin. Dann stehen diese wohl in einem Netzwerksegment das von Spamhaus gesperrt wurde.
  • host 2.0.0.127.zen.spamhaus.org d.gns.spamhaus.org funktioniert ebenfalls nicht? Dann ist von der Sperre auch noch die Adresse des eigenen Rechners betroffen.
  • Naja, man kann ja schnell einen anderen Nameserver benutzen. Gibt ja z.B. die beiden frei erreichbaren von dem großen Suchmaschinenanbieter mit dem großen "G" im Anfang vom Namen: host 2.0.0.127.zen.spamhaus.org 8.8.8.8. Hm, ebenfalls timeout? Die etwa auch gesperrt? Ja, das mag prinzipiell schon sein. Auf der anderen Seite sperren einige Betreiber von DNS-Servern auch den Zugriff auf RBLs über ihre Systeme. So oder so, unterm Strich war das schon wieder nichts. Und auf der anderen Seite: Bei dem Betreiber dieser DNS-Systeme weiß man ja, dass der sein Geld damit verdient, dass er Besucherprofile von einem über die gestellten DNS-Anfragen kreiert. Zusätzlich bleibt hier die spannende Frage ob man das überhaupt so will.

Annäherung an die Lösung

Also muss irgendein DNS-Server her der frei verfügbar ist und idealerweise nichts oder nur kaum etwas protokolliert. Und ideaerweise keine Profile oder sonst was erzeugt. Auch hier sollten sich im Internet Server finden lassen wie z.B. die von DigitalCourage oder OpenDNS. Es gibt mehr davon wie man zunächst vielleicht denken mag mit vielen verschiedenen Beweggründen. Mir soll es reicht sein, ich habe eine Alternative gefunden:

# host 2.0.0.127.zen.spamhaus.org 208.67.222.220
Using domain server:
Name: 208.67.222.220
Address: 208.67.222.220#53
Aliases: 

2.0.0.127.zen.spamhaus.org has address 127.0.0.2
2.0.0.127.zen.spamhaus.org has address 127.0.0.4
2.0.0.127.zen.spamhaus.org has address 127.0.0.10

Und siehe da: Es funktioniert! Ok, jetzt könnte ich diese Server in der resolv.conf meines Linuxservers kurz eintragen. Doch halt, das würde alle DNS-Anfragen über diese Server leiten. Eigentlich schon wieder nicht das was ich haben wollte. Also nochmals anders.

Ein eigener DNS-Server

Genau, das ist doch die Lösung: Ein eigener DNS-Server. Im Caching-Modus. Also übers Internet nicht erreichbar, nur via localhost und macht für mich meine DNS-Anfragen. Löst diese direkt ohne irgendwelche Abhängigkeiten auf, legt das alles noch im Cache ab. Und, damit Spamhaus funktioniert, eine Forwarding-Zone für zen.spamhaus.org. eingerichtet.

Das kann man mit so gut wie jedem DNS-Server machen. An der Stelle mag ich selbst unbound: Der ist klein, schlank, in allen gängigen Distributionen bereits enthalten und richtig fix konfiguriert. Ok, ggf. muss man sich kurz schlau machen wie man den bei seiner eigenen Distribution letztendlich auch verwendet. Bei einigen wird es reichen die resolv.conf anzupassen, bei ein paar anderen wird man ggf. systemd-resolve vorher noch deaktivieren müssen. Das sollte sich aber im Handbuch bzw. der Paketbeschreibung zu unbound in der jeweiligen Distribution rasch ermitteln lassen.

Nachdem das erledigt ist und erste Testauflösungen via unbound funktionieren wird noch rasch dessen Konfig um diese Zeilen erweitert (die DNS-Server ggf. sinngemäß anpassen):

# Spamhaus
forward-zone:
  name: "zen.spamhaus.org."
  forward-addr: 46.182.19.48	# DigitalCourage
  forward-addr: 208.67.222.220	# OpenDNS
  forward-addr: 208.67.222.222	# OpenDNS

Unbound neugestartet und schon, oh wunder, ist sogar Spamhaus vom eigenen Server aus erreichbar 🙂 Angenehmer Seiteneffekt dieser Lösung: Über die DNS-Server von Dritten laufen nur Teilmengen der eigentlichen Anfrageflut. Für den größten Teil bleibe ich, dank eigenem caching-Proxy, mein eigener Herr.

Postfix: IPv6 oder IPv4?

Postfix: IPv6 oder IPv4?

Mal wieder ein Problem zum Thema Email und Postfix. Neulich erst SMTPUTF8, jetzt wieder etwas was sich der Admin vor Ort nach Erklärungen und Lösungen sucht.

Fortune hat einmal zu mir folgendes gesagt:

The light at the end of the tunnel may be an oncoming dragon.

Für alle diejenigen die fortune nicht kennen: https://de.wikipedia.org/wiki/Fortune_(Computerprogramm).

Achtung!

Man sollte natürlich richtig prüfen, ob die IPv6 Auflösung eventuell sogar wirklich ein Problem hat. Da die Frage aufkam hier das grobe Vorgehen dazu: In der Fehlermeldung steht eine IPv6 Adresse drin. Diese per Reverse-DNS auflösen. Der Rechnername, der hierbei raus kommt sollte via Forward-DNS wieder zur gleichen IPv6 Adresse führen. Unterm Strich genauso, wie es auch für IPv4 der Fall sein sollte. Bitte dran denken. Nur wenn das alles passt und immer noch nichts hilft, dann kann dieses vorgehen wie hier beschrieben eine sinnvolle Variante sein.

Das Spiel beginnt

Bevorzugt kommen solche Fragen ja immer am spätem Nachmittag rein. Mal wieder das Thema Email. Mal wieder auf den ersten Blick dubios: Angeblich kann ein Emailserver keine Mails an eine bestimmte Empfangsdomain senden. Als Grund wird der fehlende Reverse DNS-Eintrag angegeben. Dieser ist aber gesetzt. So auf die schnelle passt hier irgendwas nicht zusammen, der detailliertere Blick ins Protokoll muss her. Hier findet sich folgendes - stark gekürzt und anonymisiert. Du weißt schon, Datenschutz und so 😉

May  7 14:12:37 methusalix postfix/smtp[587]: 0D2B11E0027: to=<emfp@aeng.er>, relay=mail.gatew.ay[1.1.1.1]:25, delay=0.57, delays=0.02/0.01/0.33/0.21, dsn=2.0.0, status=sent (250 OK id=1hNyxZ-00061t-DZ)
May  7 14:12:37 methusalix postfix/smtp[587]: 9600B1E0028: to=<emfp@aeng.er>, relay=mail.gatew.ay[1.1.1.1]:25, delay=0.35, delays=0.01/0/0.22/0.12, dsn=2.0.0, status=sent (250 OK id=1hNyxZ-00068z-RW)
May  7 14:13:23 methusalix postfix/smtp[587]: EAE621E0028: to=<emfp@aeng.er>, relay=mail.gatew.ay[1.1.1.1]:25, delay=0.4, delays=0.01/0/0.21/0.18, dsn=2.0.0, status=sent (250 OK id=1hNyyJ-0007Tp-6X)
May  7 14:55:19 methusalix postfix/smtp[6340]: A672D1E0027: to=<emfp@aeng.er>, relay=mail.gatew.ay[1.1.1.1]:25, delay=0.65, delays=0.01/0/0.5/0.14, dsn=2.0.0, status=sent (250 OK id=1hNzct-0006QR-6i)
May  7 15:13:07 methusalix postfix/smtp[8811]: 6C1A31E0027: to=<emfp@aeng.er>, relay=mail.gatew.ay[1:1:1:1::1:1]:25, delay=0.39, delays=0.03/0.01/0.32/0.03, dsn=5.0.0, status=bounced (host mail.gatew.ay[1:1:1:1::1:1] said: 550-Inconsistent/Missing DNS PTR record (RFC 1912 2.1) 550 (methusalix.doma.in) [1:1:1:1::1]:44636 (in reply to RCPT TO command))

Aha... 4x geht es und einmal nicht. Was bei dem einen Versuch anders ist? Der war per IPv6, die anderen via IPv4. Ok, das mag ja jetzt sein: Reverse-DNS für IPv4 gesetzt, für IPv6 schlichtweg vergessen. Fix via host-Befehl im DNS abgefragt auf die IPv6 Adresse die laut Log keinen Reverse Eintrag haben soll: Oh wunder, der ist richtig auflösbar. Ab jetzt wird es seltsam. Aber wie so oft: Erstmal muss eine Lösung her. Die Suche nach der Ursache wird mal wieder hinten angestellt.

Also gut, das hier ist ganz klar ein Fall für den Blick in die Postfix Dokumentation bzw. in die aktuelle Konfiguration.

Recent Postfix SMTP clients randomly select between IPv4 and IPv6 so that mail won't get stuck when one of the two is down.

Wietse Zweitze Venema
Programmierer und Physiker

smtp_address_preference = any ist wie es sich gehört richtig gesetzt. Das macht so einfach mit am meisten Sinn und wird in der Dokumentation letztendlich genauso empfohlen. inet_protocols brauche ich gar nicht zu kontrollieren, muss auf any stehen. Sonst hätte es gar nicht die beiden unterschiedlichen Zustellvarianten geben dürfen. Um jetzt zu verstehen was da passiert sollte man die Doku kennen oder sich an das im Block links angeführte Zitat von Wietse erinnern.

Somit ist die Lösung für dieses Rätsel fix gefunden: Für diese eine Empfangsdomain sollte der Emailausgang ausschließlich auf IPv4 festgelegt werden. Nur kennt Postfix keine inet_protocol_map in der man dies festlegen könnte. Es ist also mal wieder die Frage nach etwas Kreativität um eine passende Lösung mit Postfix Mitteln entsprechend abzubilden.

Und der Weg zum Ziel ist unterm Strich mal wieder ganz einfach: Man definiert in der master.cf einen weiteren smtp Dienst welcher als Option das oben bereits erwähnte inet_protocols = ipv4 hat. Im zweiten Schritt noch fix einen passenden Eintrag für die Zieldomain in der transport Tabelle gesetzt welche genau diesen Dienst verwendet und voilà: Ziel erreicht.

Die Umsetzung

Die folgenden Beispiele zeigen an reinen Textdateien unter /etc/postfix die passende Konfiguration für die Empfängerdomain gehirn-mag.net. Wer dort bereits eine transport-Tabelle hat kann diese selbstverständlich nutzen. Wer ein Datenbank- oder LDAP-Backend hat kann diese Lösung sinngemäß übertragen. Hier aber, der Einfachheit wegen, das Beispiel an den "blanken" Textdateien. Und Du solltest logischerweise die Empfängerdomain richtig anpassen 🙂

Die erste Datei die geändert wird ist /etc/postfix/master.cf. Hier wird ein weiterer Dienst eingetragen. Eine Zeile analog zur ersten gibt es bereits. Wichtig ist, dass zu Beginn am Anfang und am Ende smtp steht und kein smtpd. Diese kopiert ihr, ändert den Namen (Zeile 2, Spalte 1) und fügt darunter den Inhalt der Zeile 3 ein.

Als nächstes ist /etc/postfix/main.cf dran. Hier ist zu prüfen ob es eine transport_maps Zeile gibt. Falls nicht fügt Ihr diese einfach ein.

Und zu guter Letzt ist die transport Tabelle /etc/postfix/transport selbst. Hier ist der Eintrag für die Zieldomain zu setzen, dass diese unseren neuen IPv4 smtp Dienst verwendet.

smtp      unix  -       -       y       -       -       smtp
smtp-ipv4 unix  -       -       y       -       -       smtp
    -o inet_protocols=ipv4
transport_maps = hash:/etc/postfix/transport
gehirn-mag.net           smtp-ipv4:

Nun müsst Ihr noch via postmap /etc/postfix/transport diese für postfix übersetzen und mit postfix reload den Mailserver neu starten. Postfix versendet nun für Eure Zieldomain alle Mails dorthin via IPv4 anstatt frei zu wählen was er jetzt verwenden könnte.

Und fertig!

Was eine Lösung. Ist das wirklich elegant gemacht auf diese Art und Weise? Ja, das ist Sie. Auf ihre ganz spezielle Art. Einen eigenen Dienst in der master.cf anzulegen macht man eigentlich öfters. Am häufigsten wohl als Ziel für irgendwelche Postfachsysteme wie IMAP/POP3 oder Groupware-Systeme. Wenn man diese externe Domain mit der sinngemäßen gleichen Logik betrachtet ist das schon sehr ähnlich: Ein Postfachspeicher welcher Emails via SMTP annimmt und obwohl er eine IPv6 Adresse hat kann der Dienst aber nur IPv4. Ich betreue Postfix Umgebungen bei denen aufgrund von der Vielzahl und der Größe der dahinter liegenden Groupware Lösungen die transport-Tabelle länger ist bei vielen anderen Installationen die virtual-Tabelle. Da erlebt man noch ganz andere Dinge...

In größeren Emailumgebungen ist man gefühlt nie am Ende mit der Konfiguration angekommen. Man mag sich in dem zu Beginn angesprochenen Tunnel fühlen. Sobald die Ursache aber sauber erfasst wurde ist die Lösung des Problems rasch erledigt und das Ende des Tunnels naht. Bis zum nächsten Anruf 😉

Aber morgen kontaktiere ich erstmals den Emailadmin auf der anderen Seite und frage nach den Gründen für diese Fehlermeldung - Feierabend für heute.

Quellen

  • GNU Bild: Wikimedia - kann aber genauso gut auf gnu.org direkt gezogen werden
  • Wietse Bild: Wikimedia - public domain
Das xn--mrchen-bua vom Punycode…

Das xn--mrchen-bua vom Punycode…

Ich erzähl euch mal eine kurze Geschichte: Heute am späten Nachmittag ereilte mich der Hilferuf eines befreundeten Emailadmins. Einer seiner Mailserver, zugegen einer auf dem recht wenig los ist, nimmt keine Emails mehr an. "Relay Access Denied" steht da im syslog drin. Ok, etwas genauer darauf geschaut: Das trifft nur auf die Emails zu die von Gmail kommen. Alles andere, wenn mal was vorbei kommt, läuft "richtig" durch. Eine Besonderheit der Empfangsdomain: IDN, Punycode, SMTPUTF8 und kein ASCII. Oder, ganz anders ausgedrückt "German umlaut in the domain name". Seit RFC-6530...6533 soll das ja kein Thema mehr sein. Siehe z.B. hier: https://tools.ietf.org/html/rfc6531 - das ist wohl das RFC wo der interessanteste Teil zu den Grundlagen von SMTPUTF8 drin steht.
 
In der Postfix-Doku ist ganz gut erklärt warum Postfix sich schwer damit tut zu erahnen ob eine Domain jetzt UTF8 oder ASCII ist und was das für Seiteneffekte mit sich ziehen kann. Siehe hierzu http://www.postfix.org/SMTPUTF8_README.html#detecting sowie die darauf folgenden Abschnitte. Unterm Strich sollte das aber keine große Hürde darstellen - mag man meinen.
 
Per telnet fix nachgeschaut:
telnet <bla.blubb> 25
Trying 253.254.255.256..
Connected to <bla.blubb>.
Escape character is '^]'.
220 <bla.blubb> ESMTP Try me, beat me!
ehlo duda
250-<bla.blubb>
250-PIPELINING
250-SIZE 31457280
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
quit
221 2.0.0 Bye
 
Alles gut, SMTPUTF8 steht mit drin. Und ja, im Postfix Log steht die Emailadresse je nach Modul mal als UTF8 oder als ASCII drin - siehe oben, der Link zum Readme. Aber irgendwie, Relay Access Denied. Trotz allem. Hm... Während die Gedanken sich so winden: Kleiner Online-Konverter gefällig mit dem der Titel dieses Textes zurück nach ASCII übersetzt werden kann? Bitte schön, gibt es hier: http://unicode.org/cldr/utility/idna.jsp. Aber zurück zum eigentlichen Thema, wir waren beim Hm... stehen geblieben. Dort läuft noch ein amavisd-new-milter. Ob der was damit zu tun haben kann? Laut https://www.ijs.si/software/amavisd/release-notes.txt nein, der soll alles richtg können (Achtung, bei dem Link hab ich gerade ein SSL-Zertifkatsfehler ignorieren müssen). Fix via telnet nachgeprüft - lief hier auf dem üblichem Amaivs-Port 10024: SMTPUTF8 taucht in der Liste erwartungsgemäß auf.
 
Bleibt noch der letzte Beteiligte in der Kette: Dovecot LTMP. Kann der mit SMTPUTF8 umgehen? Eine eindeutige Aussage dazu habe ich nicht gefunden. Also falls Ihr was finden solltet wo eindeutig drin steht "ja, das geht" oder "nein, das geht (noch?) nicht": Nur her damit!
 
Jetzt mal ernsthaft und das ganze Bild nochmals komplett betrachtet: Andere Emails kommen an. Und die haben kein Problem mit dem Umlaut in der Domain. Nur die von Gmail nicht. Ggf. auch noch von ein paar weiteren, da ist bloß bisher noch nichts aufgefallen. So muss Gmail hier als stellvertretendes Beispiel dienen. Was macht in diesem Falle hier Gmail anders als der Rest? Das Internet schweigt sich aus. Nur wenig lässt sich finden wo das exakt gleiche Problem beschrieben wird. Lösungen fehlen aber. Gefühlte tausende Logzeilen von Postfix im Debug Modus später und zwar das Problem immer weiter eingekreist auf das oben beschriebene aber keine Lösung gefunden. Doch Moment mal: Das Problem ist doch wohl der Natur, dass die Ursache im Umlaut, also SMTPUTF8 liegen muss. Es ist ja nun mal so, dass einige Emails ankommen obwohl die Domain einen Umlaut hat. Was ist wohl bei denen anders als bei denen die nicht ankommen? So langsam wird es zwingend logisch was bei denen anders sein muss. Na, schon die passende Idee dazu? Ich hab es einfach gleich mal ausprobiert und in die main.cf von Postfix folgendes eingetragen: "smtputf8_enable = no". Per telnet geprüft: SMTPUTF8 fehlt. Und siehe da: Die Emails von Gmail kommen an. Da jetzt kein SMTPUTF8 mehr angeboten wird übergibt Google die Mails in ASCII-Darstellung. Und schon klappt alles wie erwartet. Google scheint, wenn es die Gegenseite anbietet, doch tatsächlich SMTPUTF8 zu nutzen. Und ist damit wohl noch einer der wenigen die das so tun.
 
Freundlicherweise hab ich ja noch ein paar Appliances von namhaften Herstellern im Angebot wo man via telnet auf den SMTP-Port mal rasch prüfen kann was die so tun: Kein SMTPUTF8. Ok, die werden wohl wissen warum. Das weiß ich jetzt ebenfalls.
 
Aber irgendwie bleibt ein ungutes Gefühl bei der ganzen Sache. Die Durchdringung von Umlautdomains ist wohl doch noch nicht so weit wie man denken mag. Wirklich toll ist das nicht. Ich freue mich schon, oder auch nicht, wenn der erste Kunde kommt der bei diesem Mailhoster aus Redmond liegt. Wo dem Namen nach die Kunden das ganze Jahr lang jeden Tag im Büro verbringen. Und wenn dann dieser Kunde sagt er hat eine Umlaut-Domain: An dem Tag hab ich vermutlich Urlaub...