Wenn Windows weiß waschen nicht reicht

Daß die IT-Branche ein schnelllebiges Geschäft ist, weiß eigentlich jeder. Ein Bereich, für den das ganz besonders gilt, sind allerdings Schädlingsprogramme aller Art (Viren, Trojaner, Rootkits, Scareware, etc.). Auf die Veröffentlichung von Sicherheitslücken hin vergehen inzwischen oft nur mehr Stunden anstatt Tage, bis Exploits dafür auftauchen oder auch gleich in Frameworks wie Metasploit eingebaut werden.

Das Resultat sind, trotz verbesserter Abwehrmaßnahmen, weiterhin haufenweise infizierte PCs, auch oder gerade hier an der Uni. Daher möchte ich zu meinen früheren Veröffentlichungen rund um das Thema Virenbefall einmal ein aktuelles Update geben und etwas ausführlicher auf die Abhilfe bei einem derzeit sehr häufigen Problem bei virenbefallenen PCs mit Windows XP eingehen.

Gefahrenherde

Wie auch schon beim letzten Mal erwähnt,  ist die beste Methode, um einen mit Schädlingsprogrammen infizierten Rechner zu säubern, immernoch eine Datensicherung der selbst erstellten Dateien und eine anschließende Neuinstallation (oder natürlich das Zurückspielen eines hoffentlich vorhandenen Images des Systems in einem sicheren Zustand). Leider zeigt die Erfahrung, daß von denjenigen Benutzern, die immer wieder von Schädlingsprogrammen betroffen sind, die wenigsten daran gedacht haben, rechtzeitig Images und Backups anzufertigen. Wer sich beim Lesen dieser Zeilen selbst ertappt fühlt, den Aufwand eines „richtigen“ Images aber weiterhin scheut, dem kann ich auf alle Fälle den XP-eigenen Assistenten für das „Übertragen von Dateien und Einstellungen“ ans Herz legen. Man findet ihn im Startmenü unter Zubehör, Systemprogramme. Hiermit lässt sich zumindest einmal schnell, einfach und kostenlos das „Look und Feel“ der eigenen Arbeitsumgebung sichern, das man sich nach einer Neuinstallation ansonsten mühsam und langwierig zusammenklicken müsste (aus meiner Sicht einer der nervigsten Punkte bei einer Neuinstallation, der die Freude über ein sauberes und schnelles System viel zu schnell vergehen lässt).

Eine Neuinstallation ist zwar die sinnvollste Methode, nicht immer ist sie aber auch gangbar. Nach wie vor wird es Fälle geben, in denen man eine Reinigung des infizierten Systems durchführen muß oder möchte. Wer mit derartigen Problemen häufiger zu tun hat, wie etwa die Beratung des RRZK, wird sich im Laufe der Zeit dafür sicherlich eigene Tools, z. B. auf Basis von BartPE, zurechtgelegt haben. Wer hingegen zum ersten Mal vor einem solchen Problem stand, hatte es in der Vergangenheit schwer. Zum Zeitpunkt ihrer Veröffentlichung war die Sicherheits-CD der Beratung daher ein ganz besonders wertvolles Werkzeug, da sie es ermöglichte, mit einem aktuellen Virenscanner von CD zu starten und so den Rechner auf vertrauenswürdige Weise nach Schädlingsprogrammen zu durchsuchen.

Tools für alle

Diese Situation hat sich inzwischen gewandelt: Mittlerweile bieten eine ähnliche Funktion auch die kostenlos herunterladbaren Rescue-CDs der Antivirushersteller Avira, Bitdefender, F-Secure oder Kaspersky an. Und eine DVD, mit der ein betroffener Windows-PCs „offline“ (also korrekterweise vor dem erneuten Kontakt mit dem Netzwerk) aktualisiert werden kann, kann inzwischen auch jeder mit etwas Geduld und Bandbreite nach wenigen Mausklicks selbst zusammenstellen.

Während man – was die Werkzeuge zur Virensuche angeht – inzwischen also auf ein reichhaltiges Arsenal an kostenfrei verfügbaren Lösungen durückgreifen kann, ohne selbst sehr viel Zeit investieren zu müssen, bleibt neben dem Aspekt der Unvollständigkeit sämtlicher Virensuchprogramme noch das ebenfalls sehr große Problem der „Hinterlassenschaften“ von Schädlingsprogrammen. Die Virenscanner, von einer Rescue-CD gestartet zumal, beschränken sich im Regelfall darauf, Dateien zu entfernen, die einen als schädlich bekannten Code beinhalten (eine lobenswerte Ausnahme ist hier das kostenlose Anti-Spyware-Programm Spybot Search and Destroy, welches auch unerwünschte Registry-Einstellungen erkennen und korrigieren kann). Wie schon früher erwähnt, können verstellte Einstellungen in Windows eine erneute Infektion begünstigen, so daß es oft nur eine Frage der Zeit ist, bis ein lediglich von infektiösen Dateien befreites System erneut befallen ist. Und im ungünstigsten Fall, um den es hier im Folgenden gehen soll, sind die Einstellungen in Windows so geändert worden, daß man sich nach der Virensäuberung per Rescue-CD noch nicht einmal mehr am Windows-System anmelden kann.

Auf die Anmeldung folgt die sofortige Abmeldung

