Sudo: Unterschied zwischen den Versionen
| (10 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
'''{{BASEPAGENAME}}''' - [[Kommando]]s mit der [[Linux/Identität|Identität]] eines anderen [[Linux/Benutzer|Benutzer]]s | '''{{BASEPAGENAME}}''' - [[Kommando]]s mit der [[Linux/Identität|Identität]] eines anderen [[Linux/Benutzer|Benutzer]]s ausführen | ||
== Beschreibung == | == Beschreibung == | ||
| Zeile 49: | Zeile 49: | ||
<noinclude> | <noinclude> | ||
== Anwendung == | |||
Beispielsweise für Aufgaben auszuführen, die sonst ''root'' vorbehalten sind | |||
* Programme installieren (sudo apt-get install ...) | |||
* Systemkonfigurationen ändern (sudo nano /etc/fstab) | |||
Der Linux-Befehl sudo ermöglicht einem Benutzer, einen Befehl als Superuser oder als ein anderer Benutzer auszuführen | |||
* sudo erfordert die Angabe eines Passworts | |||
* Dies ist normalerweise das Benutzerpasswort, nicht das Root-Passwort | |||
; Beispiel | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
usermod -G sudo -a Otto | |||
</syntaxhighlight> | |||
Jetzt gehört der User Otto der Gruppe sudo an | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo apt update | |||
</syntaxhighlight> | |||
Und kann mit sudo root Befehle ausführen, ohne sich als root anzumelden | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
less /etc/group | |||
</syntaxhighlight> | |||
Mit diesem Befehl lassen sich Gruppen anzeigen und nachvollziehen, wer zu sudo gehört. Siehe [[/etc/group]] | |||
== Problembehebung == | |||
; "could not open display" | |||
/etc/sudoers.d | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
Defaults env_keep += "DISPLAY" | |||
</syntaxhighlight> | |||
Dadurch kann sudo die Umgebungsvariable DISPLAY an das ausgeführte Programm übergeben, und diese Programme können dann eine Verbindung zum richtigen DISPLAY herstellen | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
xhost + | |||
</syntaxhighlight> | |||
== Konfiguration == | |||
[[/etc/sudoers]] | |||
* Modulare Regeln werden als ''Drop-Ins'' bezeichnet und befinden sich standardmäßig unter: [[/etc/sudoers.d/]] | |||
Die Datei [[sollte]] mit [[visudo]] bearbeitet werden | |||
* [[visudo]] führt vor dem Speichern eine Syntaxprüfung durch | |||
=== Sudoers === | |||
Benutzer, die [[Sudo]] benutzen wollen, müssen Mitglied der Gruppe "sudo" sein | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo usermod -G sudo -a BENUTZERNAME | |||
</syntaxhighlight> | |||
; Ausführen von sudo ohne Passwort | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
sudo visudo | |||
</syntaxhighlight> | |||
In der sudoers.d Datei in der letzten Zeile folgenden Befehl einfügen | |||
<syntaxhighlight lang="bash" highlight="1" line copy> | |||
'USER' ALL=(ALL) NOPASSWD:ALL | |||
</syntaxhighlight> | |||
* User ist der Name des Users, den das betreffen soll | |||
; Einzelne Befehle auszuschließen | |||
* in der Klammer die Befehle listen, die gewünscht sind, in diesem Fall sind das alle Befehle (ALL) | |||
; Allgemeiner Grundsatz für die Konfiguration von sudoers | |||
# Öffnen Sie die gewünschte Datei mit ''visudo'' (Haupt- oder Drop-in-Datei). | |||
# Nehmen Sie Änderungen vor und speichern Sie die Datei. | |||
# ''visudo'' überprüft die Syntax. | |||
# Wenn die Überprüfung fehlschlägt, werden die Änderungen nicht übernommen und visudo gibt eine Fehlermeldung aus. | |||
# Überprüfung: ''sudo -l''. Führen Sie einen Testbefehl aus. | |||
; Konfiguration Öffnen | |||
Sie können den Konfigurationseditor mit folgendem Befehl öffnen: | |||
sudo visudo | |||
Unter Debian erfolgt der Start mit nano, da dies standardmäßig in der Systemvariablen editor angegeben ist. | |||
Sie können dies wie folgt überprüfen: | |||
readlink -f /usr/bin/editor | |||
Änderung des Standard-Editors: | |||
sudo update-alternatives --config editor | |||
; Drop-Ins einschalten | |||
* Am Ende von ''/etc/sudoers'' steht normalerweise: | |||
<syntaxhighlight lang="ini"> | |||
@includedir /etc/sudoers.d | |||
</syntaxhighlight> | |||
* Sie können auch eine separate Datei mit der Anweisung @include in die Konfiguration einfügen. | |||
<syntaxhighlight lang="ini"> | |||
@include /usr/local/etc/sudoers.custom | |||
</syntaxhighlight> | |||
;Hinweis | |||
:In älteren Versionen von sudo (<1.9.1) begannen die Anweisungen mit dem Zeichen '''''#''''' statt mit '''''@'''''. Beide Formate werden jedoch unterstützt. | |||
;Bezeichnung der Drop-in-Dateien | |||
Allgemein übliche Bezeichnung der Drop-in-Dateien: | |||
* ''NN-topic'', wobei NN die Dateinummer ist. Die Reihenfolge der Lesbarkeit ist lexikografisch (alphabetisch, von 00 bis 99). | |||
:* Beispiel: | |||
/etc/sudoers.d/ | |||
├── 00-defaults | |||
├── 10-groups | |||
├── 50-nginx | |||
└── 90-local | |||
* Die Dateien haben keine Erweiterung. | |||
=== Regeln (User Specifications) === | |||
Jeder dieser Einträge beschreibt: | |||
* wer (USER) | |||
* auf welchen Hosts (HOSTS) | |||
* was ausführen darf (COMMANDS) | |||
* im Namen von wem (RUNAS) | |||
* mit welchen Modifikatoren (TAGS) | |||
; Schreiben von sudoers-Regeln | |||
Allgemeiner Aufbau einer Zeile | |||
<syntaxhighlight lang="ini"> | |||
USER HOSTS = (RUNAS) [TAGS] COMMANDS | |||
</syntaxhighlight> | |||
'''USER''' — Für dieses Feld kann einer der folgenden Werte angegeben werden: | |||
* Benutzer | |||
* Gruppe (GID-Gruppe) | |||
* Netgroup (NIS) | |||
* Alias | |||
'''HOSTS''' – auf welchen Hosts die Regel gilt (Namen/Masken/IP, Aliase sind möglich). | |||
'''(RUNAS)''' – in wessen Namen und/oder mit welcher Gruppe ausführen (Standardwert ''root''). | |||
* Benutzer | |||
* Mehrere Benutzer: (postgres, mysql) | |||
* Gruppe (GID-Gruppe) | |||
* Alias | |||
'''[TAGS]''' – Modifikatoren | |||
* '''NOPASSWD:''' – kein Passwort für die aufgeführten Befehle abfragen. | |||
* '''PASSWD:''' – Passwort für die aufgeführten Befehle abfragen. | |||
* '''SETENV:''' – Verwaltung der Umgebung zulassen. | |||
* '''NOEXEC:''' – Unterprozesse innerhalb des Befehls verbieten. | |||
'''COMMANDS''' – Liste der vollständigen Pfade zu Befehlen (vorzugsweise ohne Wildcards), Aliase sind möglich. | |||
; Beispiele für Regeln mit Erläuterungen | |||
<syntaxhighlight lang="ini" line> | |||
# Die Gruppe devops darf ALLES ausführen, AUSSER Ausschalten/Neustarten | |||
%devops ALL = (ALL) ALL, !/sbin/shutdown, !/sbin/poweroff, !/sbin/reboot | |||
# Der Benutzer dbuser darf die Befehle psql und mysql als postgres bzw. mysql ausführen | |||
dbuser ALL = (postgres, mysql) /usr/bin/psql, /usr/bin/mysql | |||
# apt für den Benutzer dev einschränken | |||
dev ALL = (root) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade | |||
# Der Benutzer webops darf den Status von nginx als root ohne Passwort abfragen | |||
# und einen Neustart mit Passwort durchführen (nur bei exakt passender Befehls-Syntax). | |||
# Das Stoppen des Dienstes ist NICHT erlaubt, da es nicht ausdrücklich aufgeführt ist. | |||
webops ALL = (root) NOPASSWD: /usr/bin/systemctl status nginx, PASSWD: /usr/bin/systemctl restart nginx | |||
# Dem Benutzer extadmin das Recht geben, api auf Hosts web* (deren Hostname mit „web“ beginnt) | |||
# während der Arbeitszeit neu zu starten (09:00–18:00 gemäß den unten gesetzten Grenzen) | |||
extadmin web* = (root) NOTBEFORE=202511010900: NOTAFTER=202511011800: /usr/bin/systemctl restart api | |||
</syntaxhighlight> | |||
=== Defaults === | |||
Mit Defaults können Sie das Sicherheitsprofil und die Verhaltenseinstellungen von sudo festlegen | |||
* Zeitlimit für zuvor eingegebene Passwörter, erneute Passwortabfrage nach ... | |||
* I/O-Protokollierung | |||
* Verwendung eines vordefinierten PATH | |||
* ... | |||
; Ausführungspriorität | |||
Defaults haben die folgende Priorität (von oben nach unten): | |||
* Defaults! /Befehl | |||
* Defaults>runas | |||
* Defaults:Benutzer/Gruppe | |||
* Defaults@Host | |||
* Globale Defaults | |||
<syntaxhighlight lang="ini" line> | |||
# Reine Umgebung | |||
Defaults env_reset | |||
# PATH definieren | |||
Defaults secure_path="/usr/sbin:/usr/bin:/sbin:/bin" | |||
# sudo-Passwort-Cache (Minuten); 0 – immer fragen | |||
Defaults timestamp_timeout=5 | |||
# Pseudo-TTY für I/O-Protokolle | |||
Defaults use_pty | |||
# Authentifizierungsparameter/ | |||
Defaults passwd_tries=3, passwd_timeout=30 | |||
Defaults lecture=once | |||
</syntaxhighlight> | |||
Beispiele für Defaults für bestimmte Entitäten | |||
<syntaxhighlight lang="ini" line> | |||
# Für den Befehl vi: Unterprozesse verbieten und I/O-Protokolle aktivieren | |||
Defaults! /usr/bin/vi noexec, log_input, log_output | |||
# Für den Benutzer alice: Immer nach dem Passwort fragen | |||
Defaults:alice timestamp_timeout=0 | |||
# Für die Gruppe (GID) webops: Proxy-Variablen zulassen | |||
Defaults:%webops env_keep += "http_proxy https_proxy" | |||
# Für den Host (jump-host): TTY und strenge Passwortabfragepolitik | |||
Defaults@backupsrv use_pty, timestamp_timeout=0 | |||
# Für RunAs-Benutzer: Beim Ausführen von Befehlen von postgres wird kein Passwort abgefragt. | |||
Defaults>postgres !authenticate | |||
# Für RunAs-Benutzer: Beim Ausführen von Befehlen von postgres wird kein Passwort abgefragt. | |||
</syntaxhighlight> | |||
=== Aliase === | |||
; Einrichten von Aliasen für die spätere Verwendung | |||
<syntaxhighlight lang="ini"> | |||
User_Alias WEBOPS = alice, bob | |||
Runas_Alias DBUSERS = postgres, mysql | |||
Host_Alias WEBSERVERS = www01, www02 | |||
Cmnd_Alias Nginx_CTL = /bin/systemctl start nginx, /bin/systemctl stop nginx, /bin/systemctl restart nginx, /bin/systemctl status nginx | |||
</syntaxhighlight> | |||
; Anwendungsbeispiel | |||
Beispiel für eine vollständige Zeile | |||
<syntaxhighlight lang="ini"> | |||
WEBOPS WEBSERVERS = (root) NOPASSWD: Nginx_CTL | |||
</syntaxhighlight> | |||
== Anhang == | == Anhang == | ||
| Zeile 55: | Zeile 304: | ||
=== Dokumentation === | === Dokumentation === | ||
; Man-Page | ; Man-Page | ||
# [https://manpages.debian.org/stable/sudo/sudo.8.en.html sudo(8)] | # [https://manpages.debian.org/stable/sudo/sudo.8.en.html sudo(8)] | ||
# [https://manpages.debian.org/stable/sudo/sudoers.5.en.html sudoers(5)] | |||
=== Links === | === Links === | ||
| Zeile 70: | Zeile 317: | ||
{{DEFAULTSORT:sudo}} | {{DEFAULTSORT:sudo}} | ||
[[Kategorie:sudo]] | |||
[[Kategorie:Linux/Befehl]] | |||
[[Kategorie:Linux/Benutzer/Befehl]] | [[Kategorie:Linux/Benutzer/Befehl]] | ||
</noinclude> | </noinclude> | ||
Aktuelle Version vom 17. April 2026, 18:11 Uhr
Sudo - Kommandos mit der Identität eines anderen Benutzers ausführen
Beschreibung
- Benutzern Root-Privilegien gewähren
Anwendern die Durchführung von administrativen Aufgaben ermöglichen
- Möglichst wenige Privilegien vergeben
- Aktivitäten protokollieren
- LDAP-Unterstützung
sudo-ldap bietet LDAP-Unterstützung
Installation
apt-get install sudo
Aufruf
sudo -h | -K | -k | -V
sudo -v [-ABknS] [-g group] [-h host] [-p prompt] [-u user]
sudo -l [-ABknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
sudo [-ABbEHnPS] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory] [-r role] [-t type] [-T timeout] [-u user] [VAR=value] [-i | -s] [command]
sudoedit [-ABknS] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory] [-r role] [-t type] [-T timeout] [-u user] file ..
Optionen
| Unix | GNU | Parameter | Beschreibung |
|---|---|---|---|
Parameter
Umgebungsvariablen
Exit-Status
| Wert | Beschreibung |
|---|---|
| 0 | Erfolg |
| >0 | Fehler |
Anwendung
Beispielsweise für Aufgaben auszuführen, die sonst root vorbehalten sind
- Programme installieren (sudo apt-get install ...)
- Systemkonfigurationen ändern (sudo nano /etc/fstab)
Der Linux-Befehl sudo ermöglicht einem Benutzer, einen Befehl als Superuser oder als ein anderer Benutzer auszuführen
- sudo erfordert die Angabe eines Passworts
- Dies ist normalerweise das Benutzerpasswort, nicht das Root-Passwort
- Beispiel
usermod -G sudo -a Otto
Jetzt gehört der User Otto der Gruppe sudo an
sudo apt update
Und kann mit sudo root Befehle ausführen, ohne sich als root anzumelden
less /etc/group
Mit diesem Befehl lassen sich Gruppen anzeigen und nachvollziehen, wer zu sudo gehört. Siehe /etc/group
Problembehebung
- "could not open display"
/etc/sudoers.d
Defaults env_keep += "DISPLAY"
Dadurch kann sudo die Umgebungsvariable DISPLAY an das ausgeführte Programm übergeben, und diese Programme können dann eine Verbindung zum richtigen DISPLAY herstellen
xhost +
Konfiguration
- Modulare Regeln werden als Drop-Ins bezeichnet und befinden sich standardmäßig unter: /etc/sudoers.d/
Die Datei sollte mit visudo bearbeitet werden
- visudo führt vor dem Speichern eine Syntaxprüfung durch
Sudoers
Benutzer, die Sudo benutzen wollen, müssen Mitglied der Gruppe "sudo" sein
sudo usermod -G sudo -a BENUTZERNAME
- Ausführen von sudo ohne Passwort
sudo visudo
In der sudoers.d Datei in der letzten Zeile folgenden Befehl einfügen
'USER' ALL=(ALL) NOPASSWD:ALL
- User ist der Name des Users, den das betreffen soll
- Einzelne Befehle auszuschließen
- in der Klammer die Befehle listen, die gewünscht sind, in diesem Fall sind das alle Befehle (ALL)
- Allgemeiner Grundsatz für die Konfiguration von sudoers
- Öffnen Sie die gewünschte Datei mit visudo (Haupt- oder Drop-in-Datei).
- Nehmen Sie Änderungen vor und speichern Sie die Datei.
- visudo überprüft die Syntax.
- Wenn die Überprüfung fehlschlägt, werden die Änderungen nicht übernommen und visudo gibt eine Fehlermeldung aus.
- Überprüfung: sudo -l. Führen Sie einen Testbefehl aus.
- Konfiguration Öffnen
Sie können den Konfigurationseditor mit folgendem Befehl öffnen:
sudo visudo
Unter Debian erfolgt der Start mit nano, da dies standardmäßig in der Systemvariablen editor angegeben ist.
Sie können dies wie folgt überprüfen:
readlink -f /usr/bin/editor
Änderung des Standard-Editors:
sudo update-alternatives --config editor
- Drop-Ins einschalten
- Am Ende von /etc/sudoers steht normalerweise:
@includedir /etc/sudoers.d
- Sie können auch eine separate Datei mit der Anweisung @include in die Konfiguration einfügen.
@include /usr/local/etc/sudoers.custom
- Hinweis
- In älteren Versionen von sudo (<1.9.1) begannen die Anweisungen mit dem Zeichen # statt mit @. Beide Formate werden jedoch unterstützt.
- Bezeichnung der Drop-in-Dateien
Allgemein übliche Bezeichnung der Drop-in-Dateien:
- NN-topic, wobei NN die Dateinummer ist. Die Reihenfolge der Lesbarkeit ist lexikografisch (alphabetisch, von 00 bis 99).
- Beispiel:
/etc/sudoers.d/ ├── 00-defaults ├── 10-groups ├── 50-nginx └── 90-local
- Die Dateien haben keine Erweiterung.
Regeln (User Specifications)
Jeder dieser Einträge beschreibt:
- wer (USER)
- auf welchen Hosts (HOSTS)
- was ausführen darf (COMMANDS)
- im Namen von wem (RUNAS)
- mit welchen Modifikatoren (TAGS)
- Schreiben von sudoers-Regeln
Allgemeiner Aufbau einer Zeile
USER HOSTS = (RUNAS) [TAGS] COMMANDS
USER — Für dieses Feld kann einer der folgenden Werte angegeben werden:
- Benutzer
- Gruppe (GID-Gruppe)
- Netgroup (NIS)
- Alias
HOSTS – auf welchen Hosts die Regel gilt (Namen/Masken/IP, Aliase sind möglich).
(RUNAS) – in wessen Namen und/oder mit welcher Gruppe ausführen (Standardwert root).
- Benutzer
- Mehrere Benutzer: (postgres, mysql)
- Gruppe (GID-Gruppe)
- Alias
[TAGS] – Modifikatoren
- NOPASSWD: – kein Passwort für die aufgeführten Befehle abfragen.
- PASSWD: – Passwort für die aufgeführten Befehle abfragen.
- SETENV: – Verwaltung der Umgebung zulassen.
- NOEXEC: – Unterprozesse innerhalb des Befehls verbieten.
COMMANDS – Liste der vollständigen Pfade zu Befehlen (vorzugsweise ohne Wildcards), Aliase sind möglich.
- Beispiele für Regeln mit Erläuterungen
# Die Gruppe devops darf ALLES ausführen, AUSSER Ausschalten/Neustarten
%devops ALL = (ALL) ALL, !/sbin/shutdown, !/sbin/poweroff, !/sbin/reboot
# Der Benutzer dbuser darf die Befehle psql und mysql als postgres bzw. mysql ausführen
dbuser ALL = (postgres, mysql) /usr/bin/psql, /usr/bin/mysql
# apt für den Benutzer dev einschränken
dev ALL = (root) NOPASSWD: /usr/bin/apt update, /usr/bin/apt upgrade
# Der Benutzer webops darf den Status von nginx als root ohne Passwort abfragen
# und einen Neustart mit Passwort durchführen (nur bei exakt passender Befehls-Syntax).
# Das Stoppen des Dienstes ist NICHT erlaubt, da es nicht ausdrücklich aufgeführt ist.
webops ALL = (root) NOPASSWD: /usr/bin/systemctl status nginx, PASSWD: /usr/bin/systemctl restart nginx
# Dem Benutzer extadmin das Recht geben, api auf Hosts web* (deren Hostname mit „web“ beginnt)
# während der Arbeitszeit neu zu starten (09:00–18:00 gemäß den unten gesetzten Grenzen)
extadmin web* = (root) NOTBEFORE=202511010900: NOTAFTER=202511011800: /usr/bin/systemctl restart api
Defaults
Mit Defaults können Sie das Sicherheitsprofil und die Verhaltenseinstellungen von sudo festlegen
- Zeitlimit für zuvor eingegebene Passwörter, erneute Passwortabfrage nach ...
- I/O-Protokollierung
- Verwendung eines vordefinierten PATH
- ...
- Ausführungspriorität
Defaults haben die folgende Priorität (von oben nach unten):
- Defaults! /Befehl
- Defaults>runas
- Defaults:Benutzer/Gruppe
- Defaults@Host
- Globale Defaults
# Reine Umgebung
Defaults env_reset
# PATH definieren
Defaults secure_path="/usr/sbin:/usr/bin:/sbin:/bin"
# sudo-Passwort-Cache (Minuten); 0 – immer fragen
Defaults timestamp_timeout=5
# Pseudo-TTY für I/O-Protokolle
Defaults use_pty
# Authentifizierungsparameter/
Defaults passwd_tries=3, passwd_timeout=30
Defaults lecture=once
Beispiele für Defaults für bestimmte Entitäten
# Für den Befehl vi: Unterprozesse verbieten und I/O-Protokolle aktivieren
Defaults! /usr/bin/vi noexec, log_input, log_output
# Für den Benutzer alice: Immer nach dem Passwort fragen
Defaults:alice timestamp_timeout=0
# Für die Gruppe (GID) webops: Proxy-Variablen zulassen
Defaults:%webops env_keep += "http_proxy https_proxy"
# Für den Host (jump-host): TTY und strenge Passwortabfragepolitik
Defaults@backupsrv use_pty, timestamp_timeout=0
# Für RunAs-Benutzer: Beim Ausführen von Befehlen von postgres wird kein Passwort abgefragt.
Defaults>postgres !authenticate
# Für RunAs-Benutzer: Beim Ausführen von Befehlen von postgres wird kein Passwort abgefragt.
Aliase
- Einrichten von Aliasen für die spätere Verwendung
User_Alias WEBOPS = alice, bob
Runas_Alias DBUSERS = postgres, mysql
Host_Alias WEBSERVERS = www01, www02
Cmnd_Alias Nginx_CTL = /bin/systemctl start nginx, /bin/systemctl stop nginx, /bin/systemctl restart nginx, /bin/systemctl status nginx
- Anwendungsbeispiel
Beispiel für eine vollständige Zeile
WEBOPS WEBSERVERS = (root) NOPASSWD: Nginx_CTL
Anhang
Siehe auch
Dokumentation
- Man-Page
Links
Projekt
Weblinks