Bundesamt für Steuern: Zope fail

Geschrieben von everflux am September 26th, 2014

Dank dem total unkomplizierten Steuerrecht muss man beim VAT reversed Verfahren zur Abrechnung von IT Dienstleistungen im EU Binnenland immer sicherstellen, dass die VAT Nummer auch korrekt ist – und zum Rechnungsempfänger gehört.
Die Anwendung des Bundesamts für Steuern fühlt sich etwas rustikal an, tut aber meistens. Meistens.
bundesamt-fuer-steuern-fail

Gelöschte Datei retten solange sie offen ist

Geschrieben von everflux am Juli 13th, 2014

Durch eine unglueckliche Konstellation kam es dazu, dass mir von laufenden, produktiven, KVM Maschinen die Images abhanden kamen. Kurzum: Gelöscht. Aber da die Maschinen noch liefen eine gute Gelegenheit sich an der Rettung zu versuchen, und nicht über ein Backup zu arbeiten.
Dadurch, dass die Datei Images noch in Benutzung waren, war ein File-Handle mit dem jeweiligen Prozess verknüpft. Dieser kann nach Belieben noch mit der Datei arbeiten, auch das Dateisystem betrachtet die zu der Datei gehörenden Datenblöcke nicht als frei und bewahrt sie somit vor Verlust. Solange der Prozess läuft aber nur.

Zur Illustration verwenden wir einmal folgende Kommandos:

wget --limit-rate=1000 http://releases.ubuntu.com/14.04/ubuntu-14.04-desktop-amd64.iso

Der Download ist extra langsam gedreht, so dass genug Zeit ist zum experimentieren.
Nun loeschen wir die Datei – das wget laeuft weiter.

rm ubuntu-14.04-desktop-amd64.iso

Suchen wir nun nach Prozessen, die auf gelöschte Dateien zugreifen und filtern nach Dateien mit dem Wort “ubuntu”:

lsof | grep deleted | grep ubuntu
wget 10694 tkruse 4w REG 252,1 195943 1573596 /home/tkruse/ubuntu-14.04-desktop-amd64.iso (deleted)

Der einfachste Weg den Inhalt zu retten wäre nun, einfach die Datei(inhalte) zu kopieren. Dazu suchen wir das Filehandle des Prozesses “10694” (dem wget aus dem lsof)


ls -l /proc/10694/fd             
total 0
lrwx------ 1 tkruse tkruse 64 Jul 12 13:02 0 -> /dev/pts/7
lrwx------ 1 tkruse tkruse 64 Jul 12 13:02 1 -> /dev/pts/7
lrwx------ 1 tkruse tkruse 64 Jul 12 13:02 2 -> /dev/pts/7
lrwx------ 1 tkruse tkruse 64 Jul 12 13:02 3 -> socket:[797560]
l-wx------ 1 tkruse tkruse 64 Jul 12 13:02 4 -> /home/tkruse/ubuntu-14.04-desktop-amd64.iso.1 (deleted)

Das Datei handle können wir als Quelle nehmen, und den Inhalt nun kopieren:

cp /proc/10694/fd/4 /home/tkruse/rescue

Da die Maschinen noch laufen, wäre es eigentlich schön nicht einen Zustand zu kopieren, sondern die Datei auf ‘nicht gelöscht’ setzen zu können. Das ging mal mit ln -L, wurde jedoch aus Sicherheitsgründen aus dem Kernel entfernt.

Dazu kann man nur noch direkt ins Dateisystem eingreifen. Nichts für Angsthasen – und ein fsck sollte danach besser stattfinden.
Mittels debugfs kann man einen neuen Link auf die inode der Datei anlegen. Darüber kann danach wieder ein Zugriff erfolgen. Jedoch wird dabei der Link-Count nicht erhöht, so dass die Datei nicht wirklich wieder hergestellt ist.
Die inode ist die Zahl aus dem lsof vor dem Dateipfad, in diesem Fall “1573596”. Legen wir also eine neue Datei an, die diese inode nutzt:

sudo debugfs -w /dev/mapper/ubuntu--gnome--vg-root -R "link <1573596> rescue"

Anschließend kann man den Prozess, der die Datei bisher noch offen und damit am Leben gehalten hat, beenden und die Datei (auf ein anderes Dateisystem) kopieren.

cp rescue ....

Ist man damit fertig, kann man den Link wieder aufheben.

sudo debugfs -w /dev/mapper/ubuntu--gnome--vg-root -R "unlink rescue"

