Inhaltsverzeichnis
SUDOERS: Sichere Konfiguration und Best Practices (Admin-Level)
Die `/etc/sudoers`-Datei (oder Dateien im `/etc/sudoers.d/`-Verzeichnis) ist das zentrale Konfigurationselement, um Benutzern und Gruppen die Ausführung von Befehlen mit Root-Rechten oder als anderer Benutzer zu ermöglichen, ohne das Root-Passwort direkt preiszugeben.
1. Grundprinzip und Sicherheitsaspekte
`sudoers` definiert, welche Benutzer/Gruppen (`User_Alias`, `Cmnd_Alias`), auf welchen Hosts (`Host_Alias`) welche Befehle (`Cmnd_Alias`) mit welchen Rechten (`Runas_Alias`) ausführen dürfen. Das Kernziel ist das *Prinzip der geringsten Privilegien*, um die Angriffsfläche bei kompromittierten Benutzerkonten zu minimieren.
ABSOLUTE WARNUNG
VOR: `User ALL=(ALL) NOPASSWD: ALL`
Die Konfiguration `User ALL=(ALL) NOPASSWD: ALL` (oder vergleichbare für Gruppen) ist ein erhebliches Sicherheitsrisiko und sollte auf produktiven Systemen niemals verwendet werden. Dies bedeutet: * Jeder Benutzer (oder die betreffende Gruppe) kann *jeden* Befehl als *jeden* anderen Benutzer (inkl. Root) ohne Passwort ausführen. * Dies macht eine Rechteausweitung extrem einfach, wenn das Benutzerkonto kompromittiert wird. * Es gibt keine Kontrolle mehr darüber, welche Aktionen tatsächlich als Root ausgeführt werden.
Diese Einstellung untergräbt das gesamte Konzept von `sudo` und der Rechteverwaltung unter Linux und ist nur für Testsysteme ohne Sicherheitsrelevanz oder in sehr speziellen, hochgradig kontrollierten Umgebungen (z.B. spezielle CI/CD-Agents) denkbar, wo das Risiko durch andere Maßnahmen abgefangen wird.
2. Sichere, granulare `sudoers`-Konfiguration
Statt pauschaler Freigaben sollte `sudoers` präzise Rechte für spezifische Befehle vergeben. Hier ein Beispiel, das `adminuser` erlaubt, den Apache-Dienst neu zu starten und den Status abzufragen, sowie `logreader` erlaubt, `journalctl` ohne Paging zu nutzen:
Konfiguration in `/etc/sudoers` oder `/etc/sudoers.d/01_custom_admin` (bevorzugt):
# Definition von Aliasen für Benutzer, Hosts, Befehle User_Alias WEBADMINS = adminuser User_Alias LOGREADERS = logreader Cmnd_Alias WEB_SERVICE = /bin/systemctl restart apache2, /bin/systemctl status apache2 Cmnd_Alias VIEW_LOGS = /bin/journalctl # Zuweisung der Rechte WEBADMINS ALL=(ALL) NOPASSWD: WEB_SERVICE LOGREADERS ALL=(ALL) NOPASSWD: VIEW_LOGS
Erläuterung: * `User_Alias`: Definiert Gruppen von Benutzern. * `Cmnd_Alias`: Definiert Gruppen von Befehlen. Jeder Befehl muss mit seinem absoluten Pfad angegeben werden! * `WEBADMINS ALL=(ALL) NOPASSWD: WEB_SERVICE`: Der Benutzer `adminuser` darf auf allen Hosts jeden Befehl aus der `WEB_SERVICE`-Liste als jeder beliebige User (Standard: root) ohne Passworteingabe ausführen. * `LOGREADERS ALL=(ALL) NOPASSWD: VIEW_LOGS`: Der Benutzer `logreader` darf `journalctl` ohne Passwort ausführen.
3. Verhinderung von Befehlsketten und Rechteerschleichung
Eine der größten Fallen bei `sudoers` sind Befehlsketten. Wenn ein Befehl erlaubt ist, der weitere Befehle ausführen kann, kann dies zur Rechteausweitung führen. Beispiele hierfür sind: * Editoren wie `vi` oder `nano` (`sudo vi /etc/shadow`) * Paging-Programme wie `less` oder `more` (`sudo less /var/log/audit/audit.log`, dann über `!bash` eine Shell öffnen) * Programme, die Shell-Befehle ausführen können (z.B. `find -exec`, `awk -F /etc/passwd '{print $1}'`, `ssh`)
3.1 Argumente mit Regex exakt begrenzen
Bei aktuellen sudo-Versionen (ab 1.9.10) können die komplette Befehlszeile und ihre Argumente mit einer Regex eingeschränkt werden. Die Regex sollte mit `^` beginnen und mit `$` enden. Dadurch sind keine zusätzlichen Argumente erlaubt.
Beispiel: `deployuser` darf nur genau dieses Skript mit genau einem nicht-leeren, leerzeichenfreien Dateinamen ausführen:
Cmnd_Alias DEPLOY = ^/usr/local/sbin/deploy[[:space:]]+[^[:space:];&|<>$()]+$ deployuser ALL=(root) NOPASSWD: DEPLOY
Damit wird beispielsweise folgender Aufruf erlaubt:
sudo /usr/local/sbin/deploy release.tar
Nicht erlaubt sind zusätzliche Argumente oder eine vermeintliche Befehlsverkettung wie:
sudo /usr/local/sbin/deploy release.tar\;id
`digit` bedeutet nicht „Leerzeichen und Ziffern verhindern“, sondern matcht ein einzelnes Zeichen, das entweder Leerraum oder eine Ziffer ist. Für „ein oder mehrere Zeichen, aber niemals Leerraum“ wird `[^[:space:]]+` verwendet. Im obigen Beispiel werden zusätzlich `;`, `&`, `|`, `<`, `>`, `$` und runde Klammern ausgeschlossen.
Wichtig: `sudo` startet den freigegebenen Befehl nicht automatisch über eine Shell. Zeichen wie `;`, `&&` oder `|` werden daher bei einem normalen Programm nicht als Verkettung interpretiert. Eine Befehlskette wird gefährlich, sobald ein freigegebenes Programm selbst eine Shell oder einen Interpreter startet, zum Beispiel:
/bin/sh -c ... /bin/bash -c ... /usr/bin/python ... /usr/bin/perl ...
Solche Programme dürfen nicht freigegeben werden, wenn eine isolierte Einzelaktion beabsichtigt ist. Am sichersten ist ein fest installiertes Root-Skript ohne frei wählbare Argumente oder mit einer eigenen, strikten Argumentprüfung. Das Skript muss absolut referenziert werden und darf keine vom Benutzer kontrollierten Shell-Kommandos ausführen.
Best Practices zur Verhinderung:
1. Absolute Pfade und Argumente: Geben Sie Befehle immer mit ihrem absoluten Pfad an. Wenn möglich, beschränken Sie auch die erlaubten Argumente oder verwenden Sie reguläre Ausdrücke (Regex) in `sudoers` (mit Vorsicht). 2. Keine Shell-Escapes: Erlauben Sie keine Programme, die interne Shell-Escapes oder die Ausführung externer Programme zulassen (z.B. `vi`, `nano`, `more`, `less`, `man`, `find`, `awk`, `perl`, `python` ohne `sudo -i`). 3. Umfeldbeschränkung (`env_reset`, `SETENV`):
- `Defaults env_reset` (Standard) bereinigt die Umgebungsvariablen. Dies ist wichtig, um Manipulationen wie `LD_PRELOAD` zu verhindern.
- Vermeiden Sie `SETENV` für sensible Befehle, da dies eine manipulierte Umgebung zulassen könnte.
- Setzen Sie `PATH` in der `sudoers`-Datei explizit für Root-Aktionen, um PATH-Hijacking zu verhindern.
4. Minimale `NOPASSWD`-Verwendung: Verwenden Sie `NOPASSWD` nur, wenn es absolut notwendig ist, und nur für sehr spezifische, „dumme“ Befehle, die keine weiteren Subprozesse starten oder Dateien manipulieren können (z.B. `/bin/systemctl status <service>`). 5. Listen Sie alle abhängigen Befehle auf: Wenn ein Skript als `sudo` ausgeführt wird, das intern weitere Root-Aktionen ausführt, müssen diese weiteren Aktionen ebenfalls explizit in `sudoers` erlaubt werden. 6. `visudo` verwenden: Bearbeiten Sie die `sudoers`-Datei immer mit `visudo`, da dies Syntaxfehler prüft und somit Systemausfälle verhindert.
4. Überprüfung der `sudoers`-Konfiguration
Verwenden Sie den Befehl `sudo -l -U <username>` um zu prüfen, welche `sudo`-Rechte ein bestimmter Benutzer tatsächlich hat. Dies ist unerlässlich nach jeder Änderung.
5. Fazit und Best Practices für Administratoren
- Das Prinzip der geringsten Privilegien ist nicht verhandelbar. Jeder unnötige Zugriff ist ein Sicherheitsrisiko.
- Pauschale `NOPASSWD: ALL`-Konfigurationen sind extrem gefährlich und sollten vermieden werden.
- Genaue Befehlspfade und beschränkte Argumente minimieren das Missbrauchspotenzial.
- Achten Sie auf Befehlsketten und vermeiden Sie die Freigabe von interaktiven Programmen oder Skriptinterpretern per `sudo`.
- Nutzen Sie `visudo` und testen Sie Konfigurationen immer mit `sudo -l -U <username>`.
`sudo` ist ein mächtiges Werkzeug, das bei korrekter Konfiguration die Systemsicherheit erhöht. Bei unsachgemäßer Handhabung kann es jedoch eine der größten Schwachstellen darstellen.
Stichworte
sudo, sudoers, visudo, Linux, Root-Rechte, Rechteverwaltung, Least Privilege, NOPASSWD, User_Alias, Cmnd_Alias, Host_Alias, Runas_Alias, Regex, Rechteausweitung, Systemsicherheit
