Archiv des Autors: David Scherfgen

Maximale Vermasselung bei der Netbank — Finger weg!

Seit einigen Monaten habe ich ein Geschäftskonto bei der Netbank. Es fing schon merkwürdig an: Das Datum, an dem ich mein Gewerbe angemeldet habe, wurde als Geburtsdatum ins System eingetragen. Darum war ich für das System noch minderjährig und konnte mit meinem neuen Konto erst einmal nicht viel anfangen. Erst nach längerem Nachfragen wurde mir mitgeteilt, dass ich andere Zugangsdaten benutzen muss als die, die mir gegeben wurden. Mit den neuen Zugangsdaten funktionierte das Banking dann.

Ein Grund, warum ich mich für die Netbank entschieden hatte, war die Möglichkeit der Einlösung von Schecks (bei manch anderer reiner Online-Bank geht das nicht). Doch als ich von dieser Möglichkeit erstmals Gebrauch machte, wurde ich gleich böse überrascht: Bei einem US-Scheck über umgerechnet knapp 430 € fielen saftige Gebühren von 62 € an, die sich anhand des Preisverzeichnisses nicht nachvollziehen ließen. Bei meiner Raiffeisenbank ist das wesentlich günstiger, da bezahle ich für die gleichen Schecks 12,50 €. Also war dieses „Feature“ schon mal für die Tonne.

Apropos „für die Tonne“: Die Online-Banking-Oberfläche der Netbank war bis vor Kurzem noch unglaublich hässlich. Sie schien (ohne Witz) für eine feste Bildschirmauflösung von 800×600 Pixel ausgelegt zu sein, und dementsprechend erinnerte auch das Bedienkonzept an eine Website aus den Neunzigern. Der Funktionsumfang ließ ebenfalls zu wünschen übrig, z. B. konnte man keine angekündigten SEPA-Lastschriften anzeigen (das geht auch jetzt noch nicht). Das Online-Banking-Interface war zwar schlecht — richtig schlecht — aber immerhin funktionierte es, und es gab auch sonst keine Probleme.

Vor ungefähr einem Monat bekam ich per Post eine protzige Hochglanz-A4-Mappe von der Netbank geschickt, in der eine neue Online-Banking-Oberfläche angekündigt wurde. Die abgedruckten Screenshots der neuen Oberfläche weckten Vorfreude in mir. Würde nun alles besser werden? Davon ging ich aus. Die neuen Zugangsdaten bekam ich etwas später ebenfalls per Post geschickt (da hatte ich Glück, wie sich später herausstellen sollte).

Am 9. Oktober loggte ich mich erstmals in die neue Online-Banking-Oberfläche ein. Mit den neuen Zugangsdaten war das kein Problem. Das neue Design ist modern und responsive — so, wie man es im Jahr 2017 erwarten würde. Es fehlten zwar noch einige Funktionen, aber die sollten später freigeschaltet werden. OK, damit hätte ich leben können.

Als ich jedoch zum ersten Mal nach der Umstellung in meiner Buchhaltungssoftware meine Kontoumsätze via HBCI/FinTS abrufen wollte, kam eine böse Überraschung: Die HBCI/FinTS-Implementierung wurde scheinbar ebenfalls ersetzt, und zwar durch eine maximal Unbrauchbare. Es fehlen wichtige Felder wie Sender/Empfänger der Zahlung, Teile des Verwendungszwecks sowie eine eindeutige ID für jede Transkation. Insbesondere Letztere ist nötig, um Duplikate zu erkennen. Ohne diese eindeutige ID werden dieselben Transaktionen bei jedem Abruf immer wieder als neue Transaktionen erkannt und erscheinen doppelt, dreifach, vierfach, …, in der Banking-Software.