Die Symptome dieses Problems sind stets die gleichen: nach der Virenreinigung wird Windows XP normal hochgefahren, man meldet sich an, der Desktophintergrund erscheint, doch wenige Sekunden später heißt es nur noch „Einstellungen werden gespeichert“  – man wird sofort wieder abgemeldet und sieht wenige Sekunden später erneut den Anmeldebildschirm. Der Hintergrund dieses Vorgangs ist ebenso perfide wie clever (das muß man den Malware-Autoren einfach neidlos zugestehen): Ein Teil des Schädlingsprogramms wird in Windows als Debugger des für den Anmeldevorgangs zuständigen Programms userinit.exe deklariert. Das führt dann dazu, daß das Schädlingsprogramm bei jedem Anmeldevorgang mit gestartet wird, in den üblichen Listen von Autostartprogrammen, wie sie etwa msconfig oder RunAlyzer anzeigen, aber nicht auftaucht. Außerdem führt diese Vorgehensweise eben dazu, daß nach dem Löschen der Schädlingsdatei diese beim nächsten Anmeldeversuch nicht mehr gefunden wird und die Anmeldung fehlschlägt, weil der von Windows als obligatorisch betrachetete „Debugger“ fehlt. Wem das nach einer Virenentfernung auf eigene Faust einmal passiert ist, wird beim nächsten Mal vermutlich auch eher bereit sein, den Anbietern von Scareware-Programmen Geld für eine „Lösung“ dieses Problems hinterherzuwerfen, wenn ansonsten nur die Möglichkeit bleibt, nochmals vor einem „verschlossenen“ Windows zu stehen.

Problem erkannt, Problem gebannt?

Selbstverständlich sollte man nicht die Machenschaften von Kriminellen unterstützen und irgendwelche dubiosen Programme erwerben, um sich nach einem Virenbefall wieder an seinem Windows-System anmelden zu können (im harmlosesten Fall sind diese überteuerten Programme einfach nur nutzlos, mit etwas Pech lädt man sich freiwillig ein weiteres Spionageprogramm auf den PC). Die Lösung ist vielmehr eigentlich ganz einfach: Man muß „nur“ in der Registry des betroffenen Systems den Schlüssel

HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionImage File Execution Optionsuserinit.exe

inklusive aller seiner Unterschlüssel löschen (und darauf achten, daß man auch wirklich unter …Windows NT… sucht, nicht bei einem anderen, ähnlich lautenden Schlüssel in der Nähe). Doch wie stellt man das an, wenn man sich noch nicht einmal mehr im abgesicherten Modus anmelden kann? Dazu gibt es mehrere denkbare Möglichkeiten. Ich schlage im folgenden gleich mehrere davon vor, die alle den gleichen Effekt haben, aber unterschiedliche Voraussetzungen mit sich bringen und in ihrer Komplexität steigend angeordnet sind. Da dies eine Beschreibung für IT-Profis ist, beschränke ich mich zudem darauf, die groben Schritte zu erklären und nicht jedes Detail, und weise auch nur an dieser Stelle noch einmal darauf hin, daß man natürlich eine Sicherungskopie anlegen sollte, bevor man Änderungen an einer so wichtigen Systemdatei vornimmt.

  1. Änderung unter Windows PE durchführen

    Voraussetzungen: Man verfügt über eine beliebige Installations-DVD bzw. -CD von Windows Vista oder Windows 7, es reicht sogar die eines Release Candidate. Alternativ geht natürlich auch eine funktionierende BartPE-CD.
    Vorgehensweise:
    Von der Windows-DVD bzw. -CD starten.

    Bei der Installations-DVD von Windows 7 kann direkt nach Erscheinen des Willkommensbildschirms mit der Tastenkombination Shift+F10 eine Eingabeaufforderung gestartet werden, bei dem Installer von Vista muß man erst noch so tun, als wolle man tatsächlich Vista installieren und ein paar Schritte der Installation durchklicken, bevor das Drücken von Shift+F10 die gewünschte Wirkung zeigt (alternativ kann man sich dort aber auch durch die Computerreparaturoptionen klicken, dort kann man schlußendlich auch eine Eingabeaufforderung aufrufen).

    In der Eingabeaufforderung regedit eingeben.

    Im Registrierungseditor den Zweig HKEY_LOCAL_MACHINE auswählen und über den Punkt Datei, Struktur laden die Datei C:WindowsSystem32ConfigSoftware laden (wenn C: die Festplatte mit dem betroffenen Windows ist, ansonsten natürlich die Pfadangabe anpassen). Bei der Frage nach dem Namen eine sinnvolle Bezeichnung wie etwa Software_auf_C eingeben.

    Nun in leichter Abwandlung des zuvor genannten Pfades sich durchklicken zum Schlüssel HKEY_LOCAL_MACHINESoftware_auf_CMicrosoftWindows NTCurrentVersionImage File Execution Options und dabei wie erwähnt auf das …Windows NT…  achten. Hier den Schlüssel userinit.exe unter Bestätigung der Rückfrage löschen.

    Ganz nach oben scrollen und den Schlüssel Software_auf_C auswählen. Über Datei, Struktur entfernen den Registryzweig wieder entfernen und die Rückfrage dazu bestätigen.

    Regedit beenden, die Eingabeaufforderung schließen und den Computer neu starten.

  2. Registry remote über das Netzwerk ändern

    Voraussetzungen: Der Rechner war vor dem Vorfall schon in ein lokales Netzwerk eingebunden (ist also entsprechend konfiguriert), man hat Zugang zu einem anderen Windows-PC im gleichen Subnetz, die Windows-Firewall auf dem betroffenen PC enthält eine entsprechende Ausnahme und die notwendigen Dienste laufen auf dem PC (Remote-Registrierung, RPC).

    Vorgehensweise:
    Den betroffenen PC an das Netzwerk anschließen und einschalten.

    Auf dem zweiten PC regedit starten.

    Über den Menüpunkt Datei, Mit Netzwerkregistrierung verbinden die Registry des fremden PCs öffnen und den o. g. Schlüssel HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionImage File Execution Optionsuserinit.exe samt seiner Unterschlüssel löschen.

    Zum Schluß noch Von Netzwerkregistrierung trennen und Regedit beenden.

  3. Mit Hilfe einer Linux-Live-CD die benötigte Datei kopieren

    Voraussetzungen: Eine aktuelle Live-CD, die vernünftig mit dem NTFS-Dateisystem umgehen kann, z. B. Ubuntu 9.10, ein USB-Stick sowie Zugang zu einem funktionierenden Windows-System.

    Vorgehensweise:
    Von der Live-CD starten.

    Das Dateisystem mit der problembehafteten Windows-Installation lokalisieren. Von dort die Datei Windows/System32/Config/Software auf den USB-Stick kopieren. Den Stick „auswerfen“, vom PC abziehen und das Linux weiterlaufen lassen.

    Mit dem USB-Stick zu einem normalen Windows-PC gehen, dort regedit starten.

    Auf dem anderen Windows-PC im Prinzip so vorgehen wie bei der Alternative (1) beschrieben, nur beim Struktur laden natürlich die Datei „Software“ vom USB-Stick öffnen. Dann wie dort beschrieben den Schlüssel userinit.exe löschen und die Struktur wieder entfernen. Regedit beenden und den USB-Stick „sicher entfernen“.

    Mit dem Stick zurück zum betroffenen PC gehen. Vom USB-Stick die bearbeitete Datei „Software“ zurück in das Verzeichnis Windows/System32/Config kopieren (also die gleichnamige Datei dort überschreiben). Den Stick und das Windows-Dateisystem „auswerfen“ und den Computer neu starten.

