kanotix.com

Scripte - Verschlüsseltes Kanotix + USB-Stick als Boot-Schlüssel

Dannyboy - 13.04.2007, 07:56 Uhr
Titel: Verschlüsseltes Kanotix + USB-Stick als Boot-Schlüssel
Guten Morgen, Sehr glücklich
für alle die so paranoid sind wie ich, habe ich nun mal ein kleines Skript geschrieben, das sich auf meinem System als sehr hilfreich erwiesen hat.

Was das Skript kann:
Das Skript mountet eine via Truecrypt verschlüsselte Partition beim Hochfahren des Computers. Hierbei wird ein externer USB-Stick als Schlüssel verwendet. Dies bedeutet, dass ohne diesen "USB-Zündschlüssel" und einem weiteren Passwort niemand an die verschlüsselte Partition herankommt. Ist der USB-Stick mit Schlüssel nicht eingesteckt oder das Passwort ist falsch, so bricht das Hochfahren des PCs ab und er schaltet sich aus. Gleiches gilt für einen Timeout, den ich eingebaut habe (Standard: 30 Sekunden).

Beim Herunterfahren des PCs, also nach dem täglichen Gebrauch, wird die verschlüsselte Partition automatisch von meinem Skript ausgehängt, damit sie stets uneinsehbar bleibt, falls jemand versucht mit einer bootbaren Linux-CD an die Daten zu kommen oder die Festplatte klauen würde.

Ich habe meine KOMPLETTE Daten-Partition (140 GB) mit Truecrypt verschlüsselt und verwende mein Boot-Skript für den Zugriff dieser Partition. Somit sind alle persönlichen Daten, die automatisch auf der verschlüsselten Partition abgelegt werden, stets sicher und meine gerechtfertigten Paranoia als Informatikstudent ein Stückchen kleiner. Winken

INSTALLATION (alle Befehle als root!):
1. Truecrypt downloaden und installieren (ist hier im Kanotix-Forum mehrfach beschrieben)
2. Neue Truecrypt-Partition (normale Partition, nicht versteckt (hidden)!) mit Passwort UND einem Keyfile erstellen. Das Keyfile kann irgend eine Datei sein, z.B. eine binäre Datei oder ein Bild. Falls vorher bereits eine funktionierende Truecrypt-Partition bestand, ist das Erstellen und Testen einer solchen Partition natürlich nicht erforderlich, ansonsten neue Truecrypt-Partition anlegen mit
Code:
truecrypt --create

oder ggf. Keyfiles zu bestehender Partition hinzufügen mit
Code:
truecrypt --change

3. Um sicher zu gehen, dass alles bisher geklappt hat am besten einfach mal mounten z.B. bei mir mit:
Code:
truecrypt /dev/hda6 /media/hda6 -k KEY_FILE

und zum Testen ein paar Testdaten auf die verschlüsselte Partition kopieren
(hda6 ist also bei mir die Truecrypt-Partition, ergo bei Euch anpassen)
4. Wenn erfolgreich gemountet werden konnte, dann wieder aushängen, z.B. mit:
Code:
truecrypt -d /dev/hda6

WICHTIG:
Nun _unbedingt_ Backup vom Keyfile erstellen, z.B. auf CD brennen, denn ohne das Keyfile können die verschlüsselten Daten nicht eingesehen werden!!!

5. Nun ein Verzeichnis namens “keyfile” für das Keyfile auf einem nun neu eingesteckten USB-Stick erstellen, der als USB-Schlüssel fungieren soll:
Code:
mount -t auto /dev/sda1 /media/sda1 && mkdir /media/sda1/keyfile

(bei mir ist der USB-Stick auf /dev/sda1. Bitte einfach bei Euch anpassen)
6. So, nun das Keyfile in das eben erstellte Verzeichnis auf dem USB-Stick kopieren:
Code:
cp KEY_FILE /media/sda1/keyfile/truecrypt.key

