Jedes Linux-System hat Benutzer und Gruppen, und jede Datei gehört einem Benutzer und einer Gruppe. Das System entscheidet bei jedem Zugriff, ob er erlaubt ist. Wer dieses Modell versteht, kann Rechte zielgenau setzen – und vermeidet den reflexhaften Griff zu chmod 777.

Die drei Dateien

Die Benutzerverwaltung liegt in drei Textdateien, die man lesen kann:

# /etc/passwd - Konten (weltweit lesbar, keine Geheimnisse!)
devon:x:1000:1000:Devon:/home/devon:/bin/bash
#     |  |  |    |      |            |
#   Name | UID GID  Kommentar  Heimatverzeichnis  Anmelde-Shell

# /etc/shadow - Passworthashes (nur fuer root lesbar!)
devon:$6$xyz...:19500:0:99999:7:::
#     |            |    |
#   Hash      letzte Aenderung   Gueltigkeit

# /etc/group - Gruppen
sudo:x:27:devon,worker
#     |  |    |
#   Name GID  Mitglieder (Nebengruppen)

# Wichtige Bereiche der UIDs
#   0            root
#   1-999        Systemkonten fuer Dienste
#   1000+        normale Benutzer
#   65534        nobody

Benutzer anlegen und verwalten

# Anlegen
useradd -m -s /bin/bash -c "Max Mustermann" max     # mit Heimatverzeichnis
adduser max                                          # interaktiv (Debian)

# Passwort setzen
passwd max
passwd -l max            # sperren
passwd -u max            # entsperren
chage -l max             # Gueltigkeitsinformationen ansehen
chage -M 90 -W 14 max    # 90 Tage Gueltigkeit, 14 Tage Warnung

# Aendern und Entfernen
usermod -aG sudo max                  # zu Nebengruppe hinzufuegen (-a nicht vergessen!)
usermod -aG docker,adm max            # mehrere Gruppen
usermod -s /bin/bash max              # Shell aendern
usermod -L max                        # sperren
userdel max                           # loeschen, Heimatverzeichnis bleibt
userdel -r max                        # loeschen inklusive Heimatverzeichnis

# Ansehen
id max
groups max
getent passwd max
getent group sudo
who
last | head -20
w

usermod -aG – das a ist entscheidend. Ohne -a ersetzt der Befehl die gesamte Gruppenliste, und der Benutzer verliert alle bisherigen Nebengruppen. Das ist einer der häufigsten Fehler überhaupt – und er fällt oft erst Tage später auf.

Dateirechte lesen

ls -l /var/www/html/index.html
-rw-r--r-- 1 www-data www-data 1024 26. Sep 12:00 index.html
|└┬┘└┬┘└┬┘   |        |
| |  |  |    Besitzer Gruppe
| |  |  └-- Andere:  r-- (nur lesen)
| |  └----- Gruppe:  r-- (nur lesen)
| └-------- Besitzer: rw- (lesen und schreiben)
└---------- Typ: - Datei, d Verzeichnis, l Verknuepfung

# Erste Spalte im Detail (drwxr-x---)
#   d  Typ
#   rwx  Besitzer: lesen, schreiben, ausfuehren
#   r-x  Gruppe:   lesen, ausfuehren
#   ---  Andere:  kein Zugriff

# Wirkung bei Verzeichnissen ist anders als bei Dateien!
#   r  = Namen auflisten duerfen
#   w  = Eintraege anlegen/loeschen duerfen
#   x  = Verzeichnis betreten duerfen (cd, Zugriff auf Inhalte)
# Ohne x nuetzt w nichts: Man darf den Namen schreiben,
# aber nicht auf die Datei zugreifen. Das verwirrt oft.

# Rechte in Zahlen (oktal)
#   r = 4    w = 2    x = 1
#   7 = rwx   6 = rw-   5 = r-x   4 = r--   0 = ---

chmod 644 datei            # rw-r--r--   Standard fuer Dateien
chmod 755 verzeichnis      # rwxr-xr-x   Standard fuer Verzeichnisse
chmod 600 geheim.txt       # nur Besitzer
chmod 700 .ssh             # nur Besitzer, auch nicht betretbar fuer andere
chmod +x skript.sh         # ausfuehrbar fuer alle
chmod u+x,g+r,o-r datei    # symbolisch: Besitzer +x, Gruppe +r, Andere -r
chmod -R 750 /srv/app      # rekursiv (Vorsicht bei Dateien und Verzeichnissen!)

# Besitzer und Gruppe aendern
chown max datei
chown max:admins datei
chown -R www-data:www-data /var/www/html
chgrp admins datei

Spezielle Rechte-Bits

Neben den neun Standardbits gibt es drei besondere, die ein zusätzliches Zeichen in der Rechteanzeige erzeugen:

