Zum Inhalt springen

Zugriffsrechte

Linux ist von Anfang an ein Mehrbenutzersystem. Auf einem Server arbeiten mehrere Personen, und Dienste wie der Webserver laufen unter eigenen Benutzern. Damit niemand versehentlich oder absichtlich fremde Daten liest oder die Systemkonfiguration zerstört, prüft der Kernel bei jedem Zugriff auf eine Datei, ob er erlaubt ist. Das Modell dahinter ist einfach und du wirst ihm täglich begegnen, spätestens bei der Fehlermeldung Permission denied.

Jeder Benutzer hat eine Nummer, die UID (user ID), und gehört zu einer Hauptgruppe mit einer GID (group ID) sowie beliebig vielen weiteren Gruppen. Die Benutzer stehen in /etc/passwd, die Gruppen in /etc/group. Der Benutzer mit UID 0 heisst root und darf alles.

Hands-on: Wer bist du, und in welchen Gruppen bist du?

Terminal-Fenster
id
groups
grep "^$USER:" /etc/passwd
getent group sudo adm

id zeigt UID, GID und alle Gruppen. Auf Ubuntu ist der bei der Installation angelegte Benutzer unter anderem in sudo und adm. Die Gruppe adm darf Logs in /var/log lesen; das brauchst du gleich in der Aufgabe.

Jede Datei und jedes Verzeichnis gehört genau einem Benutzer und einer Gruppe. Dazu kommt eine Maske aus drei mal drei Rechten:

Bereich Kürzel Wer
user u Der Besitzer der Datei
group g Alle Mitglieder der Gruppe, der die Datei gehört
others o Alle anderen
Recht Kürzel Bei einer Datei Bei einem Verzeichnis
read r Inhalt lesen Dateinamen auflisten (ls)
write w Inhalt ändern Dateien anlegen, löschen, umbenennen
execute x Als Programm starten Betreten (cd) und auf Inhalt zugreifen

Die Verzeichnisspalte ist wichtig und wird oft falsch verstanden: Ob du eine Datei löschen darfst, entscheidet nicht die Datei, sondern das w-Recht auf dem Verzeichnis, in dem sie liegt. Und ohne x auf einem Verzeichnis kommst du nicht hinein, auch wenn du r hast.

Der Kernel prüft genau einen Bereich, und zwar den ersten, der passt:

  1. Bist du der Besitzer? Dann gelten nur die u-Rechte.
  2. Sonst: Bist du in der Gruppe? Dann gelten nur die g-Rechte.
  3. Sonst gelten die o-Rechte.

Es wird nicht gesammelt. Eine Datei mit -r--rw----, die dir gehört und deren Gruppe du angehörst, kannst du nicht schreiben, obwohl die Gruppe dürfte. Du bist Besitzer, also zählt nur r--. root umgeht die Prüfung fast vollständig.

Terminal-Fenster
ls -l /etc/passwd /etc/shadow /usr/bin/passwd
ls -ld /tmp /home/$USER
-rw-r--r-- 1 root root 2954 Okt 12 09:14 /etc/passwd
-rw-r----- 1 root shadow 1431 Okt 12 09:14 /etc/shadow
-rwsr-xr-x 1 root root 64152 Mai 30 15:02 /usr/bin/passwd
drwxrwxrwt 15 root root 4096 Nov 5 10:40 /tmp

Die erste Zeile, Feld für Feld:

Feld Wert Bedeutung
Typ - Normale Datei
Rechte rw- r-- r-- Besitzer liest und schreibt, Gruppe liest, andere lesen
Links 1 Anzahl Hardlinks, siehe nächste Seite
Besitzer root
Gruppe root
Grösse 2954 Bytes
Datum Okt 12 09:14 Letzte Änderung
Name /etc/passwd

Das erste Zeichen ist der Dateityp:

Zeichen Typ
- Normale Datei
d Verzeichnis (directory)
l Symbolischer Link
p Named Pipe (Verbindung zwischen Prozessen)
s Socket (Netzwerk- oder lokale Verbindung)
b Block Device, etwa eine Festplatte /dev/sda
c Character Device, etwa ein Terminal /dev/tty1

/etc/shadow enthält die Passwort-Hashes. Nur root und die Gruppe shadow dürfen lesen, alle anderen gar nichts. Probiere cat /etc/shadow und lies die Fehlermeldung.

chmod (change mode) kennt zwei Schreibweisen. Die symbolische sagt, was sich ändert: Bereich, Operator, Recht.

Terminal-Fenster
touch probe.sh
chmod u+x probe.sh # Besitzer darf ausführen
chmod g-w probe.sh # Gruppe darf nicht mehr schreiben
chmod o= probe.sh # andere dürfen nichts
chmod a+r probe.sh # alle (a = ugo) dürfen lesen
chmod ug=rw,o=r probe.sh
ls -l probe.sh

Operatoren: + fügt hinzu, - nimmt weg, = setzt exakt. Die oktale Schreibweise setzt alle neun Rechte auf einmal. Jeder Bereich ist eine Ziffer, die sich aus r=4, w=2, x=1 zusammenzählt:

Ziffer Rechte Rechnung
7 rwx 4+2+1
6 rw- 4+2
5 r-x 4+1
4 r-- 4
0 ---
Terminal-Fenster
chmod 644 probe.sh # rw-r--r-- typische Datei
chmod 755 probe.sh # rwxr-xr-x typisches Programm oder Verzeichnis
chmod 600 probe.sh # rw------- nur ich, zum Beispiel SSH-Keys
chmod 700 ~/privat # rwx------ privates Verzeichnis

