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

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

Für alle Aktionen sind ROOT Rechte nötig, das mounten selbst kann man aber dann später einem User erlauben.

Als erstes erzeugen wir mal ein leeres File mit einer Grösse 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 später im GELI Container.

Nun brauchen wir ein File mit RANDOM Daten, die für den Schlüssel verwendet werden:

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

Das wars mit den Vorbereitungen, man hätte auch einfach eine Partition nehmen können, 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 Schlüsselfiles:

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

Diesen Provider können wir nun "attachen", dabei wird das Keyfile mit einer Passphrase, die abgefragt wird, entschlüsselt 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 Schnüffler auch nur im Ansatz erahnen können, an welcher Stelle in dem File sich denn echter Content befindet, darum schreiben wir erst mal RANDOM Binärdaten hinein:

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

und legen endlich ein Filesystem an (man hätte es sogar noch partitionieren können):

 # newfs /dev/md1.eli 

Und nun können wir letzlich das verschlüsselte 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 tatsächlich geladen ist (nicht dass wir was falsch gemacht haben und nur einen normalen GEOM Provider verwenden, welcher also nicht verschlüsselt wäre!):

 # 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 dafür:

 # umount encrypted/ 

Der Vollständigkeit halber sei hier noch erwähnt wie man ihn manuell detached:

 # geli detach /dev/md1.eli 

Überzeugt?

Hier gibts mehr davon: geli(8) und FreeBSD Partitionen verschlüsseln.

[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.

#!/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