NFS4 ACLs

NFS4 ACLs

ACL steht für Access Control List und ermöglicht eine sehr fein abgestufte Vergabe von Rechten (lesen, schreiben, ausführen), die ein Benutzer oder eine Benutzergruppe an einer Datei oder einem Verzeichnis haben soll. Man muß zwischen zwei ACL-Varianten Unterscheiden: Posix-ACLs und die an der Uni z.B. für die Home-Verzeichnisse wichtigen NFS4-ACLs.

Posix ACLs

Den meisten Linux-Nutzern fallen beim Thema  ACL sicherlich sofort Kommandos wie setfacl und getfacl ein, die aber hier an der Uni nur noch auf lokalen Dateisystemen  anwendbar sind, aber nicht mehr für z.B. NFS-gemountete Home-Verzeichnisse. Mit Hilfe dieser Kommandos ist es in Linux normalerweise möglich Lese- bzw. Schreibrechte für eine Datei oder ein Verzeichnis an einzelne Nutzer bzw Gruppen freizugeben. Genau diese Kommandos konnten vor NFS4  auch genutzt werden, wenn man eine Datei auf die über NFS zugegriffen wurde für z.B. einen Benutzer freigeben wollte. Diese Form der ACLs wird auch als Posix-ACLs bezeichnet.

Sollten z.B. die Benutzer fred und john auf die Datei file1, die dem Benutzer bill gehört Lese- und Schreibzugriff haben, so konnte diese POSIX ACL mit folgendem Kommando gesetzt werden

$ ls -l file1
-rw-r--r-- 1 bill employee 0 10. Sep 15:23 file1
$ setfacl -m u:fred:rw file1
$ setfacl -m u:john:rw file1

$ls -l file1
-rw-rw-r--+ 1 bill employee 0 10. Sep 15:24 file1

$getfacl file1
# file: file1
# owner: bill
# group: employee
user::rw-
user:fred:rw-
user:john:rw-
group::r--
mask::rw-
other::r--

In diesem Beispiel sieht man deutlich, das eine Datei, für die wie oben dargestellt eine ACL gesetzt wird bei den normalen Unix-Rechten ein zusätzliches "+" erscheint, um anzudeuten, das diese Datei über weitere ACLs verfügt, die mit getfacl angezeigt werden können.

NFS4-ACLS

Mit dem an der Uni eingesetzten Netzwerkdateisystem NFS4 können die beiden genannten Kommandos leider nicht mehr weiter genutzt werden, NFS4 führt eigene Kommandos zu diesem Zweck ein, die auf den Namen nfs4_setfacl und nfs4_getfacl hören. Wer sich nicht scheut man-Pages zu lesen, findet sehr detaillierte Informationen über die Nutzung der beiden Kommandos mit:

  • man nfs4_acl
  • man nfs4_getfacl
  • man nfs4_setfacl

Auch wenn Posix-ACLs und NFS4-ACLs letztlich dem gleichen Zweck dienen, gibt es dennoch zahlreiche Unterschiede, die über die reinen Kommandonamen (setfacl<->nfs4_setfacl, ...) deutlich hinausgehen.

Im direkten Vergeleich mit dem Posix-ACL Beispiel von oben sind folgende Kommandos notwendig, um entsprechende NFS4-ACLs zu setzen

$ ls -l file1
-rw-r--r-- 1 bill employee 0 10. Sep 15:23 file1
$ nfs4_setfacl -a A::fred@linuxdc.uni-koblenz.de:RW file1
$ nfs4_setfacl -a A::john@linuxdc.uni-koblenz.de:RW file1

$ ls -l file1
-rw-rw-r-- 1 bill employee 0 10. Sep 15:24 file1

$ nfs4_getfacl file1
A::OWNER@:rwatTcCy
A::fred@linuxdc.uni-koblenz.de:rwatcy
A::john@linuxdc.uni-koblenz.de:rwatcy
A::GROUP@:rtcy
A::EVERYONE@:rtcy

