Zum Inhalt springen

Sudo: Unterschied zwischen den Versionen

Aus Foxwiki
 
(20 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 [[ausführen]]
'''{{BASEPAGENAME}}''' - [[Kommando]]s mit der [[Linux/Identität|Identität]] eines anderen [[Linux/Benutzer|Benutzer]]s ausführen


== Beschreibung ==
== Beschreibung ==
Benutzern Root-Privilegien gewähren und verrichtete Aktivitäten protokollieren
; Benutzern Root-Privilegien gewähren
Anwendern die Durchführung von administrativen Aufgaben ermöglichen
* Möglichst wenige Privilegien vergeben
* Möglichst wenige Privilegien vergeben
* Anwendern die Durchführung ihrer Arbeiten ermöglichen
* Aktivitäten protokollieren
 
; Abhängigkeiten
Diese Version wurde mit minimalen Abhängigkeiten zu Laufzeitbibliotheken gebaut


; LDAP-Unterstützung
; LDAP-Unterstützung
Das Paket [[sudo-ldap]] bietet LDAP-Unterstützung
[[sudo-ldap]] bietet LDAP-Unterstützung


== Installation ==
== Installation ==
<syntaxhighlight lang="bash" highlight="1" line>
<syntaxhighlight lang="bash" highlight="1" line copy>
apt-get install sudo
apt-get install sudo
</syntaxhighlight>
</syntaxhighlight>
Zeile 27: Zeile 25:


=== Optionen ===
=== Optionen ===
{| class="wikitable sortable options gnu"
{| class="wikitable sortable options gnu big"
|-
|-
! Unix !! GNU !! Parameter !! Beschreibung
! Unix !! GNU !! Parameter !! Beschreibung
Zeile 40: Zeile 38:


=== Exit-Status ===
=== Exit-Status ===
{| class="wikitable options col1center"
{| class="wikitable options col1center big"
|-
|-
! Wert !! Beschreibung
! Wert !! Beschreibung
Zeile 51: 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 57: 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)]
; Info-Pages


=== Links ===
=== Links ===
Zeile 72: Zeile 317:
{{DEFAULTSORT:sudo}}
{{DEFAULTSORT:sudo}}


[[Kategorie:Linux/Benutzer]]
[[Kategorie:sudo]]
[[Kategorie:Linux/Befehl]]
[[Kategorie:Linux/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

/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

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
  1. Öffnen Sie die gewünschte Datei mit visudo (Haupt- oder Drop-in-Datei).
  2. Nehmen Sie Änderungen vor und speichern Sie die Datei.
  3. visudo überprüft die Syntax.
  4. Wenn die Überprüfung fehlschlägt, werden die Änderungen nicht übernommen und visudo gibt eine Fehlermeldung aus.
  5. Ü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
  1. sudo(8)
  2. sudoers(5)

Projekt

  1. https://wiki.ubuntuusers.de/sudo/