5.4. Arbeiten mit ACLs

Tabelle 5.1, „Typen von ACL-Einträgen“ fasst die sechs möglichen Typen von ACL-Einträgen zusammen und beschreibt die für einen Benutzer oder eine Gruppe von Benutzern verfügbaren Berechtigungen. Der Eintrag owner definiert die Berechtigungen des Benutzers, der Eigentümer der Datei oder des Verzeichnisses ist. Der Eintrag owning group definiert die Berechtigungen der Gruppe, die Eigentümer der Datei ist. Der Superuser kann den Eigentümer (owner) oder die Eigentümergruppe (owning group) mit chown oder chgrp ändern, in welchem Fall die Einträge „owner“ und „owning group“ sich auf den neuen Eigentümer bzw. die neue Eigentümergruppe beziehen. Die Einträge des Typs named user definieren die Berechtigungen des Benutzers, der im Bezeichnerfeld des Eintrags angegeben ist. Die Einträge des Typs named group definieren die Berechtigungen der im Bezeichnerfeld des Eintrags angegebenen Gruppe. Nur die Einträge des Typs „named user“ und „named group“ verfügen über ein Bezeichnerfeld, das nicht leer ist. Der Eintrag other definiert die Berechtigungen aller anderen Benutzer.

Der Eintrag mask schränkt die durch die Einträge „named user“, „named group“ und „owning group“ gewährten Berechtigungen ein, indem durch ihn festgelegt werden kann, welche der Berechtigungen in diesen Einträgen wirksam und welche maskiert sind. Sind Berechtigungen sowohl in einem der oben genannten Einträge als auch in der Maske vorhanden, werden sie wirksam. Berechtigungen, die nur in der Maske oder nur im eigentlichen Eintrag vorhanden sind, sind nicht wirksam, d. h., die Berechtigungen werden nicht gewährt. Die in den Einträgen „owner“ und „owning group“ gewährten Berechtigungen sind immer wirksam. Dieser Mechanismus wird mit dem Beispiel in Tabelle 5.2, „Maskierung von Zugriffsberechtigungen“ verdeutlicht.

Es gibt zwei grundlegende Klassen von ACLs: Eine minimale ACL enthält nur die Einträge für die Typen „owner“, „owning group“ und „other“, die den traditionellen Berechtigungsbits für Dateien und Verzeichnisse entsprechen. Eine erweiterte ACL geht über dieses Konzept hinaus. Sie muss einen Eintrag des Typs „mask“ enthalten und kann mehrere Einträge des Typs „named user“ und „named group“ haben.

Tabelle 5.1. Typen von ACL-Einträgen

Typ

Textformat

owner

user::rwx

named user

user:name:rwx

owning group

group::rwx

named group

group:name:rwx

mask

mask::rwx

other

other::rwx

Tabelle 5.2. Maskierung von Zugriffsberechtigungen

Eintragstyp

Textformat

Berechtigungen

named user

user:geeko:r-x

r-x

mask

mask::rw-

rw-

wirksame Berechtigungen:

r--

5.4.1. ACL-Einträge und Dateimodus-Berechtigungsbits

Abbildung 5.1, „Minimale ACL: ACL-Einträge vs. Berechtigungsbits“ und Abbildung 5.2, „Erweiterte ACL: ACL-Einträge vs. Berechtigungsbits“ zeigen eine minimale und eine erweiterte ACL. Die Abbildungen sind in drei Blöcke gegliedert. Der linke Block zeigt die Typspezifikationen der ACL-Einträge, der mittlere Block zeigt ein Beispiel einer ACL und der rechte Block zeigt die entsprechenden Berechtigungsbits gemäß dem herkömmlichen Berechtigungskonzept, wie sie beispielsweise auch ls -l anzeigt. In beiden Fällen werden die Berechtigungen owner class dem ACL-Eintrag „owner“ zugeordnet. Other class-Berechtigungen werden dem entsprechenden ACL-Eintrag zugeordnet. Die Zuordnung der Berechtigungen des Typs group class ist in den beiden Fällen jedoch unterschiedlich.

Abbildung 5.1. Minimale ACL: ACL-Einträge vs. Berechtigungsbits

Minimale ACL: ACL-Einträge vs. Berechtigungsbits

Im Fall einer minimalen ACL – ohne „mask“ – werden die „group class“-Berechtigungen dem ACL-Eintrag „owning group“ zugeordnet. Dies ist in Abbildung 5.1, „Minimale ACL: ACL-Einträge vs. Berechtigungsbits“ dargestellt. Im Fall einer erweiterten ACL – mit „mask“ – werden die „group class“-Berechtigungen dem „mask“-Eintrag zugeordnet. Dies ist in Abbildung 5.2, „Erweiterte ACL: ACL-Einträge vs. Berechtigungsbits“ dargestellt.

