===== 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}}