Hat man eine dieser drei Alternativen erfolgreich durchgeführt, sollte die Anmeldung unter Windows auf dem PC nun wieder normal funktionieren, d. h. man sollte nun nicht mehr wenige Sekunden nach der Anmeldung wieder automatisch abgemeldet werden.

Knoten im Taschentuch

Auch wenn es an anderen Stellen schon dutzende Male erwähnt wurde, auch hier nochmal einige Punkte, an die man unbedingt denken sollte, wenn man es mit einem solcherart „gereinigten“ Rechner zu tun hat:

  • Neben dem Browser (also Firefox, Opera, Safari, Chrome oder was immer man anstatt des Internet Explorers verwendet) müssen auch alle browsernahen Programme auf den aktuellen Stand gebracht werden. Zu den zu aktualisierenden Komponenten zählen zumindest mal der Adobe Reader, Flash und Java, wobei bei Java auch unbedingt alle alten Versionen deinstalliert werden müssen.
  • Nach weiteren veralteten Versionen von Anwendungsprogrammen Ausschau halten, z. B. mit Hilfe des Online-Scan-Tools von Secunia
  • Mit einer Software wie dem oben erwähnten SpybotSD nach unerwünschter Software und daraus resultierenden Systemänderungen suchen. Auch der MBSA kann hilfreiche Dienste leisten (vorausgesetzt, man weiß dessen Hinweise zu interpretieren).
  • Endlich mal ein Backup anlegen.

Und eben weil die Wiederholung so wichtig ist, schließe ich einfach mit den Worten: Neuinstallation ist immernoch die sicherste Methode.

Webseiten und Webanwendungen als Icon auf dem Startbildschirm des iPhone / iPod touch

Wie man Webseiten mit dem iPhone / iPod touch auf dem Home-Bildschirm ablegt.

eingebundene Webanwendungen

Eine nützliche App ist sicherlich Wikipedia. Doch deutsche Benutzer beklagen natürlich sofort: „Ist ja alles auf Englisch!“ Eine deutsche Anwendung, bzw. eine lokalisierte Version gibt es nicht. Braucht man ja auch nicht. Wozu eine App installieren, wenn man die Webanwendung direkt in den Startbildschirm einbinden kann.

Man kann beliebige Webseiten und Webanwendungen als Icon auf den Startbildschirm legen. Dazu besucht man im Safari einfach die jeweilige Webseite. Nach Drücken auf das +-Symbol erscheinen drei Auswahlbuttons.  Mit „Zum Home-Bildschirm“ wird diese Webseite als Icon abgelegt.

Mit dieser Funktion kann man häufig genutzte Webseiten noch schneller öffnen und erhält Funktionen, die durch Apps nicht abgedeckt sind. Im Beispielbild sieht man die Webseiten des Kölner Studentenwerks, Wikipedia und Wiktionary als Symbol abgelegt auf dem Home-Bildschirm.

