Ich bin ja paranoid und weil das so ist, habe ich beschlossen, irgendwie meine Mailbox zu verschluesseln. Nun verwende ich FreeBSD und musste erstmal herausfinden, wie man das da so idealerweise mit Bordmitteln macht. Ich habs herausgefunden, was ich mal aufzeigen muechte.

Die Idee ist, eine Datei zu haben, die verschluesselt ist. Es soll ein Image sein, das man on-the-fly mounten kann um darauf zuzugreifen und es soll sich automatisch unmounten.

Fuer alle Aktionen sind ROOT Rechte noetig, das mounten selbst kann man aber dann spaeter einem User erlauben.

Als erstes erzeugen wir mal ein leeres File mit einer Groesse um die 100MB:

    # dd if=/dev/zero of=memraw.f bs=1024 count=102400

Dieses File mounten wir mit mdconfig(8):

    # mdconfig -a -t vnode -f memraw.f

Ein Filesystem brauchen wir darauf nicht erzeugen, das machen wir der spaeter im GELI Container.

Nun brauchen wir ein File mit RANDOM Daten, die fuer den Schluessel verwendet werden:

    # dd if=/dev/random of=md1.key bs=64 count=1

Das wars mit den Vorbereitungen, man haette auch einfach eine Partition nehmen koennen, aber bei mir ist alles voll und ich habe keine Lust meinen GEOM Mirror im laufenden Betrieb umzubauen. Zumal ein File den Vorteil hat, dass man es mitnehmen kann (auf nem Stick zb).

Als erstes Initialisieren wir nun einen neuen GELI Provider mit dem Namen md1 unter Verwendung des von uns vorher erstellten Schluesselfiles:

    # geli init -s 4096 -K md1.key /dev/md1

Diesen Provider koennen wir nun "attachen", dabei wird das Keyfile mit einer Passphrase, die abgefragt wird, entschluesselt und ein neuer GEOM Provider mit dem Namen des GELI Providers plus .eli angelegt, also md1.eli:

    # geli attach -d -k md1.key /dev/md1
    Enter passphrase: ******

Nun wollen wir nicht, dass etwaige Schnueffler auch nur im Ansatz erahnen koennen, an welcher Stelle in dem File sich denn echter Content befindet, darum schreiben wir erst mal RANDOM Binaerdaten hinein:

    # dd if=/dev/random of=/dev/md1.eli bs=1m

und legen endlich ein Filesystem an (man haette es sogar noch partitionieren koennen):

    # newfs /dev/md1.eli

Und nun koennen wir letzlich das verschluesselte File mounten:

    # mkdir encrypted/
    # mount /dev/md1.eli encrypted/
    # ls -la encrypted/
    total 58
    drwxr-xr-x    3 root     wheel         512 Feb 28 12:01 ./
    drwxr-xr-x    3 root     wheel         512 Feb 28 11:57 ../
    drwxrwxr-x    2 root     operator      512 Feb 28 11:57 .snap/
    -rw-r--r--    1 root     wheel       45963 Feb 28 12:01 messages

Na das hat ja prima geklappt. Zu guter Letzt schauen wir noch nach, ob der GELI Provider tatsaechlich geladen ist (nicht dass wir was falsch gemacht haben und nur einen normalen GEOM Provider verwenden, welcher also nicht verschluesselt waere!):

    # geli status
    Name  Status  Components
    md1.eli     N/A  md1

und:

    # geli list
    Geom name: md1.eli
    EncryptionAlgorithm: AES-CBC
    KeyLength: 128
    Crypto: software
    UsedKey: 0
    Flags: W-DETACH, W-OPEN
    Providers:
    1. Name: md1.eli
       Mediasize: 104853504 (100M)
       Sectorsize: 4096
       Mode: r1w1e1
    Consumers:
    1. Name: md1
       Mediasize: 104857600 (100M)
       Sectorsize: 512
       Mode: r1w1e1

Richtig fein ist, dass der GELI Provider automatisch detached wird (durch die Option -d, siehe oben), wenn man ihn umountet. Dadurch kann es nicht passieren, dass unverhofft doch noch wer an die Daten rankommt.

Also, ab dafuer:

    # umount encrypted/

Der Vollstaendigkeit halber sei hier noch erwaehnt wie man ihn manuell detached:

    # geli detach /dev/md1.eli 

Ueberzeugt?

Hier gibts mehr davon: geli(8) und FreeBSD Partitionen verschluesseln.

[UPDATE]

Inzwischen hab ich den Kram in ein Skript verpackt. Man kann alles interessante einstellen im Skript. Sollte man die Absicht haben, es als normaler user laufen zu lassen, dann ist die Installation von sudo zu empfehlen.

=begin text

#!/bin/sh

keyfile=".cryptmbox.md2.key" cryptofile="cryptombox" mountpoint="mailbox" md="2" geli="sudo geli" mount="sudo mount" umount="sudo umount" chown="sudo chown" cmd="/usr/local/bin/mutt"

if test -e /dev/md$md; then echo "backingstore $cryptofile for memdisk md$md already created" else mdconfig -a -t vnode -f $cryptofile -u $md fi

if $geli dump /dev/md$md | grep "magic: GEOM::ELI" > /dev/null 2>&1; then echo "md$md already initialized" else $geli init -s 4096 -K $keyfile /dev/md$md fi

if $geli status /dev/md$md.eli | grep md$md.eli > /dev/null 2>&1; then echo "md$md.eli already attached" else $geli attach -d -k $keyfile /dev/md$md $mount /dev/md$md.eli $mountpoint $chown -R $user $mountpoint fi

$cmd $umount $mountpoint

=end text