Abbildung 5.2. Erweiterte ACL: ACL-Einträge vs. Berechtigungsbits

Erweiterte ACL: ACL-Einträge vs. Berechtigungsbits

Durch diese Art der Zuordnung ist die reibungslose Interaktion von Anwendungen mit und ohne ACL-Unterstützung gewährleistet. Die Zugriffsberechtigungen, die mittels der Berechtigungsbits festgelegt wurden, sind die Obergrenze für alle anderen „Feineinstellungen“, die per ACL vorgenommen werden. Werden Berechtigungsbits geändert, spiegelt sich dies in der ACL wider und umgekehrt.

5.4.2. Ein Verzeichnis mit einer Zugriffs-ACL

Mit getfacl und setfacl in der Befehlszeile können Sie auf ACLs zugreifen. Die Verwendung dieser Befehle wird im folgenden Beispiel erläutert:

Bevor Sie das Verzeichnis erstellen, können Sie mit dem Befehl umask festlegen, welche Zugriffsberechtigungen gleich beim Erstellen von Dateiobjekten maskiert werden sollen. Der Befehl umask 027 legt die Standardberechtigungen fest, wobei er dem Eigentümer sämtliche Berechtigungen (0) gewährt, der Gruppe den Schreibzugriff (2) verweigert und allen anderen Benutzern überhaupt keine Berechtigungen erteilt (7). Die entsprechenden Berechtigungsbits werden von umask maskiert oder deaktiviert. Weitere Informationen hierzu finden Sie auf der Manualpage umask.

mkdir mydir erstellt das Verzeichnis mydir mit den durch umask festgelegten Standardberechtigungen. Mit dem Befehl ls -dl mydir können Sie prüfen, ob alle Berechtigungen ordnungsgemäß zugewiesen wurden. Die Ausgabe für dieses Beispiel sieht wie folgt aus:

drwxr-x--- ... tux project3 ... mydir

Mit dem Befehl getfacl mydir prüfen Sie den anfänglichen Status der ACL. Es werden ähnliche Informationen wie im folgenden Beispiel zurückgegeben:

# file: mydir 
# owner: tux 
# group: project3 
user::rwx 
group::r-x 
other::---
     

Die ersten drei Zeilen der Ausgabe nennen Namen, Eigentümer und Eigentümergruppe des Verzeichnisses. Die drei nächsten Zeilen enthalten die drei ACL-Einträge „owner“, „owning group“ und „other“. Insgesamt liefert Ihnen der Befehl getfacl im Fall dieser minimalen ACL keine Informationen, die Sie mit ls nicht auch erhalten hätten.

Ändern Sie die ACL so, dass Sie dem zusätzlichen Benutzer geeko und der zusätzlichen Gruppe mascots Lese-, Schreib- und Ausführberechtigungen gewähren, indem Sie folgenden Befehl eingeben:

setfacl -m user:geeko:rwx,group:mascots:rwx mydir

Mit der Option -m kann per setfacl die vorhandene ACL geändert werden. Das nachfolgende Argument gibt an, welche ACL-Einträge geändert werden (mehrere Einträge werden durch Kommas voneinander getrennt). Im letzten Teil geben Sie den Namen des Verzeichnisses an, für das diese Änderungen gelten sollen. Mit dem Befehl getfacl können Sie sich die resultierende ACL ansehen.

# file: mydir 
# owner: tux 
# group: project3 
user::rwx 
user:geeko:rwx 
group::r-x
group:mascots:rwx 
mask::rwx 
other::--- 

Zusätzlich zu den von Ihnen erstellten Einträgen für den Benutzer geeko und die Gruppe mascots wurde ein „mask“-Eintrag generiert. Der mask-Eintrag wird automatisch gesetzt, sodass alle Berechtigungen wirksam sind. Außerdem passt setfacl vorhandene mask-Einträge automatisch an die geänderten Einstellungen an, es sei denn, Sie deaktivieren diese Funktion mit -n. „mask“ legt die maximal wirksamen Zugriffsberechtigungen für alle Einträge innerhalb der „group class“ fest. Dazu gehören „named user“, „named group“ und „owning group“. Die Berechtigungsbits des Typs „group class“, die mit ls -dl mydir ausgegeben werden, entsprechen jetzt dem mask-Eintrag.

drwxrwx---+ ... tux project3 ... mydir
   

Die erste Spalte der Ausgabe enthält ein zusätzliches +, um darauf hinzuweisen, dass für dieses Objekt eine erweiterte ACL vorhanden ist.

