Dateiverschlüsselung mit Linux

CryptSetup

CryptSetup initialisieren

Es muss ein verschlüsseltes Image nur ein einziges mal (bei der erstellung) initialisiert werden! Würde man die Initialisierung zu einem späteren Zeitpunkt wiederholen, dann würde man sich alle darauf befindlichen Daten löschen!

Als erstes sollte man cryptsetup installieren. Bei Ubuntu geht das so:

aptitude -y install cryptsetup

Als nächstes muss ein Container erstellt werden.

Das kann man so machen:

# dd if=/dev/zero of=/var/tmp/cryptodatei.img bs=1M count=700

oder so:

# touch /var/tmp/cryptodatei.img && shred -v -n1 -s700M /var/tmp/cryptodatei.img

Damit wir das gerade erstellte Image auch beschreiben können, muss dafür eine Loop-Gerätedatei angelegt werden.

# losetup -vf /var/tmp/cryptodatei.img
Loop device is /dev/loop0

In diesem Fall wurde für unser Image die Loop-Gerätedatei /dev/loop0 angelegt.

Jetzt wird die Loop-Gerätedatei mit dem verwendeten Verschlüsselungsalgorithmus verschlüsselt.

Sinnvoll sind hier nur zwei, da alle anderen momentan verfügbaren Algorithmen zu unsicher sind:

  1. twofish (sicher und schnell)
  2. serpent (sehr sicher und nur 3% langsamer als der US-Standard AES)

1998/1999 stellten sich Twofish, Serpent, Rijndael, MARS und RC6 dem Ausscheid zum AES (Advanced Encryption Standard). MARS, Twofish und Serpent wurden als „hoch-sicher“ eingestuft, während Rijndael und RC6 „nur“ die Bewertung „hinreichend-sicher“ erhielten.

Der Advanced Encryption Standard (AES) ist ein symmetrisches Kryptosystem, das als Nachfolger für DES bzw. 3DES im Oktober 2000 vom National Institute of Standards and Technology (NIST) als Standard bekannt gegeben wurde. Nach seinen Entwicklern Joan Daemen und Vincent Rijmen wird er auch Rijndael-Algorithmus genannt (gesprochen wie dt. „Reindahl“).

Und diese Bewertung liegt mittlerweile auch schon über 10 Jahre zurück… aus diesem Grund betrachte ich das beste auch nicht mehr als gut genug… aber etwas besseres gibt es noch nicht.

Wenigstens haben wir mit Serpent einen etwas besseren Algorithmus als AES, der aber nur 3% langsamer ist. Den Geschwindigkeitsnachteil wird man wohl in der Praxis nie bemerken und selbst bei Benchmarks mit der Lupe suchen müssen.

Gut, dann wollen wir mal mit dem verschlüsseln weiter machen:

cryptsetup -y -c serpent -h sha512 -s 256 luksFormat /dev/loop0
WARNING!
========
Daten auf /dev/loop0 werden unwiderruflich überschrieben.
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: 
Verify passphrase: 
Command successful.

Wichtig ist auch zu wissen, dass der Algorithmus nicht das alleinige Sicherheitsmerkmal hierbei ist! Die Verschlüsselungssoftware, die den Algorithmus verwendet, kann (bei einem schlechten Design) alles zu nichte machen. Solche Produkte gibt es auch unter Linux auch!

Jetzt wird das gerade verschlüsselte Image geöffnet, dazu muss natürlich das gerade gewählte Passwort verwendet werden:

cryptsetup luksOpen /dev/loop0 cryptodatei
Enter LUKS passphrase: 
key slot 0 unlocked.
Command successful.

Nun können wir uns den Status mal zeigen lassen:

cryptsetup status cryptodatei
/dev/mapper/cryptodatei is active:
  cipher:  serpent-cbc-plain
  keysize: 256 bits
  device:  /dev/loop0
  offset:  2056 sectors
  size:    1431544 sectors
  mode:    read/write

