fbsd 4.8 -- vncrypt

Elessar

Huldigt dem _/\_
So, hab mir gestern mein vncrypt eingerichtet und will eigenltich nur fragen ob ich was uebersehen hab, sprich ob noch irgendwo nachzubessern is.
Also warum nicht gleich in Tutorial Form erklaeren was ich gemacht hab, kritisieren koennts dann immernoch :D

Was ist vncrypt?
This is cryptographic disk driver for FreeBSD.It provides transparent encryption and decryption of selected devices. It is based on vn(4).

Evtl kennt ja jemand PGP-Disk aus der Fensterwelt, das System ist aehnlich. Es wird eine verschluesselte Datei im normalen Dateisystem erzeugt und diese wie ein Laufwerk gemountet.

Fuer freeBSD 5.x funktioniert das ganze scheinbar analog ueber md.

Einrichten wollen wir die vncrypt Disk fuer den User 'foo', Mitglied der gruppe 'bar'. Er hat keine Rechte *hrrhrr*

-2. Einloggen mit einem SuperUser (oder sudo etc.pp.)
-1. Aktualisieren der Ports
0. Installieren von 'sudo' falls noch nicht geschehen
1.
Code:
mkdir /crypto
mknod /dev/vnc0 c 120 0x00010002
mknod /dev/vnc0a c 120 0
mknod /dev/vnc0b c 120 1
mknod /dev/vnc0c c 120 2
mknod /dev/vnc0d c 120 3
mknod /dev/vnc0e c 120 4
mknod /dev/vnc0f c 120 5
mknod /dev/vnc0g c 120 6
mknod /dev/vnc0h c 120 7
cd /usr/ports/security/vncrypt && make install clean
Wir haben nun ein Verzeichnis in dem wir unsere Dateien ablegen koennen (/crypto), wir haben Device Eintraege und wir haben den Port installiert.

2.
Code:
cd /crypto
dd if=/dev/urandom of=foo bs=512 count=1331200
vncryptctl -v makekey -a aes-multi -l 32 -s 32 foo.key
kldload vncrypt
Wir haben nun unsere Traegerdatei /crypto/foo - in diesem Beispiel 650MBytes gross, passend fuer Standard CD-R. Als Grundlage dient uns random noise.
Ausserdem haben wir einen Schluessel erzeugt, unter Verwendung des Algorithmus aes-multi - Rijndael im Multi-Key CBC Mode. Hierbei wird jeder Sektor der Datei mit einem eigenen SubKey verschluesselt der vom MasterKey abgeleitet wird. Die Laenge von Master und Sub Keys wird mit -l n -s n angegeben. Hier im Beispiel werden 32 Byte (=256 Bit) Schluessel verwendet.
Beim generieren wird eine Passphrase abverlangt. Bitte ausreichend lang waehlen :p
Zu guter letzt laden wird das notwendige Kernel Modul.

3.
Code:
vnconfig -s labels -e /dev/vnc0 foo
vncryptctl enable /dev/vnc0 foo.key
dd if=/dev/urandom of=/dev/vnc0 bs=512
disklabel -r -w vnc0 auto
newfs /dev/vnc0c
tunefs -n enable -o space -m 0 /dev/vnc0c
vnconfig -u /dev/vnc0
So, zu allererst stellen wir /crypt/foo als Geraet zur Verfuegung (vnconfig). Dann aktivieren wird die Verschluesselung fuer dieses Geraet (vncryptctl)unter Angabe des zu verwendenden Schluessels. Hier muss man sich an die Passphrase erinnern.
Nun geht es noch einmal mit random noise ueber die Datei. Dieser Datenmuell wird nun bereits verschluesselt abgelegt :D
Nachdem alles soweit praepariert ist erzeugen wir uns ein Standard disklabel auf dem Slice. In diesem Fall bekommen wir vnc0c als einzigen Eintrag, dangerously dedicated. fdisk koennen wir uns sparen, gebootet werden kann davon eh nicht. Wer mehrere BSD-Partitionen im Slice will kann sich hier nach Herzenslust austoben.
Wenn wir mit unseren BSD-Partitionen zufrieden sind initialisieren wir das Dateisystem (newfs) und passen es unseren Wuenschen an (tunefs).
In meinem Fall waehlte ich:
  • Soft-Updates eingeschaltet
  • Optimiert auf Speicherplatz und nicht Zeit
  • Kein reservierter Speicherplatz