Unterschiede

An diesemBeipsiel fallen sofort mehrere grundlegende Unterschiede zu dem vorangegangenen Beispiel mit Posix-ACLs auf:

  • In der Ausgabe von ls -l ist nicht mehr ersichtlich ob für eine Datei eine NFS4-ACL gesetzt ist, was bei Posix durch das zusätzliche "+" angedeutet wurde. Der einzige Weg heruaszufinden, ob für eine Datei  eine ACL angelegt wurde ist der nfs4_getfacl-Aufruf für diese Datei.
  • NFS4 ACLs  bestehen aus sogenannten ACE (jede Zeile in der nfs4_getfacl-Ausgabe von oben  ist eine solche ACE). Eine ACE ermöglicht das "Erlauben" (A::-ACE) oder verweigern (D::-ACE) einer Vielzahl von  möglichen Rechten. So unterscheiden NFS4-ACLs beispielsweise  das Lesen und Schreiben von Datei-Attributen und ACLs (c,C, t,T)-Rechte vom Lesen bzw Schreiben der eigentlichen Daten (r,w). Insgesamt existieren 13 verschiedene Rechte für Dateien und 14 für Verzeichnisse. Eine genaue Beschreibung findet sich in den man-pages zu nfs4_acl (Kommando: man nfs4_acl).
    Um diese Komplexität zu vermindern wurden Rechte in Großbuchstaben als Kurzschreibweise eingeführt, die den klassischen Unix-Rechten entsprechen: R,W,X. Von dieser Möglichkeit wurde in obigem Beispiel beim Setzen der ACL  mit nfs4_setfacl bereits Gebrauch gemacht. Ein R steht dabei z.B.  für die Rechte "rtcy", ein W für "rwatcy" .
  • Soll einem Benutzer oder einer Gruppe ein Recht eingeräumt werden, muß der Kennungsname immer zusammen mit dem Kerberos-Domainnamen linuxdc.uni-koblenz.de geschrieben werden: user@linuxdc.uni-koblenz.de und nicht: user.
  • Die Form einer ACE die ein Recht einräumt ist:  A::Benutzer|Gruppe:Recht
    Die Form einer ACE die ein Recht verweigert ist  D::Benutzer|Gruppe:Recht
    Genaue Informationen zu erlaubten ACEs finden sich in den man-.pages zu nfs4_acl (Kommando: man nfs4_acl).
  • Das Setzen/Hinzufügen einer ACL erfolgt mit nfs4_setfacl -a <ACE> <Datei>
  • Das Entfernen einer ACL erfolgt mit  nfs4_setfacl -x <ACE> <Datei> oder besser im interaktiven ACL-Editor, der mit nfs4_setfacl -e <Datei> gestartet wird. In diesem Editor, im Normalfall wir der Editor vi hierfür genutzt, wird jede ACE  auf einer Zeile dargestellt. Soll z.B. eine  ACE gelöscht werden, wird einfach die entsprechende Zeile gelöscht und die Datei wieder geschrieben.
  • Um ACLs rekursiv für ein Verzeichnis und alle darin enthaltenen Daten und Unterverzeichnisse zu setzen muß bei einem nfs4_sefacl -Aufruf die Option -R verwendet werden, wie z.B:
$ nfs4_setfacl -R -a A::fred@linuxdc.uni-koblenz.de:RW mydirectory

NFS4 Default-ACLs

Für Verzeichnisse ist es möglich eine Default oder auch Inherited  genannte ACEs zu setzen. Wird anschließend eine neue Datei oder ein neues Unterverzeichnis darin angelegt, erbt die neue Datei bzw. das neue Verzeichnis die in der Default-ACL angegebenen Rechte.  Dabei erbt das neu angelegte Verzeichnis nicht nur die in der Default-ACL zur Vererbung angegeben Zugriffs-Rechte für das Verzeichnis, sondern auch die Default-ACL selbst, so daß Unter- und Unterunter-Verzeichnisse ebenfalls wieder die vorgegebenen Rechte erben können. Falls gewünscht kann diese Weitervererbung aber auch deaktiviert werden,

