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
Tags for this page:
encrypt
freebsd
geli
image
verschlüsseln