Blog
Ein Mini-Webserver für die linuxrc
Für das bereits erwähnte NAS möchte ich natürlich auch die Root-Partition verschlüsseln. Nur: wie geben ich beim Booten den Schlüssel ein? Ein Mini-Webserver muss her!
Falls das NAS neu gestartet werden muss -- beispielsweise nach einem Stromausfall -- darf das Eingeben den Filesystem-Passworts nicht an mir hängen. Vielleicht bin ich ja unterwegs. Also muss eine Lösung her, die einfach zu bedienen ist.
Das NAS hat keine serielle Schnittstelle, also scheidet Alles in diese Richtung aus. Den Schlüssel auf einem USB-Stick zu speichern geht nicht, denn der USB-Stick könnte in falsche Hände gelangen. Ein winziger Webserver, der das Passwort abfragt, scheint mir die sinnvollste Lösung.
Eine schöne Lösung hierzu hat das Projekt CryptoNAS (ehemals Cryptobox) entwickelt. Für meinen Einsatzzweck ist das leider (noch) nicht geeignet, da es a) noch keinen RAID unterstützt und b) den Server erst startet, wenn das System schon gebootet hat.
Da bei mir auch die Root-Partition verschlüsselt werden soll, muss das "Entsperren" geschehen, ehe diese eingebunden wird. Also muss der Webserver in der linuxrc gestartet werden, was wiederum bedeutet, dass der Webserver in die initrd muss. Und die möchte ich möglichst klein halten.
In der initrd ist bereits busybox installiert, alleine, um das Shell-Script linuxrc abzuarbeiten. Da wäre doch ein Webserver cool, der einfach als Shell-Script implementiert ist. Einen davon hat Morty Abzug geschrieben. Der macht einen guten Eindruck, ich müsste dem Server nur noch beibringen, CGI-Scripte zu verarbeiten, um das Webformular auszuwerten.
Bei der Suche, was genau die busybox shell kann, habe ich dann entdeckt: Die busybox hat einen Webserver eingebaut! Der kann auch CGI-Scripte. Sehr schön, das spart mir einen Haufen Arbeit! Und wie gesagt: busybox ist in der initrd sowieso enthalten. Jetzt muss ich "nur noch" die nötigen CGI-Scripte schreiben -- aber das sollte nicht recht aufwändig sein.
BTW: Die Anleitung für den busybox htpd findet sich im Quelltext.
Warum man die Performance von /dev/urandom kaum erhöhen kann
Ich baue momentan ein kleines NAS zum Server um. Mein Ziel ist, ein stromsparender kleinen Server für unserer Bürogemeinschaft. Natürlich müssen die Daten darauf verschlüsselt werden. Die Platte ...
Dummerweise habe ich mir ein NAS empfehlen lassen, dass nicht von Haus aus verschlüsseln kann. Habe ich nicht aufgepasst. Dazu und zu anderen Unzulänglichkeiten des NAS ein andermal mehr. Ich hatte auch kurz die Idee, mir ein anderes zu kaufen, statt viel zeit hinein zu stecken. Aber wer weiß, ob ich da nicht vom Regen in die Traufe käme.
Das NAS ist gerootet, Debian ist installiert. Nun baue ich nach dieser Anleitung das verschlüsselte RAID. Die Anleitung ist kurz und gut, und die nötigen Befehle sind in zirka einer halben Stunde eingegeben.
Aber: Ein Schritt ist, die Platte mit Zufallsdaten zu beschreiben. Und das dauert ...
... und dauert ...
... und dauert ...
... und ich werde ungeduldig. Das muss man doch beschleunigen können?!
Zusammengefasst: Schneller geht nur mit schnellem Rechner.
Das Kommando
dd if=/dev/urandom of=/dev/md127 bs=10M
liefert auf dem NAS 1,8 MB/s, bei 2 TB macht das gute 300 Stunden also über 12 Tage. Urgs.
Also Platte ausgebaut, und per USB an den Desktop angeschlossen. Hier die Ergebnisse verschiedener Versuche (alle Messungen am Desktop):
| of=/dev/md.. (also über RAID-Schicht) |
3,8 MB/s | 135 Stunden |
5 1/2 Tage |
| of=/dev/md.. + Runlevel 0 |
4,0 MB/s | 135 Stunden | 5 1/2 Tage |
| of=/dev/md.. + timer_entropyd |
3,7 MB/s |
135 Stunden | 5 1/2 Tage |
| of=/dev/sd.. (also ohne RAIS-Schicht) |
3,8 MB/s |
135 Stunden |
5 1/2 Tage |
| if=/dev/zero | ca. 66 MB/s | 8 Stunden | 1/3 Tag |
Meine Erkenntnisse daraus:
- urandom ist der begrenzende Faktor, nicht der USB-Anschluss.
- Die Blockgröße ist fast egal: Auch größere und kleinere Input-Blocks (ibs=...) ändern nichts Nennenswertes.
- Mehr Entropie bringt keinen Speed: Ich dachte, dass urandom schneller wird, wenn das System mehr Entropie hat. Dazu habe ich timer_entropyd eingesetzt, um die Entropie zu bekommen. Hat nichts gebracht, ja eher geschadet: Die Performance ist leicht gesunken.
- Nachdenken hilft: urandom liefert Psuedozufallszahlen, rechnet also und braucht dazu CPU-Power. Mehr Entropie macht die Zufallszahlen zwar "zufälliger", aber deren Erzeugen nicht schneller.
Ich habe nun also ein paar Stunden Zeit, zu entscheiden, ob es das Risiko einer Krypto-Attacke gegen meine Platte wert ist, sie vorher 5 1/2 Tage mit Zufallszahlen zu beschreiben.
Ps(i)²'s Liebling
Das freut den Programmierer: Auch die Kollegen schätzen offensichtlich meinen CVSS-Calculator:
Sebastian Klipper, Buchautor, Blogger (psi2.de) und ebenfalls CISSP, lobt in seinem Werk"Information Security Risk Management" (Wiesbaden, 2011. Seite 205): "Mein Favorit ist der Plattform-unabhängige CVSS-Calculator von Goebel Consult. [...] und er kann CVSS-Vektoren mit cut-and-paste verarbeiten."
Informatikkunst
Die Rhäthische Bahn in der Schweiz UNESCO Kulturerbe. Wohl wegen Ihrer kühnen Trassenführung und Konstruktionen. Wenn ich unter einer der Brücken dort stehe (siehe Bild) und mir vorstelle, dass die schon 100 Jahre alt sind und mit viel, viel Körpereinsatz gebaut wurden, bekomme ich Hochachtung. Hochachtung vor den Ingenieuren, die das geplant und berechnet haben. Hochachtung vor Handwerkern und Arbeitern, die diese Konstrukte ausgeführt haben.
Das geht wohl Vielen so, sonst hätte es nicht für das Weltkulturerbe gereicht.
Ingenieurskunst zeigt sich an vielen Stellen, und auch der Nicht-Ingenieur läßt sich davon beeindrucken. Angefangen von einem sauber funktionierendem Taschenmesser bis zum Eiffelturm.
Schade, dass Informatikkunst nicht so offensichtlich ist. Die Kunstwerke meiner Zunft sieht man selten: Wer liest schon Quellcode und kann sich an dessen Eleganz erfreuen? Wer weiß schon einen schönen Algorithmus, ein gutes Protokoll oder eine saubere Implementierung zu schätzen.
Ein Trost bleibt (naja): Dieses Schicksal teilen wir mit der Mathematik: Deren Fourier-Transformationen sind in der Ingenieurskunst elementar, aber die Mathematik sieht man eben nicht.
Interview mit Hartmut Goebel im IT Freelancer Magazin
Unternehmen sollten IT Security wichtiger nehmen
IT-Security ist in den Unternehmen nach wie vor eine Disziplin mit zu geringem Stellenwert, moniert CISSP und Sicherheitsexperte Hartmut Goebel in einem Interview im IT Freelancer Magazin, Ausgabe April/Mai. Im Gespräch mit dem Magazin gibt er den Lesern eine Einschätzung, wie es über die technischen Sicherheitsvorkehrungen bei kleine, mittleren und großen Unternehmenskunden bestellt ist. Ein guter Sicherheitsberater kann und muss maßgeblich dazu beitragen, den Kunden ein Sicherheitsniveau zu vermitteln, auf das sie bauen können.
Datenschützer geben Goebel Consult Recht
Letztes Jahr im Mai hatte ich in meiner monatlichen Kolumne CISSP-Geflüster unter dem Titel Finger weg von Google Analytics auf die Probleme mit Googel Analytics hingewiesen und Alternativen vorgestellt. Eine davon ist piwik. Wie heute auf heise online zu lesen ist, schließt sich das Unabhängige Landeszentrum für Datenschutz Schleswig-Holstein (ULD) in Sachen Google Analytics meiner Meinung an und empfiehlt ebenfalls Piwik für die Webanalyse.
Allerdings nicht uneingeschränkt: In dem Prüfbericht werden einige Maßnahmen genannt, um piwik auch wirklich datenschutzkonform einsetzen zu können: So muss beispielsweise das Plugin „AnonymizeIP“ verwendet und eine Möglichkeit zum Widerspruch angeboten werden. Vorgeschrieben ist hierbei sogar detailliert, welcher der englischen Texte für den Einsatz im deutschsprachigen Raum in die Landessprache übersetzt werden muss. Die Beschreibung der Maßnahmen geht bis ins Detail der Konfiguration, etwa wie sich die Gültigkeitsdauer des piwik-Cookies steuern lässt.
bash-completion ergänzt remote Pfade bei scp
Eben hatte ich ein Erlebnis der dritten Art: Ich wollte mit scp eine Datei von meinem Server kopieren, tippe also
scp myserver:/tmp/abst
und drücke aus Gewohnheit und ohne nachzudenken <Tab>. Und schon steht dort:
scp myserver:/tmp/abstract_tool.pyc
Ich brauchte einen Moment, um zu realisieren: Die bash-completion hat sich tatsächlich im Hintergrund auf myserver eingeloggt, das Verzeichnis aufgelistet und meine Kommandozeile ergänzt!
Was das Paket bash-completion alles aus der bash herausholt, begeistert mich schon lange. Doch jetzt bin ich total von den Socken!
Thumbnails wie ein Stapel verschobener Blätter
Für eine Präsentation benötigte ich als visuelles Element ein "Vorschau" der verwendeten Dokumente. Es sollte aussehen wie auf dem Bild: ein Stapel verschobener Blätter. Da ich über 40 Dokumente ...
Die Ursprungsdokumente waren MS-Word-Dateien (.doc). Daraus ein Bild pro Seite zu machen, war eine leichte Übung: openoffice-python (das übrigens von mir selbst stammt) enthält ein Skript odt2pdf.py , um aus Office-Dokumenten PDFs zu erstellen. Die einzige Voraussetzung dafür ist, dass OpenOffice bzw. LibreOffice das Dokument brauchbar lesen kann. Das war hier der Fall.
Aus den PDFs Bilder zu erzeugen, war auch meine Schwierigkeit: Das Programm "convert", das zum ImageMagick-Paket gehört, erledigt das. Hier das Kommando, um nach PDFs zu suchen und sie zu konvertieren:
find . -type f -iname \*.pdf -print0 | xargs -0 -n 1 convert '"{}"' '"{}"'.png
Dann wurde es kompliziert! Wie werden aus den Bildern die Stapel?
Meine Versuche, es mit der Python Image Library (PIL) hinzubekommen, scheiterten.
Auf der Mailingliste der Linux User Group Darmstadt erhielt ich einen entscheidenden Tipp: Guck dir die Option -compose an. Das war zwar dann nicht die Lösung, aber etwas unterhalb auf der gleichen Seite war -mosaic beschreiben. Dummerweise muss man trotzdem noch die Position für jedes Bild selbst berechnen :-( Das ist zwar aufwändig, aber nicht weiter schwierig.
So geht´s also: List der Bilder lesen, umgekehrt sortieren, damit das letzte Blatt das unterste wird, offsets berechnen und eine Schleife über alle Bilder. Der wichtige Teil des Skripts sieht dann so aus:
def process(outfilename, images):
imagenames = images
imagenames.sort()
imagenames.reverse()
# Bildbreite mit Python Image Library ermitteln
im = Image.open(imagenames[-1])
width, height = im.size
offset = int(math.ceil(width*0.3 + BORDERWIDTH))
cmd = ['convert']
paste_offset = offset*(len(imagenames)-1) + BORDERWIDTH
for inname in imagenames:
cmd.extend([
'-page', '+%i+0' % paste_offset,
'(', '-border', '1%', '-bordercolor', 'black', inname, ')'])
paste_offset -= offset
cmd.extend(['-mosaic', outfilename])
subprocess.call(cmd)
Im Endeffekt wird ein Kommando wie folgendes ausgeführt:
convert \
-page +40+0 '(' -border 1% -bordercolor black seite3.png ')' \
-page +20+0 '(' -border 1% -bordercolor black seite2.png ')' \
-page +00+0 '(' -border 1% -bordercolor black seite1.png ')' \
-mosaic zusammengesetzt.png
Das Ergebnis zeigt das Bild.
Antike Fundstücke: Aminet und AmokEd
Neujahr ist eine gute Gelegenheit, auszumisten. Das habe ich habe heute mit meinen alten Bookmarks getan. Schön, wenn man gleich fünf oder zehn auf einmal löschen kann, weil die Seiten nicht mehr existieren. Dabei bin ich auch auf eine alte Sammlung Amiga-Links gestoßen. Die konnte ich alle löschen – bis auf einen, der tatsächlich noch aktuell war: AmiNet.
Anfang der 1990er war es noch üblich, Software per Diskette zu verschicken, wobei diejenigen von Fred Fish besonders bekannt war. Die Begriffe "Freie Software" oder "Open Source" waren damals vielleicht geboren, aber auch wir Studenten kannten sie nicht. Für uns gab es "Freeware" oder "Public Domain" (und noch ein paar Kategorien wie "Shareware"). Und dann kam Aminet! Erst ein einzelner FTP-Server, später ein paar Spiegelserver, von denen an sich die Software direkt herunterladen konnte. Wie revolutionär das war, wir mir erst heute bewußt. Und ich gehörte zu den Privilegierten, die an der Uni Internet hatten und Aminet nutzen konnten.
Bis Mitte der 1990er wurde Aminet ein wichtiges Online-Archiv für Amiga-Software. Mehr zur Bedeutung und Geschichte von Aminet (Selbstdarstellung) beschreibt der englische Wikipedia-Eintrag (der deutsche Eintrag berücksichtigt leider die aktuellere Entwicklung nicht).
Was mich aber am meisten fasziniert: Es gibt Aminet noch immer. Und auch die Daten sind noch da. Darunter eine Version meines Editors AmokEd von 1992, zu dem als Quelle "Fish collection" angegeben ist. Und auch die Fisk Disks gibt es noch als FTP-Archiv und im Fred Fish memorial archive.
Distributing Python programms for Windows using pyinstaller
While I not blogged on this topic yet, for several times now I looked into the topic of how to distribute Python for Windows users. There are several major problems, especially if one wants to cross-bundle from e.g. Linux. The later is a requirement for me, since my development platform is Linux and I do not want to boot into Windows just for creating a new distribution package.
With "cross-bundling" I mean "just" sticking together pure python programs, eventually with already compiled third-party packages like GTK. So one of the problems may be where to get the binary packages from. But I'll not going into this today.
The program I want to distribute is my pdfposter, which scales and tiles PDF images/pages to print on multiple pages. Basically this is a Python script, a Python package and another Python package (pyPDF). On a Unix system, installing it is quite easy, assuming that Python is already installed (which is the case on Linux).
Not so on WIndows!
On Windows users are used to get self-contained packages. For installing pdfposter, one needs to install Python, setuptools, (maybe pyPDF, if you are offline) and then pdfposter. Users get trapped be the provided .msi and pdfposter got horrible comments on Heise Software Verzeichnis. So I decided to release a Windows executable of pdfposter for the next release.
In 2008 I already did some work on pyinstaller, adding support for different target-platform and for relative imports (see this trak timeline). One of the major pros of pyinstaller is: the binaries required for bootstraping the program on the target platform are included prebuild. So one may really bundle cross platform.
Meanwhile, a lot has been worked on pyinstaller and it is now able to include Python eggs (this is packages packed into a zip-file or unpacked into a directory). Wow! py2exe (one of the major other options) still does not support this. There is still some more work to do until can use pyinstaller. [Now it's getting technical] Currently scripts defined via entry_points are not bundled. You may work around this by first installing the script, not this will not recognize the required module.
It seams as if there is time for some more contributions to pyinstaller.