Im Knast und doch frei – iPod Touch unter Linux befüllen

Auch wenn MacOS X bekanntlich auf Unix basiert, ignoriert Apple die Linuxbenutzer leider beständig und veröffentlicht kein Programm á la iTunes, mit dem unsereins seinen iPod Touch oder sein iPhone unter Linux mit Musik befüllen kann. Zwar existieren  Lösungen wie „iFuse„, die das Gerät als USB-Laufwerk einbinden, aber das allein reicht nicht, da die iTunes-Datenbank des Gerätes von einem einfachen Kopiervorgang nichts mitbekommt und die neuen Musikdateien nicht anzeigt.

Ich suchte daraufhin nach einer Lösung, die insbesondere ohne das berühmte „Jailbreaking“ auskam und so den Nutzungsregelungen und Garantiebedingungen von Apple nicht widersprach. Gefunden habe ich zunächst einen Artikel auf „FERNmanns Blog„, der über das o.g. iFuse hinaus auf eine spezielle Version von libgpod verweist, die man nach der verlinkten Anleitung selbst kompilieren muss. Das klappte bei mir (Ubuntu 9.10 Karmic Koala) auch, allerdings musste ich zwei Anpassungen vorher (!) machen, die im Blogeintrag nicht bzw. erst im Kommentar erwähnt sind:

  • zusätzliches Installieren der Pakete libsqlite0-dev, libsqlite3-dev, gtk-doc-tools, intltool, libltdl-dev, libtool, libgcrypt11-dev, libgnutls-dev, libgpg-error-dev, libtasn1-3-dev
  • manuelles Kompilieren und Nachinstallieren der Software libimobiledevice von dieser Quelle

Bevor der geneigte Leser sich aber gleich ans Kompilieren macht: Inzwischen gibt es noch eine viel viel einfachere Lösung, ebenfalls dokumiert auf „FERNmanns Blog„. Die erste Lösung habe ich für den Fall noch erwähnt, dass der einfache Weg aus irgendeinem Grund scheitert. Zu letzterem Weg ist noch zu sagen, dass ich bei meinem Ubuntu alle Vorkommen von „libiphone“ in der Paketliste durch „libimobiledevice“ ersetzen und das Paket „python-iphone“ rausstreichen musste. Danach kann man mittels Rhythmbox einwandfrei auf die Musiksammlung des iPods zugreifen. Viel Spaß!

Kein Anschluss unter dieser Nummer

Ein Problem, das sowohl bei Windows 7 als auch bei Vista gelegentlich auftritt, verbindet in gekonnter Weise zwei bekannte Größen im ITK-Business miteinander: Microsoft und die Telekom. Einerseits ist nicht ganz klar warum Windows keine native Verwaltung von UMTS-Karten und Sticks mitbringt, andererseits ist fraglich, ob die Telekom Software für eigentlich recht simple Aufgaben derart aufblähen muss wie dies z.B. beim Web’n’Walk Manager der Fall ist.

Nun kommt es sowohl bei Windows 7 als auch bei Vista bisweilen vor, dass nach der Installation des Web’n’Walk Managers die Zuweisung von IP-Adressen über DHCP außer Kraft gesetzt wird. Die Folge: Statt einer zusätzlichen Netzanbindung über UMTS hat man plötzlich keine Netzanbindung mehr über LAN und WLAN. Gelegentlich tritt auch das Problem auf, dass sich der Web’n’Walk Manager nicht mehr starten lässt, ohne dass dabei jedoch ein brauchbare Fehlermeldung erzeugt würde und somit UMTS-Karten und Sticks nicht mehr genutzt werden können. Die schein im wesentlichen mit der Inkompatibilität zu aktuelleren Versionen des Flash-Players zu liegen.

Abhilfe schafft die Deinstallation des Web’n’Walk Managers. Danach funktioniert zumindest die Adresszuweisung über DHCP wieder. Für die Verwaltung von UMTS-Karten und Sticks ist MWconn zu empfehlen. Diese kleine und als Freeware erhältliche Applikation kann viele der gängigen UMTS-Karten und Sticks verwalten, lässt sich über vorkonfigurierte Profile in sekundenschnelle auf den gewünschte Provider einstellen und bietet – sofern benötigt – wesentlich umfangreichere Konfigurationsmöglichkeiten als der Web’n’Walk Manager.

Weitere Erfahrungen mit dem Web’n’Walk Manager unter Vista

Wenn Windows passiv bleiben will

Die allfällige Aktivierung von Produkten aus der Windows-Familie ist seit je her umstritten. Immer wieder treten Fragen nach Datenschutz etc. auf. Nachdem nun bereits kurze Zeit nach der Veröffentlichung von Windows 7 bekannt wurde, wie die Aktivierung ausgehebelt oder umgangen werden kann, möchte man als Nutzer mit ehrlich und legal erworbenem Lizenzschlüssel die Aktivierung doch wenigsten ohne weitere Probleme durchführen können.

Leider kommt es nach der Installation von Windows 7 häufig vor, dass der eingegebene Lizenzschlüssel in einer Form gespeichert wird, die die spätere automatische Aktivierung nicht zulässt. Nach dem erfolglosen Versuch der automatischen oder manuellen Aktivierung wird dann folgende Meldung angezeigt:

Fehlermeldung der Windows Aktivierung

Dieses Problem lässt sich sehr einfach beheben. Rufen Sie über Start -> Systemsteuerung -> System die Windows-Aktivierung auf und geben Sie unter „Product Key ändern“ den Lizenzschlüssel erneut ein. Anschließen lässt sich Windows 7 anstandslos aktivieren.

Weitere Hinweise zur Aktivierung von Windows 7

Emacs schön hässlich machen

Ich mag Emacs. Mit vi konnte ich hingegen noch nie etwas anfangen, aber lassen wir das, sonst ziehe ich den Unmut der Kollegen auf mich. Zurück zum Emacs. Ich mag Emacs im Textmode, da er so gerade bei SSH-Verbindungen trotz seines Umfangs schnell genug ist. Zeitweise habe ich sogar den deutlich abgespeckten Ableger zile („zile is lossy emacs“) verwendet, bei dem ich dann aber doch die eine oder andere Funktion vermisste. Auf einigen Systemen gibt es für den Textmode den speziellen Aufruf „emacs-nox“, allgemeingültig ist jedoch „emacs -nw“.

Nun wird auch der Emacs fortlaufend weiterentwickelt und erhält neue Features, zudem ist er vollgepackt mit diversen Modi und Zusatzmodulen, die ich persönlich nie benötige. Wer wie ich den Emacs einfach nur als Texteditor schätzt (und kein OS im OS braucht), der sucht in den Tiefen des Netzes vielleicht nach Konfigurationsoptionen, um den Emacs einfach, schnell und herrlich hässlich zu machen. Die wichtigsten dieser Optionen möchte ich kurz benennen, um die Suche für den einen oder anderen etwas abzukürzen.

  • Farben ausschalten: Natürlich nutze ich Emacs auch für die Erstellung und Bearbeitung von Python- oder Perlskripten sowie für HTML-Dateien. Trotzdem möchte ich auf keinen Fall Syntax-Highlighting oder ähnliche Auswüchse einer „echten“ IDE haben, da geht mir in der Regel jede Form von Übersicht eher verloren. Die Einstellung, um generell Farben auszuschalten, lautet:
    (setq-default global-font-lock-mode nil)
  • Backups ausschalten: Für mich ein Riesenärgernis sind die automatisch angelegten Backupfiles mit der Endung „~“. Regelmäßig schlagen hier unsere Intrusion Detection Systems an und zudem macht es Verzeichnisse unnötigerweise unübersichtlicher. Backups mache ich auf andere Art und Weise. Daher die Abschaltung dieser furchtbaren Backupfiles:
    (setq kept-old-versions 0)
    (setq kept-new-versions 0)
    (setq make-backup-files nil)
  • Klammerpaare nicht anzeigen: Eine relativ neue Funktion vom Emacs zeigt den jeweiligen öffnenden oder schließenden Partner einer Klammer an, sobald der Cursor auf der Klammer verweilt. Ergebnis: Der Cursor hüpft fröhlich herum und man weiß gerade bei vielen Klammern (ich sage nur Perlskripte) gar nicht mehr, wo man gerade ist. Daher weg damit:
    (show-paren-mode 0)
  • Fundamentaler Modus: Nach dem letzten Emacs-Update landete ich plötzlich bei jeder HTML-Datei im „HTML-Fill“-Modus, der fröhlich und ungefragt lauter Zeilenumbrüche da einfügte, wo ich gar keine haben wollte. Daher wollte ich einstellen, dass Emacs grundsätzlich alle Dateien im reinen Text- bzw. Fundamental-Mode öffnet. Diese Anforderung erwies sich als ganz harte Nuss, aber schlussendlich verdanke ich Ralf Döring den entscheidenden Tipp (an dieser Stelle nochmal ein Dank dafür):
    (setq major-mode ‚text-mode)

    (setq auto-mode-alist (cons ‚() nil))

Nun ist mein Emacs wieder genauso, wie ich ihn gern habe. Weitere Vorschläge für Optionen, die Emacs in dieser Richtung für uns „Puristen“ optimiert, nehme ich gerne auf.

SFTP mag das AFS nicht

Die Betreuerin eines unserer Webprojekte meldete uns, dass sie mittels ihres SFTP-Programms – Cyberduck unter MacOS – innerhalb unseres Dateisystems AFS keine Dateien in einen Unterordner verschieben kann. Eine Überprüfung unsererseits ergab, dass das Problem nicht auf Cyberduck oder MacOS beschränkt ist, auch mit WinSCP (im SFTP-Modus) unter Windows erhält man lediglich die nichtssagende Meldung „Failure“.

Intern verwendet das SFTP-Protokoll zum Verschieben von Dateien das Kommando „rename“. Offenbar geschieht beim Verschieben in ein Unterverzeichnis Folgendes: SFTP legt im Unterordner einen Hardlink auf die Datei an und entfernt anschließend den alten Verweis im übergeordneten Verzeichnis (link-unlink). Dies ist im Hinblick auf plötzliche Stromausfälle etc. die sichere Variante. Da das AFS allerdings seine ACLs pro Verzeichnis speichert, erlaubt es keine Hardlinks – SFTP scheitert entsprechend. Seit der Version 5.1 von OpenSSH (der Software, die auch für den SFTP-Server zuständig ist) führt SFTP hier einen Fallback auf den internen syscall „rename“ durch, der vermutlich (!) ein unlink-link durchführt, siehe:

https://bugzilla.mindrot.org/show_bug.cgi?id=1447

Leider steht diese Version auf unseren Red-Hat-5-Servern noch nicht zur Verfügung, einen Case bei Red Hat haben wir zu diesem Thema aber eröffnet. Einige Clients umgehen das Problem selbständig, z.B.:

  • WinSCP führt einen Fallback auf SCP durch
  • SSH SecureShell kopiert die Datei stattdessen – das kann bei größeren Dateien Speicherplatzprobleme verursachen und ist entsprechend langsamer

Generelle Workarounds lauten wie folgt:

  • Arbeiten auf der Unix-Kommandozeile nach SSH-Login mit dem Kommando „mv“
  • Lokale Installation eines AFS-Clients, siehe http://www.uni-koeln.de/rrzk/daten/afs/#clients
  • Dateien herunterladen und im neuen Verzeichnis wieder hochladen (dauert ggf. sehr lange und setzt eine schnelle Verbindung voraus)

Für die Hilfe bei der Aufklärung ein Dank an Sebastian Hagedorn und Claus Kalle.

Debugging für Fortgeschrittene: Post-Mortem einer Java-Bugsuche

Damit hatten wir nicht gerechnet: nachdem Snow Leopard von Apple veröffentlicht wurde, zeigte sich, dass unsere UKLAN-Admin-Anwendung darunter nicht lief. Die Version von Java, die mit Snow Leopard auf Macs erstmalig der Standard ist, ist Java 6. Diese Version hatten Kollegen mit Windows- und Linux-Rechner schon längst ohne Probleme im Einsatz, so dass nicht zu erwarten gewesen war, dass das auf Macs anders sein könnte.
Das Problem lag bei der Authentifizierung. Beim Anmeldeversuch kam die Meldung, dass diese gescheitert sei. Im Log konnte man zu der Exception einen recht langen Stacktrace sehen. Die entscheidende Meldung lautete:

java.lang.IllegalArgumentException: EncryptionKey: Key bytes cannot be null!

Der Fehler trat in einer internen Javaklasse auf, die nie explizit verwendet werden soll: sun.security.krb5.EncryptionKey. Das allein machte für mich klar, dass es sich um keinen Fehler in unserem Programm handeln konnte, sondern entweder einen im Betriebssystem oder im mitgelieferten Java. Da abzusehen war, dass das Problem durch Apple nicht kurzfristig gelöst werden würde, habe ich mich auf die Suche nach der eigentlichen Ursache gemacht. Am Anfang der Suche standen Beobachtungen:

  • Wenn man ein falsches Passwort eingab, wurde das korrekt als falsch erkannt. Das Problem trat also nur auf, wenn die Authentifizierung eigentlich erfolgreich war.
  • Wenn man bereits ein Kerberos-Ticket hatte, konnte das (nach einer kleinen Programmänderung) verwendet werden, so dass das Passwort gar nicht geprüft werden musste.

Die zweite Erkenntnis hat uns zumindest einen ersten Workaround verschafft, wenngleich der für die Anwender etwas lästig war. Die eigentliche Ursache war hingegen immer noch unklar. Durch die tatkräftige Hilfe eines Forummitglieds auf forums.sun.com bin ich in mehreren Schritten zu weiteren Erkenntnissen gekommen:

  • Die Exception wurde nur durch manche Ciphers verursacht – wie sich später zeigte, sind es die AES-basierten.
  • Unmittelbare Ursache der Exception war ein leeres Salt – dass die AES-Ciphers das nicht mögen, war auf verschiedenen Plattformen reproduzierbar.
  • Nach einer ganzen Weile wurde mir klar, dass die Authentifizierung manchmal klappte.

Das letzte Indiz wies mir den Weg. Wir befragen im Programm zunächst das DNS, welche Server im Active Directory der Uni als KDCs zur Verfügung stehen. Derzeit sind das sechs Stück:

% host -t srv _kerberos._udp.ad.uni-koeln.de
_kerberos._udp.ad.uni-koeln.de has SRV record 0 100 88 ads5.ad.uni-koeln.de.
_kerberos._udp.ad.uni-koeln.de has SRV record 0 100 88 advdc1.ad.uni-koeln.de.
_kerberos._udp.ad.uni-koeln.de has SRV record 0 100 88 rzkvdc1.ad.uni-koeln.de.
_kerberos._udp.ad.uni-koeln.de has SRV record 0 100 88 rzkvdc2.ad.uni-koeln.de.
_kerberos._udp.ad.uni-koeln.de has SRV record 0 100 88 rzkvdc3.ad.uni-koeln.de.
_kerberos._udp.ad.uni-koeln.de has SRV record 0 100 88 ads4.ad.uni-koeln.de.

Da die Authentifizierung manchmal klappte, lag der Verdacht nahe, dass nur manche der Server das Problem provozieren. Also habe ich die Server der Reihe nach fest im Programm verdrahtet. Dabei zeigte sich, dass Authentifizierung nur bei einem der sechs Server möglich war – wohlgemerkt, nur unter Java 6 auf Macs! Auf allen anderen Systemen funktionierten alle sechs Server. Wie ich vom zuständigen Kollegen erfuhr, läuft der funktionierende Server unter Windows Server 2008, die anderen hingegen noch unter Windows Server 2003. Aber in was unterschied sich die Authentifizierung? Mit Wireshark ließ sich beobachten, dass die Antwort des W2K8-Servers einen Unterschied aufwies.

W2K3:
Encryption type: rc4-hmac (23)
Salt:
Encryption type: des-cbc-md5 (3)
Salt: ...

W2K8:
Encryption type: rc4-hmac (23)
Encryption type: des-cbc-md5 (3)
Salt: ...

Hm, ein leeres Salt – war da nicht was? Richtig, das leere Salt produziert eine Exception. Aber wieso wird hier das leere Salt in der Antwort des Servers übernommen, auf anderen Plattformen aber nicht? Die Klasse mit dem relevanten Code gehört zum dem kleinen Teil, der nicht im Source verfügbar ist – mit Ausnahme von OpenJDK. Also habe ich dort nachgesehen. In Zeile 360 beginnt der Code, der das Salt auswertet, das der KDC in seiner Antwort übergibt:

360 // update salt in PrincipalName
361 byte[] newSalt = error.getSalt();
362 if (newSalt != null && newSalt.length > 0) {
363 princ.setSalt(new String(newSalt));
364 }

Im OpenJDK wird also explizit getestet, dass der String eine Länge > 0 hat. Hatte Apple diesen Test etwa entfernt? Ich hätte es bei der Spekulation belassen müssen, wenn ich nicht auf das javap-Kommando hingewiesen worden wäre. Damit kann man Javaklassen disassemblieren. Das funktioniert auch für die Systemklassen. Und da konnte man folgenden Unterschied erkennen:

javap -v sun.security.krb5.Credentials

JDK 5
85: invokevirtual #77 // Method sun/security/krb5/internal/KRBError.getSalt:()[B
88: astore 6
90: aload 6
92: ifnull 114
95: aload 6
97: arraylength
98: ifle 114
101: aload_0
102: new #44 // class java/lang/String
105: dup
106: aload 6
108: invokespecial #78 // Method java/lang/String."":([B)V
111: invokevirtual #79 // Method sun/security/krb5/PrincipalName.setSalt:(Ljava/lang/String;)V

In Zeile 98 wird die Länge getestet. Ist sie 0, springt das Programm zu Zeile 114, also hinter die setSalt()-Anweisung.

JDK 6
85: invokevirtual #81; //Method sun/security/krb5/internal/KRBError.getSalt:()[B
88: ifnull 107
91: aload_0
92: new #51; //class java/lang/String
95: dup
96: aload 5
98: invokevirtual #81; //Method sun/security/krb5/internal/KRBError.getSalt:()[B
101: invokespecial #82; //Method java/lang/String."":([B)V
104: invokevirtual #83; //Method sun/security/krb5/PrincipalName.setSalt:(Ljava/lang/String;)V
107: aload_2
108: ifnull 131
111: aload_2
112: aload_0
113: invokevirtual #84; //Method sun/security/krb5/PrincipalName.getSalt:()Ljava/lang/String;

Hier fehlt der Längentest! Der Vergleich mit einem Windowsrechner zeigte, dass das dortige Java 6 den Test enthielt. Es handelt sich also zweifelsfrei um einen Bug in Apples Javaversion. Nachdem ich all diese Rechercheergebnisse an Apple gemeldet hatte, wurde der Bug dort auch sofort anerkannt. Bis Apple einen Fix rausbringt, könnte allerdings erfahrungsgemäß noch einige Zeit vergehen. Da die Ursache jetzt aber erkannt war, konnte ich einen Workaround implementieren, der ohne Mitwirkung der Anwender funktioniert: wenn die besagte Exception auftritt, wird die Authentifizierung einfach nochmal durchgeführt, dann aber immer gegen den W2K8-Server. Der ist zwar jetzt ein „single point of failure“ für Macs mit Java 6, aber damit können wir leben.

Der Workaround ist nur in der Testversion von UKLAN-Admin enthalten.

Der geschilderte Fall zeigt, wie verzwickt die Fehlersuche sein kann. Der Fehler tritt schließlich nur auf, wenn man

  • einen Mac einsetzt, der Java 6 als präferiertes Java eingestellt hat (d.h. alle Macs mit 10.6, sehr wenige mit 10.5)
  • Kerberos 5 zur Authentifizierung nutzt
  • kein anderweitig bezogenes Kerberos-Ticket besitzt
  • keinen Windows 2008 Server hat (wie es mit anderen KDCs als W2K3 aussieht, weiß ich allerdings nicht)
  • man nicht die Cipherliste in /Library/Preferences/edu.mit.Kerberos durch einen Eintrag für default_tkt_enctypes auf nicht-AES-Ciphers eingeschränkt hat (der Trick klappt allerdings nicht für WebStart-Programme)


Flattr this

Snow Leopard enthält Cisco IPSec VPN

