Für FileVault anderes Passwort nutzen als für Systemaccount

Apples FileVault hat, mal abgesehen von den Sicherheitsbedenken die man prinzipiell gegenüber nichtoffener Kryptosoftware haben sollte, ein riesiges Problem.

Das Userpasswort entspricht dem Passwort zum Entschlüsseln der Festplatte.

Für Verschlüsselung nutze ich gerne Passwörter die an die 30 Zeichen lang sind, um ein einfaches Erraten so unwahrscheinlich wie möglich zu machen. Mein Userpasswort habe ich gerne etwas kürzer, da ich es öfter eingeben muss.

Apple stellt uns hier vor die Qual der Wahl. Bequemlichkeit oder Sicherheit? Es geht erst mal nur eins von beidem, da für die Verschlüsselung kein separates Passwort vergeben werden kann.

Über einen kleinen Umweg ist es aber doch möglich, ein langes Passwort als einzige Angriffsfläche zu setzen.

Hierfür sind zwei Verhaltensweisen von OS X bzw. FileVault ausschlaggebend.

  1. Neue User werden automatisch berechtigt, mit ihrem Passwort die Festplatte zu entschlüsseln
  2. Wird für einen bereits bestehenden User ein leeres Passwort gesetzt, wird ihm die Berechtigung zum entschlüsseln entzogen.

Wenn wir das beides kombinieren, tut sich folgender Weg auf. Wir legen einen neuen User mit einem sehr langen (sicheren) Passwort an. Dieser bekommt automatisch das Recht zum Entschlüsseln. Unserem eigenen User setzen wir kurzzeitig ein leeres Passwort und entziehen ihm diese Berechtigung. Wir können die Festplatte jetzt nur noch mit dem langen Passwort des neuen Users entschlüsseln. Wir werden dann als dieser User angemeldet, können uns wieder ausloggen und mit unserem „Arbeitsuser“ wieder anmelden.

Ich arbeite mit dem Account chris. FileVault ist aktiviert und alles verschlüsselt. 

Ich lege jetzt in den Systemeinstellungen den User leia an und vergebe ein sehr langes Passwort. Anschließend öffne ich das Terminal und tippe passwd ein. Ich werde nach dem aktuellen Passwort gefragt und anschließend zwei mal nach dem Neuen. Die Frage nach dem Neuen bestätige ich einfach mit Return ohne eine Eingabe zu machen. Mein Passwort ist jetzt leer und ich kann die Festplatte nicht mehr entschlüsseln.

Dann führe ich passwd noch mal aus, bestätige die Frage nach dem aktuellen Passwort mit Return, da es ja leer ist, und vergebe als neues Passwort jenes, welches ich vorher hatte.

Wenn ich jetzt neu starte, kann ich mich nur noch als leia mit dem langen Passwort anmelden. Voilá, Ziel erfüllt!

Aus Backup-Script mit rsync und growl wird fabula-backup

In meinem Artikel „Mac: Inkrementelle Backups mit rsync und growl“ habe ich letztens mein Backup-Script für den Mac veröffentlicht, welches mit rsync und growl bei mir Time Machine ersetzt und wesentlich mehr Möglichkeiten bietet.

Da ich jetzt noch ein Bisschen daran rumgeschraubt habe und auch für die Zukunft noch ein paar Dinge geplant sind, habe ich mich entschlossen, das Teil zu GitHub zu schieben.

Hier gibt’s jetzt immer die aktuellste Version mit der Möglichkeit des Downloads und der Mitarbeit. Wenn es großartige Änderungen gibt, werde ich über neue Versionen auch hier berichten.

Aktuell sind wir bei Version 0.7.1 und es hat sich Folgendes getan:

  • Anstatt alles in einer log-Datei pro Ausführung zu dokumentieren, nutzt das Script jetzt den Syslog und schreibt ein Error-log nur, wenn Fehler aufgetreten sind. Es ist jetzt also näher an den Standardmethoden von OS X dran und müllt die Festplatte nicht mit Logfiles zu 😉
  • Die growl-Notifications sind jetzt nur sticky, wenn Fehler aufgetreten sind. Ansonsten verschwinden alle Benachrichtigungen, nach der von Euch eingestellten Zeit.

Für die Zukunft geplant ist noch eine stärkere Linux-Kompatibilität und evt. eine Setup-Prozedur o. Ä.

Mac: Inkrementelle Backups mit rsync und growl

Ich bin seit ca. einem halben Jahr Mac-User und wirklich zufrieden mit OS X. Das Einzige, was mich stört, ist Time Machine.

Ich habe meinen Home-Folder verschlüsselt in einem FileVault und meine restlichen Daten auf einer separaten, mit Truecrypt verschlüsselten, Partition liegen. Time Machine ist relativ beschränkt, wenn es darum geht, die Backups anzupassen. Um mein Verschlüsseltes Home-Verzeichnis zu sichern, muss ich mich ausloggen, MacOS komprimiert den FileVault und schmeißt ihn dann auf das Backup-Medium. Die Sicherung des Truecrypt-Volumes ist gar nicht möglich.

Da dies für eine Backup-Strategie, welche automatisch im Hintergrund läuft, denkbar unpraktisch ist, musste eine andere Lösung her.

Ich habe also ein Bisschen gegoogelt und mir aus verschiedenen Backup-Scripts Anregungen geholt. Heraus kam ein Backup-Script, welches die Backups ähnlich anlegt, wie Time Machine.

Ich konfiguriere die Quell-Ordner, gebe das Ziel-Medium an und der Rest geschieht im Hintergrund. Da rsync in meiner Configuration nur neue und geänderte Dateien übertragen muss und nicht veränderte Dateien einfach verlinkt werden, geht das Backup relativ schnell und verbraucht sehr wenig Platz. Bei jedem Durchlauf wird ein neuer Ordner angelegt, welcher immer ein Vollbackup enthält. Wenn sich keine Dateien verändert haben, wird aber kein zusätzlicher Platz verbraucht.

Am Ende jedes Durchlaufs werde ich per growl benachrichtigt, dass das Backup gemacht wurde und ob es Fehler gab.

Alles in allem funktioniert jetzt alles so, wie ich es will. Das Script läuft stündlich per cron im Hintergrund und ich brauche mich um nichts zu kümmern. Trotzdem habe ich Gewissheit, dass alle meine Daten gesichert sind, falls etwas passiert.

Folgenden Code einfach in eine Textdatei packen, mit root-Rechten ausführen und glücklich sein 🙂

P.S.: Der Code funktioniert auf jedem System, af dem rsync läuft (Linux, Unix, Windows mit Cygwin). Hier muss dann aber unter Umständen auf die Benachrichtigungen verzichtet werden, wenn Ihr das Script nicht an des Benachrichtigungssystem Eures Betriebssystem anpassen wollt (z.B. notify-bin in Ubuntu).


#!/bin/bash

# --- Set backup parameters ---
 
# What local files/folders are we backing up (without trailin "/")?

SOURCES='/bin /private/etc /sbin /etc /usr /opt /Volumes/Macintosh/Library /Volumes/Macintosh/System /Volumes/Macintosh/Users/chris /Volumes/Macintosh/Applications /Volumes/Daten'

# What location shall we back up to (without trailin "/")?
DEST='/Volumes/Elements'

# Any non-valuable stuff to exclude by name/location (seperated by ",")?
EXCLUDE='.DS_Store,/.chris/,.Trash/,tmp/,LastPass/pipes/,log/,.log'


# --- Get some data and make some declarations ---

# What's the local hostname?
HOST=`hostname -fs`

# Get the date
DATE=`date "+%Y-%m-%d-%H%M%S"`

# Set the folder for backups for this host
BACKUPPATH="$DEST/Backup/$HOST"

# Where shall we write the error log?
ERRORS="$BACKUPPATH/errors-$DATE.log"

# --- Set Growl parameters ---
 
# What will this script be called in the Growl prefpane?
GROWLNAME="Backup of $HOST"
 
# And what app's icon will appear in Growl notifications?
APPICON="/Users/chris/bin/Time-Machine.icns"

# --- Do it! ---

# Check if $DEST is mounted. Otherwise quit script
DESTMOUNTED=`mount | grep "$DEST"`
 
if [ -z "$DESTMOUNTED" ]; then
  /bin/growlnotify --name "$GROWLNAME" --image "$APPICON" 
    --message "$DEST is not mounted." "Ignoring scheduled backup"
  exit 1
fi 


 
PROCS=`ps -A -o "pid=,command="`
MYNAME="$0"
MYBASENAME=`basename $MYNAME`
MYPID=$$
 
# The next line works like so:
# * take the process list (for all users),
# * filter *in* processes named like this script (making sure we're on word boundaries),
# * filter *out* (-v) the one that *is* this script (by PID), and finally
# * filter *out* the grep commands themselves.
 
MERUNNING=`echo "$PROCS" | grep -E -e "b$MYBASENAMEb" 
  | grep -E -v "b$MYPIDb" | grep -v grep`
 
# Then, if anything's left (i.e. MERUNNING isn't a zero-length string...)
 
if [ ! -z "$MERUNNING" ]; then
  /bin/growlnotify --name "$GROWLNAME" --image "$APPICON" 
    --message "Another backup seems to be in progress" "Ignoring scheduled backup"
  exit 1
fi 

EXPEXCLUDES=`eval "echo --exclude={$EXCLUDE} "`

STARTTIME=`date "+%Y-%m-%d %H:%M:%S"`

/bin/growlnotify --name "$GROWLNAME" --image "$APPICON" --message "Backup of $HOST has been startet at $STARTTIME"
echo "Backup of $HOST has been startet at $STARTTIME" >> $ERRORS

for D in $SOURCES; do
    mkdir -p $BACKUPPATH/$DATE.inProgress$D
    rsync -aH $EXPEXCLUDES --link-dest=$BACKUPPATH/current$D $D/ $BACKUPPATH/$DATE.inProgress$D 2>>"$ERRORS"
done

FINISHTIME=`date "+%Y-%m-%d %H:%M:%S"`

NUMERRORS=`awk '{x++}END{ print x}' $ERRORS`
NUMERRORS=$[$NUMERRORS-1]

/bin/growlnotify --name "$GROWLNAME" --image "$APPICON" -s 
  --message "Completed backup of $HOST at $FINISHTIME. There were $NUMERRORS errors." "$HOST has been backed up to $DEST."
echo "Completed backup of $HOST at $FINISHTIME. There were $NUMERRORS errors." >> $ERRORS

mv $BACKUPPATH/$DATE.inProgress $BACKUPPATH/$DATE

rm -f "$BACKUPPATH/current" && ln -nsf "$BACKUPPATH/$DATE/" "$BACKUPPATH/current"