Schnell fand ich im Internet weitere Kunden, die von diesem und ähnlichen Problemen berichteten. Noch weitaus schlimmer als die nicht funktionierende HBCI/FinTS-Implementierung ist jedoch, dass seit der Umstellung keine SEPA-Lastschriften mehr funktionieren (kann ich selbst bezeugen). Wenn also beispielsweise das Finanzamt die Umsatzsteuer vom Konto abbuchen möchte, dann schlägt das fehl, und man hat Ärger am Hals. Auch eingehende Zahlungen funktionieren nicht mehr. Viele Kunden dürfen sich darum mit fehlgeschlagenen Transkationen und eventuell anfallenden Gebühren herumärgern. Besonders hart trifft es Online-Händler, die mit PayPal arbeiten, denn der Netbank-Server gibt dem PayPal-Server die Auskunft, dass das Konto geschlossen wurde, woraufhin es aus dem PayPal-Konto entfernt wird. Dabei gehöre ich wohl noch zu den Glücklicheren, denn ich habe zumindest meine neuen Zugangsdaten per Post erhalten. Viele Kunden berichten, dass sie ihre Zugangsdaten nie erhalten haben. Die Service-Hotline ist wohl völlig überlastet — wenn man es überhaupt in die Warteschleife schafft, dann darf man dort über eine Stunde verharren.

Was die Netbank verschwiegen hatte: Scheinbar wurde nicht nur die Online-Banking-Oberfläche ausgetauscht, sondern ein Großteil der IT-Infrastruktur der Bank. Zu allem Überfluss wurde auch noch die BIC geändert. Letzteres wurde aber kaum irgendwo erwähnt, und die neue BIC scheint sich noch nicht „herumgesprochen“ zu haben, denn in vielen Fällen wird sie zurückgewiesen.

Neben den massiven technischen Problemen finde ich eines aber noch viel schlimmer: Bis jetzt (11. Oktober, 09:30 Uhr) gibt es weder auf der Netbank-Website noch auf Facebook eine offizielle Stellungnahme — und das, obwohl die Bank seit mehreren Tagen von den Problemen weiß. Schlechter geht es wohl kaum! Eine einfache Meldung würde doch schon ausreichen, um den Kunden die Gewissheit zu geben, dass an der Lösung der Probleme gearbeitet wird. Das würde auch den Druck auf die Hotline reduzieren. Lustigerweise klettert der „Gefällt mir“-Zähler der Netbank auf Facebook stetig weiter — alles klar!

Zusammenfassung des Netbank-Desasters:

  • Online-Banking-Oberfläche umgestellt, aber vielen Kunden ihre neuen Zugangsdaten nicht mitgeteilt
  • HBCI/FinTS funktioniert nicht mehr richtig, was es unmöglich macht, das Konto aus einer Software heraus zu verwenden
  • BIC geändert, ohne ordentlich darauf hinzuweisen und sie auf korrekte Weise publik zu machen, wodurch sie von anderen Systemen nicht akzeptiert wird
  • SEPA-Lastschriften werden zurückgebucht, wodurch (Mahn-)Gebühren und Zinsforderungen entstehen
  • Eingehende Zahlungen funktionieren nicht mehr
  • Service-Hotline völlig überlastet
  • Seit Tagen keine einzige Stellungnahme der Bank

Die Umstellung bei der Netbank wurde jedenfalls massiv vermasselt. Es muss ein absoluter Albtraum für diejenigen sein, die das zu verantworten haben, und auch für diejenigen, die es ausbaden dürfen (Kunden und Kundendienst). Der Schaden für die Bank dürfte groß sein, denn nun werden viele Kunden abwandern. Ich bin einer davon.

Fazit: Finger weg von der Netbank! Wer so laienhaft arbeitet und sich so wenig um seine Kunden schert, der hat absolut kein Vertrauen verdient.

Nachtrag (13. Oktober 2017): Mittlerweile gibt es zumindest eine (wenn auch gut versteckte) Stellungnahme der Netbank. Dort werden die Probleme aber heruntergespielt, und vom nicht mehr brauchbaren HBCI/FinTS ist keine Rede. Die Netbank will jedem Kunden pauschal 5 € pro fehlgeschlagener Lastschrift gutschreiben. Das reicht aber nicht, um gewöhnliche Strafgebühren abzudecken. Der Kundendienst ist weiterhin nicht erreichbar. Mittlerweile habe ich ein Konto bei der Fidor Bank eröffnet. Leider musste ich feststellen, dass dort gar kein HBCI/FinTS angeboten wird, sondern lediglich eine API, die aber von kaum einer Software unterstützt wird. Mein Fehler, dass ich davon ausging, dass eine Bank, die ein Geschäftskonto anbietet, auch HBCI/FinTS anbietet.