Obwohl Apple angekündigt hatte, dass Snow Leopard keine neuen Features aufweisen würde, hat sich doch so manches getan, allerdings zumeist unter der Oberfläche. Eine dieser etwas versteckten Neuerungen ist integrierte Unterstützung für Ciscos Variante eines IPSec VPNs. Da iPhone und iPod Touch das seit Firmwareversion 2.0 schon konnten, ist die Integration in Snow Leopard keine ganz große Überraschung. Es fällt aber auf, dass im Ggs. zum iPhone bei OS X keine Spur des offiziellen Cisco-Logos zu erkennen ist. Und die Implementierung erfolgt auf Basis von racoon, eines Open Source VPN-Clients aus FreeBSD.

Wir propagieren hier an der Uni zwar mittlerweile vornehmlich die Verwendung des Cisco AnyConnect-Clients, der anstelle von IPSec DTLS verwendet, aber durch die direkte OS-Integration ist Apples Variante mglw. noch einen Tick komfortabler und robuster.

Wer’s probieren möchte, muss entweder im alten „tsunami“-WLAN oder außerhalb des UKLAN sein. Dann öffnet man Systemeinstellungen, dort Netzwerk, klickt auf das + oberhalb des Schlosses, wählt dort als Anschluss VPN, wählt als VPN-Typ Cisco IPSec, und bestätigt die Eingabe. Nun trägt man als Serveradresse vpngate.uni-koeln.de ein, Accountname und Passwort, klickt auf „Identifizierungseinstellungen …“, trägt dort als Gruppenname uklan-full ein, als Schlüssel uklan und klickt auf OK. Dann noch Anwenden und Verbinden, und fertig. Eine ausführlichere Doku mit Screenshots folgt evtl. später.

Mit dem Excel aus Office 2008 mit einem Intel-Mac auf MySQL zugreifen

Heute kam mir zum ersten Mal eine sinnvolle Anwendung für eine ODBC-Anbindung einer MySQL-Datenbank an Microsoft Excel in den Sinn. Zum Glück war meine erste Aktion nach der Idee eine Google-Suche. Dadurch habe ich einen Foreneintrag gefunden, der mir eine Menge Arbeit erspart hat.
Der Hintergrund ist, dass es eine Reihe von Problemen gibt:

  • Obwohl Office 2008 Macs mit Intel-Prozessoren nativ unterstützt, ist das Hilfsprogramm Microsoft Query seit 2002 unverändert und hat nur PowerPC-Code.
  • Der freie ODBC-Connector von MySQL wird nicht als „fat binary“ angeboten, sondern nur wahlweise als ppc- oder x86-Code.
  • Excel 2008 hat eine hartkodierte Liste von unterstützten ODBC-Konnektoren, die nicht den MySQL-Connector enthält.

Wenn man eine schnelle und einfache Lösung für alle genannten Problem will, kann man einen der offiziell von Microsoft unterstützten Konnektoren kaufen. Getestet habe ich nur den von Actual Technologies (siehe unten).

Da es einen freien Konnektor gibt, sehe ich aber nicht ein, warum ich einen kaufen soll. Hier sind die Schritte, um den freien MySQL-Connector benutzen zu können:

  • bei MySQL die Konnektoren für PowerPC und x86 separat runterladen (im „package format“)
  • Achtung: in gemounteter Form heißen beide gleich, so dass man die Architektur nicht mehr erkennen kann. Deshalb sollten die Images jeweils manuell nach Bedarf gemountet werden.
  • Das Image für x86 mounten (Doppelklick) und den Installer für x86 ausführen
  • im Terminal wie folgt aus den Shared Libraries beider Architekturen sog. „fat binaries“ bauen:
  • mkdir ODBC_ppc ODBC_x86 ODBC_fat
  • cd ODBC_x86
  • pax -zrf /Volumes/MySQL Connector ODBC 5.1/MySQL Connector ODBC 5.1.pkg/Contents/Archive.pax.gz
  • x86-Image auswerfen, ppc-Image mounten
  • cd ../ODBC_ppc
  • pax -zrf /Volumes/MySQL Connector ODBC 5.1/MySQL Connector ODBC 5.1.pkg/Contents/Archive.pax.gz
  • cd ..
  • lipo ./ODBC_ppc/usr/local/lib/libmyodbc3S-5.1.5.so ./ODBC_x86/usr/local/lib/libmyodbc3S-5.1.5.so -output ODBC_fat/libmyodbc3S-5.1.5.so -create
  • lipo ./ODBC_ppc/usr/local/lib/libmyodbc3S.so ./ODBC_x86/usr/local/lib/libmyodbc3S.so -output ODBC_fat/libmyodbc3S.so -create
  • lipo ./ODBC_ppc/usr/local/lib/libmyodbc5.so ./ODBC_x86/usr/local/lib/libmyodbc5.so -output ODBC_fat/libmyodbc5.so -create
  • sudo cp ODBC_fat/* /usr/local/lib/
  • An dieser Stelle hat man einen „fetten“ MySQL-Connector, den man mit Dienstprogramme->ODBC-Administrator konfigurieren kann. Ich habe einen Benutzer-DSN hinzugefügt.
  • Da Excel sich noch weigert, wenn man Daten->Externe Daten->Neue Abfrage erstellen auswählt, muss man die Demo-Version von Actual Technologies installieren.
  • Jetzt startet Microsoft Query, wenn man es aus Excel aufruft, und man kann auch den MySQL-Connector benutzen


Flattr this