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/nologinoder/usr/sbin/nologinals Shell. Sie dürfen sich nicht anmelden – das ist beabsichtigt. - Dienste laufen als eigener Benutzer. Ein Webserver als
www-data, eine Datenbank alspostgres. Wird der Dienst übernommen, hat der Angreifer nur dessen Rechte. - root sollte nicht direkt verwendet werden. Anmeldung nur über
sudomit 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
- Wer hat
sudo?getent group sudo wheelundsudo -l -U <benutzer>für jeden Eintrag. - Welche ungewöhnlichen setuid-Programme gibt es?
find / -perm -4000 -type f– die Liste sollte man kennen und begründen können. - Gibt es Konten ohne Passwort oder ohne Sperre?
awk -F: '($2=="") {print $1}' /etc/shadow. - Sind nicht mehr benötigte Konten entfernt? Ein altes Konto mit gültigem Passwort ist ein offener Zugang.
- Welche Rechte haben sensible Verzeichnisse? Besonders
.ssh, Konfigurationen mit Geheimnissen, Anwendungsverzeichnisse. - Wurde
chmod 777irgendwo 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.