Wichtig bei vererbten ACLs ist, das bei Dateien oder Verzeichnissen, die ACLs erben immer die Gruppenrechte der Datei als Maske dienen, mit der die maximal erlaubten Rechte auf diese Datei beschränkt werden. Durch das Setzen bzw Löschen von Gruppenrechten werden also direkt vom Vaterverzeichnis geerbte ACL-Rechte beeinflußt. Weiter unten wird anhand von Beispielen mehr dazu gesagt werden.

Das Setzen z.B. einer RW-Default-ACL für einen Benutzer erfolgt mit der ACE:
A:fdi:user@linuxdc.uni-koblenz.de:RW

Soll eine RW-Default-ACL für eine Gruppe gesetzt werden hat die ACE die Form:
A:fdgi:user@linuxdc.uni-koblenz.de:RW

In der Ausgabe von nfs4_getfacl für ein Verzeichnis sind Default-ACLs leicht durch die Inheritance flags :fdi: bzw :fdgi: erkennbar.  Weitere Informationen zu den Inheritance Flags finden sich in den Handbuchseiten zu nfs4_acl, auf die mit man nfs4_acl zugegriffen werden kann.

Hier ein Beispiel in dem für ein Verzeichnis topdir Default-ACLs gesetzt werden sollen, so das jede  neue Datei, bzw jedes neue Unterverzeichnis  für den Benutzer john und die Gruppe org die Rechte RWX haben soll. Der Benutzer, der diese Kommandos eingibt sei fred:

$ mkdir topdir
$ nfs4_setfacl -a A:fdi:john@linuxdc.uni-koblenz.de:RWX topdir
$ nfs4_setfacl -a A:fdgi:org@linuxdc.uni-koblenz.de:RWX topdir
$ nfs4_getfacl topdir
A::OWNER@:rwaDxtTcCy
A::GROUP@:rwaDxtcy
A::EVERYONE@:rxtcy
D:fdi:OWNER@:rwaDx
A:fdi:OWNER@:tTcCy
A:fdi:john@linuxdc.uni-koblenz.de:rwaDxtcy
A:fdi:GROUP@:tcy
A:fdig:org@linuxdc.uni-koblenz.de:rwaDxtcy
A:fdi:EVERYONE@:tcy

$ umask 0002
$ cd topdir
$ touch newfile

$ nfs4_getfacl newfile # Anzeige der geerbten Rechte
D::OWNER@:rwa # -> "D"==Deny, Owner ohne Rechte. s.u.
A::OWNER@:tTcCy
A::john@linuxdc.uni-koblenz.de:rwatcy # -> RW
A::GROUP@:tcy
A:g:org@linuxdc.uni-koblenz.de:rwatcy # -> RW
A::EVERYONE@:tcy

$ ls -l newfile
----rw---- 1 fred employee 0 11. Sep 09:40 newfile

$ chmod g-rw newfile # Loeschen der Gruppenrechte==Maske
$ ls -l newfile
---------- 1 fred employee 0 11. Sep 09:40 newfile
$ nfs4_getfacl newfile
A::OWNER@:tTcCy
A::john@linuxdc.uni-koblenz.de:tcy # weder lesen noch schreiben
A::GROUP@:tcy
A:g:org@linuxdc.uni-koblenz.de:tcy # weder lesen noch schreiben
A::EVERYONE@:tcy