Echtzeitanalyse von Apache-Logs ohne Umweg über das Dateisystem

Ich wollte mir schon seit langer Zeit ein Tool schreiben, mit dem ich meine Apache-Logs mehr oder weniger in Echtzeit analysieren kann (z. B. um Angriffe zu erkennen). Mein erster Ansatz wäre zunächst gewesen, alle paar Minuten ein Skript laufen zu lassen, das alles, was seit dem letzten Lauf in die Log-Dateien geschrieben wurde, verarbeitet. Aber so richtig schön wäre das nicht gewesen, ginge das doch unnötigerweise über das Dateisystem. Das Rotieren der Log-Dateien hätte ebenfalls speziell behandelt werden müssen.

Dann sah ich, dass mit der CustomLog-Direktive von Apache nicht nur normale Dateien als Log-Ziel angegeben werden können, sondern es auch möglich ist, die Log-Ausgaben über eine Pipe in einen anderen Prozess zu leiten („Piped Logs“). Dazu gibt man den Pfad zur ausführbaren Datei eines Programms an, das von Apache gestartet wird und dann die Log-Ausgaben über seine Standardeingabe erhält, zum Beispiel so:

CustomLog "||/pfad/zum/programm" "<%h|%D>"

Der zweite Teil der Direktive definiert das Log-Format. Im Beispiel werden nur die IP-Adresse des Aufrufers und die zur Verarbeitung benötigte Zeit geloggt. Das ist noch ein Vorteil gegenüber der Analyse von Log-Dateien: Man kann genau auswählen, welche Daten man zur Echtzeitverarbeitung benötigt. Warum ich die Zeichen < und > am Anfang und am Ende benutze, erläutere ich weiter unten.

Nun könnte man die Log-Ausgaben direkt in diesem einen Programm verarbeiten. Jedoch wird für jeden Apache-Elternprozess eine separate Instanz dieses Programms gestartet, also laufen normalerweise viele davon parallel. Das würde es schwierig machen, die Daten zusammenzuführen.

Um eine zentrale Verarbeitung zu ermöglichen, erstelle ich ein FIFO (mkfifo) und starte ein separates Auswertungsprogramm, das stets im Hintergrund läuft. Das Programm, das von Apache gestartet wird, wird nur zum Sammeln der Daten benutzt und heißt daher von nun an „Sammelprogramm“. Alle Instanzen des Sammelprogramms schreiben ins FIFO, und das Auswertungsprogramm liest daraus und analysiert die Daten.

Ein paar Hinweise, falls das jemand nachbauen möchte:

  • Da viele Instanzen des Sammelprogramms parallel laufen werden, sollte man es möglichst speichersparend implementieren. Ich habe dafür C++ genommen statt wie üblich Python.
  • Wenn das Auswertungsprogramm nicht läuft (z. B. weil es abgestürzt ist), werden die Sammelprogramme irgendwann hängen bleiben. Das ist nicht gut, weil dann auch der jeweilige Apache-Prozess beim Loggen hängen bleibt. Zum Glück kann man die Situation erkennen, indem man das FIFO nicht-blockierend öffnet (in C/C++ mit dem Flag O_NONBLOCK). Das Öffnen schlägt dann einfach fehl statt zu blockieren.
  • Das Auswertungsprogramm sollte das FIFO zuerst zum Lesen öffnen und danach zusätzlich auch zum Schreiben. Somit verhindert man, dass es irgendwann keinen Prozess mehr gibt, der das FIFO zum Schreiben geöffnet hat (dann passieren seltsame Dinge).
  • Wenn mehrere Prozesse parallel in ein FIFO schreiben (so wie es hier der Fall ist), ist es nur unter gewissen Umständen garantiert, dass die Daten jeweils am Stück geschrieben werden. Theoretisch kann es passieren, dass das Auswertungsprogramm zuerst einen Teil der von Prozess A geschriebenen Daten liest und dann einen Teil der von Prozess B geschriebenen Daten („interleaved“). Um solche Fälle zu erkennen, verwende ich die Zeichen < und > am Anfang und am Ende jeder ins FIFO geschriebenen Zeile. Somit kann man erkennen, ob man eine unvollständige Zeile gelesen hat. Solange man nur Daten am Stück schreibt, die höchstens PIPE_BUF Bytes groß sind (Linux: 4096), sollte dies jedoch nie passieren.