Zu guter letzt schalten wir das virtuelle Geraet wieder ab (vnconfig -u) und machen so wieder eine ganz normale Datei aus /crypto/foo.

4.
Code:
echo vncrypt_load="YES" >> /boot/loader.conf
vi crypt-foo.sh    1)
visudo                2)
chown foo:bar foo foo.key
chown root:wheel crypt-foo.sh
chmod 400 foo.key
chmod 600 foo
chmod 500 crypt-foo.sh
mkdir ~foo/cryptodisk
chown foo:bar ~foo/cryptodisk
chmod 700 ~foo/cryptodisk
Eintrag in der Bootloader Conf damit der das vncrypt modul brav beim Systemstart geladen wird.
Anlegen des Skriptes crypt-foobar.sh, Listing folgt.
Editieren der sudo Konfiguration. Einer leeren/default Configuration einfach die Zeile
Code:
foo  foobox = /crypto/crypt-foo.sh
anhaengen, wobei foo wie gesagt der Username und foobox der Hostname des Rechners ist.
Danach erzeugen wir den Mountpoint im ~ des Users und setzen ein paar Zugriffrechte etwas restriktiver.

crypt-foo.sh
Code:
#!/bin/sh

case "$1" in
enable)
        vnconfig -s labels -e /dev/vnc0 /crypto/foo
        vncryptctl enable /dev/vnc0 /crypto/foo.key
        mount /dev/vnc0c ~foo/cryptodisk
        ;;
disable)
        umount ~foo/cryptodisk
        vnconfig -u /dev/vnc0
        ;;
*)
        echo "Usage: `basename $0` {enable|disable}" >&2
        exit 64
        ;;
esac

exit 0
Was macht das Skript?
Enable:
1. "Enable and configure" des vn-Devices
2. Einschalten der Verschluesselung (Passphrase Prompt)
3. Mounten des Dateisystems
Disable:
1. Unmounten des Dateisystems
2. "Disable and Unconfigure" des vn Devices <<WICHTIG!
Die Initialisierung der Verschluesselung bleibt nach einem unmount erhalten. Kann also weiterhin entschluesselt normal gemountet werden. Erst das "disable und unconfigure" schaltet die Entschluesselung ab, fuer ein erneutes mounten ist jetzt wieder die Passphrase notwendig.
Ein Mountversuch ohne vncryptctl enable fuehrt uebrigens zu einem "Error: Incorrect Superblock".

Ergebnis:
Wir haben jetzt ein Crypto-Dateisystem fuer unseren unpriviligierten User foo das er mit "sudo /crypto/crypt-foo.sh enable" in sein ~ einbinden kann und mit "sudo /crypto/crypt-foo.sh disable" wieder herausloesen, ohne das er zu viele Rechte im System bekommt oder gar setuid auf vnconfig gesetzt werden muss.
Das ganze kann fuer so viele User angelegt werden wie vn Devices moeglich sind (kennt da jemand Zahlen?), und ist sicher auch per Skript automatisiert erstellbar so das sich jeder User wenn er will sein cryptfs anlegen kann.

Hab isch was uebersehen?
 
Zuletzt bearbeitet:
mal ne ganz dumme frage:
wenn wir das als /crypt anlegen, wird dann der ganze kram nicht in der / partition angelegt, also auh die 650MB grosse Datei?
mein / ist nämlich nur 128MB gross...

ab 5.0 gabs da auch ne neue möglichkeit oder?

gruss Male
 
Hab isch was uebersehen?

Ja, jeder der den dd Durchgang in endlicher Zeit hinter sich bringen will, sollte als Sektorgroesse nicht 512 nehmen, sondern Vielfache davon (Am besten gleich 1024k, wozu gibts den Festplattencaches?)

Und die Parameter fuer das Skript wuerde ich start|stop nennen, nicht enable|disable, in Anlehnung an die Skripte in rc.d

Ansonsten ganz brauchbar :)
 
Zurück
Oben