Linux NetMag
Titel: USB-Massenspeicher verschlüsseln unter SUSE Linux 10.1
URL: http://www.linuxnetmag.com/de/issue9/m9usbcrypt1.html
Artikel vom: 5.11.06
Autor: Lars-Anders Schmuhl


Das Schützen von sensiblen Daten gegen den Zugriff Unberechtigter ist ein Thema mit wachsender Bedeutung. Zunehmender Beliebtheit für den Datentransport erfreuen sich USB-Festplatten und USB-Sticks. Wird der Speicher auf der Dienstreise entwendet, so könnten sensible Daten in die Hände Dritter geraten. Dieser Artikel zeigt das Verschlüsseln von USB-Massenspeichern unter SUSE Linux 10.1.

YaST2 oder "Do it yourself"?

Das HowTo der SuSE Support-Datenbank ist veraltet [1], [2]. Zwar läßt bei SuSE 10.1 YaST2 (System/Partitionieren) das Einrichten einer verschlüsselten Partition zu. Die Einbindung ins System über /etc/fstab ist aber nicht ganz problemlos. Zudem kann man das Verschlüsselungsverfahren nicht frei wählen. Im Folgenden ist der "Do-it-youself"-Weg beschrieben.

USB Massenspeicher identifizieren

Für die folgenden Schritte sind root-Rechte erforderlich. Zunächst schaut man, als welches Device die USB-Platte (hier eine FUJITSU MHS2060AT, 60GB) angemeldet wird, wenn man sie mit dem System verbindet. USB-Massenspeicher werden als SCSI Geräte eingebunden. Dabei wird der Device-Name durch den ersten freien Namen bestimmt: sda, sdb, sdc ,sdd , etc., je nach dem wie viele USB-Massenspeichergeräte bereits angeschlossen sind.

  
  Sep 23 16:03:12 darkstar kernel: usb 1-1: new full speed USB device using uhci_hcd and address 3
  Sep 23 16:03:13 darkstar kernel: usb 1-1: new device found, idVendor=0840, idProduct=0060
  Sep 23 16:03:13 darkstar kernel: usb 1-1: new device strings: Mfr=73, Product=90, SerialNumber=110
  Sep 23 16:03:13 darkstar kernel: usb 1-1: Product: USB Storage Adapter
  Sep 23 16:03:13 darkstar kernel: usb 1-1: Manufacturer: USB2.0 TO IDE   
  Sep 23 16:03:13 darkstar kernel: usb 1-1: SerialNumber: 11100E0000403A1B
  Sep 23 16:03:13 darkstar kernel: usb 1-1: configuration #2 chosen from 1 choice
  Sep 23 16:03:13 darkstar kernel: scsi3 : SCSI emulation for USB Mass Storage devices
  Sep 23 16:03:13 darkstar kernel: usb-storage: device found at 3
  Sep 23 16:03:13 darkstar kernel: usb-storage: waiting for device to settle before scanning
  Sep 23 16:03:18 darkstar kernel:   Vendor: FUJITSU   Model: MHS2060AT         Rev: 8004
  Sep 23 16:03:18 darkstar kernel:   Type:   Direct-Access                      ANSI SCSI revision: 00
  Sep 23 16:03:18 darkstar kernel: SCSI device sda: 117210240 512-byte hdwr sectors (60012 MB)
  Sep 23 16:03:18 darkstar kernel: sda: Write Protect is off
  Sep 23 16:03:18 darkstar kernel: sda: Mode Sense: 2a 00 00 00
  Sep 23 16:03:18 darkstar kernel: sda: assuming drive cache: write through
  Sep 23 16:03:18 darkstar kernel: SCSI device sda: 117210240 512-byte hdwr sectors (60012 MB)
  Sep 23 16:03:18 darkstar kernel: sda: Write Protect is off
  Sep 23 16:03:18 darkstar kernel: sda: Mode Sense: 2a 00 00 00
  Sep 23 16:03:18 darkstar kernel: sda: assuming drive cache: write through
  Sep 23 16:03:18 darkstar kernel:  sda: sda1
  Sep 23 16:03:18 darkstar kernel: sd 3:0:0:0: Attached scsi disk sda
  Sep 23 16:03:18 darkstar kernel: sd 3:0:0:0: Attached scsi generic sg0 type 0
  Sep 23 16:03:18 darkstar kernel: usb-storage: device scan complete
  