Ich bin bisher sehr zufrieden mit dieser Vorgehensweise und kann sie nur weiterempfehlen.

Lösung für Facebook-Fehlermeldung „This Page isn’t eligible to have a username.“

Wer hin und wieder Facebook-Seiten erstellt, kennt vielleicht das Problem, dass man manchmal einfach keinen Benutzernamen für die Seite vergeben kann. Das Problem tritt wohl willkürlich auf. Ich selbst hatte zwei fast identische Seiten kurz hintereinander erstellt. Bei der einen klappte die Vergabe des Benutzernamens problemlos, bei der anderen wurde ich stets mit der Fehlermeldung „This Page isn’t eligible to have a username.“ abgespeist. Wenn man im Netz danach sucht, findet man viele verzweifelte Leute und auch Lösungsansätze, die aber nicht immer vollständig sind. Mit der folgenden Methode hat es bei mir auf Anhieb geklappt:

  1. Bitte einen Freund um Hilfe, oder lege dir kurzerhand einen neuen Account auf Facebook an.
  2. Wichtig ist, dass der Hilfsaccount (Account des Freundes oder neuer Account) eine Telefonnummer angegeben hat, die per SMS bestätigt ist! Ich konnte ohne Probleme dieselbe Telefonnummer verwenden, die ich auch für meinen echten Account benutze. Man bekommt dann lediglich per E-Mail eine Warnung, dass ein anderer Account dieselbe Nummer verwendet hat, und wenn man die Zwei-Faktor-Authentifizierung mittels SMS aktiviert hat, wird sie sicherheitshalber deaktiviert, lässt sich danach aber wieder aktivieren.
  3. Trage in den Einstellungen der Seite, für die du den Benutzernamen vergeben möchtest, unter „Rollen für die Seiten“ den Hilfsaccount als zusätzlichen Administrator der Seite ein. Der Hilfsaccount erhält daraufhin eine Einladung, die er akzeptieren muss.
  4. Der Hilfsaccount sollte nun in der Lage sein, der Seite einen Benutzernamen zu geben. Bei meinem ersten Versuch bekam ich nun die leicht anderslautende Fehlermeldung „You’re not eligible to create a username.“, da ich den Account noch nicht mittels SMS bestätigt hatte. Nachdem ich das nachgeholt hatte, lief alles reibungslos.
  5. Zum Abschluss sollte der Hilfsaccount seine Administratorrolle wieder aufgeben.

Ich hoffe, dass dies dem einen oder anderen hilft!

Mit PhantomJS Platzhalter für datenschutzkonforme „Gefällt mir“- und „+1“-Buttons erstellen

Wer Gefällt mir– oder +1-Buttons direkt in seine Website einbindet, verstößt dabei wohl gegen geltendes Datenschutzrecht. Denn selbst wenn man in seinen Datenschutzrichtlinien über die Buttons informiert, so werden sie ja automatisch sofort geladen, bevor der Besucher den Text überhaupt lesen konnte. Und da die Buttons direkt von Facebook & co. geladen werden, können diese damit wunderbar ein digitales „Bewegungsprofil“ ihrer Nutzer und Nichtnutzer erstellen.

Eine beliebte Alternative sind Lösungen wie die von Heise ins Leben gerufene Shariff-Bibliothek. Hier wird die Verbindung zum sozialen Netzwerk erst hergestellt, nachdem der Benutzer einmal geklickt hat. Leider bietet Shariff von sich aus keine Unterstützung für Gefällt mir– und +1-Buttons, sondern es erlaubt lediglich das Teilen. Die ebenfalls von Heise entwickelte Zwei-Klick-Lösung SocialSharePrivacy ist mittlerweile auch schon arg angestaubt und hat den Nachteil, dass die aktuelle Anzahl von „Likes“ nicht angezeigt werden kann.

Ich wollte daher eine eigene Alternative entwickeln. Mein Ansatz ist derselbe wie bei SocialSharePrivacy: Der Benutzer sieht zunächst eine „ausgegraute“ Version des Buttons, bei der es sich nur um ein Bild handelt, das vom eigenen Server ausgeliefert wird. Ein kleiner Hinweis informiert darüber, dass der Button mit dem ersten Klick aktiviert und mit dem zweiten Klick bedient wird. Bei erfolgtem Klick wird das Bild durch den tatsächlichen Button ersetzt, beispielsweise mit Hilfe eines iframe-Elements.

