Zugriffsrechte
Warum Rechte
Abschnitt betitelt „Warum Rechte“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.
Benutzer und Gruppen
Abschnitt betitelt „Benutzer und Gruppen“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?
idgroupsgrep "^$USER:" /etc/passwdgetent group sudo admid 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.
Die Zugriffsmaske
Abschnitt betitelt „Die Zugriffsmaske“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.
Die Prüfreihenfolge
Abschnitt betitelt „Die Prüfreihenfolge“Der Kernel prüft genau einen Bereich, und zwar den ersten, der passt:
- Bist du der Besitzer? Dann gelten nur die
u-Rechte. - Sonst: Bist du in der Gruppe? Dann gelten nur die
g-Rechte. - 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.
Eine ls -l Zeile lesen
Abschnitt betitelt „Eine ls -l Zeile lesen“ls -l /etc/passwd /etc/shadow /usr/bin/passwdls -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/passwddrwxrwxrwt 15 root root 4096 Nov 5 10:40 /tmpDie 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.
Rechte ändern: chmod
Abschnitt betitelt „Rechte ändern: chmod“chmod (change mode) kennt zwei Schreibweisen. Die symbolische sagt, was sich ändert: Bereich, Operator, Recht.
touch probe.shchmod u+x probe.sh # Besitzer darf ausführenchmod g-w probe.sh # Gruppe darf nicht mehr schreibenchmod o= probe.sh # andere dürfen nichtschmod a+r probe.sh # alle (a = ugo) dürfen lesenchmod ug=rw,o=r probe.shls -l probe.shOperatoren: + 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 |
--- |
chmod 644 probe.sh # rw-r--r-- typische Dateichmod 755 probe.sh # rwxr-xr-x typisches Programm oder Verzeichnischmod 600 probe.sh # rw------- nur ich, zum Beispiel SSH-Keyschmod 700 ~/privat # rwx------ privates VerzeichnisMit -R (recursive) wirkt chmod auf ein Verzeichnis und alles darunter. Vorsicht damit: chmod -R 777 ist fast immer falsch, weil danach jeder alles darf.
Besitzer ändern: chown und chgrp
Abschnitt betitelt „Besitzer ändern: chown und chgrp“chgrp adm probe.sh # Gruppe wechseln, geht als Mitglied beider Gruppensudo chown root probe.sh # Besitzer wechseln, nur root darf dassudo chown root:adm probe.sh # Besitzer und Gruppe in einem Schrittsudo chown -R www-data:www-data /var/www/htmlDen 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.
Identität wechseln: newgrp, su, sudo
Abschnitt betitelt „Identität wechseln: newgrp, su, sudo“| 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:
root ALL=(ALL:ALL) ALL%sudo ALL=(ALL:ALL) ALLDie 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.
umask und Spezialbits
Abschnitt betitelt „umask und Spezialbits“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.
umaskumask 077 # ab jetzt in dieser Shell: neue Dateien nur für michtouch geheim.txt && ls -l geheim.txtNeben rwx gibt es drei Spezialbits, die du erkennen solltest, auch wenn du sie selten setzt:
- setuid (
san Stelle desxbeim Besitzer): Das Programm läuft mit den Rechten des Besitzers statt des Aufrufers. So kann/usr/bin/passwdalsrootin/etc/shadowschreiben, obwohl du es startest. - setgid (
sbei der Gruppe): Bei Verzeichnissen erben neue Dateien die Gruppe des Verzeichnisses. Praktisch für gemeinsame Projektordner. - sticky bit (
tam Ende): In einem Verzeichnis darf nur löschen, wem die Datei gehört, auch wenn alle schreiben dürfen. Darum zeigt/tmpdrwxrwxrwt: Jeder schreibt hinein, niemand löscht fremde Dateien.
Lösung anzeigen
script labs/linux/04-dateisystem/rechte.txtcd ~touch leer.txtls -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.txtls -l leer.txtecho "Hallo Welt" > leer.txtcat leer.txtidchgrp adm leer.txtchmod g=w leer.txtls -l leer.txtsudo chown root leer.txtecho "Besitzer und Gruppe duerfen schreiben" >> leer.txtcat 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.txtrm 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.exitStatt chmod 600 geht auch chmod go-r leer.txt oder chmod u=rw,go= leer.txt.
Selbstcheck · 6 Fragen
Weiterführend
Abschnitt betitelt „Weiterführend“man chmod,man sudoers- ubuntuusers-Wiki: Rechte
- ubuntuusers-Wiki: sudo