Mit -R (recursive) wirkt chmod auf ein Verzeichnis und alles darunter. Vorsicht damit: chmod -R 777 ist fast immer falsch, weil danach jeder alles darf.

Terminal-Fenster
chgrp adm probe.sh # Gruppe wechseln, geht als Mitglied beider Gruppen
sudo chown root probe.sh # Besitzer wechseln, nur root darf das
sudo chown root:adm probe.sh # Besitzer und Gruppe in einem Schritt
sudo chown -R www-data:www-data /var/www/html

Den Besitzer verschenken darf nur root, sonst könnte jeder seine Dateien einem anderen unterschieben. Die Gruppe darfst du als Besitzer wechseln, aber nur zu einer Gruppe, in der du selbst Mitglied bist.

Befehl Wirkung
newgrp adm Neue Shell, in der adm deine aktive Hauptgruppe ist. Neu angelegte Dateien gehören dann adm.
su - anna Switch user: Neue Login-Shell als anna, fragt nach deren Passwort. Das - lädt Annas Umgebung wie bei einem echten Login. Ohne - behältst du dein Verzeichnis und deine Variablen.
su - Wechsel zu root. Auf Ubuntu geht das nicht, weil root kein Passwort hat. Stattdessen sudo -i.
sudo befehl Führt genau einen Befehl als root aus, fragt nach deinem Passwort.
exit Verlässt die mit newgrp, su oder sudo -i gestartete Shell.

sudo ist die saubere Lösung, weil jeder Aufruf im Log steht (journalctl _COMM=sudo) und niemand das root-Passwort kennen muss. Wer sudo benutzen darf, steht in /etc/sudoers:

/etc/sudoers (Auszug)
root ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL

Die Zeile mit %sudo bedeutet: Alle Mitglieder der Gruppe sudo dürfen auf allen Hosts als jeder Benutzer und jede Gruppe alle Befehle ausführen. Deshalb reicht es auf Ubuntu, jemanden in die Gruppe sudo aufzunehmen: sudo usermod -aG sudo ben.

Warum hat eine neue Datei rw-r--r-- und ein neues Verzeichnis rwxr-xr-x? Wegen der umask. Sie sagt, welche Rechte bei neuen Dateien weggenommen werden. Die Standard-umask 022 nimmt der Gruppe und den anderen das Schreibrecht: aus 666 wird 644, aus 777 wird 755.

Terminal-Fenster
umask
umask 077 # ab jetzt in dieser Shell: neue Dateien nur für mich
touch geheim.txt && ls -l geheim.txt

Neben rwx gibt es drei Spezialbits, die du erkennen solltest, auch wenn du sie selten setzt:

  • setuid (s an Stelle des x beim Besitzer): Das Programm läuft mit den Rechten des Besitzers statt des Aufrufers. So kann /usr/bin/passwd als root in /etc/shadow schreiben, obwohl du es startest.
  • setgid (s bei der Gruppe): Bei Verzeichnissen erben neue Dateien die Gruppe des Verzeichnisses. Praktisch für gemeinsame Projektordner.
  • sticky bit (t am Ende): In einem Verzeichnis darf nur löschen, wem die Datei gehört, auch wenn alle schreiben dürfen. Darum zeigt /tmp drwxrwxrwt: Jeder schreibt hinein, niemand löscht fremde Dateien.
Lösung anzeigen
Terminal-Fenster
script labs/linux/04-dateisystem/rechte.txt
cd ~
touch leer.txt
ls -l leer.txt
# Antwort 1: -rw-r--r--: ich lese und schreibe, meine Gruppe und alle anderen lesen nur. Nicht ausführbar, kein x gesetzt.
chmod 600 leer.txt
ls -l leer.txt
echo "Hallo Welt" > leer.txt
cat leer.txt
id
chgrp adm leer.txt
chmod g=w leer.txt
ls -l leer.txt
sudo chown root leer.txt
echo "Besitzer und Gruppe duerfen schreiben" >> leer.txt
cat leer.txt
# Antwort 4: Ich bin nicht mehr Besitzer, also zaehlt die Gruppe adm, und die hat nur w. Schreiben ja, lesen nein.
# Besitzer root, Gruppe adm. Auch root kann sie nicht ausfuehren, es ist nirgends ein x gesetzt (root ignoriert r und w, aber nicht ein fehlendes x).
ls -l leer.txt
rm leer.txt
# Antwort 5: Loeschen ist eine Aenderung am Verzeichnis, und mein Home gehoert mir mit w-Recht. Dass die Datei root gehoert, spielt keine Rolle.
exit

Statt chmod 600 geht auch chmod go-r leer.txt oder chmod u=rw,go= leer.txt.

Selbstcheck · 6 Fragen

1. Eine Datei hat -rw-r-----, gehört ben und der Gruppe dev. Anna ist in dev. Was darf Anna?
2. Welche oktale Zahl entspricht rwxr-x---?
3. Du darfst eine Datei nicht löschen. Welches Recht fehlt dir vermutlich?
4. Welche Aussagen zu sudo stimmen? (mehrere Antworten möglich)
5. Was bedeutet das t am Ende von drwxrwxrwt bei /tmp?
6. Welcher Befehl macht ein Skript für dich ausführbar?