Die Platzhaltergrafiken für die Buttons sollten bereits die aktuelle Anzahl von „Likes“ enthalten, daher scheidet ein manuelles Anfertigen dieser Grafiken aus. Und genau hier hat sich PhantomJS wieder einmal als ein hervorragendes Tool bewiesen. Mit nur ein paar Zeilen JavaScript kann der echte Button von Facebook/Google in einem „virtuellen Browser“ geladen und als Screenshot abgespeichert werden. Ein bisschen Nachbearbeitung mit ImageMagick sorgt dann für einen ausgegrauten/unscharfen Look. Die Aktualisierung der Platzhaltergrafiken erfolgt mittels Cronjob automatisch einmal pro Stunde, bei Bedarf auch öfter oder seltener.

Upgrade auf Windows 10 und nicht mehr funktionierendes Wake on LAN

Obwohl ich mit dem Upgrade von Windows 8.1 auf Windows 10 eigentlich ein wenig warten wollte, bis die gröbsten Fehler behoben wurden, habe ich dem verlockenden Angebot doch nur ein paar Tage standgehalten.

Das Upgrade selbst lief zu meiner Überraschung fast problemlos. Ich musste lediglich einmal den Rechner komplett ausschalten, damit ich wieder Internetzugang bekam — ein Neustart reichte nicht aus …

Heute wollte ich dann zum ersten Mal nach dem Upgrade aus der Ferne meinen Rechner starten, um auf eine lokale Datei zuzugreifen. Zu diesem Zweck habe ich Wake on LAN eingerichtet, was äußerst praktisch ist. Es erlaubt mir, den Rechner über das Web-Interface meiner FRITZ!Box einzuschalten, um mich dann mit Remote Desktop darauf anzumelden.

Genau das funktionierte nun nach dem Upgrade plötzlich nicht mehr. Wenn man im Internet nach dem Problem sucht, findet man normalerweise drei Hinweise:

  1. Man soll das Windows-Feature Fast Startup (Schnellstart) deaktivieren, denn ansonsten wird der Rechner beim Herunterfahren nicht komplett ausgeschaltet, sondern nur in einen sehr sparsamen Energiesparmodus versetzt, aus dem er sich eventuell mittels Wake on LAN nicht aufwecken lässt.
  2. Man soll im Gerätemanager bei den Geräteeigenschaften des Netzwerkadapters sicherstellen, dass dieser den Rechner aufwecken kann.
  3. Man soll im BIOS überprüfen, ob Wake on LAN aktiviert ist.

Alles war bei mir der Fall — die Einstellungen wurden vom Upgrade-Prozess wohl übernommen, und die BIOS-Einstellungen werden (hoffentlich) davon nicht beeinflusst.

Nach einigem verzweifelten Herumprobieren sah ich dann im Gerätemanager, dass der Treiber für den Intel-Netzwerkadapter ein Standardtreiber von Microsoft war. Zuvor hatte ich den Intel-Treiber installiert, aber dieser wurde wohl beim Upgrade auf Windows 10 ersetzt.

Nachdem ich nun wieder den Intel-Treiber für Windows 10 installiert und den Rechner einmal neugestartet habe, funktioniert Wake on LAN wieder einwandfrei! Dass es sich um ein Treiberproblem handelte, erscheint mir seltsam, denn wenn der Computer ausgeschaltet ist, spielen Treiber keine Rolle. Aber möglicherweise versetzt der Intel-Treiber den Netzwerkadapter in einen speziellen Modus, in dem er auf Wake on LAN-Pakete wartet, bevor der Rechner heruntergefahren wird.

Wenn mod_deflate scheinbar nur mit HTTPS funktioniert

Gerade bin ich einem sehr knackigen Rätsel auf die Spur gekommen. Wenn ich eine meiner Seiten im Browser lade und mir die HTTP-Requests anzeigen lasse, dann stelle ich fest, dass HTML-Inhalte scheinbar ohne Kompression ausgeliefert werden, obwohl mod_deflate im Apache-Webserver korrekt aktiviert ist. Noch seltsamer ist aber, dass das Problem nicht auftritt, wenn ich die Seite mit HTTPS (SSL) aufrufe. Aus der Sicht externer Tools wiederum, die Seiten auf Kompression testen, wird alles ordnungsgemäß komprimiert — sowohl mit HTTP als auch mit HTTPS. Nur meine Browser sind anderer Meinung.

