Im Linux-Kernel eingebaut ist ja nun schon seit geraumer Zeit das Crypt-Target
des Device-Mappers, mit dem sich transparent ganze Partitionen auf der
Platte verschlüsseln lassen. Das verwende ich schon länger um mein
Notebook komplett zu verschlüsseln und so im Falle eines
Diebstahls/Verlustes wenigstens nicht gleich meine ganzen privaten
Daten im Netz zu finden. Für ein Projekt brauche ich in Zukunft
allerdings ein wenig mehr: einen Container, der im normalen Betrieb
nicht offen ist, sondern nur wenn ich mit den Daten arbeite, die sich
darin befinden (man weiß ja nie, ob nicht unter Umständen unter dem
eigenen Nutzer mal was Amok läuft). Recht bequem löst man das mit TrueCrypt:
Container anlegen, im TrueCrypt auf "Mounten" klicken, Passwort
eingeben, fertig (so zumindest unter Windows. TrueCrypt unter Linux hab
ich noch nicht benutzt). Nun will ich mir nicht noch ein Tool
installieren, schließlich hab ich mit dm-crypt schon ein erprobtes zur
Verfügung. Leider kann dieses nur Devices verwalten und keine Dateien
als Container direkt ansprechen. Macht aber nichts, wozu gibt es
loop-Devices?
Die Schritte sind also ganz einfach: loop-Device auf der
Container-Datei anlegen, mittels cryptsetup öffnen lassen und unter
einem Mountpoint einhängen. Weil mir das zuviel Tipperei ist, hab ich
zwei einfache Skripte zusammengebaut, die den kompletten Ablauf
übernehmen.
Skript #1 ist zum Öffnen eines Container da. Einfach: ./mount_container.sh <containerdatei> <mountpoint>
als root (oder mittels sudo
) ausführen, Passwort eingeben und schon hängt der Container unter dem angegebenen Mountpoint.
mount_container.sh
#! /bin/bash
if [ x$1 == x ]; then
echo "Usage: $0 <imagefile> <mountpoint>"
exit 1
fi
DIRECTORY=$(dirname $1)
IMAGENAME=$(basename $1)
CUR_DIR=$(pwd)
if [ ! "x$DIRECTORY" == x ]; then
cd "$DIRECTORY"
fi
IMAGEPATH=$(pwd)/"$IMAGENAME"
MAPPERNAME=$(echo "$IMAGEPATH" | sha1sum | cut -d" " -f 1) # we use the sha1sum of the image path as mapper device
echo "Mapping $IMAGEPATH to device /dev/mapper/$MAPPERNAME"
MP_TMP=$(losetup -a | grep "$IMAGEPATH" | cut -d':' -f 1)
if [ x$MP_TMP == x ]; then
echo "Setting up loop device"
losetup -f "$IMAGEPATH"
fi
DEVICE=$(losetup -a | grep "$IMAGEPATH" | cut -d':' -f 1)
C_TMP=$(cryptsetup status $MAPPERNAME | grep " active")
echo $C_TMP
if [ x$C_TMP == x ]; then
echo "Opening LUKS device $DEVICE"
cryptsetup luksOpen "$DEVICE" $MAPPERNAME
fi
mount /dev/mapper/$MAPPERNAME "$2"
Irgendwann ist die Arbeit im Container dann mal beendet und man möchte ihn wieder aushängen. Dazu gibt es das Skript umount_container.sh
(ebenfalls wieder als root oder via sudo
ausführen:
umount_container.sh
#! /bin/bash
#! /bin/bash
if [ x$1 == x ]; then
echo "Usage: $0 <mount point>"
exit 1
fi
MAPPER_DEVICE_NAME=$(mount | grep "$1" | cut -d' ' -f 1 | cut -d'/' -f 4)
if [ x$MAPPER_DEVICE_NAME == x ]; then
echo "$1 is not a mounted device."
exit 1
fi
if [ x"$(cryptsetup status $MAPPER_DEVICE_NAME | grep ' active')" == x ]; then
echo "$1 does not seem to be a mounted dm-crypt device"
exit 1
fi
umount "$1"
DEVICE=$(cryptsetup status $MAPPER_DEVICE_NAME | grep device: | cut -d ' ' -f 5)
cryptsetup luksClose $MAPPER_DEVICE_NAME
LO_TMP=$(losetup -a | grep "$DEVICE")
if [ ! x"$LO_TMP" == x ]; then
losetup -d "$DEVICE"
fi
Angelegt wird der Container ganz klassisch als loop
-Device: Anleitung aus dem Gentoo Linux Wiki. Danach kann man ihn ganz einfach mittels der Skripte benutzen.
Tipp: Wenn man den Container als normaler Benutzer
verwenden will (also ohne root-Rechte), dann sollte man als root
einmalig nach dem Anlegen und Einhängen ein chown -R <nutzer>
auf den Mountpoint machen. Zugriffsrechte auf das Verzeichnis kann man
natürlich auch gleich noch entsprechend setzen, damit nicht jeder drin
rumwurschteln kann.