Meinem Script ist egal wie das Keyfile (hier: “truecrypt.key”) heisst, solange es brav im Verzeichnis “keyfile” Des USB-Schlüssels liegt! Es kann also beliebig umbenannt werden um nicht aufzufallen. Es können natürlich auch noch andere Daten auf diesem USB-Stick liegen, denn solange das Verzeichnis „keyfile“ mit dem Schlüssel vorhanden ist, ist das dem Skript egal. Aus Sicherheitsgründen taucht der Name des Keyfiles nicht im Skript auf (wird dynamisch bezogen) und wird auch nicht beim Ausführen des Skripts auf dem Bildschirm angezeigt.)
7. Nun müssen die Pfad-Variablen am Anfang dieses Skripts evtl. noch kurz angepasst werden (sind gut dokumentiert), das wären somit:
- Truecrypt-device in /dev/ (bei mir /dev/hda6)
- Device des USB-Schlüssels, (bei mir /dev/sda1)
- Mountpoints in "/media/",
- Dateisystem des USB-Schlüssels (funktioniert bei mir mit “auto”, ansonsten anpassen, z.B. „vfat“ )
- Pfad zum Keyfile auf USB-Stick (bei mir “keyfile”, kann aber auch was unauffälligeres sein. Smilie)
- Timeout (Sekunden) bis PC runter fährt, wenn USB-Schlüssel beim Boot nicht eingesteckt wurde.
8. Nun Testmodus des Skriptes starten via:
Code:
./mount_truecrypt start --testing

Wenn die eben erwähnten Variablen am Anfang des Skriptes entsprechend den Pfaden gesetzt worden sind, dann wird das Skript nun auf den immer noch gemounteten USB-Stick zugreifen (wenn nicht mehr gemountet, dann mountet das Skript den Stick), automatisch das Keyfile beziehen und wird dann, nachdem das korrekte Passwort eingegeben ist, die mit Truecrypt verschlüsselte Partition mounten.
Im hier befindlichen Testmodus (--testing) wird der PC bei einem Fehlschlagen des Mounts (falsches/fehlendes Passwort/Keyfile) NICHT heruntergefahren.
9. Wenn das Skript die verschlüsselte Partition mounten konnte und nicht mehr darauf zugegriffen wird (prüfen mit “lsof | grep /media/hda6” (oder wo auch immer Eure verschlüsselte Partition liegt)), dann kann das Skript die Partition wieder dismounten mit:
Code:
./mount_truecrypt stop

10. Da nun alles geklappt hat (hoffe ich Smilie) muss nun mein Skript in den Boot-Prozess integriert werden:
Code:
su  # root-Passwort eingeben
cp ./mount_truecrypt /etc/init.d/ # im gleichen Verzeichnis des Skripts
chown root /etc/init.d/mount_truecrypt # Besitzer ist nun root
chmod 700 /etc/init.d/mount_truecrypt # Nur root darf zugreifen
unfreeze-rc.d # Zugriff erlauben rc.d
rcconf # Skript in den Boot-Prozess einbinden
(Hier nun das Skript "mount_truecrypt&" markieren, damit es in den Boot-Prozess eingebunden wird.)   
freeze-rc.d # Zugriff verweigern für rc.d

11. Das war's schon. Smilie Beim Hochfahren/Booten solltest Du nun nach dem USB-Schlüssel und dem Passwort zum Entschlüsseln der verschlüsselten Partition gefragt werden. Bei dreimaliger Falscheingabe fährt das System wieder runter, ansonsten wird die Truecrypt-Partition regulär gemountet, Du wirst darum gebeten den USB-Schlüssel aus Sicherheitsgründen zu entfernen (Du lässt ja im Auto auch nicht einfach den Schlüssel stecken. Smilie) und der Boot-Prozess geht weiter.
Nach der Arbeit mit dem System, hängt das Skript automatisch die verschlüsselte Partition aus.

