cryptfs

Entwickelt: 202? - schon länger her

Für heikle Daten, die andere Leute nix angehen, nutze ich verschlüsselte Dateisysteme. Ich verschlüssele nicht die komplette Platte (der Client ist ein stationärer Rechner und wird nicht in der Gegend rumgeschleift), die verschlüsselten Dateisysteme werden nur bei Bedarf eingehängt und auch wieder ausgehängt, wenn sie nicht mehr benötigt werden.

Vorarbeiten:
Du benötigst luks auf dem Rechner - sollte bei den gängigen Distributionen bereits installiert sein. Prüfen kannst Du das z. B. mit dem Kommando losetup -f - wenn das gefunden wird, dann ist alles im Lot, sonst installierst Du das über die Paketverwaltung nach.
FS anlegen:
Bevor Du mit einem verschlüsselten Dateisystem arbeiten kannst, musst Du es erstmal anlegen. Hinweis: Bei mir liegen die nachfolgenden Scripts im Home-Verzeichnis unter ~/bin/Cryptfile, ist aber kein Muss.

 1  #! /bin/bash
 2  # crypt_file_gen.sh: create a crypted file system

 3  # application files path
 4  export APP_PATH=/home/jan/bin/CryptFile
 5  # check for uid
 6  if test `id -u` -ne 0; then
 7    echo "script has to run as root, exiting"
 8    exit 1
 9  fi
10  # check for setup script
11  if test -z "" -o ! -x "$APP_PATH/"; then
12    echo "setup script not given or not executable, exiting"
13    echo "usage: script name-of-setup-script"
14    exit 1
15  fi
16  # get the variables
17  . $APP_PATH/
18  # create container file
19  dd if=/dev/urandom of=$CONTAINER_FILE bs=1M count=$BLOCK_SIZE
20  # setup loop device
21  losetup $LO_DEV $CONTAINER_FILE
22  # luks setup - password question
23  cryptsetup -c aes-xts-plain64 -y -s 512 luksFormat $LO_DEV
24  # open luks device
25  cryptsetup luksOpen $LO_DEV $LUKS_CONTAINER
26  # create a file system
27  mkfs.ext4 $LUKS_MAPPER
28  # mount the crypto device
29  mount -t ext4 $LUKS_MAPPER $CRYPT_MOUNTPT

30  exit 0
Der Ablauf:
  • Zuerst wird die UID geprüft, das Script muss als root aufgerufen werden.
  • Dann wird eine Environment-Datei eingelesen, siehe weiter unten
  • Eine Gerätedatei mit der gewünschten Größe wird angelegt
  • Diese Datei wird nun zum Generieren des verschlüsselten Device genutzt
  • Dann wird auf dem Device ein ext4-Dateisystem angelegt und gemountet
In Zeile 23 wird übrigens die Passphrase für das Device abgefragt - wenns wirklich sicher sein soll, dann denkst Du Dir ein schönes langes und komplexes aus - oder lässt es generieren. Dann entweder merken oder in einem Passwort-Safe speichern - das brauchst Du nämlich beim Mounten.

Das Environment:
Da man ja möglicherweise mehrere solche verschlüsselten Dateisysteme nutzt, bestimmt ein entspr. Script die Parameter des gewünschten FS. Das wird übrigens von allen Scripts hier genutzt und muss immer als Argument mitgegeben werden, wie Du es nennst ist Wurscht.

 1  #! /bin/bash

 2  # container file
 3  export CONTAINER_FILE=/datadisk/devel/secret/.data/data_dev
 4  # next available loop device
 5  export LO_DEV=`losetup -f`
 6  # luks device
 7  export LUKS_CONTAINER=data_container
 8  # device mapper
 9  export LUKS_MAPPER=/dev/mapper/$LUKS_CONTAINER
10  # mount point
11  export CRYPT_MOUNTPT=/datadisk/devel/secret/.data/data_mount
12  # block size (= kbytes)
13  export BLOCK_SIZE=8192

Rein ...
Um an die Daten ranzukommen, muss man das Device einhängen:

 1  #!/bin/bash
 2  # crypt_file_mount.sh: mount a crypted file system

 3  # application files path
 4  export APP_PATH=/home/jan/bin/CryptFile
 5  # check for uid
 6  if test `id -u` -ne 0; then
 7    echo "script hat to run as root, exiting"
 8    exit 1
 9  fi
10  # check for setup script
11  if test -z "" -o ! -x "$APP_PATH/"; then
12    echo "setup script not given or not executable, exiting"
13    echo "usage: script name-of-setup-script"
14    exit 1
15  fi
16  # get the variables
17  . $APP_PATH/
18  # mount if not yet mounted
19  if losetup -a | grep -q $CONTAINER_FILE; then
20    exit 0
21  else
22    losetup $LO_DEV $CONTAINER_FILE
23    cryptsetup luksOpen $LO_DEV $LUKS_CONTAINER
24    mount -t ext4 $LUKS_MAPPER $CRYPT_MOUNTPT
25  fi

26  exit 0
Im Dolphin z. B. taucht das Device nach dem Mount als 8,0 GB internes Laufwerk auf.

... und raus
Nach Benutzung räumst Du natürlich auf (Du bist ja ein ordentlicher Mensch):

 1  #!/bin/bash
 2  # crypt_file_umount.sh: umount a mounted crypted file system

 3  # application files path
 4  export APP_PATH=/home/jan/bin/CryptFile
 5  # check for uid
 6  if test `id -u` -ne 0; then
 7    echo "script hat to run as root, exiting"
 8    exit 1
 9  fi
10  # check for setup script
11  if test -z "" -o ! -x "$APP_PATH/"; then
12    echo "setup script not given or not executable, exiting"
13    echo "usage: script name-of-setup-script"
14    exit 1
15  fi
16  # get the variables
17  . $APP_PATH/
18  # overwrite loop device
19  LO_DEV=`losetup -a | grep "$CONTAINER_FILE" | sed "s/: .*//"`
20  # umount if mounted
21  if test -n "$LO_DEV"; then
22    umount $CRYPT_MOUNTPT
23    cryptsetup luksClose $LUKS_CONTAINER
24    losetup -d $LO_DEV
25  fi

26  exit 0

Helferlein:
Damit ich nicht jedesmal die Kommandos mit Pfad und Argumenten aufrufen muss (Du weisst ja - ich bin ein fauler Strick), habe ich mir 2 klitzekleine Bequemlichkeits-Shell-Scripts gebastelt und in ~/bin geparkt.

jan@jake:~$ cat bin/start_work
#! /bin/bash
export APP_PATH=/home/jan/bin/CryptFile
export SETUP_FILE=crypt_file_vars.sh
su -c "$APP_PATH/crypt_file_mount.sh $SETUP_FILE"
jan@jake:~$ cat bin/stop_work
#! /bin/bash
export APP_PATH=/home/jan/bin/CryptFile
export SETUP_FILE=crypt_file_vars.sh
su -c "$APP_PATH/crypt_file_umount.sh $SETUP_FILE"
jan@jake:~$ start_work
Passwort: 
Geben Sie die Passphrase für »/datadisk/devel/secret/.data/data_dev« ein: 
jan@jake:~$ stop_work
Passwort: 
jan@jake:~$