===== SUID, SGID und Sticky Bit =====
SUID (Set User ID), SGID (Set Group ID) und Sticky Bit sind spezielle Berechtigungen unter Linux, die das Ausführungsverhalten von Programmen und den Zugriff auf Verzeichnisse beeinflussen. Diese werden als spezielle Bits in den Dateirechten gesetzt.
===== SUID (Set User ID) =====
Wenn das SUID-Bit gesetzt ist, wird ein Programm beim Ausführen mit den Rechten des Dateibesitzers gestartet – nicht mit den Rechten des ausführenden Benutzers.
Beispiel:
-rwsr-xr-x 1 root root ... /usr/bin/passwd
Das "s" im Besitzer-Bereich zeigt das SUID-Bit. passwd benötigt z.B. root-Rechte, um Passwörter zu ändern.
Setzen:
chmod u+s datei
===== SGID (Set Group ID) =====
Mit SGID ausgeführte Programme laufen mit den Rechten der Gruppenzugehörigkeit der Datei.
Beispiel:
-rwxr-sr-x 1 root mail ... /usr/bin/procmail
Das "s" im Gruppen-Bereich zeigt das SGID-Bit.
Setzen:
chmod g+s datei
===== SGID auf Verzeichnissen =====
Wird SGID auf ein Verzeichnis gesetzt, werden neue Dateien darin automatisch der Gruppenzugehörigkeit des Verzeichnisses zugeordnet.
Setzen:
chmod g+s verzeichnis
===== Verhalten beim Erstellen neuer Dateien =====
==== SUID und SGID auf neuen Dateien ====
Aus **Sicherheitsgründen** werden SUID und SGID **NICHT automatisch vererbt** an neu erstellte Dateien:
# Verzeichnis mit SUID/SGID erstellen
mkdir testdir
chmod 6777 testdir # SUID + SGID + rwxrwxrwx
# Neue Datei erstellen
touch testdir/neuedatei
ls -l testdir/neuedatei
-rw-r--r-- 1 user group ... testdir/neuedatei
# Keine SUID/SGID-Bits gesetzt!
**Wichtig:**
* **SUID wird NIE automatisch auf neue Dateien gesetzt** - muss explizit gesetzt werden
* **SGID wird auf Dateien nur vererbt wenn vom System unterstützt** (selten)
* **SGID auf Verzeichnissen** - neue Dateien erben die Gruppe des Verzeichnisses
==== SGID auf Verzeichnissen - Gruppenvererbung ====
Bei SGID-Verzeichnissen erben neue Dateien die **Gruppe** des Verzeichnisses (nicht die primäre Gruppe des Erstellers):
# Verzeichnis mit SGID erstellen
mkdir projektdir
chgrp projektteam projektdir
chmod g+s projektdir
chmod 2775 projektdir
ls -ld projektdir
drwxrwsr-x 2 user projektteam ... projektdir
# Benutzer erstellt Datei (gehört zur Gruppe "benutzergruppe")
touch projektdir/dokument.txt
ls -l projektdir/dokument.txt
-rw-r--r-- 1 user projektteam ... projektdir/dokument.txt
# Gruppe ist "projektteam" (vom Verzeichnis), nicht "benutzergruppe"!
==== SGID-Vererbung auch auf Unterverzeichnisse ====
Neue **Unterverzeichnisse** in einem SGID-Verzeichnis erben sowohl die Gruppe als auch das SGID-Bit:
# In SGID-Verzeichnis ein Unterverzeichnis erstellen
mkdir projektdir/unterordner
ls -ld projektdir/unterordner
drwxr-sr-x 2 user projektteam ... projektdir/unterordner
# - Gruppe ist "projektteam" (vererbt)
# - SGID-Bit ist gesetzt (vererbt)
==== Sticky Bit-Verhalten ====
Das Sticky Bit wird **NICHT** auf neue Dateien oder Unterverzeichnisse vererbt:
# Verzeichnis mit Sticky Bit
mkdir stickydir
chmod 1777 stickydir
ls -ld stickydir
drwxrwxrwt 2 user group ... stickydir
# Neue Datei erstellen
touch stickydir/datei.txt
ls -l stickydir/datei.txt
-rw-r--r-- 1 user group ... stickydir/datei.txt
# Kein Sticky Bit!
# Unterverzeichnis erstellen
mkdir stickydir/unterdir
ls -ld stickydir/unterdir
drwxr-xr-x 2 user group ... stickydir/unterdir
# Kein Sticky Bit!
==== Zusammenfassung: Vererbung bei Dateierstellung ====
^ Bit ^ Auf Verzeichnis gesetzt ^ Neue Datei ^ Neues Unterverzeichnis ^ Bemerkung ^
| SUID | Ja | **Nein** | **Nein** | Wird nie vererbt (Sicherheit) |
| SGID | Ja | **Gruppe JA**, Bit Nein | **Gruppe JA**, **Bit JA** | Unterverzeichnisse erben beides |
| Sticky | Ja | **Nein** | **Nein** | Wird nicht vererbt |
**Merksatz:** Nur SGID auf Verzeichnissen hat Auswirkungen beim Erstellen neuer Dateien/Verzeichnisse - es vererbt die Gruppenzugehörigkeit und bei Unterverzeichnissen auch das SGID-Bit selbst.
===== Sticky Bit =====
Das Sticky Bit (auch Restricted Deletion Flag) wird hauptsächlich auf Verzeichnissen verwendet. Wenn es gesetzt ist, können Dateien in diesem Verzeichnis nur vom Dateibesitzer, dem Verzeichnisbesitzer oder root gelöscht oder umbenannt werden – auch wenn andere Benutzer Schreibrechte im Verzeichnis haben.
==== Sticky Bit auf Verzeichnissen ====
Typisches Beispiel ist das ''/tmp''-Verzeichnis:
drwxrwxrwt 1 root root ... /tmp
Das "t" am Ende zeigt das Sticky Bit. Jeder kann dort Dateien erstellen, aber nur der Besitzer kann sie löschen.
Setzen:
chmod +t verzeichnis
chmod 1777 verzeichnis # Mit numerischer Notation
Entfernen:
chmod -t verzeichnis
==== Sticky Bit auf Dateien ====
Auf modernen Linux-Systemen hat das Sticky Bit auf Dateien keine Funktion mehr. Historisch wurde es verwendet, um Programme im Speicher zu halten.
===== Numerische Notation =====
Spezielle Berechtigungen können auch numerisch gesetzt werden:
# Vierstellige Notation: [Spezial][User][Group][Other]
chmod 4755 datei # SUID + rwxr-xr-x
chmod 2755 datei # SGID + rwxr-xr-x
chmod 1777 verzeichnis # Sticky Bit + rwxrwxrwx
chmod 4750 datei # SUID + rwxr-x---
chmod 6755 datei # SUID + SGID + rwxr-xr-x
chmod 7755 datei # SUID + SGID + Sticky + rwxr-xr-x
Werte für spezielle Bits:
* **4** = SUID
* **2** = SGID
* **1** = Sticky Bit
Diese können kombiniert werden (z.B. 4+2=6 für SUID+SGID).
===== Übersicht der Anzeige =====
^ Bit ^ Auf Dateien ^ Auf Verzeichnissen ^ Anzeige (wenn ausführbar) ^ Anzeige (wenn nicht ausführbar) ^
| SUID | Programm läuft als Besitzer | Keine Wirkung | s (user-Bereich) | S (user-Bereich) |
| SGID | Programm läuft als Gruppe | Neue Dateien erben Gruppe | s (group-Bereich) | S (group-Bereich) |
| Sticky | Keine Wirkung (historisch) | Nur Besitzer kann löschen | t (other-Bereich) | T (other-Bereich) |
Kleinbuchstaben (s, t) = Ausführungsrecht ist gesetzt
Großbuchstaben (S, T) = Ausführungsrecht ist NICHT gesetzt
===== Beispiele =====
==== SUID-Beispiel ====
# passwd benötigt root-Rechte um /etc/shadow zu ändern
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root ... /usr/bin/passwd
# Setzen
sudo chmod u+s /pfad/zum/programm
sudo chmod 4755 /pfad/zum/programm
==== SGID-Beispiel auf Verzeichnis ====
# Shared-Projektverzeichnis erstellen
sudo mkdir /srv/projekt
sudo chgrp projektteam /srv/projekt
sudo chmod g+s /srv/projekt
sudo chmod 2775 /srv/projekt
ls -ld /srv/projekt
drwxrwsr-x 2 root projektteam ... /srv/projekt
# Alle neuen Dateien gehören automatisch zur Gruppe "projektteam"
==== Sticky Bit-Beispiel ====
# Shared-Upload-Verzeichnis mit Sticky Bit
sudo mkdir /srv/upload
sudo chmod 1777 /srv/upload
ls -ld /srv/upload
drwxrwxrwt 2 root root ... /srv/upload
# Jeder kann Dateien erstellen, aber nur eigene Dateien löschen
==== Kombiniertes Beispiel: SGID + Sticky Bit ====
# Team-Verzeichnis mit Sticky Bit
sudo mkdir /srv/team-share
sudo chgrp team /srv/team-share
sudo chmod 3770 /srv/team-share # SGID (2) + Sticky (1) + rwxrwx---
ls -ld /srv/team-share
drwxrws--T 2 root team ... /srv/team-share
# - Neue Dateien erben Gruppe "team" (SGID)
# - Nur Dateibesitzer kann eigene Dateien löschen (Sticky Bit)
# - Nur Team-Mitglieder haben Zugriff
===== Sicherheitsaspekte =====
==== SUID-Risiken ====
* **Privilege Escalation** - SUID-Programme können Sicherheitslücken darstellen
* **Nur vertrauenswürdige Programme** - SUID nur auf notwendige System-Tools setzen
* **Regelmäßige Überprüfung** - SUID-Dateien regelmäßig auditieren
Alle SUID-Dateien finden:
# SUID-Dateien suchen
sudo find / -type f -perm -4000 -ls 2>/dev/null
# SGID-Dateien suchen
sudo find / -type f -perm -2000 -ls 2>/dev/null
# Dateien mit SUID oder SGID
sudo find / -type f \( -perm -4000 -o -perm -2000 \) -ls 2>/dev/null
==== Best Practices ====
* **Minimalprinzip** - SUID/SGID nur wenn unbedingt nötig
* **NoSUID Mount-Option** - Partitionen mit nosuid mounten wo möglich
* **Audit-Tools nutzen** - Tools wie rkhunter oder aide verwenden
* **Dokumentation** - Begründung für jede SUID/SGID-Datei dokumentieren
* **Sticky Bit für Shared Directories** - Bei mehreren Benutzern immer verwenden
==== Mount-Optionen ====
# In /etc/fstab - SUID/SGID auf Partition deaktivieren
/dev/sdb1 /home ext4 defaults,nosuid,nodev 0 2
# Temporär mounten
sudo mount -o remount,nosuid /partition
===== Entfernen von speziellen Berechtigungen =====
# Einzeln entfernen
chmod u-s datei # SUID entfernen
chmod g-s datei # SGID entfernen
chmod -t verzeichnis # Sticky Bit entfernen
# Alle speziellen Bits entfernen
chmod 0755 datei # Setzt nur rwxr-xr-x (keine speziellen Bits)
# Rekursiv für Verzeichnis
chmod -R u-s,g-s verzeichnis
===== Überprüfung und Debugging =====
# Aktuelle Berechtigungen prüfen
ls -l datei
stat datei
# Numerische Darstellung
stat -c "%a %n" datei
# Detaillierte Informationen
stat -c "Permissions: %a (%A) %n" datei
# Beispiel-Ausgabe:
# Permissions: 4755 (-rwsr-xr-x) /usr/bin/sudo
# Permissions: 1777 (drwxrwxrwt) /tmp
===== Häufige Probleme =====
==== "Permission denied" trotz Rechten ====
Prüfen Sie:
* Ist das Ausführungsrecht gesetzt? (s statt S, t statt T)
* Ist die Partition mit nosuid gemountet?
* Sind alle Verzeichnisse im Pfad zugänglich?
==== SGID funktioniert nicht auf Verzeichnis ====
# Prüfen ob ausführbar für Gruppe
ls -ld verzeichnis
# Sollte sein: drwxrws--- (nicht drwxrwS---)
# Korrekt setzen
chmod 2775 verzeichnis
==== Sticky Bit zeigt "T" statt "t" ====
Das große "T" bedeutet, dass das Ausführungsrecht für "others" fehlt:
# Aktuell: drwxrwxrwT (Sticky Bit ohne x)
# Korrektur:
chmod o+x verzeichnis
# Ergebnis: drwxrwxrwt (Sticky Bit mit x)
===== Weitere Informationen =====
man chmod
man 2 chmod
man stat
man find
===== Siehe auch =====
* [[sammlung:chmod|chmod - Dateiberechtigungen ändern]]
* [[sammlung:chown|chown - Besitzer ändern]]
* [[sammlung:dateirechte_uebersicht|Dateirechte Übersicht]]
* [[sammlung:umask|umask - Standard-Berechtigungen]]
* [[sammlung:acl|ACL - Access Control Lists]]
{{tag>cli permissions security}}