Um auf das Image Daten rauf schreiben zu können, fehlt noch ein Dateisystem. Das werden wir im folgenden Schritt auf das verschlüsselte Image schreiben.

Welches Dateisystem ist jetzt das geeignetste? Nun folgende sind recht gebräuchlich:

Als Dateisystem verwende ich meistens JFS oder ZFS, je nach Partitionsgröße und Verwendungszweck. In diesem Fall ist JFS die bessere Wahl, da es bei dieser Prozedur, zum zeigen einfach übersichtlicher ist.

Dazu muss es natürlich erstmal installiert werden:

aptitude -y install jfsutils

Dann kann es los gehen:

# mkfs -t jfs /dev/mapper/cryptodatei
mkfs.jfs version 1.1.12, 24-Aug-2007
Warning!  All data on device /dev/mapper/cryptodatei will be lost!
Continue? (Y/N) Y
   |
Format completed successfully.
715772 kilobytes total disk space.

Man sollte es sich zur Angewohnheit machen, immer vor dem mounten einer JFS-Partition ein fsck drüber zu jagen:

# fsck -y /dev/mapper/cryptodatei
fsck from util-linux-ng 2.16
fsck.jfs version 1.1.12, 24-Aug-2007
processing started: 3/23/2010 14.29.34
Using default parameter: -p
The current device is:  /dev/mapper/cryptodatei
Block size in bytes:  4096
Filesystem size in blocks:  178943
**Phase 0 - Replay Journal Log
Filesystem is clean.

Es tut nicht weh und ist schneller durch, als das mounten einer großen Partition mit ext3-Dateisystem!

Jetzt kann es gemountet werden:

# mount /dev/mapper/cryptodatei /mnt/

CryptSetup aushängen

Zuerst den mount lösen (abmontieren):

# umount /mnt/

Dann die Entschlüsselung entfernen (Tresor schließen):

# cryptsetup luksClose cryptodatei

Dann das Loop-Device anzeigen:

# losetup -a
/dev/loop0: [6801]:3585 (/var/tmp/cryptodatei.img)

Dann das Loop-Device lösen:

# losetup -d /dev/loop0

oder alles zusammen:

# umount /mnt/ && losetup -a | fgrep '/var/tmp/cryptodatei.img' | awk -F':' '{print $1}' | xargs losetup -d ${1}

CryptSetup einhängen

# losetup -vf /var/tmp/cryptodatei.img
Loop device is /dev/loop0

Jetzt die Datei entschlüsseln (den Tresor wieder öffnen):

# cryptsetup luksOpen /dev/loop0 cryptodatei
Enter LUKS passphrase: 
key slot 0 unlocked.
Command successful.

fsck:

# fsck -y /dev/mapper/cryptodatei
fsck from util-linux-ng 2.16
fsck.jfs version 1.1.12, 24-Aug-2007
processing started: 3/23/2010 14.29.34
Using default parameter: -p
The current device is:  /dev/mapper/cryptodatei
Block size in bytes:  4096
Filesystem size in blocks:  178943
**Phase 0 - Replay Journal Log
Filesystem is clean.

Zum Schluss an ein Verzeichnis montieren:

# mount -t jfs -o user /dev/mapper/cryptodatei /mnt/

Belegung des Archives zeigen:

# df -h
/dev/mapper/cryptodatei
                      696M  224K  696M   1% /mnt

Scripte zur einfacheren Handhabung

Hier möchte ich mein Script vorstellen, welches ich mir als „Schaltfläche“ hinterlegt habe um meine verschlüsselte Datei einzuhängen und wieder auszuhängen.

Dabei wird das Script in jedem Fall einmal als root aufgerufen und es ermittelt dann selbst ob die Datei eingehängt ist und ausgehängt werden soll oder ob sie erst eingehängt werden soll.

Ist sie schon eingehängt, wird nur das „root“-Passwort abgefragt um sie dann mit Root-Rechten sauber auszuhängen.