Wie man in dem Beispiel deutlich sehen kann, beeinflussen die Gruppenrechte der neuen Datei alle geerbten ACLs. Sind die Gruppenrechte von newfile  "rw", so enthalten auch die geerbten Rechte für den Nutzer john und die Gruppe org Schreib- und Leserechte. Werden die "rw" Gruppenrechte von newfile jedoch mit dem Kommando chmod entfernt , so enthält anschließend auch die ACL von newfile keine Schreib-Leserechte mehr für den Benutzer john bzw die Gruppe org.

Würde man in einem weiteren chmod z.B. wieder das Gruppen-Leserecht für newfile setzen (chmod g+r newfile), würde  anschließend auch die ACE für john und für die Gruppe org wieder Leserechte enthalten. Die Default-Rechte werden durch das Verändern-der Gruppenrechte also nicht endgültig gelöscht, sondern lediglich maskiert, ausgeblendet.

Bemerkenswert ist auch die Auswirkung der Existenz  der Gruppen-Default-ACL für topdir auf die Rechte des Eigentümers (OWNER@)  einer neu in diesem Verzeichnis angelegten Datei, die diese Default-Rechte erbt, wie z.B. newfile.  In obigem Beispiel enthält die NFS4-ACL von newfile durch die Existenz  der Gruppen-ACL des Verzeichnisses topdir automatisch einen D(isallow)-Eintrag für den Eigentümer (OWNER@) von newfile. Dadurch darf der Eigentümer diese Datei jetzt nicht mehr schreiben/lesen. Die Lösung ist im folgenden Abschnitt  über "Ein Beispiel mit NFS4 Gruppen-ACLs" beschrieben und besteht im zusätzlichen Setzen einer  Default-ACL für das Verzeichnis topdir für den Eigentümer.

Ein Beispiel mit NFS4 Gruppen-ACLs

Es soll eine ACL gesetzt werden, so das beliebige Kennungen, die zu der Gruppe *employee* gehören in einem Verzeichnis "/tmp/mydir" neue Unterverzeichnisse und darin auch weitere Dateien anlegen können.

Hierzu muss eine ACL gesetzt werden, die es der Gruppe "employee" erlaubt das
Verzeichnis zu schreiben als auch eine sogenannte Default-ACL, damit neue Einträge
in "/tmp/mydir" das Gruppen-Recht erben. Eine Default-ACL kann nur für Verzeichnisse gesetzt werden und regelt nicht den Zugriff auf dieses Verzeichnis, sondern dient dazu Rechte vorgeben zu können, die neu in diesem Verzeichnis angelegte Dateien/Unterverzeichnisse  automatisch vom Vaterverzeichnis erben sollen.

Zudem muss eine Default-ACL für den Besitzer des Basis-Verzeichnisses (mydir) gesetzt werden, sonst fehlen anschließend in  neu angelegten Unterverzeichnissen/Dateien alle Rechte für den Benutzer.  Damit würde dann jeglicher Zugriff für den Benutzer selbst auf das Unterverzeichnis oder eine neu angelegte Datei  fehlen.

$ nfs4_setfacl -a A:g:employee@linuxdc.uni-koblenz.de:RWX /tmp/mydir     # 1
$ nfs4_setfacl -a A:fdgi:employee@linuxdc.uni-koblenz.de:RWX /tmp/mydir  # 2
$ nfs4_setfacl -a A:fdi:OWNER@:RWX /tmp/mydir                            # 3
$ nfs4_setfacl -a A:fdi:GROUP@:RWX /tmp/mydir                            # 4

$ cd /tmp/mydir
$ umask 0022   # umask beeinflusst ACLs fuer neue Dateien, siehe unten
$ mkdir neudir # Neues Unterverzeichnis erbt Rechte von mydir
$ ls -l neudir # NFS4-ACLs sind nicht sichtbar in der Ausgabe von ls
drwxr-x--- 2 user employee 6 11. Sep 10:32 neudir

