Verschlüsselte Container mounten

st86xn

New Member
Hallo.

Gibt es unter Debian Möglichkeiten mit einem Script ein verschlüsselten Container beim hochfahren zu mounten, ohne Administratorrechte?
Wie wichtig ist es vor dem herunterfahren den Container zu dismounten? Gehen Daten verloren wenn man es nicht macht?
 

theoth

Junior Member
was in der /etc/fstab steht wird beim Hochfahren automatisch gemountet. Wenn Du dort ein über den device-mapper (unter /dev/mapper/... ) bereitgestelltes Volume hast, kannst Du das auch mounten. Das Problem ist die Eingabe des Schlüssels. Entweder der steht bei Dir im Filesystem, dann kannst Du in der /etc/crypttab das verschlüsselte Volume per Schlüssel in einer Datei entschlüsseln und es wird unter /dev/mapper/... entschlüsselt zum mounten bereitgestellt, oder Du mußt beim Hochfahren z.B. einen USB-Stick einstöpseln, von dem dann der Schlüssel gelesen wird. Zweiteres ist etwas komplexer, geht aber auch. So fahre ich meinen Server hoch (komplett verschlüsselt) der weder eine Tastatur noch einen Bildschirm angeschlossen hat. Den USB-Stick muß man natürlich entsprechend sicher aufbewahren. Als Backup habe ich noch einen langen Schlüssel, den ich bei Bedarf auch über die Tastatur eingeben kann, sollte der Schtick mal kaputt sein.
 

st86xn

New Member
Irgendwie komme ich nicht weiter. Ich habe folgendes Script als einhängen.sh gespeichert:

Code:
#!/bin/sh

SAFE=/home/4vz435zt
CRYPTNAME=name
MNT=/media/Datenträger_V
FS=ntfs
LOOPDEV=`losetup -f`


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

mkdir $MNT
/sbin/losetup $LOOPDEV $SAFE/container.luks
/sbin/cryptsetup luksOpen -d $SAFE/key1.keyfile $LOOPDEV $CRYPTNAME
sleep 2
/bin/mount -t $FS /dev/mapper/$CRYPTNAME $MNT
und ein Passwort in der Datei key1.keyfile abgelegt. In /etc/fstab habe ich ganz unten folgendes eingetragen:

Code:
sh /home/4vz435zt/einhängen.sh
Nach dem Neustart bleibt das System mit dieser Textausgabe hängen:


Während ich das schreibe, stelle ich fest das ich keine Schreibrechte vergeben habe. Ich weiß aber nicht ob es auch daran gelegen hat.
 

theoth

Junior Member
Kommt mir alles reichlich spanisch vor. Ein shell-script Aufruf hat in der fstab nicht zu suchen. Wenn Du ein lokales script laufen lassen willst dann gehört das in die /etc/rc.local.
Außerdem benutzt Du cryptsetup nicht richtig. Erstmal muß Du ja wohl ein verschlüsseltes Volume anlegen, das geht mit luksFormat. Mit luksopen kannst Du das dann öffnen.
Dann erst wird es formatiert (Ein FS aufgespielt).Warum NTFS? nimm doch lieber ext4 oder ähnliches.
NTFS hat mehr Nachteile als Vorteile. Ist in gewissen Situationen etwas flotter, dafür hat ein eben nur features eines steinalten FS. Kann das symbolische links? Wie sieht das mit : im filenamen aus usw.
Das Ding ist unter Linux reverse engineered und hat vermutlich nich die "geheimen" Zusatzeigenschaften, die MS weiterentwickelt hat.

Edit: warum nimmst Du nicht lieber encfs - da ist schon alles fertig - vielleicht paßt das für Dich
 
Last edited:

st86xn

New Member
Kommt mir alles reichlich spanisch vor. Ein shell-script Aufruf hat in der fstab nicht zu suchen. Wenn Du ein lokales script laufen lassen willst dann gehört das in die /etc/rc.local.
Ich habe nicht behauptet das ich mich in Linux auskenne ;)

Außerdem benutzt Du cryptsetup nicht richtig. Erstmal muß Du ja wohl ein verschlüsseltes Volume anlegen, das geht mit luksFormat.
Ich habe bereits ein Container zu Testzwecken erstellt.