Gemäß der Ausgabe des Befehls ls beinhalten die Berechtigungen für den mask-Eintrag auch Schreibzugriff. Solche Berechtigungsbits würden normalerweise bedeuten, dass die „owning group“ (hier project3) ebenfalls Schreibzugriff auf das Verzeichnis mydir hätte. Allerdings sind die wirklich wirksamen Zugriffsberechtigungen für die „owning group“ als die Schnittmenge aus den für „owning group“ und den für „mask“ gesetzten Berechtigungen definiert, in unserem Beispiel also r-x (siehe Tabelle 5.2, „Maskierung von Zugriffsberechtigungen“). Was die wirksamen Berechtigungen der „owning group“ in diesem Beispiel betrifft, hat sich also nach dem Hinzufügen der ACL-Einträge nichts geändert.

Bearbeiten Sie den mask-Eintrag mit setfacl oder chmod. Geben Sie beispielsweise chmod g-w mydir ein. ls -dl mydir gibt dann Folgendes aus:

drwxr-x---+ ... tux project3 ... mydir

getfacl mydir erzeugt folgende Ausgabe:

# file: mydir 
# owner: tux 
# group: project3 
user::rwx 
user:geeko:rwx          # effective: r-x
group::r-x 
group:mascots:rwx       # effective: r-x 
mask::r-x 
other::---

Nachdem Sie mit dem Befehl chmod den Schreibzugriff über die „group class“-Bits deaktiviert haben, liefert Ihnen bereits die Ausgabe des Befehls ls den Hinweis darauf, dass die mask-Bits entsprechend angepasst wurden: Die Schreibberechtigung ist wieder auf den Eigentümer von mydir beschränkt. Dies wird durch die Ausgabe des Befehls getfacl bestätigt. Dieser Befehl fügt allen Einträgen Kommentare hinzu, deren tatsächlich wirksame Berechtigungsbits nicht mit den ursprünglich gesetzten übereinstimmen, weil sie vom mask-Eintrag herausgefiltert werden. Die ursprünglichen Berechtigungen können jederzeit mit dem Befehl chmod g+w mydir wiederhergestellt werden.

5.4.3. Ein Verzeichnis mit einer Standard-ACL

Verzeichnisse können über eine Standard-ACL verfügen. Dabei handelt es sich um einen speziellen Typ von ACL, der festlegt, welche Zugriffsberechtigungen neue Unterobjekte dieses Verzeichnisses bei ihrer Erstellung erben. Eine Standard-ACL wirkt sich sowohl auf Unterverzeichnisse als auch auf Dateien aus.

5.4.3.1. Auswirkungen einer Standard-ACL

Die Zugriffsberechtigungen in der Standard-ACL eines Verzeichnisses werden an Dateien und Unterverzeichnisse unterschiedlich vererbt:

  • Ein Unterverzeichnis erbt die Standard-ACL des übergeordneten Verzeichnisses sowohl als seine eigene Standard-ACL als auch als Zugriffs-ACL.

  • Eine Datei erbt die Standard-ACL als ihre eigene Zugriffs-ACL.

Alle Systemaufrufe, die Dateisystemobjekte anlegen, verwenden einen mode-Parameter, der die Zugriffsberechtigungen für das neu erstellte Dateisystemobjekt definiert. Hat das übergeordnete Verzeichnis keine Standard-ACL, werden die mit umask definierten Berechtigungsbits mit dem mode-Parameter von den Berechtigungen abgezogen und das Ergebnis wird dem neuen Objekt zugewiesen. Existiert eine Standard-ACL für das übergeordnete Verzeichnis, entsprechen die dem neuen Objekt zugewiesenen Berechtigungsbits der Schnittmenge aus den Berechtigungen des mode-Parameters und den in der Standard-ACL festgelegten Berechtigungen. umask wird in diesem Fall nicht beachtet.

5.4.3.2. Standard-ACLs in der Praxis