# setuid (s an Stelle des Besitzer-x)
chmod u+s /usr/bin/passwd
#  4xxx  Programm laeuft mit den Rechten des BESITZERS, nicht des Aufrufers.
#  Notwendig fuer passwd (muss /etc/shadow schreiben).
#  Sicherheitsrisiko bei Programmen, die falsch geschrieben sind.

# setgid (s an Stelle des Gruppen-x)
chmod g+s /srv/shared
#  2xxx  Bei Verzeichnissen: neue Dateien erben die GRUPPE des Verzeichnisses.
#  Das ist der praktische Weg fuer gemeinsam genutzte Verzeichnisse.

# Sticky Bit (t an Stelle des Andere-x)
chmod +t /tmp
#  1xxx  Bei Verzeichnissen: Nur der Besitzer darf seine Dateien loeschen.
#  Ohne Sticky Bit koennte in /tmp jeder die Dateien anderer loeschen.

# Suche nach setuid-Programmen (Sicherheitspruefung!)
find / -perm -4000 -type f 2>/dev/null | head -30
find / -perm -2000 -type f 2>/dev/null | head -20

Umask: die Standardrechte

Bei jeder neuen Datei zieht das System eine Maske ab:

umask                 # anzeigen
# 0022 -> neue Dateien 644, Verzeichnisse 755
# 0077 -> neue Dateien 600, Verzeichnisse 700  (restriktiv)

# Herleitung: maximale Rechte sind 666 (Dateien) und 777 (Verzeichnisse)
# Datei:       666 & ~022 = 644
# Verzeichnis: 777 & ~022 = 755

# Dauerhaft setzen
echo 'umask 0027' >> ~/.bashrc               # je Benutzer
# oder systemweit in /etc/profile, /etc/login.defs

sudo: Rechte gezielt vergeben

# NICHT: Benutzer in die sudo-Gruppe aufnehmen und alles erlauben
usermod -aG sudo max          # max darf jetzt ALLES als root

# BESSER: nur was noetig ist (ueber /etc/sudoers.d/, NIE /etc/sudoers direkt!)
# Immer visudo verwenden - es prueft die Syntax vor dem Speichern.
visudo -f /etc/sudoers.d/webteam

# Inhalt: nur Dienste neu starten, keine Shell
%webteam ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
%webteam ALL=(root) NOPASSWD: /usr/bin/systemctl reload nginx
%webteam ALL=(root) NOPASSWD: /usr/bin/journalctl -u nginx *

# Pruefen, was ein Benutzer darf
sudo -l -U max

# Regeln pruefen
visudo -c

Die wichtigste Regel bei sudo: Nie eine allgemeine Shell (ALL) oder ein Programm mit Ausbruchsmöglichkeit erlauben. NOPASSWD: /usr/bin/vi ist faktisch eine vollständige Root-Shell – aus dem Editor lässt sich eine Shell starten. Dasselbe gilt für less, find, awk, tar und viele andere.

Besondere Konten und Dienste

  • Systemkonten (UID unter 1000) gehören Diensten und haben meist /sbin/nologin oder /usr/sbin/nologin als Shell. Sie dürfen sich nicht anmelden – das ist beabsichtigt.
  • Dienste laufen als eigener Benutzer. Ein Webserver als www-data, eine Datenbank als postgres. Wird der Dienst übernommen, hat der Angreifer nur dessen Rechte.
  • root sollte nicht direkt verwendet werden. Anmeldung nur über sudo mit eigenem Konto – damit ist im Protokoll nachvollziehbar, wer was getan hat.
  • root-Anmeldung per SSH abschalten (PermitRootLogin no). Passwortanmeldung ganz abschalten, nur Schlüssel zulassen.

Prüfliste

  1. Wer hat sudo? getent group sudo wheel und sudo -l -U <benutzer> für jeden Eintrag.
  2. Welche ungewöhnlichen setuid-Programme gibt es? find / -perm -4000 -type f – die Liste sollte man kennen und begründen können.
  3. Gibt es Konten ohne Passwort oder ohne Sperre? awk -F: '($2=="") {print $1}' /etc/shadow.
  4. Sind nicht mehr benötigte Konten entfernt? Ein altes Konto mit gültigem Passwort ist ein offener Zugang.
  5. Welche Rechte haben sensible Verzeichnisse? Besonders .ssh, Konfigurationen mit Geheimnissen, Anwendungsverzeichnisse.
  6. Wurde chmod 777 irgendwo verwendet? find / -perm -o+w -type f – weltweit schreibbare Dateien sind fast immer ein Fehler.

Verwandte Grundlagen: Linux-Dateirechte, Server härten, Linux-Prozesse, Fail2ban in der Praxis.