Mit luksopen kannst Du das dann öffnen.
Das sollte dann das obere Script machen.

Warum NTFS?
Ich wollte ein Container unter Linux und Windows verwenden. Unter Windows hat man z.B. das Programm LibreCrypt, um auf LUKS Container zuzugreifen. Lieber hätte ich für Linux und Windows Veracrypt verwendet, aber bei Linux kam ich mit Veracrypt ohne Administratorrechte nicht weiter.

Edit: Mit LibreCrypt kann man bestimmt unter Windows auch ext4 verwenden, aber das habe ich noch nicht ausprobiert.

Edit: warum nimmst Du nicht lieber encfs - da ist schon alles fertig - vielleicht paßt das für Dich
Danke. Werde ich ausprobieren.
 
Last edited:

theoth

Junior Member
ok wen Du bereits einen verschlüsselten Container hast, dann ist das was anderes - dann ist auch encfs keine Lösung, die unter Windows funktioniert.
Hast Du das schon mal händisch einhängen können? Wenn ja, dann pack Dein script entweder in /etc/init.d und verwende ein Beispielscript von dort als Rahmen (für start/stop/status, Du kannst dann genau festlegen, wann Dein script während des botens ausgeführt wird) oder pack es in /etc/rc.local, dann wird es ganz am Ende des Bootvorgangs ausgeführt. Script einfach vorher von Hand ausführen, um zu prüfen ob es tut. Debugging mit set -x
 

st86xn

New Member
Hast Du das schon mal händisch einhängen können?
Ja, über den Terminal, aber nur mit Administratorrechten.

Ich habe das Script in /etc/rc.local gepackt, um zu sehen ob es nach dem Bootvorgang ausgeführt wird. Leider wird es nur teilweise eingehängt, um darauf zuzugreifen muss ich immer noch Containerpasswort und Administrator Passwort eingeben. Ich muss also erst heraus finden wo der Fehler liegt und ob das Script für diese Aufgabe überhaupt geeignet ist.
 

theoth

Junior Member
wenn das script beim Einhängen unter root funktioniert, dürfte es auch in /etc/rc.local tun. Kann sein, daß Du noch irgendein environment mitschleppst, daß beim booten nicht gesetzt ist. Kannst Dir ja mal "env" ausgeben lassen und den Befehl "env" in Dein script einbauen - und noch was: schreib ruhig mal "set -x" ganz oben in Dein script, dann siehst Du schon mal was da genau passiert
 

theoth

Junior Member
Ich hab das mal kurz nachvollzogen - hier die wichtigsten Schritte:
Code:
dd if=/dev/zero of=container bs=1k count=10000
losetup /dev/loop0 container
cryptsetup -y -c aes-cbc-essiv:sha256 -s 256 luksFormat /dev/loop0
cryptsetup luksAddKey /dev/loop0 ./password
cryptsetup luksOpen /dev/loop0 testdev <=== per password-Eingabe
cryptsetup luksOpen --key-file /.../password /dev/loop0 testdev <== automatisch
mkfs -t ntfs /dev/mapper/testdev
mkdir /mnt/testdev
chown theo: /mnt/testdev/
ls -ald /mnt/testdev/
drwxr-xr-x 2 theo theo 4096 Okt  3 10:47 /mnt/testdev/
mount -t ntfs -o rw,uid=theo,gid=theo,fmask=0022,dmask=000 /dev/mapper/testdev /mnt/testdev/
mount
...
/dev/mapper/testdev on /mnt/testdev type fuseblk (rw,nosuid,nodev,allow_other,default_permissions,blksize=4096)
...
su - theo
$ cd /mnt/testdev/
$ touch test
$ ls -al
total 8
drwxrwxrwx 1 theo theo 4096 Okt  3 11:12 .
drwxr-xr-x 6 root root 4096 Okt  3 10:47 ..
-rwxr-xr-x 1 theo theo  0 Okt  3 11:12 test
Die entscheidenden Punkte in Deiner /etc/rc.local wären diese:
Code:
losetup /dev/loop0 container
cryptsetup luksOpen --key-file /.../password /dev/loop0 testdev
mount -t ntfs -o rw,uid=theo,gid=theo,fmask=0022,dmask=000 /dev/mapper/testdev /mnt/testdev/
 

st86xn

New Member
Danke für die ausführliche Beschreibung theoth. Das startup Script funktioniert jetzt einwandfrei.

Zu einigen Punkten habe ich noch Fragen.


Ich nehme an das der folgender Befehl eine Passwort Datei erstellt:
Code:
cryptsetup luksAddKey /dev/loop0 ./password
Ich bekomme allerdings die Meldung:
Code:
Geben Sie irgendeine Passphrase ein: (nach der Eingabe eines passworts)
Konnte Schlüsseldatei nicht öffnen.
Ich habe danach einfach noch einmal eine password Datei erstellt.

Die Bezeichnung theo habe ich mit root ersetzt und die entscheidenden Punkte mit dem einhängen Script von hier ergänzt.
Unter dem oberen link von "hier" werden viele Deiner Befehle erklärt.

Ich würde noch gerne wissen was diese Befehle bewirken:

Code:
chown theo: /mnt/testdev/
ls -ald /mnt/testdev/
drwxr-xr-x 2 theo theo 4096 Okt  3 10:47 /mnt/testdev/
mount -t ntfs -o rw,uid=theo,gid=theo,fmask=0022,dmask=000 /dev/mapper/testdev /mnt/testdev/
mount
...
/dev/mapper/testdev on /mnt/testdev type fuseblk (rw,nosuid,nodev,allow_other,default_permissions,blksize=4096)
...
su - theo
$ cd /mnt/testdev/
$ touch test
$ ls -al

Für andere habe hier nochmal das geänderte Script:

Code:
#!/bin/sh

SAFE=/home/45gv34z34
CRYPTNAME=testdev
MNT=/media/Datenträger_V
FS=ntfs
LOOPDEV=`losetup -f`


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

mkdir $MNT
/sbin/losetup $LOOPDEV $SAFE/container
/sbin/cryptsetup luksOpen --key-file $SAFE/password $LOOPDEV $CRYPTNAME
sleep 2
/bin/mount -t $FS -o rw,uid=root,gid=root,fmask=0022,dmask=000 /dev/mapper/$CRYPTNAME $MNT
Die Container und Passwort Datei liegen in meinem Beispiel unter /home/45gv34z34/
 
Last edited:

theoth

Junior Member
luksAddkey fügt einen weiteren key hinzu. in diesem Fall die Datei als schlüssel. Der erste Schlüssel wird bei luksFormat verlangt. Mit dem mußt du dann das luksAddkey legitimieren.

Die Datei passwort habe ich vorher mit einem Editor erstellt. Oder man benutzt /dev/random und liest x zufällige bits aus und packt die dann in die Datei: dd if=/dev/random of=passwort bs=256 count=1 macht ein 256 byte Zufallspasswort

Warum hast Du das root zugewiesen? chown theo: bewirkt, daß das Verzeichnis dem user "theo" gehört. Das war doch der Sinn der Sache, daß ein nicht root-user auf so einen Container zugreifen kann.

ls -ald heiß "list all, long, directory" ==> man sieht, daß das dir tatsächlich theo gehört.

mount -t ntfs -o... sind die mount optionen. Die muß man bei ntfs zum mountzeitpunkt festlegen (also wem das gemountete filesystem gehört usw)


mount zeigt das an.

su - theo macht mich zum user "theo" - und wenn ich als theo mittels touch eine Datei anlege, sieht man auch, daß die hinterher theo als owner hat.
 
Last edited:

st86xn

New Member
Warum hast Du das root zugewiesen?
Ich bekam eine Fehlermeldung wenn ich "chown theo: /mnt/testdev/" ausgeführt habe.

Die Meldung war glaube ich: "chown: ungültige Spezifikation: „theo:“"
 

theoth

Junior Member
nimm einen gültigen user auf Deinem System. Als root user arbeitet man normalerweise nicht.
Kannst jederzeit einen Benutzer hinzufügen mit "useradd hugo (oder theo oder was auch immer)"
 
Top