Dateien und Verzeichnisse unter Ubuntu besitzen einen Standardsatz an Berechtigungen, welche den Zugriff auf Dateisystemebene kontrollieren. Dieser Blog-Artikel erklärt die wichtigsten Konzepte und dokumentiert die notwendigen Befehle für die Kommandozeile.
Einführung
Ubuntu und die meisten anderen Linux-Distributionen implementieren die Zugriffskontrolle auf das Dateisystem als Discretionary Access Control (DAC). Hierbei wird jede Datei bzw. jedes Verzeichnis von einem oder mehreren Benutzern in Besitz genommen, welche die Zugriffsrichtlinien bestimmen.
Benutzer und Gruppen
Unter Ubuntu wird jeder Benutzer durch ein Benutzerkonto repräsentiert. Ein Benutzer hat einen Namen und eine eindeutige UID (User ID). Ein Benutzer kann eine reale Person (regular user) sein oder eine bestimmte Rolle im System (service user) repräsentieren.
Benutzer könne in Gruppen zusammengefasst werden. Dies dient u.a. der effektiveren Zuweisung von Rechten. Eine Gruppe hat einen Namen und eine eindeutige GID (Group ID).
Ein Benutzer kann Mitglied mehrerer Gruppen sein, aber nur eine Gruppe kann seine Hauptgruppe (Primary Group) sein. Die Hauptgruppe eines Benutzers ist in der Datei /etc/passwd definiert. Sie wird beim Anlegen eines Benutzers zugeordnet.
Der Benutzer root
ist unter Ubuntu ein stets vorhandenes Benutzerkonto mit der UID 0, das den Super-Administrator des Gesamtsystems repräsentiert. Er hat umfassende Rechte und kann auf alle Dateien, Daten und Kommandos zugreifen.
Benutzerklassen
Ubuntu definiert drei Benutzerklassen für Dateien bzw. Verzeichnisse:
Benutzerklasse | Beschreibung |
---|---|
Owner | Benutzers, welcher die Datei oder das Verzeichnis besitzt. |
Group | Benutzergruppe, welche die Datei oder das Verzeichnis besitzt. |
Other | Aller anderen Benutzer, die weder Owner noch Mitglied von Group sind. |
Eine Datei bzw. ein Verzeichnis hat also genau zwei Besitzer: Den Owner und die Group. Der Owner ist ein ausgewiesener Benutzer, die Group repräsentiert eine Liste von Benutzern (nämlich deren Mitglieder).
Berechtigungen
Jede Benutzerklasse hat drei Berechtigungen:
Berechtigung | Dateizugriff | Verzeichniszugriff |
---|---|---|
Read | Du kannst die Datei kopieren und deren Inhalt lesen. | Du kannst Dir den Verzeichnisinhalt anzeigen lassen. |
Write | Du kannst den Dateiinhalt ändern. | Du kannst Dateien den Verzeichnisinhalt ändern (z.B. Dateien hinzufügen und löschen). |
Execute | Du kannst die Datei ausführen, wenn sie ausführbar ist. | Du kannst mittels cd ins Verzeichnis wechseln. |
Hinzu kommen noch drei Spezialberechtigungen:
Berechtigung | Dateizugriff | Verzeichniszugriff |
---|---|---|
SetUID Bit | Dateien werden mit den Rechten von owner ausgeführt. | Neu erzeugte Dateien oder Unterverzeichnisse übernehmen den owner des Verzeichnisses und nicht des Erzeugers. |
SetGID Bit | Dateien werden mit den Rechten von group ausgeführt. | Neu erzeugte Dateien oder Unterverzeichnisse übernehmen die group des Verzeichnisses und nicht des Erzeugers. |
Sticky Bit | Du kannst die Datei nur löschen, wenn Du Eigentümer bist. | Du kannst nur Dateien oder Unterverzeichnisse löschen, deren Eigentümer Du bist. |
Das SetUID Bit kann nur für die Benutzerklasse Owner gesetzt werden, das SetGID Bit kann nur für die Benutzerklasse Group gesetzt werden und das Sticky Bit kann nur für die Benutzerklasse Other gesetzt werden.
Berechtigungen anzeigen
Möchtest Du Dir die Berechtigung einer Datei anzeigen lassen, dann nutze den Befehl ls mit dem Parameter -l
.
Beispiel:
$ ls -l /usr/bin/passwd
Das Ergebnis unter Ubuntu sollte in etwa so aussehen:
-rwsr-xr-x 1 root root 68208 Jul 15 00:08 /usr/bin/passwd
Schauen wir uns die Ausgabe etwas genauer an:
Das erste Zeichen in der Ausgabe gibt wieder, ob es sich um eine Datei (-
) oder ein Verzeichnis (d
) handelt. Die folgenden neun Zeichen geben die Berechtigungen der drei Benutzerklassen Owner , Group und Other aus.
Die Berechtigungen werden in der Ausgabe von ls -l
durch folgende Buchstaben repräsentiert.
Symbol | Bedeutung |
---|---|
r | Lesen |
w | Schreiben |
x | Ausführen (oder Suchen bei Verzeichnissen) |
s | SetUID Bit bzw. SetGID Bit gesetzt, und Execute gesetzt |
S | SetUID Bit bzw. SetGID Bit gesetzt, aber kein Execute gesetzt |
t | Sticky Bit gesetzt, aber kein Execute gesetzt |
T | Sticky Bit gesetzt, und Execute gesetzt |
- | Kein Recht gesetzt |
Die Symbole x
, s
und S
schließen sich gegenseitig aus, ebenso die Symbole x
, t
, und T
.
Kommen wir noch einmal auf unser Beispiel zurück. Die ausführbare Datei /usr/bin/passwd
implementiert den Befehl passwd zum Ändern des eigenen Benutzerkennworts.
Folgende Beobachtungen kannst Du machen:
-
Der Benutzer
root
ist der alleinige Besitzer von/usr/bin/passwd
. Die gleichnamige Gruppe enthält normalerweise nur den Benutzerroot
. -
Alle Benutzer können
/usr/bin/passwd
ohne sudo ausführen (siehe dass
bei Owner und dasx
bei Group und Other). -
Die Ausführung geschieht immer mit Root-Rechten (siehe das
s
bei Owner). Das ist notwendig, da/usr/bin/passwd
u.a. Änderungen an der Datei /etc/shadow vornehmen muss. In dieser Datei werden die Kennwörter verschlüsselt gespeichert und diese darf nur durch den Benutzerroot
verändert werden.
Besitzer ändern
Einer Datei oder einem Verzeichnis sind stets ein Owner und eine Gruppe zugeordnet. Mit Hilfe des Befehls chown kannst Du den Owner ändern, mit Hilfe des Befehls chgrp die Group.
Um beispielseise den Owner der Datei datei.txt
zu ändern, tippe folgendes ein:
$ sudo chown frank datei.txt
Der neue Owner heißt jetzt frank
.
Um auch die zugeordnete Group der Datei datei.txt
zu ändern, tippe folgendes ein:
$ sudo chgrp marketing datei.txt
Die neue Group heißt jetzt marketing
.
Beide Befehle lassen sich auch kombinieren:
$ sudo chown frank:marketing datei.txt
Hier wurden Owner und Group gleichzeitig geändert.
Bei einem Verzeichnis kannst Du bei allen Befehlen optional den Parameter -R
für eine rekursive Anwendung nutzen. Um beispielsweise die Group des Verzeichnisses beispiele
rekursiv zu ändern, tippe folgendes ein:
$ sudo chgrp -R marketing beispiele
Die neue Group heißt jetzt für dieses Verzeichnis und alle dort enthaltenen Dateien und Unterverzeichnisse marketing
.
Standardbesitzer
Standardmäßig wird der Ersteller einer Datei oder eines Verzeichnisses als Owner eingetragen und seine Hauptgruppe (Primary Group) als Group zugeordnet.
Mit Hilfe des folgenden Befehls kannst Du Dir die Hauptgruppe eines Benutzers anzeigen lassen:
$ grep frank /etc/passwd
Die Ausgabe könnte wie folgt aussehen:
frank:x:1000:1000:Frank,,,:/home/frank:/bin/bash
Die GID der Hauptgruppe steht im vierten Feld (hier: 1000
). Möchtest Du den Namen Hauptgruppe wissen, dann tippe folgendes ein:
$ grep 1000 /etc/group
Die Ausgabe könnte wie folgt aussehen:
frank:x:1000:
Die Hauptgruppe heißt also frank
.
Möchtest Du die Hauptgruppe nachträglich ändern, dann tippe folgendes ein:
$ sudo usermod frank -g marketing
Die neue Hauptgruppe für frank
heißt jetzt marketing
.
Berechtigungen ändern
Mit Hilfe des Befehls chmod kannst Du die Zugriffsrechte einer Datei oder eines Verzeichnisses ändern.
Um beispielsweise dem Owner der Datei datei.txt
die Berechtigung Execute zu erteilen, tippe folgendes ein:
$ chmod u+x datei.txt
Der Besitzer der Datei hat nun die Berechtigung Execute erhalten. Das u
steht für User bzw Owner, das +
ist der Operator Hinzufügen und das x
für Execute.
Schauen wir uns chmod etwas genauer an. Dieser Befehl kann in zwei unterschiedlichen Modi ausgeführt werden: Im symbolischen Modus oder im numerischen Modus.
Symbolischer Modus
Im symbolischen Modus werden Benutzerklassen, Operatoren und Berechtigungen durch Symbole ausgedrückt. Die Kombination dieser Symbole legt fest, welche Rechte gesetzt oder entfernt werden sollen.
Hier die Definition der Benutzerklassen:
Symbol | Bedeutung |
---|---|
u | Besitzer |
g | Gruppe |
o | alle anderen |
a | alle (also die Vereinigungsmenge aus u, g und o) |
Hier die Definition der Operatoren:
Symbol | Bedeutung |
---|---|
+ | Hinzufügen |
- | Entfernen |
= | Ersetzen |
Hier die Definition der Berechtigungen:
Symbol | Bedeutung |
---|---|
r | Lesen |
w | Schreiben |
x | Ausführen (oder Suchen bei Verzeichnissen) |
X | nur Ausführen/Suchen, wenn die Datei ein Verzeichnis ist oder bereits für einige Benutzer die Ausführungsrechte besitzt |
s | Das SetUID Bit bzw. das SetGID Bit setzen |
t | Das Sticky Bit setzen |
u | Die Rechte der Benutzerklasse Owner kopieren |
g | Die Rechte der Benutzerklasse Group kopieren |
o | Die Rechte des Benutzerklasse Other kopieren |
Diese Symbole müssen wie folgt kombiniert werden:
-
Zunächst wird die Benutzergruppe angegeben werden (z.B.
u
). Es können auch mehrere Benutzergruppen gleichzeitig angeben weden (z.B.ugo
). -
Unmittelbar danach folgt der Operator (z.B.
+
) -
Den Abschluss bildet das Recht (z.B.
r
) oder eine Kombination der Rechter
,w
,x
,X
,s
undt
. Die Rechteu
,g
undo
können nur isoliert angegeben werden.
Ein paar Beispiele für chmod im symbolischen Modus:
-
Setzt die Rechte der Datei auf Read, Write und Execute für Owner.
chmod u=rwx datei.txt
-
Setzt die Rechte der Datei auf Read, Write und Execute für Owner. Group und Other haben beide kein Zugriffsrecht.
chmod u=rwx,g=-,o=- datei.txt
-
Setzt die Rechte der Datei auf Read, Write und Execute für Owner, Group und Other .
chmod a=rwx datei.txt
-
Fügt das Recht Write für Owner hinzu.
chmod u+w datei.txt
-
Entfernt das Recht Write für Owner.
chmod u-w datei.txt
-
Kopiert die Rechte von Owner nach Group.
chmod g=u datei.txt
-
Fügt das Sticky Bit für Other hinzu.
chmod o+t datei.txt
-
Setzt rekursiv die Rechte f+r Owner aller Dateien und Unterverzeichnisse im Verzeichnis
/mein/ordner
aufrwx
.chmod -R u=rwx /mein/ordner
Numerischer Modus
Im numerischen Modus (auch Oktal-Modus genannt) werden die Rechte durch Zahlen definiert, die den drei Benutzerklassen direkt zugewiesen werden.
Hier die Definition der Rechte:
Wert | Rechte |
---|---|
0 | Keine |
1 | x |
2 | w |
3 | w+x |
4 | r |
5 | r+x |
6 | r+w |
7 | r+w+x |
Diese Zahlenwerte müssen wie folgt angewandt werden:
-
Es werden immer alle drei Benutzerklassen gleichzeitig durch eine dreistellige Zahl gesetzt (z.B.
744
). -
Die erste Stelle definiert die Rechte für Owner, die zweite Stelle die Rechte für Group und die dritte Stelle die Rechte für Other.
Möchtest Du auch die Spezialrechte SetUID Bit, SetGID Bit oder Sticky Bit setzen, musst Du noch eine zusätzliche vierte Stelle voranstellen. Hier die möglichen Werte:
Wert | Rechte |
---|---|
0 | Keine |
1 | Sticky Bit |
2 | SetGID Bit |
3 | SetGID Bit + Sticky Bit |
4 | SetUID Bit |
5 | SetUID Bit + Sticky Bit |
6 | SetUID Bit + SetGID Bit |
7 | SetUID Bit + SetGID Bit + Sticky Bit |
Ein paar Beispiele für chmod im numerischen Modus:
-
Setzt die Rechte der Datei auf Read, Write und Execute für Owner. Group und Other haben beide kein Zugriffsrecht
chmod 700 datei.txt
-
Setzt die Rechte der Datei auf Read, Write und Execute für Owner, Group und Other
chmod 777 datei.txt
-
Setzt die Rechte der Datei auf Read, Write und Execute für Owner sowie Read und Write für Group und Other. Außerdem wird das Sticky Bit gesetzt.
chmod 1766 datei.txt
-
Setzt rekursiv die Rechte aller Dateien und Unterverzeichnisse im Verzeichnis
/mein/ordner
auf700
.chmod -R 700 /mein/ordner
Standardberechtigungen
Beim Erzeugen einer neuen Datei oder eines neuen Verzeichnisses vergibt Ubuntu Standardberechtigungen für alle drei Berechtigungsgruppen.
-
Die Standardberechtigungen für
root
sind755 (rwxr-xr-x)
für Verzeichnisse und644 (rw-r--r--)
für Dateien. -
Die Standardberechtigungen für alle anderen Benutzer sind
775 (rwxrwxr-x)
für Verzeichnisse und664 (rw-rw-r--)
für Dateien.
Diese Vorgabe kannst Du für jeden Benutzer anpassen. Ubuntu vergibt die Standardberechtigungen nämlich in einem zweistufigen Verfahren:
-
Zunächst gelten die Standardberechtigungen von Ubuntu. Diese lauten
777 (rwxrwxrwx)
für Verzeichnisse und666 (rw-rw-rw-)
für Dateien. -
Von diesen Standardberechtigungen wird ein benutzerdefinierter Wert abgezogen. Dieser Wert wird als umask (user-defined permissions mask) bezeichnet. Er lautet für root
022
und für alle anderen Benutzer002
.
Zieht man also beispielsweise die umask 002
von 666
ab, dann ergibt dies 664
.
Mit Hilfe des Befehls umask kannst Du den umask-Wert anpassen. Der folgende Befehl setzt den umask-Wert des aktuellen Benutzers auf 022
$ umask 022
Access Control Lists
Der Standardsatz an Berechtigungen für Dateien und Verzeichnisse erlaubt die Zuordnung nur einer Benutzergruppe. Das ist vor allem dann ein Problem, wenn in freigegebenen Verzeichnissen unterschiedliche Gruppen von Benutzern (z.B. Marketing und Development) mit unterschiedlichen Zugriffsrechten kollaborieren sollen. Die Lösung hierfür ist der Einsatz einer Access Control List (kurz ACL).
Mit Hilfe von ACL ist es möglich, einzelnen Benutzern und Gruppen gezielt Rechte an einzelnen Dateien oder Verzeichnissen zu geben oder zu entziehen. ACLs sind eine Erweiterung der Rechteverwaltung. Die Nutzung von ACLs unter Ubuntu ist standardmäßig aktiviert. Die entscheidenden Befehle lauten: