[[Vorlage(Getestet, bionic, focal, jammy)]] 

[[Vorlage(Fortgeschritten)]]

{{{#!vorlage Wissen
[:Terminal: Ein Terminal öffnen]
[:sudo: Root-Rechte]
[:LUKS:Verschlüsselte Partitionen mit LUKS]
}}}

[[Inhaltsverzeichnis()]]

In diesem Artikel wird beschrieben, wie man [:LUKS:] mit einer Container-Datei verwendet.

= Vorbereitung =
Die Vorbereitung ist identisch mit der des [:LUKS:LUKS-Artikels]. Dieser sollte zuerst durchgearbeitet und verstanden werden.

= Container anlegen =
Der Container ist eine einfache Datei, die man mit Zufallsdaten füllt. Mit dem folgenden Befehl wird ein 250 MB großer Container mit dem Namen '''container_file''' angelegt[1].

{{{#!vorlage Befehl
dd if=/dev/urandom of=container_file bs=1M count=250
}}}

{{{#!vorlage Hinweis
Die nächsten vier Befehle kann man auch zusammenfassen:

{{{#!vorlage Befehl
sudo cryptsetup -c aes-xts-plain64 -s 512 -h sha512 -y luksFormat container_file
sudo cryptsetup luksOpen container_file container
\}}}
}}}

Diese Container hängt man jetzt über ein Loop-Device ein. Dieser Befehl gibt zunächst ein freies Loop-Device zurück, z.B.: '''/dev/loop20''' [2]

{{{#!vorlage Befehl
sudo losetup -f
}}}

Jetzt hängt man den Container ein. Durch das Loop-Device kann man die Datei wie eine normale Partition/Festplatte ansprechen.
{{{#!vorlage Befehl
sudo losetup /dev/loopX container_file
}}}

'''/dev/loopX ''' muss durch das freie Loop-Device ersetzt werden.

Als nächstes muss man den Container mit `cryptsetup` initialisieren und den Algorithmus (siehe Manpage von cryptsetup) festlegen. Hier wird auch das Passwort abgefragt. [3] Beispiel:

{{{#!vorlage Befehl
sudo cryptsetup -c aes-xts-plain64 -s 512 -h sha512 -y luksFormat /dev/loopX 
}}}

Jetzt kann man den Container mit `cryptsetup` öffnen. Das Argument `container` steht für den Namen, unter dem das Gerät unter '''/dev/mapper/''' erstellt werden soll. Wenn man mehrere verschlüsselte Container verwendet, muss man darauf achten, dass kein Name doppelt verwendet wird.

{{{#!vorlage Befehl
sudo cryptsetup luksOpen /dev/loopX container
}}}

Als nächstes muss ein Dateisystem angelegt werden (siehe [:Formatieren:]). Beispiel:

{{{#!vorlage Befehl
sudo mkfs.ext4 /dev/mapper/container
}}}

Mit

{{{#!vorlage Befehl
sudo mount -t ext4 /dev/mapper/container /mnt
}}}

kann man den Container einhängen.

Mit

{{{#!vorlage Befehl
sudo chown -R username /mnt
}}}

kann man den Nutzer `username` zum Besitzer des eingehängten Containers machen, sodass der Container im Dateimanager wie üblich genutzt werden kann.

Nachdem man sich seinen Container erstellt hat, kann er über folgenden Ablauf eingehangen und wieder ausgehangen werden.

= Container einhängen =
== Kommandozeile ==
=== Mit Superuser Rechten ===

{{{#!vorlage Hinweis
Die nächsten drei Befehle kann man auch zusammenfassen:
{{{#!vorlage Befehl
sudo cryptsetup luksOpen container_file container
\}}}
}}}

Ein freies Loop-Device finden. [1][2]
{{{#!vorlage Befehl
sudo losetup -f
}}}

Die Datei '''container_file''' an das Loop-Device binden.

{{{#!vorlage Befehl
sudo losetup /dev/loopX container_file
}}}

Den Container mit `cryptsetup` öffnen:

{{{#!vorlage Befehl
sudo cryptsetup luksOpen /dev/loopX container
}}}

Und zuletzt das Dateisystem mounten.

{{{#!vorlage Befehl
sudo mount -t ext4 /dev/mapper/container /mnt
}}}


{{{#!vorlage Hinweis
Die letzten beiden Befehle (Öffnen und Mounten) können auch grafisch über den Dateimanager [:Nautilus:] erfolgen.
}}}

=== Im Userspace ===

Mit

{{{#!vorlage Befehl
udisksctl loop-setup -f container_file
}}}

das loopdevice erstellen, dann mit

{{{#!vorlage Befehl
udisksctl unlock -b /dev/loopX
}}}

entsperren und schließlich via

{{{#!vorlage Befehl
udisksctl mount -b /dev/dm-Y
}}}

das entsperrte loopdevice mounten.

== Nautilus ==
Wenn der Container die Endung '''.iso''' hat, kann man diesen in Nautilus per rechtem Mausklick auf die Datei und Auswahl von "Laufwerksabbilder einhängen" im Nur-Lese-Modus mounten.

= Container aushängen =

Dateisystem aushängen. [1][2]

{{{#!vorlage Befehl
sudo umount /mnt
}}}

Container mit cryptsetup schließen.

{{{#!vorlage Befehl
sudo cryptsetup luksClose container
}}}

Loop-Device schließen.

{{{#!vorlage Befehl
sudo losetup -d /dev/loopX
}}}

bzw.

{{{#!vorlage Befehl
udisksctl unmount -b /dev/dm-y
udisksctl lock -b /dev/loopX
udisksctl loop-delete -b /dev/loopX
}}}

{{{#!vorlage Hinweis
Wer den Container zuvor mit [:Nautilus:] eingehängt hat, der sollte ihn auch darüber wieder aushängen. Dadurch müssen die beiden oberen Befehle nicht angewandt werden.
}}}

= Container vergrößern =

{{{#!vorlage Warnung
Es sind Datenverluste möglich! Vorher sollte ein Backup erstellt werden [:Sicherheit#Sicherungskopien:].
}}}

Zunächst muss der Container [#Container-aushaengen ausgehängt] werden.

Danach vergrößert man die Container-Datei beliebig, in diesem Beispiel um 100 MB. [1]

{{{#!vorlage Befehl
dd if=/dev/urandom bs=1M count=100 >> container_file
}}}

Danach [#Container-einhaengen hängt] man den Container ein, aber ohne das Dateisystem zu mounten.

Mit [2]

{{{#!vorlage Befehl
sudo cryptsetup resize container
}}}

verwendet `cryptsetup` den gesamten verfügbaren Platz in der Container-Datei.

Um das Dateisystem an die neue Größe anzupassen, kann man folgenden Befehl verwenden. Man sollte vor und nach dem Befehl eine Dateisystemprüfung durchführen.

{{{#!vorlage Befehl
resize2fs /dev/mapper/container
}}}

= Skripte =
Mit den folgenden Skripten kann man beliebige Container automatisch ein- und aushängen. Die Skripte müssen mit Root-Rechten ausgeführt werden. [2]

== Einhängen ==
{{{#!code bash
#!/bin/sh

SAFE=/Pfad/zum/Container_File
CRYPTNAME=container
MNT=/Pfad/zum/Mointpoint
FS=ext4
LOOPDEV=`losetup -f`

if [ "`losetup -a | grep -c "$SAFE"`" != "0" ]; then
        echo "bereits eingehängt"
        exit
fi

/sbin/losetup $LOOPDEV $SAFE
/sbin/cryptsetup luksOpen $LOOPDEV $CRYPTNAME
/bin/mount -t $FS /dev/mapper/$CRYPTNAME $MNT
}}}

== Aushängen ==
{{{#!code bash
#!/bin/sh

SAFE=/Pfad/zum/Container_File
CRYPTNAME=container
MNT=/Pfad/zum/Mointpoint
LOOPDEV=`losetup -a | grep "$SAFE" | sed "s/: .*//"`

if [ "`losetup -a | grep -c "$SAFE"`" != "1" ]; then 
	echo "nicht eingehängt"
	exit
fi

/bin/umount $MNT
/sbin/cryptsetup luksClose $CRYPTNAME
/sbin/losetup -d $LOOPDEV
}}}

= Links =
 * [wikipedia:dm-crypt:cryptsetup] - Wikipedia

#tag: Sicherheit, Shell, Verschlüsselung