Passwort erzeugen

17. Oktober 2008 at 19:11

Oft braucht man eine Idee für ein neues Passwort, doch die Idee fehlt. Wie man solche einfach erfindet, habe ich im Artikel Sichere Passwörter schon erklärt. Doch kommt es manchmal auch vor, dass man viele Passwörter automatisch erzeugen muss. Hier helfen entweder viele kleine Tools oder eben die Shell.

Zuerst hole ich mir mit dd zufällige Daten, sagen wir mal 10 kByte. Diese schicke ich durch eine RegEx und entferne alle Zeichen, die nicht den gewünschten Zeichen entsprechen. Ich nehme hier im Beispiel nur Buchstaben und Zahlen. Nun muss ich nur noch dafür sorgen, dass nur so viele Zeichen wie benötigt ankommen, was ebenfalls wieder durch eine RegEx passiert.

Das Ergebnis sieht dann so aus:

 

dd if=/dev/urandom bs=1024 count=10 2>/dev/null
  | perl -pe "s/[^a-zA-Z0-9]//g"
  | perl -pe "s/^(.{12}).*$/1/g"

Nun gibt es aber einen Sonderfall, bei dem ich weitere Ausnahmen mache: Das Root-Kennwort.

Ein externer Login (via SSH) mit Passwort ist bei meinen Systemen nicht möglich (nur via Public Key). Das Passwort wird bei mir also nur benötigt, wenn ein Techniker es im Rechenzentrum lokal eingeben muss. Daher sollten alle Zeichen einfach tippbar sein, âáà sind das bei nodeadkeys meist nicht. Außerdem sollte man an die Verwechslungsgefahr denken: Der Techie mit dem Ausdruck des Passwortes in seiner Hand kann bei typischer RZ-Beleuchtung sicher keinen Unterschied zwischen | und l erkennen.

Folgende Zeichen der oben generierten Passworter erachte ich als Störend:

  • Kleines Ludwig (l), großes Ida (I), die Zahl Eins (1), das Pipe-Symbol: lI1|
  • Großes Otto (O), die Zahl Null (0): O0
  • Das Ypselon und das Zet (weil auf US-Keyboards vertauscht)

So würde das nun aussehen, wenn wir diese Zeichen nun entfernen:

 

dd if=/dev/urandom bs=1024 count=10 2>/dev/null
  | perl -pe "s/[^a-zA-Z0-9]//g"
  | perl -pe "s/[lI1O0yYzZ]//g"
  | perl -pe "s/^(.{12}).*$/1/g"

Die beiden RegEx könnte man zusammenfassen, indem man schon beim ersten nur gewünschte Zeichenbereiche freigibt. Aber ich finde es so leichter lesbar und besser zu bearbeiten.

Fullbackup mit tar

12. Oktober 2008 at 22:40

Meinen Server sichere ich gerne vollständig, da ich so im Falle eines Ausfalls schnell wieder an die Daten komme. Sofern man keine Technologien wie Snapshot & Co nutzen kann, genügt hierzu auch ein einfaches tar.

Erstmal sollte man einige Verzeichnisse ausnehmen, z.B. /proc, /dev oder /sys. Auch können Temp-Verzeichnisse sowie /var/run und /var/lock ausgenommen werden. Je nachdem, wie wichtig die Logfiles sind, können die auch weg, brauchen sie doch nur viel Platz.

Die Spool-Files vom Mailserver sind oft auch unsinnig: Ein 6h altes Backup enthält viele Mails, die längst zugestellt sind, andererseits keine Mails der letzten 6 Stunden. Sowas lohnt im Backup nicht. Wer viel Wert auf das Mailbackup legt, könnte höchstens das aktuelle Spool-Verzeichnis sehr häufig per rsync anderswo sichern.

Datenbanken sollten nicht live weggezogen werden, besser ist eine vorher erstellte konsistente Kopie (z.B. ein MySQL Dump), die im Backup landet, während das Arbeitsverzeichnis der Datenbank ausgenommen wird. In meinem Fall ist das /var/lib/mysql.

Eine Sache ist für die Herstellung noch ganz wichtig: Es sollte nicht das Verzeichnis selbst vom Backup ausgenommen werden, sondern nur dessen Inhalt. Das Verzeichnis (samt zugehöriger Owner- und Rechteeingestellungen) sollte im Backup bleiben. In tar geht das so, dass man das Verzeichnis nicht mit ‚–exclude=pfad‘ sondern mit ‚–exclude=pfad/*‘ ausnimmt.

Zuletzt sollte man das Backup selbst auch noch ausnehmen – nicht wäre dümmer als eine rekursive Sicherung des Backups selbst. Das Ergebnis als Kommando sieht dann so aus:

tar czf /pfad/zum/backup.tgz \
    --exclude=proc/* \
    --exclude=dev/* \
    --exclude=sys/* \
    --exclude=tmp/* \
    --exclude=var/tmp/* \
    --exclude=var/run/* \
    --exclude=var/lock/* \
    --exclude=var/log/* \
    --exclude=var/lib/mysql/* \
    --exclude=var/spool/postfix/* \
    --exclude=pfad/zum/backup.tgz \
    /

Die am Ende der Zeilen zeigen der Bash an, dass die Zeile noch nicht abgeschlossen ist. So lassen sich mehrzeilige Kommandos eingeben, was der Übersichtlichkeit dient. Das / am Ende ist wichtig, es sagt tar, dass wir / sichern wollen, also die ganze Platte.

urldecode auf der Shell

21. September 2008 at 13:39

Wer hin und wieder schon mal in einem Apache-Log die Referer durchsucht hat, kennt das Problem mit der Zeichenkodierung: Sonderzeichen werden als zweistellige hexadezimale Zeichen mit vorangestelltem Prozentzeichen dargestellt. Aus ‚Wörter mit Äh, Üh und Öh‘ wird so schnell ein ‚W%F6rter+mit+%C4h%2C+%DCh+und+%D6h‘, was für den Admin wirklich schwer zu lesen sein dürfte.

Eine ganz einfache Möglichkeit der Umwandlung bietet Perl durch die Möglichkeit, die Suchergebnisse eines regulären Ausdrucks durch eine Callback-Funktion zu schicken:

echo 'W%F6rter+mit+%C4h%2C+%DCh+und+%D6h'
  | perl -pe 's/%([A-Fa-f0-9]{2})/pack("C", hex($1))/seg'

Nur die Pluszeichen (welche für Space eingesetzt werden) bleiben bestehen, das erschwert die Lesbarkeit jedoch kaum. Falls es doch stört, einfach das Ergebnis nochmal durch ‚tr‚ schicken…