Hier die Beschreibung der einzelnen Kommandos:

  1. Setzen einer  ACL,  um Schreibzugriff für die Gruppe employee auf mydir zu erlauben
  2. Setzen einer Default  ACL für den Schreibzugriff der Gruppe employee auf mydir
  3. Setzen einer Default ACL für den Zugriff des Eigentümers des Verzeichnisses  mydir
  4. Setzen einer Default  ACL für den Zugriff der Gruppe des Verzeichnisses mydir

Die NFS4-ACLs von neudir sehen jetzt wie folgt aus:

$ umask   # gesetzte umask anzeigen
0022
$ nfs4_getfacl neudir
A::OWNER@:rtTcCy
A::GROUP@:rxtcy
A:g:employee@linuxdc.uni-koblenz.de:rxtcy
A::EVERYONE@:tcy
A:fdi:OWNER@:rwaDxtTcCy
A:fdi:GROUP@:rwaDxtcy
A:fdig:employee@linuxdc.uni-koblenz.de:rwaDxtcy
A:fdi:EVERYONE@:tcy

Mit den so gesetzten Rechten kann ein beliebiger Benutzer, der Mitglied der Gruppe employee ist, im Verzeichnis /tmp/mydir eine neue Datei oder ein neues Unterverzeichnis wie z.B. neudir anlegen. Die neu angelegte Datei bzw das neu angelegte Unterverzeichnis erbt dabei automatisch die mittels Default-ACL angegebenen Rechte. Eine neue Datei oder ein neues Verzeichnis wird daher für employee lesbar  sein und  der Eigentümer der Datei/des Verzeichnisses kann im Moment nur mit R-Rechten darauf zugreifen. Zusätzlich dazu erhalten neue Unterverzeichnisse stets auch wieder die Default-ACL des Vaterverzeichnisses , so das auch darin angelegte neue Dateien und Unter-Unterverzeichnisse stets über die gleichen Rechte verfügen werden.

Schaut man sich die einzelnen ACE oben für das Verzeichnis neudir genauer an, fällt jedoch schnell auf, das abgesehen von den Default-ACEs, alle oben ausgegebenen ACEs nur Leserechte (r) einräumen, das erwartete "w"-Recht jedoch fehlt. Die Ursache liegt in dem Befehl umask 0022, der ganz am Anfang ausgeführt wurde (für genaue Informationen über umask siehe: man umask).

Das Linux umask-Kommando dient dazu für neue Dateien und Verzeichnisse festzulegen, welche Rechte eine neue Datei bzw ein neues Verzeichnis erhalten soll. Eine umask von 0022 führt z.B. dazu, das beim Anlegen z.B. eines neuen Verzeichnisses wie neudir die Gruppenrechte dieses Verzeichnisses  --- r-- ---lauten (nur Lesezugriff).   Da die Gruppenrechte aber wiederum als Maske für die vom Vaterverzeichnis mydir geerbten Default-ACLs dienen, werden diese ACLs ebenfalls  auf "nur lesen" beschränkt.

Damit die Defalut-ACL von mydir, die ja Lese- und Schreibrecht für die Gruppe employee vorsieht für neudir wirksam werden kann, muß das Gruppenrecht  für neudir ebenfalls das Schreibrecht enthalten. Dies erfolgt einfach mit dem Kommando chmod g+w neudir. Anschließend wird für neudir jetzt auch das W-Recht für OWNER@, GROUP@ und die Gruppe employee dargestellt.  :

$ chmod g+w neudir
$ ls -l neudir
drwxrwx--- 2 user employee 6 11. Sep 10:32 neudir

$ nfs4_getfacl neudir
A::OWNER@:rwaDxtTcCy
A::GROUP@:rwaDxtcy
A:g:employee@linuxdc.uni-koblenz.de:rwaDxtcy
A::EVERYONE@:tcy
A:fdi:OWNER@:rwaDxtTcCy
A:fdi:GROUP@:rwaDxtcy
A:fdig:employee@linuxdc.uni-koblenz.de:rwaDxtcy
A:fdi:EVERYONE@:tcy