Hier ist es das erste Gerät, also sda (mit einer primären Partition sda1). Man kann sich ausserdem auch die angeschlossenen USB-Geräte mit lsusb anzeigen lassen.
  Bus 002 Device 001: ID 0000:0000  
  Bus 001 Device 003: ID 0840:0060 Argosy Research, Inc. 
  Bus 001 Device 001: ID 0000:0000  
  

USB Massenspeicher partionieren

Es wird eine Session mit fdisk gezeigt. Vorsicht: das Neupartitionieren löscht alle Daten unwiederbringlich vom Datenträger! Es wird zunächst ein vorhandene Partition gelöscht und dann eine neue primäre Partition angelegt und ihr ein Dateisystemtyp zugeordnet. Diese Partition wird später verschlüsselt.

  
  Befehl (m für Hilfe): d
  Partition 1 ausgewählt
  
  Befehl (m für Hilfe): p
  
  Platte /dev/sda: 60.0 GByte, 60011642880 Byte
  255 heads, 63 sectors/track, 7296 cylinders
  Einheiten = Zylinder von 16065 �512 = 8225280 Bytes
  
     Gerät  boot.     Anfang        Ende     Blöcke   Id  System
  
  Befehl (m für Hilfe): n
  Befehl  Aktion
     e      Erweiterte
     p      Primäre Partition (1-4)
  p
  Partitionsnummer (1-4): 1
  Erster Zylinder (1-7296, Vorgabe: 1): 
  Benutze den Standardwert 1
  Letzter Zylinder oder +Größe, +GrößeK oder +GrößeM (1-7296, Vorgabe: 7296): 
  Benutze den Standardwert 7296
  
  Befehl (m für Hilfe): t
  Partition 1 ausgewählt
  Hex code (L um eine Liste anzuzeigen): 83
  
  Befehl (m für Hilfe): p
  
  Platte /dev/sda: 60.0 GByte, 60011642880 Byte
  255 heads, 63 sectors/track, 7296 cylinders
  Einheiten = Zylinder von 16065 �512 = 8225280 Bytes
  
     Gerät  boot.     Anfang        Ende     Blöcke   Id  System
  /dev/sda1               1        7296    58605088+  83  Linux
  
  Befehl (m für Hilfe): w
  Die Partitionstabelle wurde verändert!
  
  Rufe ioctl() um Partitionstabelle neu einzulesen.
  Synchronisiere Platten.
  
Jetzt ist die Platte neu partitioniert.

Auswahl eines Kryptoverfahrens

Es gibt eine ganze Reihe von (symmetrischen) kryptographischen Verfahren, unter denen man wählen kann. Die durchaus interessanten Einzelheiten der Verfahren und deren Entstehungsgeschichte kann man z.B. unter [5] nachlesen. Ein wesentliches Merkmal ist natürlich die Sicherheit des Verfahrens. Allerdings kann die Geschwindigkeit des Verfahrens nicht vernachlässigt werden, da das verschlüsseln und entschlüsseln transparent erfolgt. D.h. nachdem man sich authentifiziert hat (üblicherweise mit einem Passwort), kann man mit dem verschlüsselten Dateisystem arbeiten, wie man es von nicht verschlüsselten Dateisystemen gewohnt ist. Mit man losetup kann man sich die Möglichkeiten anzeigen lassen.

  (...)
         -e encryption
                Enable  data  encryption.  Following encryption types are recog-
                nized:
  
                NONE   Use no encryption (default).
                XOR    Use a simple XOR encryption.
                AES128 AES
                       Use 128 bit  AES  encryption.  Password  is  hashed  with
                       SHA-256 by default.
                AES192 Use  192  bit  AES  encryption.  Password  is hashed with
                       SHA-384 by default.
                AES256 Use 256 bit  AES  encryption.  Password  is  hashed  with
                       SHA-512 by default.
  
                twofish128 twofish160 twofish192 twofish256
                blowfish128 blowfish160 blowfish192 blowfish256
                serpent128 serpent192 serpent256 mars128 mars192
                mars256 rc6-128 rc6-192 rc6-256 tripleDES
                       These  encryption types are available if they are enabled
                       in kernel configuration  or  corresponding  modules  have
                       been loaded to kernel.
  (...)
  
Welche Verfahren der Kernel unterstützt, kann man in /proc/crypto nachschauen.
  name         : md5
  driver       : md5-generic
  module       : kernel
  priority     : 0
  type         : digest
  blocksize    : 64
  digestsize   : 16
  
  name         : des
  driver       : des-generic
  module       : kernel
  priority     : 0
  type         : cipher
  blocksize    : 8
  min keysize  : 8
  max keysize  : 8
  
  name         : des3_ede
  driver       : des3_ede-generic
  module       : kernel
  priority     : 0
  type         : cipher
  blocksize    : 8
  min keysize  : 24
  max keysize  : 24
  
DES ist der Data Encryption Standard [3]. Die angezeigte Liste hängt von den geladenen Modulen ab. Weitere Module kann man mit modprobe nachladen.
  (...)
  name         : twofish
  driver       : twofish-generic
  module       : twofish
  priority     : 0
  type         : cipher
  blocksize    : 16
  min keysize  : 16
  max keysize  : 32
  (...)
  (...)
  name         : aes
  driver       : aes-generic
  module       : aes
  priority     : 100
  type         : cipher
  blocksize    : 16
  min keysize  : 16
  max keysize  : 32
  (...)
  
In Punkto Sicherheit und Geschwindigkeit ist AES (Advanced Encryption Standard, [4]) zu empfehlen. Ausserdem ist dieser Algorithmus frei verfügbar und darf ohne Lizenzgebühren eingesetzt werden. Es ist der Nachfolger von DES und wird bereits vielfach verwendet [4]. Deshalb wird im Folgenden dieser Algorithmus verwendet.

Auswahl eines Passworts

Zur Authentifizierung benötigen wir ein Passwort, das möglichst sicher ist. Dabei kann pwgen helfen. Es erzeugt eine Liste mit Passworten, die zwar zufällig, aber trotzdem verhältnismäßig leicht einprägsam sind. Sie entsprechen auch den Mindestanforderungen an ein "sicheres" Passwort: mindestens 8 Zeichen lang und es kommen große und kleine Buchstaben vor sowie Zahlen.

  Ootee1oo OoCa2oe5 iek1Hit6 aeH6Aeha Ujai4eir uoth5Ree aem6Bead uabeeQu0
  Udaer7ga Ivo4ahb5 vahgi5Ei eiFe3bis Er3ahawe keay0Fie IPh5maej auw1quuF
  aiwoh7eY ees0uv0O ooc2AHiW Ohmaep9g hiPaig0E Yohph6qu NeiNg9Ji yoo8Eeng
  oole6ahN phee4Zei Eequ4ieg yahL7xou ooph1Fea ier8nioD keiD9Pee Oa0oc0qu
  Liovoe3e Izi6oF2e aG7aiLu0 aeb6EiSh xe9AThoh pai5Biun eS0ootei ooshie6O
  bouWei5w sa5iexeM Paehae5a aCo9see6 loiMoo3o Fi4iev2e ahPh3foh Neico8ei
  oi3pahGh VaeV8ieB eeK8rae5 Too9roh1 quohph5J Ux5eeP0i Xiighae7 coo6Cu6o
  Eithe9Er Cai8chob eiK0pael tiD2ooth airei5Ao dui2Ecoh oofa3Cha bul8aiFa
  orahQuo6 ANeeC9ai Shai2yoi og9He8oo xahteJ9F Ohhiequ3 apahV5Ai wiThiV7e
  daeyio9R Uv0waaTh OhngeiN8 Voi0aht1 Quohv9ee xa3Tooch aeto5ieR ATho6xoo
  eifo4Eew iF2oopoh Eit4phie uiK7ozai eevah8iK rav7Tuuw roo7Gaiv Bohh1ieP
  eumaPie5 naeziR0z LeiWai7a rooV7iex ahVee2um ho6Iriep Eifei4ii gae6Woot
  aed3Iroh iugiu9So aoXoh8Ok xiekoo9A we1VaeJi Oop0vofo Huj1hafo IN7eop8t
  ga9Opead oHe1ieng At4bu6oo uoTei2Ee aPhah5uF MaeV5bie Phoh7eit AudeSuh4
  aiwae0IM age7AG8a Ohfai4te Aegh5eik paBa7mah Baevo4fu Aezae5Qu kid1Ohxe
  Ieh4eiGa vue1Shah taFei0eo heip0Aaj Igh2arae eePhees0 aiThae2y eJ6boeWa
  Ar4Ulee3 ahdei1Ph oT7queer yaefiaC2 ing5eVo8 Ahch5pho ewaeMe1a hug3PhuT
  ia5aYaeb iG1bahYa Iegoova8 bah3heSh Nahhio6O yah4Tuu0 uedoCe4d eipi3ooG
  Ahz2Ohri faec0Oop Iw3sie6e aigh2Aed Xa2Liech eetaik3N OChoh5oo iiQuau9a
  Soh9ef5c too6Oub9 utoo9niB yuuYax5l Eiqu3ahY ievai1Fu ieNgei1m ahthie9T
  
Die Wahl des Passworts sollte sorgfältig erfolgen, da man es nachträglich nicht mehr ändern kann.

Dateisystem verschlüsseln

Der Zugriff auf das zu verschlüsselnde Dateisystem (/dev/sda1) geschieht über das loop-Device (/dev/loop0). Zunächst lädt man die entspechenden Kernelmodule.

  
Nun wird das Verschlüsselungsverfahren festgelegt. Achtung: das Passwort wird nur einmal eingeben und kein zweites mal zur Bestätigung!
  Passwort: 
  
Der nächste Schritt besteht darin, ein Dateisystem (das jetzt verschlüsselt wird) auf den Datenträger zu bringen. Hier hat man wieder die Wahl: ext2, ext3, reiserfs, vfat, usw. Wir formatieren den Datenträger über das loop-Device mit ext3. Dabei kann man den Namen mit der Option -L festlegen.
  mke2fs 1.38 (30-Jun-2005)
  Dateisystem-Label=VOLUME_NAME
  OS-Typ: Linux
  Blockgröße=4096 (log=2)
  Fragmentgröße=4096 (log=2)
  7325696 Inodes, 14651272 Blöcke
  732563 Blöcke (5.00%) reserviert für den Superuser
  erster Datenblock=0
  448 Blockgruppen
  32768 Blöcke pro Gruppe, 32768 Fragmente pro Gruppe
  16352 Inodes pro Gruppe
  Superblock-Sicherungskopien gespeichert in den Blöcken: 
          32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
          4096000, 7962624, 11239424
  
  Schreibe Inode-Tabellen: erledigt                           
  Erstelle Journal (32768 Blöcke): erledigt
  Schreibe Superblöcke und Dateisystem-Accountinginformationen: erledigt
  
  Das Dateisystem wird automatisch alle 31 Mounts bzw. alle 180 Tage überprüft,
  je nachdem, was zuerst eintritt. Veränderbar mit tune2fs -c oder -t .
  
Nach dem das Dateisystem aufgespielt ist, lösen wir wieder die Verbindung zum loop-Device.
  

Manuelles mount/unmount

Zunächst benötigen wir einen Mountpoint (sprich ein Verzeichnis), in dem das Dateisystem eingehängt wird.

  
Das manuelle mounten kann vorerst nur root durchführen. Zum Einbinden der USB-Platte:
  Passwort: 
  
Nun kann transparent auf das Dateisystem unter /data/VOLUME_NAME zugegriffen werden. In /var/log/messages erhält man Ausgaben wie diese:
  Sep 23 20:29:42 darkstar kernel: kjournald starting.  Commit interval 5 seconds
  Sep 23 20:29:42 darkstar kernel: EXT3 FS on loop0, internal journal
  Sep 23 20:29:42 darkstar kernel: EXT3-fs: mounted filesystem with ordered data mode.
  
Unmounten geht so:
  
Damit ein Benutzer (USER), der nicht root ist Zugriff auf die USB-Platte erhält, muß man die Rechte entsprechend anpassen.
  

Semi-automatisches mount/unmount

Ein Schwachpunkt von YaST2 ist, dass der Eintrag in die Datei /etc/fstab nicht korrekt ist. Es gibt ein spezielles Problem bei USB-Medien, das bei intern eingebauten SCSI/IDE-Platten nicht auftritt. Der Device-Name kann nicht statisch zugeordnet werden; er ist nicht im voraus bekannt. Je nachdem wieviele USB-Geräte schon angeschlossen sind ist der Name ein anderer. Noch schlimmer: Trägt man das verschlüsselte USB-Gerät als sda1 in die fstab ein, dann wird wenn man ein anderes USB-Gerät zuerst verbindet, dieses nicht erkannt und man wird nach dem Passwort gefragt. Abhilfe schafft hier das Referenzieren by-path, by-uuid, by-label oder by-id (siehe in /dev/disk/) statt durch den Device-Namen. Dies wird durch udev (dynamic device management) zur Verfügung gestellt. By-path scheidet aus, da es vom benutzten USB-Port abhängt (es sei denn man benutzt immer denselben Anschluß). By-uuid (universally unique identifier (UUID)) scheidet aus, da dieser dynamisch erzeugt wird und bei jeder Session ein anderer ist. By-label scheidet ebenfalls aus, da das Label der USB-Platte ebenso verschlüsselt ist und nicht zur Verfügung steht. Bleibt by-id. Diese ist statisch und eindeutig und ist somit geeignet die USB-Platte zu identifizieren (ohne dass man den Device-Namen kennen muß). Wenn das USB-Gerät angeschlossen, schaut man einfach unter /dev/disk/by-id/ nach, wie die ID ist. Es ist ein symbolischer Link auf den Device-Namen.

  (...)
  lrwxrwxrwx 1 root root   9 2006-09-23 17:52 usb-FUJITSU_MHS2060AT_11100E0000403A1B -> ../../sda
  lrwxrwxrwx 1 root root  10 2006-09-23 17:52 usb-FUJITSU_MHS2060AT_11100E0000403A1B-part1 -> ../../sda1
  
Nun kann man diese ID in der Filesystem Table (alles in einer Zeile) eintragen (/etc/fstab):
  /dev/disk/by-id/usb-FUJITSU_MHS2060AT_11100E0000403A1B-part1 /data/VOLUME_NAME ext3 loop,encryption=aes256,user,noauto 0 0
  
Die Option noauto verhindert das automatische Einbinden während des Bootprozesses. Die Option user ermöglicht es einem non-root User diese Partition zu mounten und zwar mittels
  
das einhängen (mit Passwortabfrage) und durch
  
das aushängen.

Fazit

Die Verschlüsselung von USB-Massenspeichern mit SuSE Linux 10.1 ist möglich. Sie ist flexibel und relativ einfach handhabbar. Was fehlt ist die 100%ige Unterstützung aus YaST2 heraus.


Links: