Linux Rechte & Berechtigungen verstehen – chmod, chown, umask erklärt
„Permission denied" ist wahrscheinlich die häufigste Fehlermeldung unter Linux. Wer das Rechtesystem versteht, löst diese Probleme in Sekunden – und verhindert gleichzeitig Sicherheitslücken, die durch falsch gesetzte Rechte entstehen.
Dieser Guide erklärt, wie Linux-Dateiberechtigungen funktionieren, wie du sie mit chmod, chown und umask steuerst, und wann SUID, SGID und das Sticky Bit relevant werden.
Das Rechte-Modell: Wer darf was?
Linux verwendet ein einfaches, aber wirkungsvolles Rechtemodell. Jede Datei und jedes Verzeichnis hat:
- Einen Besitzer (Owner) – meistens der Benutzer, der die Datei erstellt hat
- Eine Gruppe (Group) – eine Gruppe von Benutzern, die gemeinsam Zugriff haben
- Rechte für andere (Others) – alle übrigen Benutzer des Systems
Für jede dieser drei Kategorien gibt es drei Rechte:
| Recht | Symbol | Zahl | Datei | Verzeichnis |
|---|---|---|---|---|
| Lesen | r |
4 | Dateiinhalt lesen | Verzeichnisinhalt auflisten (ls) |
| Schreiben | w |
2 | Datei ändern oder löschen | Dateien erstellen, löschen, umbenennen |
| Ausführen | x |
1 | Datei als Programm starten | Verzeichnis betreten (cd) |
| Kein Recht | - |
0 | — | — |
Wichtig: Das Löschen einer Datei hängt von den Rechten des übergeordneten Verzeichnisses ab, nicht von der Datei selbst. Wer Schreibrecht auf ein Verzeichnis hat, kann darin enthaltene Dateien löschen – auch wenn die Datei selbst nur root gehört.
Rechte lesen mit ls -l
ls -l /var/www/html/
# -rw-r--r-- 1 www-data www-data 2048 Feb 18 10:00 index.html
# drwxr-xr-x 2 www-data www-data 4096 Feb 18 10:00 assets/
Die erste Spalte enthält 10 Zeichen:
- r w - r - - r - -
│ ├─┤ ├─┤ └─┘
│ │ │ └── Others: r-- = lesen (4)
│ │ └────── Group: r-- = lesen (4)
│ └────────── Owner: rw- = lesen + schreiben (6)
└──────────── Typ: - = Datei, d = Verzeichnis, l = Symlink
Dateityp-Zeichen
| Zeichen | Bedeutung |
|---|---|
- |
normale Datei |
d |
Verzeichnis |
l |
symbolischer Link |
b |
Block-Gerät (Festplatte) |
c |
Zeichen-Gerät (Terminal) |
s |
Socket |
p |
Named Pipe (FIFO) |
stat – Mehr Details zu einer Datei
stat datei.txt
# File: datei.txt
# Size: 1024 Blocks: 8 IO Block: 4096 regular file
# Device: 10303h/66307d Inode: 2621444 Links: 1
# Access: (0644/-rw-r--r--) Uid: (1000/andre) Gid: (1000/andre)
# Access: 2026-02-18 10:00:00
# Modify: 2026-02-18 09:55:00
# Change: 2026-02-18 09:55:00
chmod – Rechte ändern
chmod steht für change mode. Es gibt zwei Schreibweisen: symbolisch und oktal.
Symbolische Schreibweise
# Syntax: chmod [wem][operator][was] datei
# Wem:
# u = user (Besitzer)
# g = group (Gruppe)
# o = others (andere)
# a = all (alle drei)
# Operator:
# + = Recht hinzufügen
# - = Recht entfernen
# = = Recht exakt setzen
# Was:
# r, w, x
Praktische Beispiele
# Ausführungsrecht für den Besitzer hinzufügen
chmod u+x skript.sh
# Schreibrecht für die Gruppe entfernen
chmod g-w datei.txt
# Allen Lesrecht geben
chmod a+r index.html
# Besitzer: lesen+schreiben; Gruppe und andere: nur lesen
chmod u=rw,go=r datei.txt
# Ausführungsrecht für alle entfernen
chmod a-x datei.txt
# Schreibrecht für Gruppe und andere entfernen
chmod go-w config.php
Rekursiv anwenden
# Alle Dateien und Verzeichnisse rekursiv ändern
chmod -R 755 /var/www/html/
# Vorsicht: Oft möchte man Dateien und Verzeichnisse unterschiedlich behandeln
# Nur Verzeichnisse: 755
find /var/www/html -type d -exec chmod 755 {} \;
# Nur Dateien: 644
find /var/www/html -type f -exec chmod 644 {} \;
chown und chgrp – Besitzer ändern
# Besitzer ändern (nur root kann Besitzer ändern)
sudo chown andre datei.txt
# Besitzer und Gruppe gleichzeitig
sudo chown andre:developers datei.txt
# Nur die Gruppe ändern
sudo chgrp developers datei.txt
# Gleichwertig:
sudo chown :developers datei.txt
# Rekursiv (ganzes Verzeichnis)
sudo chown -R www-data:www-data /var/www/meine-app/
# Besitzer von einer anderen Datei übernehmen
sudo chown --reference=vorlage.txt zieldatei.txt
Benutzer und Gruppen anzeigen
# Eigene Benutzerinfos
id
# uid=1000(andre) gid=1000(andre) groups=1000(andre),4(adm),27(sudo),1001(docker)
# Gruppen des aktuellen Benutzers
groups
# Gruppen eines anderen Benutzers
groups www-data
# Alle Benutzer des Systems
cat /etc/passwd | cut -d: -f1
# Alle Gruppen
cat /etc/group | cut -d: -f1
Oktalnotation verstehen
Die Oktalschreibweise ist kompakter und wird in Skripten häufig verwendet. Jede Stelle steht für eine Kategorie (Owner, Group, Others) und ist die Summe der Rechtewerte:
r = 4
w = 2
x = 1
- = 0
| Oktal | Binär | Rechte | Bedeutung |
|---|---|---|---|
| 7 | 111 | rwx |
lesen + schreiben + ausführen |
| 6 | 110 | rw- |
lesen + schreiben |
| 5 | 101 | r-x |
lesen + ausführen |
| 4 | 100 | r-- |
nur lesen |
| 0 | 000 | --- |
kein Recht |
Gängige Kombinationen
chmod 755 skript.sh # rwxr-xr-x (Programme, Verzeichnisse)
chmod 644 datei.txt # rw-r--r-- (Dateien, Konfigurationen)
chmod 600 ~/.ssh/id_ed25519 # rw------- (private Schlüssel)
chmod 700 ~/.ssh/ # rwx------ (SSH-Verzeichnis)
chmod 640 config.php # rw-r----- (Config, die Gruppe lesen darf)
chmod 660 shared.txt # rw-rw---- (Gruppe kann auch schreiben)
chmod 777 /tmp/test/ # rwxrwxrwx (alle dürfen alles – nur für Tests!)
Faustregel: Dateien brauchen kein
x. Verzeichnisse brauchenx, um betreten zu werden.777sollte im Produktivbetrieb nie verwendet werden.
umask – Standardrechte für neue Dateien
umask (User Mask) legt fest, welche Rechte bei neu erstellten Dateien entfernt werden. Es ist eine Subtraktionsmaske:
# Aktuelle umask anzeigen
umask
# 0022
# Symbolisch anzeigen
umask -S
# u=rwx,g=rx,o=rx
Berechnung: Maximale Rechte minus umask = tatsächliche Rechte
Dateien: 666 - 022 = 644 (rw-r--r--)
Verzeichnisse: 777 - 022 = 755 (rwxr-xr-x)
| umask | Neue Datei | Neues Verzeichnis | Typischer Einsatz |
|---|---|---|---|
| 022 | 644 | 755 | Standard (Server, Desktop) |
| 027 | 640 | 750 | Sicherheitsbewusste Server |
| 077 | 600 | 700 | Maximale Privatsphäre |
| 002 | 664 | 775 | Gruppen-Collaboration |
# umask temporär ändern (nur für aktuelle Shell-Session)
umask 027
# umask dauerhaft ändern (in ~/.bashrc oder ~/.profile)
echo "umask 027" >> ~/.bashrc
Spezielle Berechtigungen: SUID, SGID, Sticky Bit
Neben den normalen rwx-Rechten gibt es drei spezielle Bits, die du kennen solltest:
SUID – Set User ID (Bit 4)
Wenn SUID auf einer ausführbaren Datei gesetzt ist, läuft das Programm mit den Rechten des Dateibesitzers, nicht des ausführenden Benutzers.
# Beispiel: /usr/bin/passwd – jeder kann sein Passwort ändern
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
# ↑ "s" statt "x" beim Besitzer = SUID aktiv
# SUID setzen
chmod u+s programm
# oder oktal: 4xxx (z.B. 4755)
chmod 4755 programm
Sicherheitshinweis: SUID sollte nur auf absolut vertrauenswürdigen Programmen gesetzt werden. SUID auf Shell-Skripten ist gefährlich und wird von Linux ignoriert/geblockt.
SGID – Set Group ID (Bit 2)
Auf Verzeichnissen: Neue Dateien erben automatisch die Gruppe des Verzeichnisses – nützlich für Collaboration.
# Beispiel: Geteiltes Projekt-Verzeichnis
sudo mkdir /opt/projekt
sudo chgrp developers /opt/projekt
sudo chmod g+s /opt/projekt # SGID setzen
ls -ld /opt/projekt
# drwxrwsr-x 2 root developers ... ← "s" in Gruppen-Bit
# Alle Dateien, die Teammitglieder erstellen, bekommen automatisch Gruppe "developers"
# SGID setzen
chmod g+s verzeichnis
# oder oktal: 2xxx (z.B. 2775)
chmod 2775 /opt/projekt
Sticky Bit (Bit 1)
Auf Verzeichnissen: Nur der Besitzer einer Datei (oder root) darf sie löschen – auch wenn andere Schreibrecht auf das Verzeichnis haben. Klassisches Beispiel: /tmp
ls -ld /tmp
# drwxrwxrwt 10 root root 4096 Feb 18 10:00 /tmp
# ↑ "t" statt "x" = Sticky Bit aktiv
# Sticky Bit setzen
chmod +t /gemeinsames/verzeichnis
# oder oktal: 1xxx (z.B. 1777)
chmod 1777 /tmp/shared
Alle drei kombiniert
# Format: chmod [SUID][SGID][Sticky][Owner][Group][Others]
chmod 4755 programm # SUID + rwxr-xr-x
chmod 2775 verzeichnis # SGID + rwxrwxr-x
chmod 1777 /tmp/shared # Sticky + rwxrwxrwx
chmod 6755 programm # SUID + SGID + rwxr-xr-x
# Alle speziellen Bits anzeigen
ls -l /usr/bin/sudo
# -rwsr-xr-x 1 root root ... sudo (SUID: läuft als root)
Praktische Beispiele
Web-Server Verzeichnis korrekt einrichten
# Verzeichnis für Nginx/Apache
sudo mkdir -p /var/www/meine-seite
sudo chown -R www-data:www-data /var/www/meine-seite
# Verzeichnisse: 755, Dateien: 644
find /var/www/meine-seite -type d -exec chmod 755 {} \;
find /var/www/meine-seite -type f -exec chmod 644 {} \;
# Wenn du als dein Benutzer Dateien hochladen willst:
sudo chown -R andre:www-data /var/www/meine-seite
find /var/www/meine-seite -type d -exec chmod 2775 {} \; # SGID für Gruppe
find /var/www/meine-seite -type f -exec chmod 664 {} \;
SSH-Verzeichnis – häufig falsch konfiguriert
# Korrektes Setup (SSH verweigert Verbindung bei falschen Rechten!)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 # privater Schlüssel
chmod 644 ~/.ssh/id_ed25519.pub # öffentlicher Schlüssel
chmod 600 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/known_hosts
chmod 600 ~/.ssh/config
# Alles auf einmal prüfen
ls -la ~/.ssh/
Skript ausführbar machen
# Skript erstellen
nano backup.sh
# Ausführbar machen (nur für dich)
chmod u+x backup.sh
# Ausführbar für alle (wenn öffentlich nutzbar)
chmod 755 backup.sh
# Ins System-PATH legen
sudo mv backup.sh /usr/local/bin/backup
sudo chmod 755 /usr/local/bin/backup
Kollaboratives Verzeichnis
# Gruppe erstellen
sudo groupadd entwickler
# Benutzer zur Gruppe hinzufügen
sudo usermod -aG entwickler alice
sudo usermod -aG entwickler bob
# Verzeichnis mit SGID
sudo mkdir /opt/projekte
sudo chgrp entwickler /opt/projekte
sudo chmod 2775 /opt/projekte
# Sticky Bit zusätzlich: keiner löscht fremde Dateien
sudo chmod 3775 /opt/projekte # SGID + Sticky
Häufige Fehler und Lösungen
Permission denied beim Ausführen eines Skripts
bash: ./skript.sh: Permission denied
# Lösung: Ausführungsrecht fehlt
chmod u+x skript.sh
# Oder direkt mit bash ausführen (kein x nötig)
bash skript.sh
Permission denied trotz korrekt gesetzter Rechte
# Ursache 1: Übergeordnetes Verzeichnis hat kein x-Bit
ls -ld /opt/meine-app/
# drw-r--r-- 2 root root ... ← fehlendes x für andere
sudo chmod o+x /opt/meine-app/ # Verzeichnis betreten erlauben
# Ursache 2: ACLs (Access Control Lists) schränken zusätzlich ein
getfacl datei.txt
# Ursache 3: SELinux oder AppArmor blockiert
# Fedora/RHEL: SELinux-Context prüfen
ls -Z datei.txt
sudo audit2why -a | tail -20 # Was wurde blockiert?
# Ubuntu: AppArmor-Status
sudo aa-status
Datei nicht löschbar trotz Schreibrecht auf Verzeichnis
rm: cannot remove 'datei.txt': Operation not permitted
# Ursache 1: Datei ist unveränderlich (immutable)
lsattr datei.txt
# ----i-------- datei.txt ← "i" = immutable
sudo chattr -i datei.txt # immutable-Flag entfernen
rm datei.txt
# Ursache 2: Sticky Bit auf dem Verzeichnis – nur Besitzer darf löschen
ls -ld /tmp/
# drwxrwxrwt ... ← "t" = Sticky Bit
chown: changing ownership: Operation not permitted
# chown benötigt root-Rechte
sudo chown andre:andre datei.txt
# Ausnahme: Du darfst deinen eigenen Besitz auf deine Gruppe übertragen
chown :meinegruppe datei.txt # (wenn du in dieser Gruppe bist)
SSH meldet Bad permissions oder ignoriert authorized_keys
# Fehler:
# @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
# @ WARNING: UNPROTECTED PRIVATE KEY FILE! @
# Lösung: Berechtigungen korrigieren
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
# Auf dem Server prüfen
ssh -vvv user@server 2>&1 | grep -i "auth\|permission\|key"
Fazit
Das Rechtemodell von Linux ist eines der fundamentalsten Sicherheitskonzepte. Die wichtigsten Punkte im Überblick:
ls -lzeigt Rechte, Besitzer und Gruppechmod 755für ausführbare Dateien und Verzeichnisse,644für normale Dateienchown benutzer:gruppeändert den Besitzer – brauchtsudo- umask 022 ist der Standard: neue Dateien bekommen 644, Verzeichnisse 755
- SUID lässt Programme als Besitzer laufen, SGID vererbt Gruppen, Sticky Bit schützt vor fremdem Löschen
- Das
x-Bit bei Verzeichnissen bedeutet „betreten", nicht „ausführen"