Rie
-
14.
Jan.
1997
AKBP-II 1997: Gruppe 4
Es wird empfohlen, die aktuellere englische Version zu lesen!
Das Crypt-Dateisystem
Funktionalität:
Beim Crypt-Dateisystem handelt es sich um ein Loopback-Filesystem,
das es dem Benutzer erlaubt, Daten verschlüsselt abzuspeichern.
Nachdem das Crypt-Dateisystem gemountet wurde, kann mit Hilfe des
User-Level-Programms cryptfs_setkey einer Shell ein Schlüssel
zugeordnet werden, der von nun an zum ver- und entschlüsseln
bei allen Dateizugriffen innerhalb des Crypt-Dateisystems verwendet
wird. Dabei ist zu beachten, daß die Weitergabe des Schlüssels
an die UNIX-Prozeßerzeugung geknüpft ist: Alle Sohnprozesse
der mit cryptfs_setkey erzeugten Shell erhalten automatisch eine Kopie
des Schlüssels und erhalten somit Zugiff auf die verschlüsselten
Daten. Dieses Vorgehen ist besonders aus sicherheitstechnischer Sicht
interessant, da selbst bei einem "Einbruch" in einen Rechner der
Schlüssel nur schwer zugänglich ist.
Für den Benutzer bleibt das ver- und entschlüsseln transparent:
Sobald der Schlüssel gesetzt wurde, können alle UNIX-Programme
wie gewohnt benutzt werden, während das unterliegende Crypt-Dateisystem
sich selbständig um das Krypten kümmert.
Implementation:
Das Crypt-Dateisystem besteht aus den drei logischen Komponenten Dateisystem-,
Vnode- und Schlüsselverwaltung.
Dateisystem-/Vnode-Verwaltung
Die Dateisystemverwaltung unterscheidet sich kaum von einem
"normalen" Dateisystem. Der wesentliche Unterschied besteht
darin, daß neben einer Vnode-Liste eine separate Liste
für die Verwaltung der Krypt-Vnodes (siehe unten) gehalten
wird.
In den Funktionen für die Vnode-Verwaltung wird die eigentliche
Arbeit erledigt, wobei alle Aktionen, die nicht an der
Verschlüsselung beteiligt sind, einfach an das unterliegende
Dateisystem weitergegeben werden. Die Ver- und Entschlüsselung
selbst wird in der write- bzw. read-Funktion durchgeführt.
Da die Kryptroutinen nur auf Blöcken arbeiten (jeweils acht
Bytes), werden verschlüsselte Dateien um eine Blocklänge
vergrößert. Somit ist sichergestellt, daß der
Krypt-Algorithmus auch die letzten Bytes einer Datei (wenn diese nicht
genau einen 8-Byte-Block füllen) bearbeiten kann. Allerdings
muß beim Lesen, Schreiben usw. diese veränderte
Dateilänge berücksichtigt werden, um Inkonsistenzen zu
vermeiden. Zudem wird beim Lesen und Schreiben innerhalb einer Datei
darauf geachtet, immer vollständige Blöcke zu bearbeiten,
auch wenn der Benutzerauftrag nicht genau mit einer Blockgrenze
beginnt und endet, was ebenfalls eine Folge der blockorientierten
Kryptroutinen ist.
Die Schlüsselverwaltung
Das Verschlüsselungsverfahren
Als Verschlüsselungsverfahren wird das symmetrische System DES verwendet,
d.h. es gibt nur einen Schlüssel zum Ver- und
Entschlüsseln. In der derzeitigen Version hat der Schluessel
eine Laenge von 8 Byte; er wird in dem bereits erwähnten
User-Level-Programm "cryptfs_setkey" vom Benutzer im Hex-Format angegeben.
Die Verwaltung dieses Schlüssels im Unix-Kern, die einen
prozeßabhängigen und an die Sohnprozesse vererbbaren Schlüssel
erlaubt, wird im folgenden näher erläutert.
Die Schlüsselverwaltung
Um die Vererbung zu ermöglichen, muß der Schlüssel in einer
prozeßabhängigen Datenstruktur abgelegt werden, die nach den
Systemaufrufen "fork()" und "exec()" bestehen bleibt. Hier bieten sich die
Filedeskriptoren an, da die Einträge der file descriptor table beim
Erzeugen eines Sohnprozesses dupliziert werden bzw. beim Ausführen eines
Kommandos mit "exec()" erhalten bleiben. Konkret wurde ein bestimmter
Filedeskriptor (Nummer 63) ausgewählt, der, wenn ein Prozeß auf
verschlüsselte Daten zugreifen können soll, auf eine spezielle v-node
verweisen muß, in deren private-data-Bereich der Schlüssel vermerkt
ist. Beim Aufruf der Operationen "read()" und "write()" des Crypt Filesystems
wird zunächst geprüft, ob der 63. Eintrag in der file descriptor
table des aufrufenden Prozesses auf eine vnode des passenden Typs (also auf
eine "key-vnode") verweist. Ist dies nicht der Fall, wird der Aufruf mit dem
Rückgabewert für "Access denied" (EACCES) abgebrochen. Wird die
passende key-vnode vorgefunden, kann der Schlüssel ausgelesen und zum
ver-/entschlüsseln benutzt werden. Hierbei kann nicht getestet werden, ob
es sich um den "passenden" Schlüssel handelt, d.h. bei Vorliegen eines
falschen Schlüssels liefert die Lese-Routine unbrauchbare Ausgaben.
Das Setzen des Schlüssels
Um den Codeaufwand, der im Cryptfilesystem-Modul für die Erzeugung der
key-vnodes anfällt, möglichst gering zu halten, wird ein key-vnode
von der "lookup()"-Funktion des Cryptfilesystems erzeugt, wenn ein Aufruf mit
dem Namen ".keytab" durchgeführt wird. In "cryptfs_setkey" wird deshalb
ein "open()" auf dieses File aufgerufen, daß einen Filedeskriptor
zurückgibt, der auf eine key-vnode verweist. Diese ist zunächst
nicht mit einem Schlüssel initialisiert. Mit Hilfe von "dup2()" sorgt
"crypt_setkey" nun dafür, daß gemäß Konvention
Filedeskriptor 63 auf den neuen key-vnode zeigt; Der zunächst erhaltene
Filedeskriptor wird freigegeben. Die Initialisierung des key-vnode erfolgt
durch einen Aufruf von "write()" mit dem vom Benutzer angegebenen
Schlüssel als dem zu "schreibenden" Puffer. Dieser Schlüssel wird in
den "private data"-Bereich des key-vnodes eingetragen, aus dem er bei
nachfolgenden Lese- und Schreiboperationen über den Zugriff auf
Filedeskriptor 63 gelesen werden kann. Ist der vom Benutzer an "crypt_setkey"
übergebene Schlüssel falsch oder wird versucht, auf eine Datei des
Cryptfilesystems zuzugreifen, die - z.B. von einem anderen Benutzer - mit einem
anderen Schlüssel verschlüsselt worden ist, kann dies in der
derzeitigen Version noch nicht erkannt werden. Der entsprechende Aufruf von
"read()" wird deshalb zwar scheinbar erfolgreich zurückkehren, aber die
gelesenen Daten sind freilich unbrauchbar.
Erweiterungsmöglichkeiten:
Hier noch ein kleiner Ausblick auf "Features", die evtl. noch zu
implementieren wären:
Vergeben von file-handles (NFS)
Mountoption zum Festlegen der Verschlüsselungsrichtung:
Bisher wird beim Lesen ent- und beim Schreiben
verschlüsselt. Will man aber z.B. Dateien, die im Klartext auf
der Platte liegen, verschlüsselt übers Netz schicken, so
könnte dies durch eine Umkehrung der
Verschlüsselungsrichtung erreicht werden.
Anbieten verschiedener Verschlüsselungsverfahren
Erkennen falscher Schlüssel
Minimierung der Anzahl globaler Symbole
Fehlertoleranz von ``setkey''
...
Unser Server |
Brief an Webmaster |
Navigationshinweise |
Suche