Hier ist das Script (hab' ich in englisch dokumentiert) zum download für Euch:
http://www.talico.de/misc/linux/kanotix/scripts/mount_truecrypt

Sollte sich das Script auch für Andere als hilfreich erweisen, so kann ich es gerne in die Wiki stellen (auch wenn ich das noch nie zuvor gemacht habe. Sehr glücklich)

Hinweise/Kritik/Verbesserungsvorschläge nehme ich gerne entgegen.

Viel Spaß.
Greetz
DANNYBOY

PS:
Quelltext des Skriptes:
Code:

#!/bin/sh

#mount_truecrypt --> (c) DANNYBOY 2007

# (...)

# CHANGE VARIABLES IN THIS SECTION IF NECESSARY #

DEVICE="/dev/hda6"      # truecrypt device in /dev/
MOUNTPOINT="/media/hda6/"   # truecrypt mountpoint
KEY_DEVICE="/dev/sda1"      # usb-key-device with keyfile in /dev/
KEY_MOUNTPOINT="/media/sda1/"   # mountpoint for usb-key-device
KEY_FILESYSTEM="auto"      # usb-key-device's filesystem
KEY_PATH="keyfile/"      # path to keyfile on usb-key-device
TIMEOUT_KEY_PLUG="30"      # timeout seconds for searching for usb-key-device
# --------------------------------------------------------------------------------- #

# DO NOT CHANGE VARIABLES BELOW !!! #

unset KEY_FILE         # name of keyfile (do NOT change / set here! It's found dynamically)
TESTING_MODE="$2"      # input param for testing mode

# force system shutdown if testing-mode is not active
function secure_shutdown() {   
   echo -en "\E[31m"        #red
   echo "truecrypt volume could not be mounted!"
   tput sgr0               # reset text-settings
   echo "system is shutting down!"
   echo "*** SECURITY SCRIPT EXITED ***"
   [ "$TESTING_MODE" != "--testing" ] && shutdown -h now # shutdown the system if no testmode
   exit 1
}

# mounting usb-key-device and looking for keyfile in directory $KEY_PATH on it
function mount_key_device() {
   # wait for usb-key-device to be plugged in
   echo "please plugin usb-key-device holding the key-file"
   echo -n "waiting for usb-key-device on $KEY_DEVICE ..."
   if ( wait_for_key != 1); then # if usb-key-device was NOT plugged in ...
      echo "Timeout expired! No key was plugged in."
      secure_shutdown      
   fi   
   echo "usb-key-device was found on $KEY_DEVICE."
   echo "trying to mount usb-key-device ..."
   # mount key device
   mkdir $KEY_MOUNTPOINT 2> /dev/null
   if ( ! mount -t $KEY_FILESYSTEM $KEY_DEVICE $KEY_MOUNTPOINT 2> /dev/null ); then
      echo "usb-key-device could not be mounted"
      secure_shutdown   
   else
      # get name of keyfile (assuming $KEY_PATH exists and holds a key-file   
      KEY_FILE=$(ls -1 $KEY_MOUNTPOINT$KEY_PATH 2> /dev/null| head -n 1) # get first file in key-directory !!!   
      if [ ! $KEY_FILE ]; then
         echo "no keyfile is found"
         dismount_key_device
         secure_shutdown      
      else
         KEY_FILE="$KEY_MOUNTPOINT$KEY_PATH$KEY_FILE" # add full path to keyfile
      fi
   fi
}

# dismount mounted usb-key-device
function dismount_key_device() {
   echo "dismounting usb-key-device ..."
   if ( ! umount $KEY_DEVICE 2> /dev/null ); then
      echo "error occured while dismounting usb-key-device $KEY_DEVICE"
   else
      echo "please unplug usb-key-device now ..."
   fi
}

# waits $TIMEOUT_KEY_PLUG seconds for usb-key-device to be plugged in
function wait_for_key() {
   i=0
   while  [ $i -lt $TIMEOUT_KEY_PLUG ]; do # count seconds
      if [ -e $KEY_DEVICE ]; then
         echo    # new line if necessary
         return 1
      else
         echo -n "."
         sleep 1s        # wait a second
      fi   
      i=`expr $i + 1`
   done
   echo
   return 0
}

# shuts down the system on startup if user tries to skip password process
function handle_userbreak() {
   echo "user-break is not allowed! --> shutting down!"
   secure_shutdown
}

#----------------------------------- START --------------------------------------#

# check for root!
if [ $UID != 0 ];  then
   echo "only root may run this script"
   exit 1
fi

# check input param for /etc/init.d

case "$1" in
   start)
      # shutdown if user tries to skip login-process
      trap handle_userbreak 2
      echo "*** SECURITY SCRIPT STARTED ***"
      
      if [ "$2" == "--testing" ]; then
         echo "(testmode is active, so system is NOT shutting down on failure)"
      fi
      # try to mount usb-key-device and get keyfile for mounting truecrypt-device   
      mount_key_device
      echo "mounting truecrypt volume $DEVICE ..."
      mkdir $MOUNTPOINT 2> /dev/null
      if ( truecrypt $DEVICE $MOUNTPOINT -k $KEY_FILE); then # mount with keyfile from extern disk!
              echo -en "\E[32m"        # green
         echo "successfully mounted truecrypt volume"
              tput sgr0               # reset text-settings
         dismount_key_device         
         while [ -e $KEY_DEVICE ]; do # wait unless usb-key-device is unplugged by user for security reasons!   
            sleep 1s
         done
         echo "*** SECURITY SCRIPT EXITED ***"

      else
         unset KEY_FILE
         dismount_key_device
              secure_shutdown
      fi
         
      ;;
   stop)
      echo "dismounting all truecrypt volumes ..."
       if ( truecrypt -d ); then
              echo -en "\E[32m"        # green
         echo "truecrypt volumes were dismounted successfully"
              tput sgr0               # reset text-settings
      else         
              echo -en "\E[31m"        # red
         echo "truecrypt volume(s) could not be dismounted"
              tput sgr0               # reset text-settings
      fi    
      ;;
   *)
      echo "usage: $0 start [--testing] | stop"
      ;;
