| 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. |
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.
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 completeHier 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
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.
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 : 24DES 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.
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 ahthie9TDie Wahl des Passworts sollte sorgfältig erfolgen, da man es nachträglich nicht mehr ändern kann.
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.
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.
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 -> ../../sda1Nun 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 0Die 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.
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.