Die drei folgenden Beispiele führen Sie an die wichtigsten Operationen an Verzeichnissen und Standard-ACLs heran:

  1. Fügen Sie dem vorhandenen Verzeichnis mydir eine Standard-ACL hinzu, indem Sie folgenden Befehl eingeben:

    setfacl -d -m group:mascots:r-x mydir
    

    Die Option -d des Befehls setfacl weist setfacl an, die folgenden Änderungen (Option -m) an der Standard-ACL vorzunehmen.

    Sehen Sie sich das Ergebnis dieses Befehls genauer an:

    getfacl mydir
    
    # file: mydir 
    # owner: tux 
    # group: project3 
    user::rwx 
    user:geeko:rwx 
    group::r-x
    group:mascots:rwx 
    mask::rwx 
    other::--- 
    default:user::rwx
    default:group::r-x 
    default:group:mascots:r-x 
    default:mask::r-x
    default:other::---
    

    getfacl gibt sowohl die Zugriffs-ACL als auch die Standard-ACL zurück. Die Standard-ACL setzt sich aus allen Zeilen zusammen, die mit default beginnen. Obwohl Sie den Befehl setfacl nur mit einem Eintrag für die Gruppe mascots für die Standard-ACL ausgeführt haben, hat setfacl automatisch alle anderen Einträge aus der Zugriffs-ACL kopiert, um so eine gültige Standard-ACL zu bilden. Standard-ACLs haben keine direkten Auswirkungen auf Zugriffsberechtigungen. Sie wirken sich nur beim Erstellen von Dateisystemobjekten aus. Diese neuen Objekte übernehmen Berechtigungen nur aus der Standard-ACL ihres übergeordneten Verzeichnisses.

  2. Im nächsten Beispiel wird mit mkdir ein Unterverzeichnis in mydir angelegt, das die Standard-ACL übernimmt.

    mkdir mydir/mysubdir
    
    getfacl mydir/mysubdir 
    
    # file: mydir/mysubdir 
    # owner: tux 
    # group: project3 
    user::rwx 
    group::r-x 
    group:mascots:r-x 
    mask::r-x
    other::--- 
    default:user::rwx 
    default:group::r-x
    default:group:mascots:r-x 
    default:mask::r-x 
    default:other::---
    

    Wie erwartet, hat das neu angelegte Unterverzeichnis mysubdir die Berechtigungen aus der Standard-ACL des übergeordneten Verzeichnisses geerbt. Die Zugriffs-ACL von mysubdir ist ein exaktes Abbild der Standard-ACL von mydir. Die Standard-ACL, die dieses Verzeichnis an ihre untergeordneten Objekte weitervererbt, ist ebenfalls dieselbe.

  3. Legen Sie mit touch eine Datei im Verzeichnis mydir an. Beispiel: touch mydir/myfile. ls -l mydir/myfile gibt dann Folgendes zurück:

    -rw-r-----+ ... tux project3 ... mydir/myfile 
    

    Die Ausgabe von getfacl mydir/myfile lautet wie folgt:

    # file: mydir/myfile 
    # owner: tux 
    # group: project3
    user::rw- 
    group::r-x          # effective:r-- 
    group:mascots:r-x   # effective:r-- 
    mask::r-- 
    other::--- 
    

    touch übergibt mode mit dem Wert 0666. Dies bedeutet, dass neue Dateien mit Lese- und Schreibberechtigungen für alle Benutzerklassen angelegt werden, vorausgesetzt, umask oder die Standard-ACL enthalten keine weiteren Einschränkungen (siehe Abschnitt 5.4.3.1, „Auswirkungen einer Standard-ACL“). Am konkreten Beispiel heißt dies, dass alle Zugriffsberechtigungen, die nicht im mode-Wert enthalten sind, aus den entsprechenden ACL-Einträgen entfernt werden. Aus dem ACL-Eintrag der „group class“ wurden keine Berechtigungen entfernt, allerdings wurde der mask-Eintrag dahin gehend angepasst, dass Berechtigungsbits, die nicht mit mode gesetzt werden, maskiert werden.

    Auf diese Weise ist sichergestellt, dass Anwendungen, zum Beispiel Compiler, reibungslos mit ACLs interagieren können. Sie können Dateien mit beschränkten Zugriffsberechtigungen erstellen und diese anschließend als ausführbar markieren. Über den mask-Mechanismus ist gewährleistet, dass die richtigen Benutzer und Gruppen die Dateien wie gewünscht ausführen können.

5.4.4. Der ACL-Auswertungsalgorithmus

Bevor ein Prozess oder eine Anwendung Zugriff auf ein durch eine ACL geschütztes Dateisystemobjekt erhält, wird ein Auswertungsalgorithmus angewendet. Die ACL-Einträge werden grundsätzlich in der folgenden Reihenfolge untersucht: „owner“, „named user“, „owning group“ oder „named group“ und „other“. Über den Eintrag, der am besten auf den Prozess passt, wird schließlich der Zugriff geregelt. Berechtigungen werden nicht akkumuliert.

Komplizierter werden die Verhältnisse, wenn ein Prozess zu mehr als einer Gruppe gehört, also potenziell auch mehrere group-Einträge dazu passen können. Aus den passenden Einträgen mit den erforderlichen Berechtigungen wird per Zufallsprinzip ein Eintrag ausgesucht. Für das Endresultat „Zugriff gewährt“ ist es natürlich unerheblich, welcher dieser Einträge den Ausschlag gegeben hat. Ähnliches gilt, wenn keiner der passenden group-Einträge die erforderlichen Berechtigungen enthält. In diesem Fall löst ein per Zufallsprinzip ausgewählter Eintrag das Ergebnis „Zugriff verweigert“ aus.