Soll sie erst eingehängt werden, dann wird zuerst das „root“-Passwort abgefragt und dann das Passwort zum entschlüsseln, fertig.

ein universelles Script zum ein- und aushängen

# vi /home/bin/cryptodatei_ein_aus.sh
#!/bin/bash
NUTZER="fritz"
CRYPTODATEI="/home/fritz/cryptodatei.img"
MDDEV="cryptodatei"
MONTIEREN="/home/${MDDEV}"
ALGORITHM="serpent"         # twofish (schnell+sicher) oder serpent (sehr sicher)
DATEISYST="jfs"             # jfs (sicher) oder xfs (keine Fragmentierung)
#
# aptitude install cryptsetup
#
if [ -z "${CRYPTODATEI}" ] ; then
      echo "Im Script-Kopf muss eine [cryptodatei.img] angegeben werden."
else
    if [ -e "/dev/mapper/${MDDEV}" ] ; then
      ### verschl. Datei ausklinken (umount)
      #
      umount ${MONTIEREN} && rm -r ${MONTIEREN}
      sync
      sleep 1
      cryptsetup status ${MDDEV} | head -n1
      cryptsetup luksClose ${MDDEV}
      cryptsetup status ${MDDEV} | head -n1
      sleep 1
      losetup -a | fgrep ${CRYPTODATEI} | awk -F':' '{print $1}' | xargs losetup -d ${1}
    else
      ### verschl. Datei einklinken (mount)
      #
      LOOPKOM="$(losetup -vf ${CRYPTODATEI} 2>&1)"
      # losetup: could not find any free loop device
      # losetup: Konnte kein freies „loop“-Gerät finden
      if [ "${LOOPKOM}" = 'losetup: Konnte kein freies „loop“-Gerät finden' -o "${LOOPKOM}" = 'could not find any free loop device' ] ; then
              echo "'${LOOPKOM}'"
      else
              LOOPDEV="$(echo "${LOOPKOM}"|awk '{print $NF}')"
              echo "'${LOOPDEV}'"
              sleep 1
              #
              ### nur zum initialisieren
              # cryptsetup -y -c ${ALGORITHM} -h sha512 -s 256 luksFormat ${LOOPDEV}
              #
              cryptsetup status ${MDDEV} | head -n1
              cryptsetup luksOpen ${LOOPDEV} ${MDDEV}
              # hier wird das Passwort abgefragt
              sleep 1
              cryptsetup status ${MDDEV}
              #
              ### nur zum initialisieren
              # mkfs -t ${DATEISYST} /dev/mapper/${MDDEV}
              #
              mkdir -p ${MONTIEREN}
              fsck -y /dev/mapper/${MDDEV} && chown ${NUTZER} /dev/mapper/${MDDEV}
              #
              EINKLINKEN="su - ${NUTZER} -c 'mount ${MONTIEREN}'"
              if [ "$(fgrep "${MONTIEREN}" /etc/fstab)" != "/dev/mapper/${MDDEV} ${MONTIEREN} ${DATEISYST} defaults,noauto,user 0 0" ] ; then
                      if [ "$(fgrep "${MONTIEREN}" /etc/fstab | wc -l)" -gt "0" ] ; then
                              EINKLINKEN="mount -t ${DATEISYST} /dev/mapper/${MDDEV} ${MONTIEREN}"
                              echo "${MONTIEREN}"
                      else
                              echo "/dev/mapper/${MDDEV} ${MONTIEREN} ${DATEISYST} defaults,noauto,user 0 0" >> /etc/fstab
                      fi
              fi
              ${EINKLINKEN}
      fi
    fi
fi
# chmod 0755 /home/bin/cryptodatei_ein_aus.sh

automatisches aushängen im Betriebssystem einrichten

