LUKS Container grafisch verwalten

Inhalt

Folgende Scripte dienen der komfortablen Erstellung und Verwaltung von LUKS Containerdateien unter Linux.

Sie setzen entsprechend installierte LUKS Pakete voraus. Daneben wird auch das Programm Kdialog benötigt. Selbst wenn man nicht den KDE Desktop einsetzen sollte, lässt sich dieses Paket jedoch nachinstallieren.

Die Script im einzelnen:

 

Container erstellen

#!/bin/bash
#Aufruf (etwa über das Startmenü) mittels: kdesudo --caption "für Root Rechte" -u root  --comment "Bitte Passwort eingeben um Admin Rechte zu erhalten"  /pfad/zum/script

#schritt1: Speicherort für Container erfragen
container_file="$(kdialog --caption 'Bitte Containder Datei Name (mit Endung .luks) angeben' --getsavefilename /home/ '*.luks')"
if [[ $? -ne 0 ]]; then
kdialog --caption "Abgebrochen" --error "Abgebrochen durch Benutzerwunsch"
exit 3
fi
if [[ -z "$container_file" ]]; then #Falls Dateiname leer ist
kdialog --caption "Abgebrochen" --sorry "Abgebrochen. Der Dateiname war leer, dies darf nicht sein."
fi
if ! [[ "$container_file" =~ \.luks$ ]]; then #Falls Dateiendung nicht .luks ist
container_file="$container_file.luks"
fi
if [[ -a "$container_file" ]]; then #Falls Datei bereits existiert
   kdialog --caption "Datei existiert bereits" --warningcontinuecancel "Eine Datei mit diesem Namen existiert am angebenen Speicherpfad bereits.
   
   Der angebene Speicherpfad lautet:
   $container_file
   
   Wenn Sie fortfahren, wird diese Datei unrettbar überschrieben. Wollen Sie WIRKLICH fortfahren??"
  if [[ $? -ne 0 ]]; then
    kdialog --caption "Abgebrochen" --error "Abgebrochen durch Benutzerwunsch"
    exit 1
  fi
fi
container_name=`basename "$container_file" | cut -d. -f1` #$container_file filename zwischen letzten / und .luks)"
# next, replace spaces with hyphens
container_name=${container_name// /-}
# now, clean out anything that's not alphanumeric or an underscore or hyphen (hyphen escaped with \ to prevent it from beeing an enumeration starting at _ with no end)
container_name=${container_name//[^a-zA-Z0-9_\-]/}
# finally, lowercase with TR
#CLEAN=`echo -n $CLEAN | tr A-Z a-z`

#schritt2: container größe erfragen
container_size="$(kdialog --title 'Container Größe' --inputbox 'Welche Größe (in Megabyte) soll der Container haben? 
Es entsprechen 1024 MB einem Gigabyte, entsprechend 2048MB zwei Gigabyte usw. Die Eingabe muss ein Integer sein, es sind daher NUR ZIFFERN zulässig' '1024')"
if ! [[ "$container_size" =~ ^-?[0-9]+$ ]]; then #if not integer
  kdialog --caption "Abbruch, kein Integer" --sorry "Abgebrochen weil die angegebene Größe keine Ganzzahl (Integer) ist."
  exit 2
fi

#schritt3: Passwort erfragen
cont_passwd=`kdialog --title "Passwort angeben" --password "Bitte vergeben Sie ein Passwort für die Verschlüsselung"`

#schritt4: Container mit Random Inhalt füllen
#dd if=/dev/urandom of="$container_file" bs=1M count=$container_size
dbusRef=$(kdialog --caption "Container vorbereiten" --title "Container vorbereiten" --progressbar "Der Container wird vorbereitet, indem die Datei durch den Zufallsgenerator gefüllt wird." 100)

/bin/dd if=/dev/urandom bs=1M count=$container_size | { /usr/bin/pv -s "$container_size"m -n 2>&3 | /bin/dd  of="$container_file"; } 3>&1 |  /usr/bin/xargs -I{} /usr/bin/qdbus $dbusRef Set org.kde.kdialog.ProgressDialog value {}

qdbus $dbusRef org.kde.kdialog.ProgressDialog.close

#schritt5: container formatieren
cont_loopdev="$(losetup -f)" #freies Loop devices finden

sudo losetup "$cont_loopdev" "$container_file"  # container einhängen
echo -n "$cont_passwd" | cryptsetup -c aes-xts-plain -s 512 luksFormat "$cont_loopdev"
echo -n "$cont_passwd" | cryptsetup luksOpen "$cont_loopdev" "$container_name"
mkfs.ext4 -L "$container_name" /dev/mapper/"$container_name"
#mount -t ext4 /dev/mapper/"$container_name" /mnt 
kdialog --title "Container erstellt" --passivepopup "Der Container wurde erfolgreich erstellt. Sie finden den Container nun im Dateimanager." 15
exit 0

 

Container einhängen

#!/bin/bash
#Aufruf (etwa über das Startmenü) mittels: kdesudo --caption "für Root Rechte" -u root  --comment "Bitte Passwort eingeben um Admin Rechte zu erhalten"  /pfad/zum/script
if [[ $(file $1) =~ "LUKS encrypted file" ]]; then 
#falls erster übergebener Parameter der Pfad zu einer LUKS ContainerDatei ist, nimm diese
   container_file="${1}"
else
#sonst frage welcher Container
  container_file="$(kdialog --caption 'Bitte Containder Datei zum Einhängen wählen' --getopenfilename /home/drake/ '*.luks')"
  if [[ $? -ne 0 ]]; then
  kdialog --caption "Abgebrochen" --error "Abgebrochen durch Benutzerwunsch"
  exit 1
  fi
fi
container_name=`basename "$container_file" | cut -d. -f1` #$container_file filename zwischen letzten / und .luks)"
# next, replace spaces with hyphens
container_name=${container_name// /-}
# now, clean out anything that's not alphanumeric or an underscore or hyphen (hyphen escaped with \ to prevent it from beeing an enumeration starting at _ with no end)
container_name=${container_name//[^a-zA-Z0-9_\-]/}
# finally, lowercase with TR
#CLEAN=`echo -n $CLEAN | tr A-Z a-z`
#schritt3: Passwort erfragen
cont_passwd=`kdialog --title "Passwort angeben" --password "Bitte geben Sie das Passwort für den Container an"`


cont_loopdev=`losetup -f`

if [ "`losetup -a | grep -c "$container_file"`" != "0" ]; then
        kdialog --caption "Abgebrochen" --error "Container bereits eingehängt"
        exit 2
fi

/sbin/losetup "$cont_loopdev" "$container_file"

echo -n "$cont_passwd" | cryptsetup luksOpen "$cont_loopdev" "$container_name"
if [[ $? -ne 0 ]]; then
kdialog --caption "Fehler" --error "Das Einhängen ist fehlgeschlagen. Falsches Passwort?"
losetup -d "$cont_loopdev"
exit 3
fi

kdialog --title "Einhängen erfolgreich" --passivepopup "Das Einhängen war erfolgreich. Sie finden den Container nun im Dateimanager." 15
exit 0

Container aushängen

 #!/bin/bash
 #Aufruf (etwa über das Startmenü) mittels: kdesudo --caption "für Root Rechte" -u root  --comment "Bitte Passwort eingeben um Admin Rechte zu erhalten"  /pfad/zum/script
#schritt 1: alle loop devices einlesen (man könnte noch filtern ob wirklich luks)
 IFS=$'\n' loop_devs=($(losetup -a));
 # get length of an array
 tLen=${#loop_devs[@]}
 if [ $tLen -eq 0 ]; then
 kdialog --caption "Abgebrochen" --error "Abgebrochen. Keine Container eingehängt!"
 exit 1
 fi
#schritt2: fragen welcher Container ausgehängt werden soll
 cont_2unmount=$(kdialog --combobox  "Welcher Container soll ausgehängt werden:" $(for (( i=0; i<${tLen}; i++ )); do  echo ${loop_devs[$i]}; done) --default $(echo -n ${loop_devs[0]}))
#schritt 3: herausfinden welche Containerdatei ($container_file) und welches Loopdevice ($cont2umdev) sowie welcher Mapper-Name ($container_name) dazu gehören
 cont2umdev="$(echo "$cont_2unmount" | sed "s/: .*//")"
 container_file="$(echo "$cont_2unmount" | sed "s/.*(//" | sed "s/)//")"
 container_name=`basename "$container_file" | cut -d. -f1` #$container_file filename zwischen letzten / und .luks)"
 # next, replace spaces with hyphens
 container_name=${container_name// /-}
 # now, clean out anything that's not alphanumeric or an underscore or hyphen (hyphen escaped with \ to prevent it from beeing an enumeration starting at _ with no end)
 container_name=${container_name//[^a-zA-Z0-9_\-]/}
 # finally, lowercase with TR
 #CLEAN=`echo -n $CLEAN | tr A-Z a-z`
#schritt 4: action
 #Dateisystem aushängen
 unmountergebnis="$(/bin/umount /dev/mapper/"$container_name" 2>&1 >/dev/null)"
 if [[ $? -ne 0 ]]; then
 kdialog --caption "Abgebrochen" --error "Abgebrochen. $(echo "\n\n $unmountergebnis")"
 exit 2
 fi
#Container aushängen
 containercloseergebnis="$(/sbin/cryptsetup luksClose "$container_name" 2>&1 >/dev/null)"
 if [[ $? -ne 0 ]]; then
 kdialog --caption "Abgebrochen" --error "Abgebrochen. $(echo "\n\n $containercloseergebnis")"
 exit 3
 fi
#Loopdevice schließen
 /sbin/losetup -d "$cont2umdev"
kdialog --title "Aushängen erfolgreich" --passivepopup "Das Aushängen war erfolgreich." 15
 exit 0