Linux Rechte & Berechtigungen verstehen – chmod, chown, umask erklärt

Dateirechte unter Linux verstehen und setzen: chmod, chown, chgrp, umask, SUID/SGID/Sticky Bit – von Grundlagen bis zu häufigen Fehlern mit konkreten Lösungen.

9 min Lesezeit

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 brauchen x, um betreten zu werden. 777 sollte 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 -l zeigt Rechte, Besitzer und Gruppe
  • chmod 755 für ausführbare Dateien und Verzeichnisse, 644 für normale Dateien
  • chown benutzer:gruppe ändert den Besitzer – braucht sudo
  • 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"

War dieser Artikel hilfreich?