Des Rätsels Lösung: Kaspersky Endpoint Security for Windows ist schuld! Die Komponente Web Anti-Virus agiert als eine Art Proxy zwischen dem Browser und dem Webserver und dekomprimiert die HTML-Inhalte, um sie nach schädlichem Zeugs zu durchsuchen. Das erklärt auch, warum Inhalte über HTTPS komprimiert beim Browser ankommen: Die Kaspersky-Software hat hier wegen der Verschlüsselung keine Möglichkeit, die Daten abzufangen!

Wenn also jemandem etwas Ähnliches passiert, dann erst einmal prüfen, ob nicht irgendeine Sicherheitssoftware dazwischenfunkt.

Lösung: Pipe-Symbol über VNC tippen

Heute wurde ich mit dem Problem konfrontiert, das Pipe-Symbol („|“) über eine VNC-Verbindung zu meinem Server zu tippen. Wenn ich Alt Gr + < drücke, passiert einfach gar nichts. Andere Zeichen funktionieren hingegen wunderbar. Eine ganz einfache Notlösung (die ich seltsamerweise nirgendwo gefunden habe) ist Folgende:

Bei gedrückter Alt-Taste einfach die Ziffernfolge 124 auf dem Ziffernblock (NumPad) tippen, denn 124 ist der ASCII-Wert des Pipe-Zeichens.

… und schon erscheint das ersehnte Symbol. Bei mir jedenfalls. 😉

Den Backslash („\“) erhält man übrigens mit Alt + 92 und die Tilde („~“) mit Alt + 126.

Wenn wget versagt: PhantomJS

Aus einem gewissen Grund brauche ich regelmäßig die aktuellen IP-Ranges von Amazon EC2 (ein Produkt für Cloud Computing). Zum Glück gibt es im entsprechenden Amazon-Forum einen Thread, in dem immer die aktuellen IP-Ranges aufgelistet sind. Bis vor einiger Zeit konnte ich diesen Thread problemlos wie folgt herunterladen, um ihn dann mit einem regulären Ausdruck nach IP-Ranges zu durchsuchen:

wget -O amazon_ec2.txt https://forums.aws.amazon.com/ann.jspa?annID=1701

Nun geht das nicht mehr — man erhält nur eine Fehlermeldung, dass der Browser JavaScript unterstützen muss. Das Forum arbeitet jetzt scheinbar Client-seitig mit JavaScript, und wget kann kein JavaScript ausführen.

Doch zum Glück gibt es PhantomJS! Dabei handelt es sich um ein Tool, das sozusagen einen Browser simuliert und mit JavaScript gesteuert werden kann. Mit folgendem Skript kann ich die Seite laden und ihren HTML-Quellcode ausgeben, womit das Problem gelöst ist:

var page = require("webpage").create();
page.open("https://forums.aws.amazon.com/ann.jspa?annID=1701",
 function(status) {
  var f = function() {
   var html = page.evaluate(function() { return document.documentElement.innerHTML; });
   console.log(html);
   phantom.exit();
  };
  setTimeout(f, 10000);
 }
);

Die Verzögerung von 10 Sekunden sorgt dafür, dass alle Umleitungen (mit hoher Wahrscheinlichkeit) abgeschlossen sind, bevor der HTML-Quellcode ausgegeben wird. Es geht wahrscheinlich auch eleganter, aber es erfüllt seinen Zweck.

Bislang habe ich für solche Zwecke übrigens Awesomium benutzt, was auch ganz nett ist, aber hier gibt es schon seit Ewigkeiten keine 64-Bit-Version mehr für Linux (eigentlich ein Unding). Vielleicht werde ich meine schon existierenden Anwendungen, die auf Awesomium basieren, auf PhantomJS portieren.

Nachtrag (1. Oktober 2016): Dieser umständliche Weg ist für den konkreten Anwendungsfall nicht mehr nötig, da Amazon die IP-Ranges nun als JSON-Datei bereitstellt.