Aus Sicherheitsgründen sollte wir noch zwei Automatissmen einbauen, die unsere verschlüsselte Datei automatisch aushängen.

  1. Der Wichtigste Grund ist die Dateisystemkonsistenz. Wenn der Rechner runter gefahren wird und Sie vergessen haben die verschlüsselte Datei auszuhängen, kann das Dateisystem beschädigt werden. Das kann zu Datenverlusst auf dem verschlüsselten Datenträger führen. Aber das ist ja bei jedem beschreibbaren Datenträger so.
  2. Ein Grund, den man nicht immer hat ist der, das man den Rechner hin und wieder mal unbeaufsichtigt lässt und dann die geschützten Daten, ungeschützt von anderen eingesehn werden können. So schlage ich ein automatisches aushängen vor, welches vom Betriebssystem regelmäßig um eine bestimmte Uhrzeit ausgeführt wird.

Dazu legen wir uns ein separates Stop-Script an. Würden wir dafür das „ein-Aus“-Script von oben verwenden, würde jedesmal, wenn der verschlüsselte Datenträger nicht eingehängt ist, ein Prozess gestartet werden, der nach der Passphrase fragt. Und das wäre sehr unschön.

Stop-Script:

# vi /home/bin/cryptodatei_aus_alle.sh
#!/bin/bash
#
# Dieses Script hängt alle eingehängten Crypto-Dateien aus.
#
for MDDEV in $(ls /dev/mapper/ | grep -v 'control')
do
      MONTIEREN="/home/${MDDEV}"
      LOOPDEV="$(cryptsetup status ${MDDEV} | grep '/dev/loop' | awk '{print $NF}')"
      CRYPTODATEI="$(losetup ${LOOPDEV} | awk '{print $NF}' | awk -F'(' '{print $2}' | awk -F')' '{print $1}')"
      umount ${MONTIEREN} && rm -fr ${MONTIEREN}
      sleep 1
      cryptsetup luksClose ${MDDEV}
      sleep 1
      losetup -a | fgrep ${CRYPTODATEI} | awk -F':' '{print $1}' | xargs losetup -d ${1}
      echo "${CRYPTODATEI} ist wieder frei"
done
# chmod 0755 /home/bin/cryptodatei_aus_alle.sh

Damit das Script beim runter fahren des Systems ausgeführt wird, muss man den Aufruf in die entsprechende Datei eintragen.

Das wird bei jeder Distribution anders gemacht:

  • Gentoo: “/etc/conf.d/local.stop“
  • SUSE : “/etc/sysconfig/shutdown“

Bei Gentoo muss dieses Script erst noch aktiviert werden, wie es bei SUSE aussieht weiß ich nicht, und bei Ubuntu muss man sich dafür selber ein Stop-Script schreiben.

Das Stop-Script für Ubuntu könnte zum Beispiel so aussehen:

# vi /etc/init.d/stop-crypt
#! /bin/sh
### BEGIN INIT INFO
# Provides:          stop-crypt
# Required-Start:    $local_fs $all
# Required-Stop:
# Default-Start:     
# Default-Stop:      0 6
# Short-Description: Stop Crypto-FS
# Description:       entfernt das Crypto-Dateisystem
### END INIT INFO
NAME=stop-crypt
[ -x "$DAEMON" ] || exit 0
case "$1" in
  stop)
      /home/bin/cryptodatei_aus_alle.sh
      ;;
  *)
      echo "Usage: $NAME {stop}" >&2
      exit 3
      ;;
esac

Jetzt am besten noch ausführbar machen:

# chmod 0755 /etc/init.d/stop-crypt

Dann muss das Script noch aktiviert werden:

# update-rc.d stop-crypt stop 20 0 6 .

Es ist auch Sinnvoll, im Sytem zu verankern, dass die verschlüsselte Datei automatisch um eine bestimmte Uhrzeit ausgehängt wird. Dann kann man es nicht vergessen (Sicherheit).

# vi /etc/crontab
00 20 * * * root /home/bin/cryptodatei_aus_alle.sh

Bedienung

als „root“:

# /home/bin/cryptodatei_ein_aus.sh

als „user“:

# su - -c /home/bin/cryptodatei_ein_aus.sh

oder bei Ubuntu

# sudo /home/bin/cryptodatei_ein_aus.sh

Diese Aufruffe kann man sich dann in seiner grafischen Arbeitsoberfläche als Schaltfläche oder „Knopf“ hinterlegen.

Beim aushängen erscheint folgendes:

Passwort: 
/dev/mapper/cryptodatei is active:
/dev/mapper/cryptodatei is inactive.

Beim Einhängen sieht das so aus:

Passwort: 
'/dev/loop0'
/dev/mapper/cryptodatei is inactive.
Enter passphrase for /dev/loop0: 
Key slot 0 unlocked.
/dev/mapper/cryptodatei is active:
  cipher:  serpent-cbc-plain
  keysize: 256 bits
  device:  /dev/loop0
  offset:  2056 sectors
  size:    1366008 sectors
  mode:    read/write
fsck from util-linux-ng 2.17.2
fsck.jfs version 1.1.12, 24-Aug-2007
processing started: 6/15/2010 17.27.34
Using default parameter: -p
The current device is:  /dev/mapper/cryptodatei
Block size in bytes:  4096
Filesystem size in blocks:  170751
**Phase 0 - Replay Journal Log
Filesystem is clean.
/home/cryptodatei

TrueCrypt

Kann direkt von der Webseite des Autors geholt werden: http://www.truecrypt.org/downloads

Dort bekommt man SUSE- und Ubuntu-Pakete in 32 und 64 Bit (entgegen der Aussage auf der Webseite ist es kein *.deb-Paket!).

TrueCrypt Installation

Das 32-Bit-Paket für Ubuntu wird im weiteren wie folgt installiert.

Als erstes mal root werden (Master of Desaster):

# su -

auspacken:

# tar xvzf Downloads/truecrypt-6.3a-ubuntu-x86.tar.gz
truecrypt-6.3a-setup-ubuntu-x86

installieren:

# sh truecrypt-6.3a-setup-ubuntu-x86
TrueCrypt 6.3a Setup
____________________
Installation options:
 1) Install truecrypt_6.3a-0_i386.deb
 2) Extract package file truecrypt_6.3a-0_i386.deb and place it to /tmp
To select, enter 1 or 2: 1
Before you can use, extract, or install TrueCrypt, you must accept the
terms of the TrueCrypt License.
Press Enter to display the license terms...

Jetzt erst [Enter] und dann [Ende] drücken

Do you accept and agree to be bound by the license terms? (yes/no): yes
Running package installer...
Wähle vormals abgewähltes Paket truecrypt.
(Lese Datenbank ... 229414 Dateien und Verzeichnisse sind derzeit installiert.)
Entpacke truecrypt (aus /tmp/truecrypt_6.3a-0_i386.deb) ...
Richte truecrypt ein (6.3a-0) ...
Verarbeite Trigger für desktop-file-utils ...
Press Enter to exit...

TrueCrypt Konfiguration

echo "%truecrypt ALL=(root) NOPASSWD:/usr/bin/truecrypt" >> /etc/sudoers

Diese Zeile bestimmt, dass die Gruppe truecrypt das Programm TrueCrypt mit Root-Rechten ohne jegliche Passwortabfrage benutzen darf.

Jetzt dann auch die Gruppe truecrypt anlegen:

# addgroup truecrypt
Lege Gruppe »truecrypt« (GID 1003) an ...
Fertig.

Und meinen unpreviligierten User hinzufühgen:

# adduser mhe truecrypt
Füge Benutzer »fritz« der Gruppe »truecrypt« hinzu ...
Adding user fritz to group truecrypt
Fertig.

So, und jetzt ist als klar zum abmarsch! ;-)

Mehr muss nicht erklärt werden, da TrueCrypt ein grafisches Programm ist und in der Bedienung keine sonderlichen Schwierigkeiten auftreten sollten.

 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:GNU Free Documentation License 1.2
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki