Aufgabenblatt 7

Erweiterter Zugriffsschutz

Abgabe: 8.2.2007

Der Zugriffsschutz in UNIX-ähnlichen Dateisystemen ist recht grobkörnig. In manchen Fällen reichen die Berechtigungen für Eigentümer, Benutzergruppe und alle anderen nicht aus, sondern man würde gerne auch Berechtigungen für weitere Benutzer und/oder Gruppen angeben können. Zugriffsschutzlisten (Access Control Lists, ACL) ermöglichen eine solche feinkörnige Zugriffssteuerung.

Erweitert das Minix-Dateisystem um Zugriffsschutzlisten für Dateien und Verzeichnisse. Stellt ein Administrations-Kommando acl bereit, mit dem der Eigner einer Datei Operationen der folgenden Art vornehmen kann:

acl myfile group mygroup r--
    ermöglicht der Gruppe mygroup nur lesenden Zugriff auf myfile,
acl myfile user myuser r-x
    ermöglicht dem Benutzer myuser nur Lesezugriff und Ausführung,
acl myfile group mygroup ---
    Verweigert der Gruppe mygroup alle Nutzungsrechte,
acl myfile user myuser del
    löscht den ACL-Schutzeintrag von Benutzer myuser.

Richtet zur Durchführung dieser Operationen einen neuen Systemaufruf ein:

#define ACL_SET_USER    1
#define ACL_SET_GROUP   2
#define ACL_DEL_USER   -1
#define ACL_DEL_GROUP  -2
int acl(const char *path, int type, int id, Mode_t mode);
Dabei ist path der Name der zu ändernden Datei oder des zu ändernden Verzeichnisses, type einer der Werte ACL_SET_USER bis ACL_DEL_GROUP, id eine entsprechende Benutzer- oder Gruppen-Nummer, und mode eine bitweise Kombination der Werte R_BIT, W_BIT, X_BIT aus /usr/include/minix/const.h. Der Rückgabewert 0 steht für Erfolg und -1 für Fehlschlag, wobei u.a. die bei chmod(2) aufgeführten Fehlercodes möglich sind.

Verwendet für die Repräsentation der Zugriffsschutzliste auf der Festplatte die bisher unbenutzte zehnte Zone des Minix V2 inode (fs/inode.h). Diese muß eingerichtet werden, wenn der erste Schutzeintrag erstellt wird, und beim Löschen der Datei wieder freigegeben werden. Definiert ferner eine geeignete Datenstruktur (struct aclent) für Schutzeinträge, und erweitert struct buf (fs/buf.h) um eine entsprechende Block-Variante b_acl.

Bedenkt bei der Implementierung, dass es pro Benutzer- bzw. Gruppen-Nummer nur einen Eintrag in der Liste geben darf, und unbenutze Einträge wiederverwendent werden müssen. Ausserdem sollen alle Blöcke der Zone für Schutzeinträge verwendbar sein. Die Auswertung der Schutzliste habe ferner Vorrang vor den Berechtigungen für Sonstige (S_IRWXO).

Zusatzaufgabe (für Interessierte)

Erweitert das Administrations-Kommando, so daß mit einem Aufruf der Form acl myfile die Zugriffsschutzliste der Datei myfile ausgegeben werden kann. Dafür ist ein weiterer Systemaufruf notwendig, mit dem sich Schutzeinträge auslesen lassen. Ihr könnt dabei entweder einzelne struct aclent auslesen, was allerdings recht ineffizient ist, oder besser gleich einen Puffer struct aclent[] übergeben, der dann vom Systemaufruf mit mehreren Einträgen gefüllt wird.

Hinweise

Um die ID zu einem Benutzer- oder Gruppennamen zu erfahren könnt Ihr die Funktionen getpwnam(3) bzw. getgrnam(3) verwenden. Für die Implementierung des Systemaufrufs acl() schaut nochmal in die Hinweise zu Aufgabe 3, aber verfolgt stattdessen den Systemaufruf chmod(), da dieser näher an der gewünschten Funktionalität liegt. Das Löschen von Dateien findet in truncate (fs/link.c) statt. Zum Testen könnt Ihr weitere Benutzer und Gruppen anlegen, indem Ihr die entsprechenden Verwaltungsdateien editiert (siehe passwd(5)) oder entsprechende Verwaltungskommandos (adduser(8)) benutzt.