esac

schmendrich - 19.04.2007, 09:16 Uhr
Titel:
Wahnsinn, so etwas suche ich auch.
Allerdings hab ich ein kleines Problem, das mich vor so etwas zurückschrecken läßt.
Was tust Du, wenn der Stick verloren ist? Kommst Du trotzdem irgendwie an die Daten? Wenn Du hierfür auch eine Lösung hast, kann ich auch meiner Paranoia ihren Lauf lassen...

Gruß
Schmendrich
gmx99 - 19.04.2007, 09:53 Uhr
Titel:
keyfile von cd und neuen stick nehmen?

super anleitung dannyboy! danke!
sailor8 - 19.04.2007, 12:47 Uhr
Titel:
Danke +funktioniert auch ein Ersatz Stick ?

Bin Linux dummy aber begeisterter Anwender - bei mir läuft ohne Mucken noch Kanotic RC4.

Die Anleitung klingt klasse - vielen Dank !

Frage:

kann man von vorn herein einen zweiten USB Stick als Sicherheitsreserve anlegen und diesen bei Verlust des ersten dann ohne Probleme verwenden ?
Dannyboy - 09.05.2007, 18:22 Uhr
Titel:
Zitat:
Was tust Du, wenn der Stick verloren ist? Kommst Du trotzdem irgendwie an die Daten? Wenn Du hierfür auch eine Lösung hast, kann ich auch meiner Paranoia ihren Lauf lassen...

Es handelt sich hierbei um ein Sicherheitsskript, das Eure Daten vor fremdem Zugriff schützen soll und dies bedeutet: OHNE Passwort plus Keyfile, KEINEN Zugriff, denn dies ist der Sinn dieses Skripts. Folglich kommt man selbstverständlich ohne Passwort oder ohne das Keyfile nicht an die verschlüsselten Daten heran, sonst ergäbe dies alles keinen Sinn.
Zitat:
kann man von vorn herein einen zweiten USB Stick als Sicherheitsreserve anlegen und diesen bei Verlust des ersten dann ohne Probleme verwenden ?

Selbstverständlich geht das. Smilie Meinem Skript ist egal, um welchen USB-Stick es sich handelt, solange dieser Stick vom aktuellen Linux-Kernel mountbar ist. Ihr könnt alternativ auch eine USB-Festplatte nehmen --> es funktioniert.

Also,
macht Euch ein Backup des Keyfiles und des Passworts und ihr könnt zusammen mit diesen beiden Informationen jederzeit problemlos an die Daten ran, indem ihr, wie in meiner Anleitung beschrieben, einen neuen USB-Stick verwendet und dort das Keyfile anlegt. Ich selbst verwende als Keyfile ein Bild, das nur ich kenne. Da ich über 1.000.000 Bilder auf meinem Backup-System habe, kann mit diesem Hinweis niemand irgend etwas anfangen und nur ich alleine weiß, welches dieser > 1.000.000 Bilder das Keyfile ist, zumal man es einem Bild auch nicht ansieht, dass es als Keyfile für irgend eine verschlüsselte Partition fungiert. Sehr glücklich
Zitat:
keyfile von cd und neuen stick nehmen?
Du sprichst mir aus der Seele. Sehr glücklich


Greetz
DANNYBOY
Alle Zeiten sind GMT + 1 Stunde
PNphpBB2 © 2003-2007