Durch durch das debugfs ist es im Prinzip auch möglich den Linkcount zu reparieren, das war mir jedoch etwas zu warm. Auch bin ich nicht sicher, wie es sich mit dem “gelöscht” Flag tatsächlich verhält, so dass ich die Daten dann auf ein anderes Dateisystem kopiert habe (um versehentliches überschreiben zu verhindern), das betroffene Dateisystem ausgehängt und per fsck geprüft habe.
Soweit ich das beurteilen kann: Die Datei wurde perfekt gerettet und alles läuft mit minimaler Downtime weiter.

Abmessungen Magnum Sekt Flasche

Geschrieben von everflux am Juli 4th, 2014

Das war schwer – um den passenden Kühler zu kaufen, brauchte ich die Abmessungen einer Sektflasche in der Größe “Magnum”. Alle Größen für Champagner Flaschen waren jedoch ausschließlich in Litern zu finden, nicht in Zentimetern oder Millimetern. Da hilft alles nichts, man kauft sich eine Referenzflasche.

Hier nun die ungefähren Abmessungen eines Moët & Chandon Magnum (1.5l) im metrischen Maßsystem: 115mm x 420mm

If you think this message is wrong….

Geschrieben von everflux am Mai 30th, 2014

access-denied

Diagnose mit sysdig

Geschrieben von everflux am Mai 17th, 2014

Wäre es nicht fantastisch, wenn es ein Tool gäbe, dass wie tcpdump auf System-Ebene arbeitet? Vielleicht noch gemischt mit lsof. Und strace. Und das ganze vielleicht auch so dass man im Nachhinein filtern kann!

Das gibt es. Es nennt sich “sysdig” und ist OpenSource: http://www.sysdig.org/ bzw. https://github.com/draios/sysdig/

Die Installation auf einem Ubuntu 14.04 sollte eigentlich so funktionieren:

curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | sudo bash

Das hat leider nicht ganz geklappt:

curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | sudo bash
[sudo] password for tkruse:
* Detecting operating system
* Installing Draios public key
OK
* Installing Draios repository
* Installing kernel headers
E: Package 'linux-headers-3.11.0-12-generic' has no installation candidate
Unable to find kernel development files for the current kernel version 3.11.0-12-generic
This usually means that your system is not up-to-date or you installed a custom kernel version.
The installation will continue but you'll need to install these yourself in order to use sysdig.
Please write to the mailing list at https://groups.google.com/forum/#!forum/sysdig
if you need further assistance.
* Installing Sysdig
Selecting previously unselected package sysdig.
(Reading database ... 207643 files and directories currently installed.)
Preparing to unpack .../sysdig_0.1.82_amd64.deb ...
Unpacking sysdig (0.1.82) ...
Processing triggers for man-db (2.6.7.1-1) ...
Setting up sysdig (0.1.82) ...
Loading new sysdig-0.1.82 DKMS files...
First Installation: checking all kernels...
Building only for 3.11.0-12-generic
Module build for the currently running kernel was skipped since the
kernel source for this kernel does not seem to be installed.

Offenbar war mein Kernel nicht beim Update auf Ubuntu 14.04 mitgezogen worden:

uname -a
Linux charix 3.11.0-12-generic #19-Ubuntu SMP Wed Oct 9 16:20:46 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

Dafuer gab es keine Kernel-Header mehr, so dass die sysdig Module nicht kompiliert und installiert werden konnten.
Das ist schnell zu beheben, neuer Kernel und neue Header:

sudo apt-get install linux-image-3.13.0-24-generic
sudo dpkg-reconfigure sysdig
Removing old sysdig-0.1.82 DKMS files...

-------- Uninstall Beginning --------
Module: sysdig
Version: 0.1.82
Kernel: 3.13.0-24-generic (x86_64)
-------------------------------------

Status: Before uninstall, this module version was ACTIVE on this kernel.

sysdig-probe.ko:
- Uninstallation
- Deleting from: /lib/modules/3.13.0-24-generic/updates/dkms/
- Original module
- No original module was found for this module on this kernel.
- Use the dkms install command to reinstall any previous module version.

depmod....

DKMS: uninstall completed.

------------------------------
Deleting module version: 0.1.82
completely from the DKMS tree.
------------------------------
Done.
Loading new sysdig-0.1.82 DKMS files...
Building for 3.11.0-12-generic and 3.13.0-24-generic
Module build for the currently running kernel was skipped since the
kernel source for this kernel does not seem to be installed.
Building initial module for 3.13.0-24-generic
Done.

sysdig-probe:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.13.0-24-generic/updates/dkms/

depmod....

DKMS: install completed.

Danach kann dann sysdig auch schon benutzt werden.
Hier ein Beispiel: “Zeige alle Prozesse, die auf Dateien in /etc zugreifen”

sudo sysdig evt.type=open and fd.name contains /etc

Die Ausgabe sieht z.B. dann so aus:

208208 13:10:12.791863631 0 DNS (4278) < open fd=73(/etc/hosts) name=/etc/hosts flags=1(O_RDONLY) mode=0 
208307 13:10:12.792037164 3 DNS (4283) < open fd=74(/etc/hosts) name=/etc/hosts flags=1(O_RDONLY) mode=0 
444807 13:10:27.793785895 0 DNS (5019) < open fd=72(/etc/hosts) name=/etc/hosts flags=1(O_RDONLY) mode=0 
470806 13:10:32.317263671 1 gnome-settings- (3411) < open fd=19(/etc/fstab) name=/etc/fstab flags=1(O_RDONLY) mode=0 
546476 13:10:42.794281200 2 DNS (4278) < open fd=72(/etc/hosts) name=/etc/hosts flags=1(O_RDONLY) mode=0 

Auch kann man mal eben schnell schauen wer am meisten Netzwerkbandbreite braucht:

sudo sysdig -c topprocs_net

Beispielausgabe:

Bytes     Process   
------------------------------
23.82KB   Socket
546B      dnsmasq
239B      pidgin
215B      DNS

(Socket ist hier der Firefox, der eine Webseite lädt.)

Das ist extrem praktische für diverse Diagnosen. Ein interessantes Beispiel für den Einsatz liefert der Blog-Post der Entwickler, die dabei im Nachhinein analysieren, was bei einem Einbruch in einen Honeypot-Server passierte: http://draios.com/fishing-for-hackers/

Viele weitere Beispiele (IO, CPU, Security…) finden sich auf dieser Seite: https://github.com/draios/sysdig/wiki/Sysdig%20Examples

Tastatureingabe für crypt-setup nach Kernel Update / 14.04

Geschrieben von everflux am Mai 17th, 2014

Nach dem Update auf den neuesten Kernel unter Ubuntu 14.04 funktionierte bei mir die Tastatureingabe nicht mehr beim Booten. Das ist deswegen relevant, weil ich zu dem Zeitpunkt das Passwort der Festplatten-Verschlüsselung angeben muss.
Dazu gibt es auch Bugs bei Canonical, die verschiedene Workarounds vorschlagen. In meinem Fall hat jedoch gereicht, dass ich ein Paket zusätzlich installiere, dass die benötigten USB und Tastaturtreiber für die initiale Ramdisk zur Verfügung stellt:


sudo apt-get install linux-image-extra-3.13.0-24-generic
sudo update-initramfs -u

Lieber E-Mail-benutzer;

Geschrieben von everflux am Januar 6th, 2014

Das ist das original Subject der wohl miesestens Phishing Mail, die ich je bekommen habe. Aber da darf sich jeder selbst ein Bild machen:

 

 

From: "HypoVereinsbank" <comfortaircon@bluestarchannel.com>
Subject: Lieber E-Mail-benutzer;

Lieber E-Mail-benutzer;

UNS HABEN SIE ZUGRIFF 23,432 Boxen überschritten your List setzen
Web-Service-/ Admin, und SIE Werden problème Haben, Das Senden und
E-Mails EMPFANGEN, Bis SIE wieder zu überprüfen. Wann & SIE DURCH Sich
einen Klick Markt auf Upgrade-
unten stehenden Link-und filling SIE sterben Details zu Ihrem Konto
überprüfen
Bitte Markt auf Musikersuche Höhle untenstehenden Link-oder KOPIEREN
Einfügen in Ihrem Browser, ähm Den Inhalt der Zwischenablage zu
überprüfen.

//LINK entfernt//

Achtung!
Andernfalls Werden Nur begrenzten zugang zu E-Mail-posteingang. WENN
Nicht Markt auf Ihr Konto Innerhalb von Drei Tagen Über Aktuelles zu
aktualisieren
Benachrichtigung, WIRD Ihr Konto Dauerhaft geschlossen Werden.
Mit freundlichen Grüßen,
System Administrator ®

Dazu gibt es dann auch eine “Webseite”, diese sieht dann so aus:

webmail-update

Wenn das mal nicht …. das Webmail der HypoVereinsbank ist!

Vagrant + Nginx/Apache: Korrupte Daten bei statischen Dateien

Geschrieben von everflux am Dezember 7th, 2013

Das hat echt eine Weile gedauert dieses Yak zu shaven: Dank Vagrant und VirtualBox habe ich ein Web-Projekt mit einer leicht zu startenden Entwicklungsumgebung versehen.

Das hat vorher auch schon prima geklappt, und das Verfahren hat sich bewährt – besonders, wenn das Setup etwas komplexer ist, oder es Entwickler gibt die nicht mit Linux/Debian/Ubuntu arbeiten. Jedoch hat mich heute ein Bug gequält den ich wirklich einige Stunden suchen durfte. Alles fing damit an, dass es JavaScript Fehler hagelte.

Uncaught SyntaxError: Unexpected token ILLEGAL

Jedoch nur, wenn die Datei aus Vagrant per nginx ausgeliefert wurde. Mit Netbeans und dem eingebauten mini-Webserver für HTML5 Projekte lief alles super.

Eine Google Suche brachte unglaublich viele Ergebnisse – jedoch keine Lösung. Man solle nach bösen Zeichen schauen, am besten nach Whitespace das komisch ist. Eine super Chance auf den Holzweg abzubiegen und da eine Weile unterwegs zu sein.

Die Quellcode-Ansicht von Firefox brachte dann erstaunliches zu Tage:

Screenshot from 2013-12-07 21:30:49

Das sieht in der Tat kaputt aus. Mal schnell im Editor schauen – nein da ist alles gut. Auf der Vagrant Maschine nachschauen, auch da alles in Ordnung. (Sowas in der Art hatte ich schonmal wenn die Guest-Additions von VirtualBox nicht mehr so recht zur Umgebung passen. Aber das war hier nicht der Fall.)

Auch das Einfügen von dummy-Text änderte weder etwas an dem Muell am Ende der Datei, noch wurde der Text angezeigt. Nanu, was kann das sein? Schnell noch einen Holzweg her! “Ist bestimmt Caching.”

Das Rätsels Lösung ist dann ein 5 Jahre alter Bug in VirtualBox, wohl auch bei Apache oder sogar Versionsverwaltungssoftware zuschlagen kann: VirtualBox hat Probleme mit direktem mmap zwischen zwei Filehandles, wenn es sich dabei um per vboxfs gemountete Verzeichnisse handelt.

Hier das Ticket dazu: https://www.virtualbox.org/ticket/819

Bei nginx kann man sendfile sehr einfach ausschalten:

sendfile off;

Danach klappt alles wie erwartet.

CorpusResponseInformationArrayException

Geschrieben von everflux am August 7th, 2013

So gesehen bei T-Online…

exception

Multi-Core vs. Single-Core: Load Testing unter Linux

Geschrieben von everflux am Juni 29th, 2013

Inzwischen sind multi-core oder sogar multi-CPU Maschinen weit verbreitet. Um etwas besser abschätzen zu können, wie gut eine Anwendung mit steigender Anzahl von CPU (Kernen) skaliert, möchte man manchmal eine Anwendung auf einzelne Kerne oder sogar einen einzigen beschränken.
Auch fuer den Fall, dass man den selben Rechner als Test-Agent und zur Ausführung des Tests (also client und server) verwenden möchte, kann es sich lohnen die zu testende Anwendung und den Test-Agenten mit beschränkten Ressourcen zu starten, damit diese nicht so stark miteinander konkurrieren.
Unter Linux (Ubuntu, Debian, Arch…) gibt es das Utility “taskset”. Damit kann die CPU Affinität eines Prozesses beim start oder sogar nachträglich eingestellt werden.
Beispielsweise kann man damit dann eine Java Webanwendung folgendermaßen auf einen Core begrenzen:

taskset 1 [start-kommando]

In meinem Fall nutze ich jmeter um gegen eine so gestartete Anwendung zu testen:

env MAVEN_OPTS="$MAVEN_OPTS -noverify" taskset 1 mvn -Dspring.profiles.active=dev jetty:run

Schon beim Start bemerkt man recht deutlich, wie gut Java von Mehrprozessorarchitekturen profitiert. Selbst wenn die eigene Anwendung nicht stark parallelisert ist.


http://everflux.de/
Copyright © 2007, 2008 everflux. Alle Rechte vorbehalten. All rights reserved.