Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

sudoers - Standardsicherheitsrichtlinie von sudo

&pagelevel(4)&pagelevel

(default sudo security policy plugin)


Die Sicherheitsrichtlinie sudoers bestimmt die sudo-Berechtigungen eines Benutzers. Die Richtlinie wird von der Datei /etc/sudoers gesteuert. Das Richtlinienformat ist im Abschnitt „sudoers-Dateiformat“ genau beschrieben.

Authentifizierung und Protokollierung

Die sudoers-Sicherheitsrichtlinie erfordert, dass sich die meisten Benutzer authentifizieren, bevor sie sudo verwenden können. Ein Kennwort ist nicht erforderlich, wenn der aufrufende Benutzer der Administrator ist, wenn der Zielbenutzer mit dem aufrufenden Benutzer identisch ist oder wenn die Richtlinie die Authentifizierung für den Benutzer oder das Kommando deaktiviert hat. Wenn sudoers eine Authentifizierung erfordert, validiert es im Gegensatz zu su die Anmeldeinformationen des aufrufenden Benutzers, und nicht die Anmeldeinformationen des Zielbenutzers (oder von SYSROOT). Dies kann über die Kennzeichen rootpw, targetpw und runaspw geändert werden, die später beschrieben werden.

Wenn ein Benutzer, der nicht in der Richtlinie aufgelistet ist, versucht, ein Kommando über sudo auszuführen, wird eine E-Mail an die zuständigen Stellen gesendet. Die für diese E-Mail verwendete Adresse ist über den Standardeintrag mailto (wird später beschrieben) konfigurierbar und ist standardmäßig SYSROOT.

Beachten Sie, dass keine E-Mail gesendet wird, wenn ein nicht autorisierter Benutzer versucht, sudo mit der Option -l oder -v auszuführen, es sei denn, es besteht ein Authentifizierungsfehler und es ist entweder das Kennzeichen mail_always oder mail_badpass aktiviert. Auf diese Weise können Benutzer für sich selbst feststellen, ob sie sudo verwenden dürfen oder nicht. Alle Versuche zur Ausführung von sudo (erfolgreich oder nicht) werden protokolliert, unabhängig davon, ob eine E-Mail gesendet wird oder nicht.

Wenn sudo vom Administrator ausgeführt wird und die Umgebungsvariable SUDO_USER festgelegt ist, verwendet die sudoers-Richtlinie diesen Wert, um festzustellen, wer der tatsächliche Benutzer ist. Dies kann von einem Benutzer verwendet werden, um Kommandos über sudo zu protokollieren, selbst wenn eine Root-Shell aufgerufen wurde. Weiterhin kann die Option -e nützlich bleiben, selbst wenn sie über ein von sudo ausgeführtes Skript oder Programm aufgerufen wird. Beachten Sie jedoch, dass die sudoers-Suche weiterhin für den Administrator durchgeführt wird, und nicht für den von SUDO_USER angegebenen Benutzer.

sudoers verwendet für das Zwischenspeichern von Anmeldeinformationen benutzerspezifische Zeitstempeldateien. Nachdem ein Benutzer authentifiziert wurde, wird ein Datensatz geschrieben, der die zur Authentifizierung verwendete UID, die ID der Terminalsitzung und einen Zeitstempel enthält. Der Benutzer kann dann sudo für einen kurzen Zeitraum (5 Minuten, es sei denn, dies wird über die Timeout-Option außer Kraft gesetzt) ohne Kennwort verwenden. Standardmäßig verwendet sudoers einen separaten Datensatz für jedes "tty".

Dies bedeutet, dass die Anmeldesitzungen eines Benutzers separat authentifiziert werden. Die Option tty_tickets kann deaktiviert werden, um die Verwendung eines einzigen Zeitstempels für alle Sitzungen eines Benutzers zu erzwingen.

sudoers kann sowohl erfolgreiche als auch nicht erfolgreiche Versuche (und Fehler) in syslog, einer Protokolldatei oder beidem protokollieren. Standardmäßig protokolliert sudoers über syslog, aber dies kann über die Standardeinstellungen von syslog und der Protokolldatei geändert werden.

Kommandoumgebung

Da Umgebungsvariablen das Programmverhalten beeinflussen können, stellt sudoers eine Möglichkeit bereit, um einzuschränken, welche Variablen aus der Umgebung des Benutzers von dem auszuführenden Kommando geerbt werden. Es gibt zwei unterschiedliche Möglichkeiten dafür, wie sudoers mit Umgebungsvariablen umgehen kann.

Standardmäßig ist die Option env_reset aktiviert. Dies führt dazu, dass Kommandos mit einer neuen, minimalen Umgebung ausgeführt werden. Die neue Umgebung enthält die Variablen TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME und SUDO_* zusätzlich zu den Variablen aus dem aufrufenden Prozess, die von den Optionen env_check und env_keep erlaubt werden. Dies ist praktisch eine Whitelist für Umgebungsvariablen. Umgebungsvariablen mit einem Wert beginnend mit () werden entfernt, es sei denn, sowohl die Namens- als auch die Wertteile passen zu env_keep oder env_check, weil sie von älteren Versionen der Bash-Shell als Funktionen interpretiert werden.

Wenn jedoch die Option env_reset deaktiviert ist, werden alle Variablen, die von den Optionen env_check und env_delete nicht explizit verweigert werden, von dem aufrufenden Prozess geerbt. In diesem Fall verhalten sich env_check und env_delete wie eine Blacklist. Umgebungsvariablen mit einem Wert beginnend mit () werden immer entfernt, selbst wenn sie mit keiner der Blacklists übereinstimmen.

Da es ist nicht möglich ist, alle potenziell gefährlichen Umgebungsvariablen auf eine Blacklist zu setzen, wird die Verwendung des Standardverhaltens env_reset empfohlen.

Standardmäßig werden Umgebungsvariablen nach ihrem Namen auf Übereinstimmung geprüft. Wenn das Muster jedoch ein Gleichheitszeichen ('=') enthält, müssen sowohl der Name als auch der Wert der Variable übereinstimmen. Zum Beispiel könnte eine Bash-Shell-Funktion im alten Stil (vor shellshock) wie folgt auf Übereinstimmung geprüft werden:

env_keep += "my_func=()*"

Ohne das Suffix "=()*" würde keine Übereinstimmung bestehen, weil Bash-Shell-Funktionen im alten Stil nicht standardmäßig beibehalten werden.

Die vollständige Liste der Umgebungsvariablen, die sudo zulässt oder verweigert, ist bei Ausführung als Administrator in der Ausgabe von "sudo -V" enthalten.

Sonderfall: Wenn die Option -i (erstmalige Anmeldung) von sudo angegeben ist, initialisiert sudoers die Umgebung unabhängig von dem Wert von env_reset. Die Variablen DISPLAY, PATH und TERM bleiben unverändert. HOME, MAIL, SHELL, USER und LOGNAME werden basierend auf dem Zielbenutzer festgelegt. Alle anderen Umgebungsvariablen werden entfernt.

Schließlich, wenn die Option env_file definiert ist, werden alle in dieser Datei vorhandenen Variablen auf ihre angegebenen Werte festgelegt, sofern dadurch kein Konflikt mit einer vorhandenen Umgebungsvariable entsteht.

sudoers-Dateiformat

Die sudoers-Datei besteht aus zwei Arten von Einträgen: Alias (im Wesentlichen Variablen) und Benutzerspezifikationen (die festlegen, wer was ausführen darf).

Wenn mehrere Einträge für einen Benutzer übereinstimmen, werden sie der Reihe nach angewendet. Wenn mehrere Übereinstimmungen bestehen, wird die letzte Übereinstimmung verwendet (was nicht unbedingt die genaueste Übereinstimmung ist).

Die sudoers-Grammatik wird weiter unten in erweiterter Backus-Naur-Form (EBNF) beschrieben. Es ist kein Problem, wenn Sie mit EBNF nicht vertraut sind. Es ist ziemlich einfach, und die nachfolgenden Definitionen werden durch Anmerkungen erläutert.

Kurzanleitung für EBNF

EBNF ist eine kurze und präzise Möglichkeit, um die Grammatik einer Sprache zu beschreiben. Jede EBNF-Definition besteht aus Produktionsregeln. Beispiel:

symbol ::= definition | alternate1 | alternate2 ...

Jede Produktionsregel verweist auf andere Regeln, wodurch eine Grammatik für die Sprache entsteht. EBNF enthält außerdem die folgenden Operatoren, die viele Leser von regulären Ausdrücken kennen werden. Verwechseln Sie diese Operatoren jedoch nicht mit Wildcard-Zeichen, die andere Bedeutungen haben.

?

Bedeutet, dass das vorhergehende Symbol (oder eine Gruppe von Symbolen) optional ist. Das Symbol kann also einmal oder überhaupt nicht auftreten.

*

Bedeutet, dass das vorhergehende Symbol (oder eine Gruppe von Symbolen) null oder mehrere Male auftreten kann.

+

Bedeutet, dass das vorhergehende Symbol (oder eine Gruppe von Symbolen) ein oder mehrere Male auftreten kann.
Klammern können verwendet werden, um Symbole zu gruppieren. Aus Gründen der Klarheit werden einfache Anführungszeichen (") verwendet, um zu bestimmen, was eine ausführliche Zeichenfolge ist (im Gegensatz zu einem Symbolnamen).

Alias

Es gibt vier Arten von Alias: User_Alias, Runas_Alias, Host_Alias und Cmnd_Alias.

Alias ::= 'User_Alias' User_Alias (':' User_Alias)* |
          'Runas_Alias' Runas_Alias (':' Runas_Alias)* |
          'Host_Alias' Host_Alias (':' Host_Alias)* |
          'Cmnd_Alias' Cmnd_Alias (':' Cmnd_Alias)*
User_Alias ::= NAME '=' User_List
Runas_Alias ::= NAME '=' Runas_List
Host_Alias ::= NAME '=' Host_List
Cmnd_Alias ::= NAME '=' Cmnd_List
NAME ::= [A-Z]([A-Z][0-9]_)*

Jede Aliasdefinition hat die folgende Form:

Alias_Type NAME = item1, item2, ...

Hierbei ist Alias_Type eines von Folgendem: User_Alias, Runas_Alias, Host_Alias oder Cmnd_Alias. Ein NAME ist eine Zeichenfolge bestehend aus Großbuchstaben, Zahlen und Unterstrichzeichen ('_'). Ein NAME muss mit einem Großbuchstaben beginnen.

Es ist möglich, mehrere Aliasdefinitionen derselben Art in eine einzige Zeile zu stellen und jeweils mit einem Doppelpunkt (':') zu verbinden. Beispiel:

Alias_Type NAME = item1, item2, item3 : NAME = item4, item5

Es ist ein Syntaxfehler, wenn ein vorhandener Alias neu definiert wird. Es ist möglich, denselben Namen für Alias verschiedener Arten zu verwenden, aber dies wird nicht empfohlen.

Es folgen Definitionen dafür, was ein gültiges Aliaselement darstellt.

User_List ::= User |
              User ',' User_List
User ::= '!'* user name |
         '!'* #uid |
         '!'* %group |
         '!'* %#gid |
         '!'* User_Alias

Eine User_List besteht aus einem oder mehreren Benutzernamen, Benutzer-IDs (mit dem Präfix '#'), Systemgruppennamen und -IDs (mit dem Präfix '%' bzw. '%#') und User_Aliases. Jedem Listenelement können null oder mehr Operatoren '!' vorangestellt werden. Eine ungerade Anzahl an Operatoren '!' negiert den Wert des Elements. Bei einer geraden Anzahl heben sie sich einfach gegenseitig auf.

Ein Benutzername, eine UID, eine Gruppe oder eine GID kann in doppelte Anführungszeichen eingeschlossen werden, um zu vermeiden, dass Sonderzeichen entwertet werden müssen. Alternativ können Sonderzeichen im hexadezimalen Escape-Modus angegeben werden, z. B. \x20 für das Leerzeichen. Wenn doppelte Anführungszeichen verwendet werden, müssen alle Präfixzeichen in die Anführungszeichen eingeschlossen werden. Beachten Sie, dass Anführungszeichen um Gruppennamen optional sind. Bei Zeichenfolgen ohne Anführungszeichen müssen Leerzeichen und Sonderzeichen durch einen Gegenschrägstrich ('\') entwertet werden. Unter "Weitere Sonderzeichen und reservierte Wörter" finden Sie eine Liste von Zeichen, die entwertet werden müssen.

Runas_List ::= Runas_Member |
               Runas_Member ',' Runas_List
Runas_Member ::= '!'* user name |
                 '!'* #uid |
                 '!'* %group |
                 '!'* %#gid |
                 '!'* Runas_Alias

Eine Runas_List ist mit einer User_List vergleichbar, aber anstelle von User_Aliases kann sie Runas_Aliases enthalten. Beachten Sie, dass Benutzernamen und Gruppen als Zeichenfolgen auf Übereinstimmung geprüft werden. Mit anderen Worten: Zwei Benutzer (Gruppen) mit derselben UID (GID) werden als verschieden betrachtet. Wenn Sie alle Benutzernamen mit derselben UID (z. B. SYSROOT und TSOS) auf Übereinstimmung prüfen möchten, können Sie stattdessen eine UID verwenden (#0 im angegebenen Beispiel).

Host_List ::= Host |
              Host ',' Host_List
Host ::= '!'* host name |
         '!'* ip_addr |
         '!'* network(/netmask)? |
         '!'* Host_Alias

Eine Host_List besteht aus einem oder mehreren Hostnamen, IP-Adressen, Netzwerknummern und anderen Alias. Wie bereits erwähnt, kann der Wert eines Elements mit dem Operator '!' negiert werden. Wenn Sie keine Netzmaske zusammen mit der Netzwerknummer angeben, fragt sudo alle Netzwerkschnittstellen des lokalen Hosts ab, und wenn die Netzwerknummer mit einer der Netzwerkschnittstellen des Hosts übereinstimmt, wird die entsprechende Netzmaske verwendet.
Die Netzmaske kann entweder in der standardmäßigen IP-Adressen-Notation (z. B.
255.255.255.0 oder ffff:ffff:ffff:ffff::) oder in der CIDR-Notation (Anzahl der Bits, z. B. 24 oder 64) angegeben werden. Ein Hostname kann Shell-Wildcards (siehe den Abschnitt zu Wildcards weiter unten) enthalten, aber sofern nicht das Hostnamenkommando auf Ihrem Computer den vollqualifizierten Hostnamen zurückgibt, müssen Sie die Option fqdn verwenden, damit Wildcards nützlich sind. Beachten Sie, dass sudo nur die tatsächlichen Netzwerk-

schnittstellen überprüft. Dies bedeutet, dass die IP-Adresse 127.0.0.1 (localhost) niemals übereinstimmt. Außerdem stimmt der Hostname "localhost" nur überein, wenn dies der tatsächliche Hostname ist, was normalerweise nur bei nicht vernetzten Systemen der Fall ist.

digest ::= [A-Fa-f0-9]+ |
           [[A-Za-z0-9+/=]+
Digest_Spec ::= "sha224" ':' digest |
                "sha256" ':' digest |
                "sha384" ':' digest |
                "sha512" ':' digest
Cmnd_List ::= Cmnd |
              Cmnd ',' Cmnd_List
command name ::= file name |
                 file name args |
                 file name '""'
Cmnd ::= Digest_Spec? '!'* command name |
                      '!'* directory |
                      '!'* "sudoedit" |
                      '!'* Cmnd_Alias

Eine Cmnd_List ist eine Liste mit einem oder mehreren Kommandonamen, Verzeichnissen und anderen Alias. Ein Kommandoname ist ein vollqualifizierter Dateiname, der Shell-Wildcards (siehe den Abschnitt zu Wildcards weiter unten) enthalten kann. Ein einfacher Dateiname ermöglicht es dem Benutzer, das Kommando mit allen gewünschten Argumenten auszuführen.

Sie können jedoch auch Kommandozeilenargumente (einschließlich Wildcards) angeben. Alternativ können Sie "" angeben, um anzuzeigen, dass das Kommando nur ohne Kommandozeilenargumente ausgeführt werden kann. Ein Verzeichnis ist ein vollqualifizierter Pfadname, der mit einem '/' endet. Wenn Sie ein Verzeichnis in einer Cmnd_List angeben, kann der Benutzer jede Datei in diesem Verzeichnis (aber nicht in allen Unterverzeichnissen darin) ausführen.

Wenn einem Cmnd Kommandozeilenargumente zugeordnet sind, müssen die Argumente in dem Cmnd genau mit denen übereinstimmen, die vom Benutzer in der Kommandozeile angegeben wurden (oder sie müssen mit den Wildcards, sofern vorhanden, übereinstimmen). Beachten Sie, dass die folgenden Zeichen durch ein '\' entwertet werden muss, wenn sie in Kommandoargumenten verwendet werden: ',', ':', '=', '\'. Das integrierte Kommando "sudoedit" wird verwendet, um es einem Benutzer zu ermöglichen, sudo mit der Option -e (oder als sudoedit) auszuführen. Es kann Kommandozeilenargumente genau wie ein normales Kommando annehmen. Beachten Sie, dass "sudoedit" ein Kommando ist, das in sudo selbst integriert ist und das in sudoers ohne einen führenden Pfad angegeben werden muss.

Wenn einem Kommandonamen ein Präfix Digest_Spec vorangestellt ist, stimmt das Kommando nur erfolgreich überein, wenn es über den angegebenen Digest SHA-2 überprüft werden kann. Dies kann in Situationen nützlich sein, in denen der Benutzer, der sudo aufruft, Schreibzugriff auf das Kommando oder dessen übergeordnetes Verzeichnis hat. Es werden die folgenden Digest-Formate unterstützt: sha224, sha256, sha384 und sha512. Die Zeichenfolge kann entweder im Hexadezimal- oder im base64-Format angegeben werden (base64 ist kompakter).

Es gibt mehrere Hilfsprogramme, die SHA-2-Digests im Hexadezimalformat erzeugen können, zum Beispiel openssl, shasum, sha224sum, sha256sum, sha384sum und sha512sum.

Beispiel unter Verwendung von openssl:

$ openssl dgst -sha224 /bin/ls

SHA224(/bin/ls)= 118187da8364d490b4a7debbf483004e8f3e053ec954309de2c41a25

openssl kann auch verwendet werden, um eine base64-Ausgabe zu erzeugen:

$ openssl dgst -binary -sha224 /bin/ls | openssl base64

EYGH2oNk1JC0p9679IMATo8+BT7JVDCd4sQaJQ==

Standardwerte

Bestimmte Konfigurationsoptionen können zur Laufzeit über eine oder mehrere Zeilen Default_Entry gegenüber ihren Standardwerten geändert werden. Dies kann alle Benutzer auf jedem beliebigen Host, alle Benutzer auf einem bestimmten Host, einen bestimmten Benutzer, ein bestimmtes Kommando oder Kommandos, die als ein bestimmter Benutzer ausgeführt werden, betreffen. Beachten Sie, dass kommandospezifische Einträge keine Kommandozeilenargumente enthalten können. Wenn Sie Argumente angeben möchten, definieren Sie einen Cmnd_Alias und verweisen Sie stattdessen darauf.

Default_Type ::= 'Defaults' |
                 'Defaults' '@' Host_List |
                 'Defaults' ':' User_List |
                 'Defaults' '!' Cmnd_List |
                 'Defaults' '>' Runas_List
Default_Entry ::= Default_Type Parameter_List
Parameter_List ::= Parameter |
                   Parameter ',' Parameter_List
Parameter ::= Parameter '=' Value |
              Parameter '+=' Value |
              Parameter '-=' Value |
              '!'* Parameter

Parameter können Kennzeichen, Ganzzahlwerte, Zeichenfolgen oder Listen sein. Kennzeichen sind implizit boolesch und können über den Operator '!' ausgeschaltet werden. Einige Ganzzahl-, Zeichenfolgen- und Listenparameter können auch in einem booleschen Kontext verwendet werden, um diese zu deaktivieren. Werte können in doppelte Anführungszeichen ("") eingeschlossen werden, wenn sie mehrere Wörter enthalten. Sonderzeichen können durch einen Gegenschrägstrich ('\') entwertet werden.

Listen haben zwei zusätzliche Zuweisungsoperatoren, "+=" und "-=". Diese Operatoren werden zum Hinzufügen zu bzw. Löschen von einer Liste verwendet. Es ist kein Fehler, den Operator "-=" zu verwenden, um ein Element zu entfernen, das nicht in einer Liste vorhanden ist.

Standardeinträge werden in der folgenden Reihenfolge analysiert: zunächst allgemeine, Host- und Benutzerstandards, dann runas-Standards und schließlich Kommandostandards.

Unter „sudoers-Optionen“ finden Sie eine Liste der unterstützten Standardparameter.

Benutzerspezifikation

User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \
              (':' Host_List '=' Cmnd_Spec_List)*
Cmnd_Spec_List ::= Cmnd_Spec |
                   Cmnd_Spec ',' Cmnd_Spec_List
Cmnd_Spec ::= Runas_Spec? Tag_Spec* Cmnd
Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
Tag_Spec ::= ('MAIL:' | 'NOMAIL:' | 'NOPASSWD:' | 'PASSWD:' | 
              'SETENV:' | 'NOSETENV:')

Eine Benutzerspezifikation bestimmt, welche Kommandos ein Benutzer (und als welcher Benutzer) auf angegebenen Hosts ausführen kann.

Standardmäßig werden Kommandos als SYSROOT ausgeführt, aber dies kann kommandospezifisch geändert werden.

Die Basisstruktur einer Benutzerspezifikation ist "wer wo = (als_wer) was". Sehen wir uns hierzu die einzelnen Bestandteile an:

Runas_Spec

Eine Runas_Spec bestimmt den Benutzer und/oder die Gruppe, als der bzw. die das Kommando ausgeführt werden kann. Eine vollständig angegebene Runas_Spec besteht aus zwei Runas_Lists (wie oben definiert), getrennt durch einen Doppelpunkt (':') und in Klammern

eingeschlossen. Die erste Runas_List zeigt an, als welcher Benutzer das Kommando über die Option -u von sudo ausgeführt werden kann. Die zweite definiert eine Liste von Gruppen, die über die Option -g von sudo angegeben werden können. Wenn beide Runas_Lists angegeben sind, kann das Kommando mit jeder beliebigen Kombination von Benutzern und Gruppen, die in ihren jeweiligen Runas_Lists aufgelistet sind, ausgeführt werden. Wenn nur die erste angegeben ist, kann das Kommando als ein beliebiger Benutzer in der Liste ausgeführt werden, aber es kann keine Option -g angegeben werden. Wenn die erste Runas_List leer ist, aber die zweite angegeben ist, kann das Kommando als der aufrufende Benutzer ausgeführt werden, und die Gruppe kann auf jede in der Runas_List aufgelistete Gruppe festgelegt werden. Wenn beide Runas_Lists leer sind, kann das Kommando nur als der aufrufende Benutzer ausgeführt werden. Wenn keine Runas_Spec angegeben ist, kann das Kommando als Administrator ausgeführt werden und es kann keine Gruppe angegeben werden.

Eine Runas_Spec legt den Standard für die ihr nachfolgenden Kommandos fest. Dies wird anhand des folgenden Eintrags verdeutlicht:

dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm

Der Benutzer dgb kann /bin/ls, /bin/kill und /usr/bin/lprm ausführen – aber nur als operator. Beispiel:

$ sudo -u operator /bin/ls

Es ist auch möglich, Runas_Spec später in einem Eintrag außer Kraft zu setzen. Dies wird anhand der folgenden Änderung des Eintrags verdeutlicht:

dgb boulder = (operator) /bin/ls, (sysroot) /bin/kill, /usr/bin/lprm

Der Benutzer dgb kann jetzt /bin/ls als OPERATOR, aber /bin/kill und /usr/bin/lprm als root ausführen.
Dies kann erweitert werden, sodass dgb /bin/ls ausführen kann, wenn entweder der Benutzer oder die Gruppe auf OPERATOR festgelegt ist:

dgb boulder = (operator : operator) /bin/ls, (sysroot) /bin/kill,\

    /usr/bin/lprm

Beachten Sie, dass der Gruppenteil der Runas_Spec es dem Benutzer erlaubt, ein Kommando mit dieser Gruppe auszuführen. Dies wird jedoch nicht erzwungen. Wenn keine Gruppe in der Kommandozeile angegeben ist, wird das Kommando mit der Gruppe ausgeführt, die im Kennwortdatenbankeintrag des Zielbenutzers aufgelistet ist. Alles Folgende wäre mit dem obigen sudoers-Eintrag zulässig:

$ sudo -u operator /bin/ls
$ sudo -u operator -g operator /bin/ls
$ sudo -g operator /bin/ls

Im folgenden Beispiel kann der Benutzer tcm Kommandos ausführen, die auf eine Modemgerätedatei mit der Wählprogrammgruppe zugreifen.

tcm boulder = (:dialer) /usr/bin/tip, /usr/bin/cu,\

    /usr/local/bin/minicom

Beachten Sie, dass in diesem Beispiel nur die Gruppe festgelegt wird. Das Kommando wird weiterhin als Benutzer tcm ausgeführt. Beispiel:

$ sudo -g dialer /usr/bin/cu

Es können mehrere Benutzer und Gruppen in einer Runas_Spec vorhanden sein. In diesem Fall kann der Benutzer jede beliebige Kombination von Benutzern und Gruppen über die Optionen -u und -g auswählen. Im folgenden Beispiel kann der Benutzer "alan" jedes beliebige Kommando als Benutzer SYSROOT oder BIN ausführen, wobei die Gruppe optional auf "operator" oder "system" festgelegt werden kann.

alan ALL = (sysroot, bin : operator, system) ALL

Tag_Spec

Einem Kommando können null oder mehrere Kennzeichen zugeordnet sein. Mögliche Kennzeichen: MAIL, NOMAIL, NOPASSWD, PASSWD, SETENV und NOSETENV. Nachdem ein Kennzeichen auf einen Cmnd festgelegt wurde, erben nachfolgende Cmnds in der Cmnd_Spec_List das Kennzeichen, sofern es nicht vom entgegengesetzten Kennzeichen außer Kraft gesetzt wird (d. h., PASSWD setzt NOPASSWD außer Kraft).

MAIL und NOMAIL

Diese Kennzeichen bieten eine fein abgestufte Kontrolle darüber, ob eine E-Mail gesendet wird, wenn ein Benutzer ein Kommando ausführt, indem der Wert der Option mail_all_cmnds auf kommandospezifischer Basis außer Kraft gesetzt wird. Sie haben keine Auswirkung, wenn sudo mit den Optionen -l oder -v ausgeführt wird. Ein NOMAIL-Kennzeichen setzt auch die Optionen mail_always und mail_no_perms außer Kraft. Weitere Informationen finden Sie in den Beschreibungen von mail_all_cmnds, mail_always und mail_no_perms im Abschnitt „sudoers-Optionen“.

NOPASSWD und PASSWD

Standardmäßig erfordert sudo, dass ein Benutzer sich authentifiziert, bevor er ein Kommando ausführt. Dieses Verhalten kann über das NOPASSWD-Kennzeichen geändert werden. Wie eine Runas_Spec legt das NOPASSWD-Kennzeichen einen Standard für die ihm nachfolgenden Kommandos in der Cmnd_Spec_List fest. Mit dem PASSWD-Kennzeichen können Vorgänge dagegen umgekehrt werden. Beispiel:

ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm

Hierbei kann der Benutzer ray /bin/kill, /bin/ls und /usr/bin/lprm als SYSROOT auf der Maschine rushmore ausführen, ohne sich authentifizieren zu müssen. Wenn ray nur /bin/kill ohne ein Kennwort ausführen können soll, wäre der Eintrag wie folgt:

ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm

Beachten Sie jedoch, dass das PASSWD-Kennzeichen keine Auswirkung auf Benutzer hat, die in der von der Option exempt_group angegebenen Gruppe enthalten sind.

Wenn das NOPASSWD-Kennzeichen auf einen beliebigen Eintrag für einen Benutzer auf dem aktuellen Host angewendet wird, kann dieser standardmäßig "sudo -l" ohne ein Kennwort ausführen. Darüber hinaus kann ein Benutzer nur "sudo -v" ohne ein Kennwort ausführen, wenn das NOPASSWD-Kennzeichen für alle Einträge eines Benutzers vorhanden ist, die zum aktuellen Host gehören. Dieses Verhalten kann über die Optionen verifypw und listpw außer Kraft gesetzt werden.

SETENV und NOSETENV

Diese Kennzeichen setzen den Wert der Option setenv auf kommandospezifischer Basis außer Kraft. Beachten Sie, dass der Benutzer, wenn SETENV für ein Kommando festgelegt wurde, die Option env_reset in der Kommandozeile über die Option -E deaktivieren kann. Darüber hinaus unterliegen Umgebungsvariablen, die in der Kommandozeile festgelegt wurden, nicht den von env_check, env_delete oder env_keep auferlegten Einschränkungen. Deshalb sollten nur vertrauenswürdige Benutzer Variablen auf diese Weise festlegen dürfen. Wenn das passende Kommando ALL ist, wird das SETENV-Kennzeichen für dieses Kommando impliziert. Dieser Standard kann durch die Verwendung des NOSETENV-Kennzeichens außer Kraft gesetzt werden.

Wildcards

sudo erlaubt die Verwendung von Shell-Wildcards in Hostnamen, Pfadnamen und Kommandozeilenargumenten in der Datei sudoers. Die Wildcard-Ersetzung erfolgt über die Funktionen glob und fnmatch gemäß IEEE Std 1003.1 ("POSIX.1"). Beachten Sie, dass dies keine regulären Ausdrücke sind.

*

Stimmt mit einer beliebige Reihe von null oder mehr Zeichen überein.

?

Stimmt mit jedem einzelnen Zeichen überein.

[...]

Stimmt mit jedem beliebige Zeichen im angegebenen Bereich überein.

[!...]

Stimmt mit jedem beliebige Zeichen im angegebenen Bereich überein, das nicht im angegebenen Bereich ist.

\x

Für ein beliebiges Zeichen wird '\x' umgesetzt in 'x'. Dies wird verwendet, um Sonderzeichen zu entwerten, insbesondere die oben genannten Zeichen.

Zeichenklassen können ebenfalls verwendet werden. Da jedoch das Zeichen ':' eine besondere Bedeutung in sudoers hat, muss es entwertet werden. Beispiel:

/bin/ls [[:alpha:]]*

Hierbei würde jeder Dateiname übereinstimmen, der mit einem Buchstaben beginnt.

Beachten Sie, dass ein Schrägstrich ('/') nicht mit im Pfadnamen verwendeten Wildcards übereinstimmt. Hierdurch passt ein Pfad wie der folgende zu /usr/bin/who, nicht jedoch zu /usr/bin/X11/xterm:

/usr/bin/*

Wenn jedoch die Kommandozeilenargumente auf Übereinstimmung geprüft werden, passt ein Schrägstrich zu Wildcards, weil Kommandozeilenargumente beliebige Zeichenfolgen und nicht nur Pfadnamen enthalten können.

Wildcards in Kommandozeilenargumenten sollten mit Vorsicht verwendet werden. Da Kommandozeilenargumente als eine einzelne, verkettete Zeichenfolge geprüft werden, können Wildcards wie '?' oder '*' mit mehreren Wörtern übereinstimmen. Beispiel: Ein sudoers-Eintrag wie:

%operator ALL = /bin/cat /var/log/messages*

erlaubt ein Kommando wie:

$ sudo cat /var/log/messages.1

aber auch:

$ sudo cat /var/log/messages /etc/shadow

was wahrscheinlich nicht beabsichtigt war.

Ausnahmen von Wildcard-Regeln

Die folgenden Ausnahmen gelten für die oben genannten Regeln:

""

Wenn die leere Zeichenfolge "" das einzige Kommandozeilenargument im sudoers-Eintrag ist, bedeutet dies, dass das Kommando nicht mit Argumenten ausgeführt werden darf.

sudoedit

Kommandozeilenargumente für das integrierte Kommando sudoedit sollten immer Pfadnamen sein, sodass ein Schrägstrich ('/') nicht von Wildcards eingeschlossen wird.

Andere Dateien aus sudoers einschließen

Es ist möglich, andere sudoers-Dateien aus der aktuell analysierten sudoers-Datei einzuschließen, indem die Direktiven #include und #includedir verwendet werden.

Dies kann z.B. verwendet werden, um eine standortübergreifende sudoers-Datei zusätzlich zu einer lokalen, computerspezifischen Datei beizubehalten. Für dieses Beispiel ist die standortübergreifende sudoers-Datei /etc/sudoers und die computerspezifische Datei ist /etc/sudoers.local. Um /etc/sudoers.local aus /etc/sudoers einzuschließen, wird die folgende Zeile in /etc/sudoers verwendet:

#include /etc/sudoers.local

Wenn sudo diese Zeile erreicht, setzt es die Verarbeitung der aktuellen Datei (/etc/sudoers) aus und wechselt zu /etc/sudoers.local. Nachdem das Ende von /etc/sudoers.local erreicht wurde, wird der Rest von /etc/sudoers verarbeitet. Dateien, die eingeschlossen werden, können ihrerseits andere Dateien enthalten. Eine harte Grenze von 128 geschachtelten eingeschlossenen Dateien wird erzwungen, um zu verhindern, dass Dateischleifen entstehen.

Wenn der Pfad zu der eingeschlossenen Datei nicht vollqualifiziert ist (nicht mit einem '/' beginnt), muss sich die Datei im selben Verzeichnis wie die sudoers-Datei befinden, aus der sie eingeschlossen wurde. Wenn zum Beispiel /etc/sudoers die folgende Zeile enthält:

#include sudoers.local

ist die Datei, die eingeschlossen wird, /etc/sudoers.local.

Der Dateiname kann auch die Escape-Sequenz %h einschließen, die für die Kurzform des Hostnamens steht. Mit anderen Worten: Wenn der Hostname des Computers "xerxes" ist, bewirkt #include /etc/sudoers.%h, dass sudo die folgende Datei einschließt:

/etc/sudoers.xerxes.

Die Direktive #includedir kann verwendet werden, um ein sudoers.d-Verzeichnis zu erstellen, in das der Paket-Manager des Systems sudoers-Regeln als Teil der Paketinstallation ablegen kann. Beispiel:

#includedir /etc/sudoers.d

In diesem Fall liest sudo jede Datei in /etc/sudoers.d und überspringt dabei Dateinamen, die auf '~' enden oder ein Zeichen '.' enthalten, um zu verhindern, dass Probleme mit dem Paket-Manager oder dem Editor für temporäre/Sicherungsdateien auftreten. Dateien werden in sortierter lexikalischer Reihenfolge analysiert. Dies bedeutet, dass /etc/sudoers.d/01_first vor /etc/sudoers.d/10_second analysiert wird. Bitte beachten: Dadurch, dass die Sortierung lexikalisch ist und nicht numerisch, wird /etc/sudoers.d/1_whoops nach /etc/sudoers.d/10_second geladen. Durch die Verwendung einer festen Anzahl von führenden Nullen in den Dateinamen können diese Probleme vermieden werden.

Bitte beachten: Im Gegensatz zu Dateien, die über #include eingeschlossen wurden, bearbeitet visudo die Dateien in einem #includedir-Verzeichnis nicht, es sei denn, eine der Dateien enthält einen Syntaxfehler. Es ist weiterhin möglich, visudo mit dem Kennzeichen -f auszuführen, um die Dateien direkt zu bearbeiten. Damit wird jedoch nicht die Neudefinition eines Alias erfasst, der auch in einer anderen Datei vorhanden ist.

Andere Sonderzeichen und reservierte Wörter

Das Rautezeichen ('#') wird verwendet, um einen Kommentar anzuzeigen (außer es ist Teil einer #include-Direktive oder außer es tritt im Kontext eines Benutzernamens auf und ist von einem oder mehreren Ziffern gefolgt. In diesem Fall wird es als UID behandelt). Sowohl das Kommentarzeichen als auch Text danach bis zum Ende der Zeile werden ignoriert.

Das reservierte Wort ALL ist ein integrierter Alias, der immer bewirkt, dass eine Prüfung auf Übereinstimmung folgt. Es kann in allen Fällen verwendet werden, in denen andernfalls möglicherweise ein Cmnd_Alias, User_Alias, Runas_Alias oder Host_Alias verwendet wird. Sie sollten nicht versuchen, Ihren eigenen Alias mit der Bezeichnung ALL zu definieren, weil der integrierte Alias vorrangig vor Ihrem eigenen Alias verwendet wird.
Bitte beachten: Die Verwendung von ALL kann gefährlich sein, weil der Benutzer in einem Kommandokontext dadurch jedes beliebige Kommando auf dem System ausführen kann.

Ein Ausrufezeichen ('!') kann als ein logischer Operator "not" in einer Liste oder einem Alias sowie vor einem "Cmnd" verwendet werden. Hierdurch können bestimmte Werte ausgeschlossen werden. Damit der Operator '!' wirksam ist, muss etwas vorhanden sein, das er ausschließen kann. Um zum Beispiel alle Benutzer außer SYSROOT auf Übereinstimmung zu prüfen, könnte Folgendes verwendet werden:

ALL,!sysroot

Wenn ALL weggelassen wird, wie in:

!sysroot

wird SYSROOT explizit verweigert, aber es werden keine anderen Benutzer auf Übereinstimmung geprüft. Dies ist anders als bei einem echten "Negations"-Operator.
Beachten Sie jedoch, dass die Verwendung von '!' in Verbindung mit dem integrierten ALL-Alias, um einem Benutzer die Ausführung von allen, außer einigen bestimmten Kommandos, zu erlauben, selten wie beabsichtigt funktioniert (siehe den Abschnitt „Sicherheitshinweise“).

Lange Zeilen können mit einem Gegenschrägstrich ('\') als dem letzten Zeichen in der Zeile fortgesetzt werden.

Leerzeichen zwischen Elementen in einer Liste sowie spezielle syntaktische Zeichen in einer Benutzerspezifikation

= : ( )

sind optional.

Die folgenden Zeichen müssen durch einen Gegenschrägstrich ('\') entwertet werden, wenn sie als Teil eines Worts (z. B. eines Benutzernamens oder Hostnamens) verwendet werden:

! = : , ( ) \

sudoers-Optionen

Das Verhalten von sudo kann, wie weiter oben erläutert, durch Default_Entry-Zeilen geändert werden. Eine Liste aller unterstützten Standardparameter, gruppiert nach Typ, wird nachfolgend angegeben.

Boolesche Kennzeichen:

always_set_home

Wenn aktiviert, legt sudo die Umgebungsvariable HOME auf das Stammverzeichnis des Zielbenutzers fest (dies ist SYSROOT, sofern nicht die Option -u verwendet wird). Dies bedeutet, dass die Option -H immer impliziert ist. Beachten Sie, dass HOME bereits festgelegt ist, wenn die Option env_reset aktiviert wird. Deshalb ist always_set_home nur in Konfigurationen wirksam, in denen entweder env_reset deaktiviert oder HOME in der Liste env_keep vorhanden ist. Dieses Kennzeichen ist standardmäßig aus.

authenticate

Wenn festgelegt, müssen sich Benutzer über ein Kennwort authentifizieren, bevor sie Kommandos ausführen können. Dieser Standard kann über die Kennzeichen PASSWD und NOPASSWD außer Kraft gesetzt werden. Dieses Kennzeichen ist standardmäßig ein.

closefrom_override

Wenn festgelegt, kann der Benutzer die Option -C verwenden, die den standardmäßigen Ausgangspunkt außer Kraft setzt, an dem sudo beginnt, geöffnete Dateideskriptoren zu schließen. Dieses Kennzeichen ist standardmäßig aus.

env_editor

Wenn festgelegt, verwendet visudo den Wert der Umgebungsvariablen EDITOR oder VISUAL, bevor auf die Standardeditorliste zurückgegriffen wird. Beachten Sie, dass dies eine Sicherheitslücke schaffen kann, weil der Benutzer jedes beliebige Kommando als SYSROOT ausführen kann, ohne sich anzumelden. Eine sicherere Alternative besteht darin, eine durch Doppelpunkte getrennte Liste mit Editoren in die Editor-Variable zu platzieren. visudo verwendet dann EDITOR oder VISUAL nur, wenn sie mit einem im Editor angegebenen Wert übereinstimmen. Dieses Kennzeichen ist standardmäßig aus.

env_reset

Wenn festgelegt, führt sudo das Kommando in einer minimalen Umgebung aus, die die Variablen TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME und SUDO_* enthält. Variablen in der Umgebung des Aufrufers, die mit den Listen env_keep und env_check übereinstimmen, werden dann hinzugefügt, gefolgt von Variablen, die in der Datei vorhanden sind, die von der Option env_file angegeben werden (sofern vorhanden). Der Standardinhalt der Listen env_keep und env_check wird angezeigt, wenn sudo vom Administrator mit der Option -V ausgeführt wird. Wenn die Option secure_path festgelegt ist, wird deren Wert für die PATH-Umgebungsvariable verwendet. Dieses Kennzeichen ist standardmäßig ein.

fast_glob

Normalerweise verwendet sudo die Funktion glob, um die Ersetzung von Pfadnamen mit Wildcards durchzuführen. Da jedoch auf das Dateisystem zugegriffen wird, kann es bei einigen Mustern lange dauern, bis glob abgeschlossen ist, insbesondere, wenn die Pfade auf ein Netzwerkdateisystem verweisen. Die Option fast_glob bewirkt, dass sudo die Funktion fnmatch verwendet, die für ihre Ausführung nicht auf das Dateisystem zugreift. Der Nachteil von fast_glob besteht darin, dass die Funktion keine relativen Pfadnamen wie ./ls oder ../bin/ls kann. Dies hat Sicherheitsauswirkungen, wenn Wildcards mit dem Negationsoperator '!' verwendet werden, weil diese Regeln leicht umgangen werden können. Aus diesem Grund sollte diese Option dann nicht verwendet werden. Dieses Kennzeichen ist standardmäßig aus.

fqdn

Verwenden Sie dieses Kennzeichen, wenn Sie vollqualifizierte Hostnamen in die sudoers-Datei einfügen möchten, wenn der lokale Hostname (wie vom Kommando hostname zurückgegeben) nicht den Domänennamen enthält. Mit anderen Worten würden Sie nicht myhost, sondern myhost.mydomain.edu verwenden. Wenn Sie möchten, können Sie weiterhin die Kurzform verwenden (und sogar beide Formen mischen). Diese Option ist nur wirksam, wenn der "kanonische" Hostname, wie von der Funktion getaddrinfo() oder gethostbyname() zurückgegeben, ein vollqualifizierter Domänenname ist. Dies ist normalerweise der Fall, wenn das System konfiguriert ist, um DNS für die Hostnamenauflösung zu verwenden.

Wenn das System konfiguriert ist, um die Datei /etc/hosts vorrangig vor DNS zu verwenden, ist der "kanonische" Hostname möglicherweise nicht vollqualifiziert. In der Datei /etc/hosts gilt der erste Hostname des Eintrags als der "kanonische" Name. Nachfolgende Namen sind Alias, die nicht von sudoers verwendet werden. Beispiel: Die folgende Hostdateizeile für den Computer "xyzzy" hat den vollqualifizierten Domänennamen als den "kanonische" Hostnamen und die Kurzversion als einen Alias.

192.618.1.1 xyzzy.sudo.ws xyzzy

Wenn der Hostdateieintrag des Computers nicht korrekt formatiert ist, ist die Option fqdn wirksam, wenn sie vor DNS abgefragt wird.

Bitte beachten: Bei der Verwendung von DNS für die Hostnamenauflösung ist es für das Einschalten von fqdn erforderlich, dass sudoers DNS-Suchen durchführt, wodurch sudo nicht mehr verwendet werden kann, wenn DNS nicht mehr funktioniert (zum Beispiel, wenn der Computer vom Netzwerk getrennt wird). Außerdem ist zu beachten, dass ebenso wie bei der Hostdatei der "kanonische" Name zu verwenden ist, wie ihn DNS kennt. Dies bedeutet, dass Sie keinen Hostalias (CNAME-Eintrag) verwenden dürfen, weil zum einen Leistungsprobleme bestehen und es zum anderen nicht möglich ist, alle Alias von DNS abzurufen. Dieses Kennzeichen ist standardmäßig aus.

ignore_dot

Wenn festgelegt, ignoriert sudo "." oder "" (beide zeigen das aktuelle Verzeichnis an) in der PATH-Umgebungsvariable. Der PATH selbst wird nicht geändert. Dieses Kennzeichen ist standardmäßig aus.

insults

Wenn festgelegt, beschimpft sudo Benutzer, wenn sie ein falsches Kennwort eingeben. Dieses Kennzeichen ist standardmäßig aus.

log_host

Wenn festgelegt, wird der Hostname in der sudo-Protokolldatei (nicht syslog) protokolliert. Dieses Kennzeichen ist standardmäßig aus.

log_year

Wenn festgelegt, wird die vierstellige Jahreszahl in der sudo-Protokolldatei (nicht syslog) protokolliert. Dieses Kennzeichen ist standardmäßig aus.

mail_all_cmnds

E-Mail an den mailto-Benutzer senden, immer wenn ein Benutzer versucht, ein Kommando über sudo (einschließlich sudoedit) auszuführen. Keine E-Mail wird gesendet, wenn der Benutzer sudo mit der Option -l oder -v ausführt, es sei denn, es besteht ein Authentifizierungsfehler und es ist auch das Kennzeichen mail_badpass festgelegt. Dieses Kennzeichen ist standardmäßig aus.

mail_always

E-Mail an den mailto-Benutzer senden, immer wenn ein Benutzer sudo ausführt. Dieses Kennzeichen ist standardmäßig aus.

mail_badpass

E-Mail an den mailto-Benutzer senden, wenn der Benutzer, der sudo ausführt, nicht das korrekte Kennwort eingibt. Wenn das Kommando, das der Benutzer auszuführen versucht, von sudoers nicht zugelassen ist und eines der Kennzeichen mail_all_cmnds, mail_always, mail_no_host, mail_no_perms oder mail_no_user festgelegt ist, hat dieses Kennzeichen keine Auswirkung. Dieses Kennzeichen ist standardmäßig aus.

mail_no_host

Wenn festgelegt, wird eine E-Mail an den mailto-Benutzer gesendet, wenn der aufrufende Benutzer in der sudoers-Datei vorhanden ist, aber keine Kommandos auf dem aktuellen Host ausführen darf. Dieses Kennzeichen ist standardmäßig aus.

mail_no_perms

Wenn festgelegt, wird eine E-Mail an den mailto-Benutzer gesendet, wenn der aufrufende Benutzer sudo verwenden darf, aber das Kommando, das versucht wird, nicht in dessen sudoers-Dateieintrag enthalten ist oder explizit verweigert wird. Dieses Kennzeichen ist standardmäßig aus.

mail_no_user

Wenn festgelegt, wird eine E-Mail an den mailto-Benutzer gesendet, wenn der aufrufende Benutzer nicht in der sudoers-Datei vorhanden ist. Dieses Kennzeichen ist standardmäßig ein.

passprompt_override

Die von passprompt angegebene Aufforderung zur Kennworteingabe wird normalerweise nur verwendet, wenn die vom System bereitgestellte Aufforderung zur Kennworteingabe mit der Zeichenfolge "Kennwort:" übereinstimmt. Wenn passprompt_override festgelegt ist, wird passprompt immer verwendet. Dieses Kennzeichen ist standardmäßig aus.

path_info

Normalerweise teilt sudo dem Benutzer mit, wenn ein Kommando nicht in dessen PATH-Umgebungsvariable gefunden wurde. Bei einigen Systemen kann es wünschenswert sein, dieses Kennzeichen zu deaktivieren, weil es dazu verwendet werden kann, Informationen zum Speicherort von ausführbaren Dateien zu erfassen, auf die der normale Benutzer keinen Zugriff hat. Wenn jedoch die ausführbare Datei nicht im PATH des Benutzers ist, besteht der Nachteil darin, dass sudo dem Benutzer mitteilt, dass er nicht zur Ausführung der Datei befugt ist. Dies kann verwirrend sein. Dieses Kennzeichen ist standardmäßig ein.

preserve_groups

Standardmäßig initialisiert sudo den Gruppenvektor für die Liste der Gruppen, in denen sich der Zielbenutzer befindet. Wenn preserve_groups festgelegt ist, bleibt der vorhandene Gruppenvektor des Benutzers unverändert. Die realen und effektiven Gruppen-IDs sind jedoch weiterhin so festgelegt, dass sie mit dem Zielbenutzer übereinstimmen. Dieses Kennzeichen ist standardmäßig aus.

pwfeedback

Standardmäßig liest sudo das Kennwort wie die meisten anderen Unix-Programme, indem Echo ausgeschaltet wird, bis der Benutzer die Eingabetaste drückt. Dies wird von einigen Benutzern als verwirrend wahrgenommen, weil sie glauben, dass sudo an diesem Punkt hängen geblieben ist. Wenn pwfeedback festgelegt ist, stellt sudo ein visuelles Feedback bereit, wenn der Benutzer eine Taste drückt. Beachten Sie, dass dies Auswirkungen auf die Sicherheit hat. Ein Beobachter kann in der Lage sein, die Länge des eingegebenen Kennworts zu ermitteln. Dieses Kennzeichen ist standardmäßig aus.

requiretty

Wenn festgelegt, wird sudo nur ausgeführt, wenn der Benutzer bei einem echten "tty" angemeldet ist. Wenn dieses Kennzeichen festgelegt ist, kann sudo nur aus einer Anmeldesitzung ausgeführt werden, und nicht auf eine andere Weise wie über die Skripte cron oder cgi-bin. Dieses Kennzeichen ist standardmäßig aus.

root_sudo

Wenn festgelegt, kann der Benutzer SYSROOT auch sudo ausführen. Durch das Deaktivieren dieses Kennzeichens wird verhindert, dass Benutzer sudo-Kommandos verketten, um eine Root-Shell z. B. über "sudo sudo /bin/sh" zu erhalten. Beachten Sie jedoch, dass das Ausschalten von root_sudo auch den Administrator daran hindert, sudoedit auszuführen. Die Deaktivierung von root_sudo bietet keine zusätzliche Sicherheit. Diese Möglichkeit besteht rein aus historischen Gründen. Dieses Kennzeichen ist standardmäßig ein.

rootpw

Wenn festgelegt, fordert sudo das Administratorkennwort und nicht das Kennwort des aufrufenden Benutzers an, wenn ein Kommando ausgeführt oder eine Datei bearbeitet wird. Dieses Kennzeichen ist standardmäßig aus.

runaspw

Wenn festgelegt, fordert sudo das Kennwort des Benutzers, der durch die Option runas_default (standardmäßig SYSROOT) definiert ist, und nicht das Kennwort des aufrufenden Benutzers an, wenn ein Kommando ausgeführt oder eine Datei bearbeitet wird. Dieses Kennzeichen ist standardmäßig aus.

set_home

Wenn dieses Kennzeichen aktiviert ist und sudo mit der Option -s aufgerufen wird, wird die HOME-Umgebungsvariable auf das Stammverzeichnis des Zielbenutzers festgelegt (dies ist SYSROOT, sofern nicht die Option -u verwendet wird). Hierdurch wird die Option -s dazu veranlasst, -H zu implizieren. Beachten Sie, dass HOME bereits festgelegt ist, wenn die Option env_reset aktiviert wird. Deshalb ist set_home nur in Konfigurationen wirksam, in denen entweder env_reset deaktiviert oder HOME in der Liste env_keep vorhanden ist. Dieses Kennzeichen ist standardmäßig aus.

set_logname

Normalerweise legt sudo die Umgebungsvariablen LOGNAME, USER und USERNAME auf den Namen des Zielbenutzers fest (normalerweise SYSROOT, sofern nicht die Option -u angegeben ist). Da jedoch einige Programme LOGNAME verwenden, um die echte Identität des Benutzers zu bestimmen, kann es wünschenswert sein, dieses Verhalten zu ändern. Dies kann erreicht werden, indem die Option set_logname negiert wird. Beachten Sie, dass Einträge in der Liste env_keep den Wert von set_logname außer Kraft setzen, wenn die Option env_reset nicht deaktiviert wurde. Dieses Kennzeichen ist standardmäßig ein.

setenv

Dem Benutzer erlauben, die Option env_reset in der Kommandozeile über die Option -E zu deaktivieren. Darüber hinaus unterliegen Umgebungsvariablen, die in der Kommandozeile festgelegt wurden, nicht den von env_check, env_delete oder env_keep auferlegten Einschränkungen. Deshalb sollten nur vertrauenswürdige Benutzer Variablen auf diese Weise festlegen dürfen. Dieses Kennzeichen ist standardmäßig aus.

shell_noargs

Wenn festgelegt und wenn sudo ohne Argumente aufgerufen wird, wirkt dieses Kennzeichen so, als ob die Option -s angegeben worden wäre. Dies bedeutet, es führt eine Shell als SYSROOT aus (die Shell wird von der SHELL-Umgebungsvariablen bestimmt, wenn diese festgelegt ist, wobei andernfalls auf die im Konfigurationseintrag des aufrufenden Benutzers angegebene Shell zurückgegriffen wird). Dieses Kennzeichen ist standardmäßig aus.

stay_setuid

Wenn sudo ein Kommando ausführt, werden normalerweise die reale und effektive UID auf den Zielbenutzer (standardmäßig SYSROOT) festgelegt. Diese Option ändert das Verhalten so, dass die reale UID als die UID des aufrufenden Benutzers beibehalten wird. Mit anderen Worten bewirkt dies, dass sudo wie ein setuid-Wrapper fungiert. Dieses Kennzeichen ist standardmäßig aus.

targetpw

Wenn festgelegt, fordert sudo das Kennwort des Benutzers, der durch die Option -u (standardmäßig SYSROOT) definiert ist, und nicht das Kennwort des aufrufenden Benutzers an, wenn ein Kommando ausgeführt oder eine Datei bearbeitet wird. Dieses Kennzeichen ist standardmäßig aus.

tty_tickets

Wenn festgelegt, müssen sich Benutzer auf tty-spezifischer Basis authentifizieren. Bei einer Aktivierung dieses Kennzeichens verwendet sudo einen separaten Datensatz in dem Zeitstempel für jedes "tty". Wenn dieses Kennzeichen deaktiviert ist, wird ein einziger Datensatz für alle Anmeldesitzungen verwendet. Dieses Kennzeichen ist standardmäßig ein.

umask_override

Wenn festgelegt, legt sudo die "umask" ohne Änderung als von sudoers angegeben fest. Dadurch ist es möglich, in sudoers eine "umask" anzugeben, die weniger streng ist als die eigene "umask" des Benutzers. Dies stimmt mit dem historischen Verhalten überein. Wenn umask_override nicht festgelegt ist, legt sudo die umask als Verbindung der "umask" des Benutzers und der Angabe in sudoers fest. Dieses Kennzeichen ist standardmäßig aus.

utmp_runas

Wenn festgelegt, speichert sudo den Namen des runas-Benutzers, wenn die Datei utmp (oder utmpx) aktualisiert wird. Standardmäßig speichert sudo den Namen des aufrufenden Benutzers. Dieses Kennzeichen ist standardmäßig aus.

visiblepw

Standardmäßig lehnt sudo die Ausführung ab, wenn der Benutzer ein Kennwort eingeben muss, es aber nicht möglich ist, Echo auf dem Terminal zu deaktivieren. Wenn das Kennzeichen visiblepw festgelegt ist, fordert sudo zur Eingabe eines Kennworts auf, selbst wenn es auf dem Bildschirm sichtbar wäre. Dieses Kennzeichen ist standardmäßig aus.

Ganzzahlen:

closefrom

Bevor sudo ein Kommando ausführt, schließt es alle geöffneten Dateideskriptoren, außer der Standard-Eingabe, der Standard-Ausgabe und der Standard-Fehlerausgabe (d. h.: Dateideskriptoren 0-2). Die Option closefrom kann verwendet werden, um einen anderen Dateideskriptor anzugeben, bei dem das Schließen gestartet werden soll. Der Standard ist 3.

passwd_tries

Die Anzahl der Versuche, die ein Benutzer erhält, um sein Kennwort einzugeben, bevor sudo das Fehlschlagen protokolliert und den Vorgang beendet. Der Standard ist 3.

Ganzzahlen, die in einem booleschen Kontext verwendet werden können:

loglinelen

Anzahl der Zeichen pro Zeile für das Dateiprotokoll. Dieser Wert wird verwendet, um zu entscheiden, wann Zeilen umgebrochen werden, um Protokolldateien übersichtlicher zu gestalten. Dies hat keine Auswirkung auf die syslog-Protokolldatei, sondern nur auf das Dateiprotokoll. Die Standardeinstellung ist 80 (verwenden Sie 0 oder negieren Sie die Option, um den Zeilenumbruch zu deaktivieren).

passwd_timeout

Anzahl der Minuten, bevor die Zeit bei der Aufforderung zur Kennworteingabe von sudo überschritten ist, oder 0 für keine Zeitüberschreitung. Die Zeitüberschreitung kann eine Bruchzahlkomponente enthalten, wenn eine Minutengranularität nicht ausreichend ist, z. B. 2,5. Der Standard ist 5.

timestamp_timeout

Anzahl der Minuten, die vergehen können, bevor sudo erneut nach einem Kennwort fragt. Die Zeitüberschreitung kann eine Bruchzahlkomponente enthalten, wenn eine Minutengranularität nicht ausreichend ist, z. B. 2,5. Der Standard ist 5. Legen Sie diesen Wert auf 0 fest, um immer zur Eingabe eines Kennworts aufzufordern. Wenn ein Wert kleiner als 0 festgelegt wird, läuft der Zeitstempel des Benutzers nie ab. Dies kann verwendet werden, um es Benutzern zu ermöglichen, ihre eigenen Zeitstempel über "sudo -v" und "sudo -k" zu erstellen bzw. zu löschen.

umask

"umask" verwenden, wenn das Kommando ausgeführt wird. Negieren Sie diese Option oder legen Sie sie auf "0777" fest, um die "umask" des Benutzers beizubehalten. Die tatsächliche "umask", die verwendet wird, ist die Verbindung der "umask" des Benutzers und des Werts der Option "umask" (standardmäßig "0022"). Auf diese Weise ist gewährleistet, dass sudo die "umask" nie senkt, wenn ein Kommando ausgeführt wird.

Zeichenfolgen:

badpass_message

Nachricht, die angezeigt wird, wenn ein Benutzer ein falsches Kennwort eingibt. Der Standard ist "Sorry, try again", sofern nicht Beschimpfungen aktiviert sind.

editor

Eine durch Doppelpunkte (':') getrennte Liste der Editoren, die mit visudo verwendet werden dürfen. visudo wählt wenn möglich den Editor aus, der mit der Umgebungsvariablen des Benutzers übereinstimmt. Andernfalls wird der erste Editor in der Liste ausgewählt, der vorhanden und ausführbar ist. Der Standard ist vi.

lecture_status_dir

Das Verzeichnis, in dem sudo benutzerspezifische Belehrungsstatusdateien speichert. Sobald ein Benutzer die Belehrung erhalten hat, wird in diesem Verzeichnis eine Datei mit der Länge null erstellt, damit sudo den Benutzer nicht erneut belehrt. Dieses Verzeichnis sollte nicht gelöscht werden, wenn das System neu gestartet wird. Der Standard ist /var/lib/sudo/lectured.

mailsub

Betreff der E-Mail, die an den mailto-Benutzer gesendet wird. Die Escape-Sequenz %h wird auf den Hostnamen des Computers erweitert. Der Standard ist "*** SECURITY-Information für %h ***".

passprompt

Die Standardaufforderung, die verwendet wird, wenn nach einem Kennwort gefragt wird. Dies kann über die Option -p oder die SUDO_PROMPT-Umgebungsvariable außer Kraft gesetzt werden. Die folgenden Escape-Sequenzen mit Prozentzeichen ('%') werden unterstützt:

%H

erweitert auf den lokalen Hostnamen, einschließlich des Domänennamens (nur, wenn der Hostname des Computers vollqualifiziert ist oder wenn die Option fqdn festgelegt ist)

%h

erweitert auf den lokalen Hostnamen ohne den Domänennamen

%p

erweitert auf den Benutzer, dessen Kennwort angefordert wird (berücksichtigt die Kennzeichnungen rootpw, targetpw und runaspw in sudoers)

%U

erweitert auf den Anmeldenamen des Benutzers, als der das Kommando ausgeführt wird (standardmäßig SYSROOT)

%u

erweitert auf den Anmeldenamen des aufrufenden Benutzers

%%

zwei aufeinanderfolgende Zeichen "%" werden zu einem einzigen Zeichen "%" reduziert

Der Standardwert ist "Password:".

runas_default

Der Standardbenutzer, als der Kommandos ausgeführt werden, wenn die Option -u nicht in der Kommandozeile angegeben ist. Dies ist standardmäßig SYSROOT.

syslog_badpri

Syslog-Priorität, die verwendet wird, wenn sich der Benutzer erfolglos authentifiziert. Dies ist standardmäßig eine Warnung. Die folgenden syslog-Prioritäten werden unterstützt: alert, crit, debug, emerg, err, info, notice und warning.

syslog_goodpri

Syslog-Priorität, die verwendet wird, wenn sich der Benutzer erfolgreich authentifiziert. Dies ist standardmäßig ein Hinweis. Siehe syslog_badpri, um die Liste der unterstützten syslog-Prioritäten anzuzeigen.

sudoers_locale

Gebietsschema, das verwendet wird, wenn die sudoers-Datei analysiert wird, Kommandos protokolliert werden und E-Mails gesendet werden. Beachten Sie, dass sich das Ändern des Gebietsschemas darauf auswirken kann, wie sudoers interpretiert wird. Standardmäßig "C".

timestampdir

Das Verzeichnis, in dem sudo seine Zeitstempeldateien speichert. Dieses Verzeichnis sollte gelöscht werden, wenn das System neu gestartet wird. Der Standard ist /var/run/sudo/ts.

timestampowner

Der Besitzer des Belehrungsstatusverzeichnisses, des Zeitstempelverzeichnisses und aller darin gespeicherten Dateien. Der Standard ist SYSROOT.

Zeichenfolgen, die in einem booleschen Kontext verwendet werden können:

env_file

Die Option env_file gibt den vollqualifizierten Pfad zu einer Datei mit Variablen an, die in der Umgebung des ausgeführten Programms festzulegen sind. Einträge in dieser Datei sollten entweder die Form "VARIABLE=Wert" oder "export VARIABLE=Wert" haben. Der Wert kann optional von einfachen oder doppelten Anführungszeichen umgeben sein. Für Variablen in dieser Datei gelten weitere sudo-Umgebungseinstellungen wie env_keep und env_check.

exempt_group

Benutzer in dieser Gruppe sind von Kennwort- und PATH-Anforderungen ausgenommen. Der angegebene Gruppenname sollte kein Präfix "%" enthalten. Dies ist standardmäßig nicht festgelegt.

lecture

Diese Option steuert, wann eine kurze Belehrung zusammen mit der Aufforderung zur Kennworteingabe ausgegeben wird. Es bestehen die folgenden möglichen Werte:

always

Den Benutzer immer belehren.

never

Den Benutzer nie belehren.

once

Den Benutzer nur beim ersten Mal, wenn er sudo ausführt, belehren.

Wenn kein Wert angegeben ist, wird der Wert "once" impliziert. Das Negieren der Option führt zu einem Wert, durch den die Option nie verwendet wird. Der Standardwert ist "once".

lecture_file

Pfad zu einer Datei mit einer alternativen sudo-Belehrung, die anstelle der standardmäßigen Belehrung verwendet wird, wenn die benannte Datei vorhanden ist. Standardmäßig verwendet sudo eine integrierte Belehrung.

listpw

Diese Option steuert, wann ein Kennwort erforderlich ist, wenn ein Benutzer sudo mit der Option -l ausführt. Es bestehen die folgenden möglichen Werte:

all

Für alle sudoers-Einträge des Benutzers für den aktuellen Host muss das Kennzeichen NOPASSWD festgelegt sein, um das Eingeben eines Kennworts zu vermeiden.

always

Der Benutzer muss immer ein Kennwort eingeben, um die Option -l zu verwenden.

any

Für mindestens einen der sudoers-Einträge des Benutzers für den aktuellen Host muss das Kennzeichen NOPASSWD festgelegt sein, um das Eingeben eines Kennworts zu vermeiden.

never

Der Benutzer muss nie ein Kennwort eingeben, um die Option -l zu verwenden. Wenn kein Wert angegeben ist, wird der Wert "any" impliziert. Das Negieren der Option führt zu einem Wert, durch den die Option nie verwendet wird. Der Standardwert ist "any".

logfile

Pfad zu der sudo-Protokolldatei (nicht zu der syslog-Protokolldatei). Wenn ein Pfad festgelegt wird, wird die Protokollierung in eine Datei eingeschaltet. Durch das Negieren dieser Option wird sie ausgeschaltet. Standardmäßig protokolliert sudo über syslog.

mailerflags

Kennzeichen, die verwendet werden, wenn ein Mailer aufgerufen wird. Standardmäßig -t.

mailerpath

Pfad zu dem E-Mail-Programm, das verwendet wird, um eine Warnungs-E-Mail zu senden. Standardmäßig der Pfad zu "sendmail", der zum Zeitpunkt der Konfiguration bestand.

mailfrom

Adresse, die für die "Von"-Adresse verwendet wird, wenn Warnungs- und Fehler-E-Mails gesendet werden. Die Adresse muss in doppelte Anführungszeichen ("") eingeschlossen werden, um zu verhindern, dass sudo das @-Zeichen interpretiert. Standardmäßig ist dies der Name des Benutzers, der sudo ausführt.

mailto

Adresse, an die Warnungs- und Fehler-E-Mails gesendet werden. Die Adresse muss in doppelte Anführungszeichen ("") eingeschlossen werden, um zu verhindern, dass sudo das @-Zeichen interpretiert. Standardmäßig "root".

secure_path

Pfad, der für alle Kommandos verwendet wird, die von sudo ausgeführt werden. Wenn Sie nicht sicher sind, dass die Benutzer, die sudo ausführen, eine "gesunde" PATH-Umgebungsvariable haben, können Sie diesen Pfad verwenden. Ein anderer Verwendungsgrund kann bestehen, wenn Sie den "Root-Pfad" vom "Benutzerpfad" getrennt halten möchten. Benutzer in der von der Option exempt_group angegebenen Gruppe sind von secure_path nicht betroffen. Diese Option ist standardmäßig nicht festgelegt.

syslog

Syslog-Facility, wenn syslog für die Protokollierung verwendet wird (negieren, um die syslog-Protokollierung zu deaktivieren).
Standardmäßig auth.
Die folgenden Syslog-Facilitys werden unterstützt: authpriv, auth, daemon, user, local0, local1, local2, local3, local4, local5, local6 und local7.

verifypw

Diese Option steuert, wann ein Kennwort erforderlich ist, wenn ein Benutzer sudo mit der Option -v ausführt. Es bestehen die folgenden möglichen Werte:

all

Für alle sudoers-Einträge des Benutzers für den aktuellen Host muss das Kennzeichen NOPASSWD festgelegt sein, um das Eingeben eines Kennworts zu vermeiden.

always

Der Benutzer muss immer ein Kennwort eingeben, um die Option -v zu verwenden.

any

Für mindestens einen der sudoers-Einträge des Benutzers für den aktuellen Host muss das Kennzeichen NOPASSWD festgelegt sein, um das Eingeben eines Kennworts zu vermeiden.

never

Der Benutzer muss nie ein Kennwort eingeben, um die Option -v zu verwenden.

Wenn kein Wert angegeben ist, wird der Wert "all" impliziert.
Das Negieren der Option führt zu einem Wert, durch den die Option nie verwendet wird. Der Standardwert ist "all".

Listen, die in einem booleschen Kontext verwendet werden können:

env_check

Umgebungsvariablen, die aus der Umgebung des Benutzers entfernt werden, sofern sie nicht als "sicher" gelten. Für alle Variablen außer TZ bedeutet "sicher", dass der Variablenwert kein Zeichen '%' oder '/' enthält. Dies kann zum Schutz vor Sicherheitsrisiken durch das printf-Format in schlecht geschriebenen Programmen verwendet werden.

Die TZ-Variable gilt als unsicher, wenn eine der folgenden Bedingungen zutrifft:

  • Sie enthält ein Pfadelement "..".

  • Sie enthält Leerzeichen oder nicht druckbare Zeichen.

  • Sie ist länger als der Wert von PATH_MAX.

Das Argument kann eine Liste mit doppelten Anführungszeichen und durch Leerzeichen getrennten Werten oder ein einzelner Wert ohne doppelte Anführungszeichen sein. Die Liste kann über die Operatoren "=", "+=", "-=" und "!" ersetzt, erweitert, gelöscht bzw. deaktiviert werden. Unabhängig davon, ob die Option env_reset aktiviert oder deaktiviert ist, werden durch env_check angegebene Variablen in der Umgebung beibehalten, wenn sie die vorstehende Prüfung bestehen. Die Standardliste der zu überprüfenden Umgebungsvariablen wird angezeigt, wenn sudo vom Administrator mit der Option -V ausgeführt wird.

env_delete

Umgebungsvariablen, die aus der Umgebung des Benutzers entfernt werden, wenn die Option env_reset nicht wirksam ist. Das Argument kann eine Liste mit doppelten Anführungszeichen und durch Leerzeichen getrennten Werten oder ein einzelner Wert ohne doppelte Anführungszeichen sein. Die Liste kann über die Operatoren "=", "+=", "-=" und "!" ersetzt, erweitert, gelöscht bzw. deaktiviert werden. Die Standardliste der zu entfernenden Umgebungsvariablen wird angezeigt, wenn sudo vom Administrator mit der Option -V ausgeführt wird. Beachten Sie, dass viele Betriebssysteme potenziell gefährliche Variablen aus der Umgebung jedes setuid-Prozesses (wie sudo) entfernen.

env_keep

Umgebungsvariablen, die in der Umgebung des Benutzers beibehalten werden, wenn die Option env_reset wirksam ist. Dies ermöglicht eine fein abgestufte Kontrolle über die Umgebung, die von sudo erstellte Prozesse erhalten. Das Argument kann eine Liste mit doppelten Anführungszeichen und durch Leerzeichen getrennten Werten oder ein einzelner Wert ohne doppelte Anführungszeichen sein. Die Liste kann über die Operatoren "=", "+=", "-=" und "!" ersetzt, erweitert, gelöscht bzw. deaktiviert werden. Die Standardliste der beizubehaltenden Umgebungsvariablen wird angezeigt, wenn sudo vom Administrator mit der Option -V ausgeführt wird.

Protokollformat

sudoers kann Ereignisse entweder über syslog oder über eine einfache Protokolldatei protokollieren. In jedem Fall ist das Protokollformat fast identisch.

Akzeptierte Kommandoprotokolleinträge

Von sudo ausgeführte Kommandos werden im folgenden Format protokolliert (zur besseren Lesbarkeit in mehrere Zeilen aufgeteilt):

date hostname progname: username : TTY=ttyname ; PWD=cwd ; \
    USER=runasuser ; GROUP=runasgroup ; TSID=logid ; \
    ENV=env_vars COMMAND=command

Hierbei werden die folgenden Felder verwendet:

date

Das Datum, an dem das Kommando ausgeführt wurde. Normalerweise wird dies im Format "MMM, DD, HH:MM:SS" angegeben. Bei einer Protokollierung über syslog wird das tatsächliche Datumsformat vom syslog-Daemon gesteuert. Wenn in eine Datei protokolliert wird und die Option log_year aktiviert ist, enthält das Datum auch das Jahr.

hostname

Der Name des Hosts, auf dem sudo ausgeführt wurde. Dieses Feld ist nur bei einer Protokollierung über syslog vorhanden.

progname

Der Name des Programms, in der Regel sudo oder sudoedit. Dieses Feld ist nur bei einer Protokollierung über syslog vorhanden.

username

Der Anmeldename des Benutzers, der sudo ausgeführt hat.

ttyname

Der Kurzname des Terminals (z. B. "Konsole", "tty01" oder "pts/0"), auf dem sudo ausgeführt wurde, oder "unbekannt", wenn kein Terminal vorhanden war.

cwd

Das aktuelle Arbeitsverzeichnis, in dem sudo ausgeführt wurde.

runasuser

Der Benutzer, als der das Kommando ausgeführt wurde.

runasgroup

Die Gruppe, als die das Kommando ausgeführt wurde, wenn eine in der Kommandozeile angegeben wurde.

env_vars

Eine Liste mit in der Kommandozeile angegebenen Umgebungsvariablen, sofern angegeben.

command

Das tatsächliche Kommando, das ausgeführt wurde.

Meldungen werden mit dem von sudoers_locale angegebenen Gebietsschema protokolliert (standardmäßig das Gebietsschema "C").

Verweigerte Kommandoprotokolleinträge

Wenn der Benutzer das Kommando nicht ausführen darf, wird der Grund für die Verweigerung nach dem Benutzernamen angegeben. Mögliche Gründe sind unter anderem folgende:

user NOT in sudoers

Der Benutzer ist nicht in der sudoers-Datei angegeben.

user NOT authorized on host

Der Benutzer ist in der sudoers-Datei angegeben, darf aber keine Kommandos auf dem Host ausführen.

command not allowed

Der Benutzer ist in der sudoers-Datei für den Host angegeben, darf aber das angegebene Kommando nicht ausführen.

3 incorrect password attempts

Der Benutzer hat 3 fehlgeschlagene Versuche zur Kennworteingabe unternommen. Die tatsächliche Anzahl der Versuche variiert je nach der Anzahl der fehlgeschlagenen Versuche und dem Wert der Option passwd_tries.

a password is required

Die Option -n wurde angegeben, aber es war ein Kennwort erforderlich.

sorry, you are not allowed to set the following environment variables

Der Benutzer hat Umgebungsvariablen in der Kommandozeile angegeben, die von sudoers nicht zugelassen wurden.

Fehlerprotokolleinträge

Wenn ein Fehler auftritt, protokolliert sudoers eine Meldung und sendet in den meisten Fällen eine E-Mail-Nachricht an den Administrator. Mögliche Fehler sind unter anderem folgende:

parse error in /etc/sudoers near line N

sudoers hat beim Analysieren der angegebenen Datei einen Fehler erkannt. In einigen Fällen kann der tatsächliche Fehler eine Zeile oberhalb oder unterhalb der angegebenen Zeilennummer sein. Dies hängt von der Art des Fehlers ab.

problem with defaults entries

Die sudoers-Datei enthält eine oder mehrere unbekannte Standardeinstellungen. Dies hindert sudo nicht an der Ausführung, aber sudoers sollte unter Verwendung von visudo überprüft werden.

timestamp owner (username): No such user

Der Besitzer des Zeitstempelverzeichnisses gemäß Angabe in der Zeitstempeleinstellung konnte in der Kennwortdatenbank nicht gefunden werden.

unable to open/read /etc/sudoers

Die sudoers-Datei konnte nicht zum Lesen geöffnet werden. Dies kann der Fall sein, wenn sich die sudoers-Datei auf einem Remotedateisystem befindet, das die Benutzer-ID "0" einem anderen Wert zuordnet. sudoers versucht normalerweise, sudoers mit Gruppenberechtigungen zu öffnen, um dieses Problem zu vermeiden. Ziehen Sie eine Änderung des Besitzes von /etc/sudoers in Betracht.

unable to stat /etc/sudoers

Die Datei /etc/sudoers fehlt.

/etc/sudoers is not a regular file

Die Datei /etc/sudoers ist vorhanden, sie ist jedoch keine reguläre Datei oder symbolische Verknüpfung.

/etc/sudoers is owned by uid N, should be 0

Die sudoers-Datei hat den falschen Besitzer.

/etc/sudoers is world writable

Die Berechtigungen bei der sudoers-Datei erlauben es allen Benutzern, darauf zu schreiben. Die sudoers-Datei darf nicht "worldwritable" sein. Der Standarddateimodus ist "0440" (lesbar von Besitzer und Gruppe, beschreibbar von niemandem).

unable to open /var/run/sudo/ts/username

sudoers konnte die Zeitstempeldatei des Benutzers nicht lesen oder erstellen. Dies kann der Fall sein, wenn der Zeitstempelbesitzer auf einen anderen Benutzer als den Administrator festgelegt und der Modus bei /var/run/sudo nicht von der Gruppe oder anderen durchsuchbar ist. Der Standardmodus für /var/run/sudo ist "0711".

unable to write to /var/run/sudo/ts/username

sudoers konnte nicht in die Zeitstempeldatei des Benutzers schreiben.

/var/run/sudo/ts is owned by uid X, should be Y

Das Zeitstempelverzeichnis ist im Besitz eines anderen Benutzers als des Zeitstempelbesitzers. Dies kann der Fall sein, wenn der Wert des Zeitstempelbesitzers geändert wurde. sudoers ignoriert das Zeitstempelverzeichnis, bis der Besitzer korrigiert wurde.

/var/run/sudo/ts is group writable

Das Zeitstempelverzeichnis ist von der Gruppe beschreibbar. Es sollte jedoch nur vom Zeitstempelbesitzer beschreibbar sein. Der Standardmodus für das Zeitstempelverzeichnis ist "0700". sudoers ignoriert das Zeitstempelverzeichnis, bis der Modus korrigiert wurde.

Hinweise zur Protokollierung über syslog

Standardmäßig protokolliert sudoers Meldungen über syslog. Die Felder "date" und "progname" werden vom syslog-Daemon hinzugefügt, nicht von sudoers selbst. Deshalb kann ihr Format je nach System variieren.

Auf den meisten Systemen hat syslog einen relativ kleinen Protokollpuffer. Um zu verhindern, dass die Kommandozeilenargumente abgeschnitten werden, teilt sudoers Protokollmeldungen, die größer als 960 Zeichen sind, auf (ohne das Datum und die Zeichenfolge "sudo"). Wenn eine Meldung aufgeteilt wird, enthalten zusätzliche Teile die Zeichenfolge "(command continued)" nach dem Benutzernamen und vor den fortgesetzten Kommandozeilenargumenten.

Hinweise zur Protokollierung in eine Datei

Wenn die Option logfile festgelegt ist, protokolliert sudoers in eine lokale Datei wie /var/log/sudo. Bei der Protokollierung in eine Datei verwendet sudoers ein ähnliches Format wie syslog, wobei jedoch einige wichtige Unterschiede bestehen:

  1. Das Feld "progname" ist nicht vorhanden.

  2. Wenn die Option log_year aktiviert ist, enthält das Datum auch das Jahr.

  3. Zeilen, die länger als die loglinelen-Zeichen sind (standardmäßig 80), werden umgebrochen und in der nächsten Zeile mit einem Einzug von vier Zeichen fortgesetzt. Dadurch können Einträge von Menschen leichter gelesen werden. Es ist dagegen schwieriger, grep bei den Protokolldateien zu verwenden. Wenn die loglinelen-Option auf "0" festgelegt (oder mit einem '!' negiert) ist, wird der Zeilenumbruch deaktiviert.

Datei

/etc/sudoers

Liste mit Angaben dazu, wer was ausführen kann

/var/run/sudo/ts

Verzeichnis mit Zeitstempeln für die sudoers-Sicherheitsrichtlinie

/var/lib/sudo/lectured

Verzeichnis mit Belehrungsstatusdateien für die sudoers-Sicherheitsrichtlinie

Beispiel

Im Folgenden sind beispielhafte sudoers-Einträge angegeben. Einige davon wirken zugegebenermaßen etwas konstruiert. Zunächst werden einige Umgebungsvariablen zugelassen, und dann die Aliase definiert:

# Run X applications through sudo; HOME is used to find the
# .Xauthority file. Note that other programs use HOME to find
# configuration files and this may lead to privilege escalation!
Defaults env_keep += "DISPLAY HOME"
# User alias specification
User_Alias      FULLTIMERS = millert, mikef, dowdy
User_Alias      PARTTIMERS = bostley, jwfox, crawl
User_Alias      WEBMASTERS = will, wendy, wim
# Runas alias specification
Runas_Alias     OP = sysroot, operator
Runas_Alias     DB = oracle, sybase
Runas_Alias     ADMINGRP = adm, oper
# Host alias specification
Host_Alias      SPARC = bigtime, eclipse, moet, anchor :\
                SGI = grolsch, dandelion, black :\
                ALPHA = widget, thalamus, foobar :\
                HPPA = boa, nag, python
Host_Alias      CUNETS = 128.138.0.0/255.255.0.0
Host_Alias      CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
Host_Alias      SERVERS = master, mail, www, ns
Host_Alias      CDROM = orion, perseus, hercules
# Cmnd alias specification
Cmnd_Alias      DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\
                        /usr/sbin/restore, /usr/sbin/rrestore,\
                        sha224:0GomF8mNN3wlDt1HD9XldjJ3SNgpFdbjO1+NsQ== \
                        /home/operator/bin/start_backups
Cmnd_Alias      KILL = /usr/bin/kill
Cmnd_Alias      PRINTING = /usr/sbin/lpc, /usr/bin/lprm
Cmnd_Alias      SHUTDOWN = /usr/sbin/shutdown
Cmnd_Alias      HALT = /usr/sbin/halt
Cmnd_Alias      REBOOT = /usr/sbin/reboot
Cmnd_Alias      SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh,\
                         /usr/local/bin/tcsh, /usr/bin/rsh,\
                         /usr/local/bin/zsh
Cmnd_Alias      SU = /usr/bin/su

Hier werden einige der kompilierten Standardwerte außer Kraft gesetzt. sudo soll in allen Fällen über syslog unter Verwendung der auth-Facility protokollieren. Die Vollzeitmitarbeiter sollen keine sudo-Belehrung erhalten, der Benutzer millert muss kein Kennwort eingeben und die Umgebungsvariablen LOGNAME, USER oder USERNAME sollen nicht zurückgesetzt werden, wenn Kommandos als SYSROOT ausgeführt werden. Darüber hinaus soll auf den Computern in SERVERS Host_Alias eine zusätzliche lokale Protokolldatei geführt und in jeder Protokollzeile das Jahr protokolliert werden, damit die Protokolleinträge für mehrere Jahre beibehalten werden können.

# Override built-in defaults
Defaults             syslog=auth
Defaults>sysroot     !set_logname
Defaults:FULLTIMERS  !lecture
Defaults:millert     !authenticate
Defaults@SERVERS     log_year, logfile=/var/log/sudo.log

Die Benutzerspezifikation ist der Teil, der tatsächlich bestimmt, wer was ausführen darf.


sysroot   ALL = (ALL) ALL

%wheel    ALL = (ALL) ALL

SYSROOT und alle Benutzer in der Gruppe wheel sollen alle Kommandos auf jedem Host als beliebiger Benutzer ausführen können.


FULLTIMERS ALL = NOPASSWD: ALL

Vollzeitsystemadministratoren (millert, mikef und dowdy) können alle Kommandos auf jedem Host ausführen, ohne sich zu authentifizieren.


PARTTIMERS ALL = ALL

Teilzeitsystemadministratoren (bostley, jwfox und crawl) können alle Kommandos auf jedem Host ausführen, aber sie müssen sich zuerst authentifizieren (weil dem Eintrag das Kennzeichen NOPASSWD fehlt).


jack CSNETS = ALL

Der Benutzer jack kann alle Kommandos auf den Computern in dem Alias CSNETS (Netzwerke 128.138.243.0, 128.138.204.0 und 128.138.242.0) ausführen. Von diesen Netzwerken hat nur 128.138.204.0 eine explizite Netzmaske (in der Notation CIDR), die anzeigt, dass es sich um ein Klasse-C-Netzwerk handelt. Für die anderen Netzwerke in CSNETS wird die Netzmaske der lokalen Maschine beim Vergleich verwendet.


lisa CUNETS = ALL

Die Benutzerin lisa kann alle Kommandos auf jedem Host im Alias CUNETS (Klasse-B-Netzwerk 128.138.0.0) ausführen.


operator  ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\

          sudoedit /etc/printcap, /usr/oper/bin/

Der Benutzer OPERATOR kann Kommandos ausführen, die auf eine einfache Wartung beschränkt sind. Dies sind Kommandos im Zusammenhang mit Sicherungen, dem Beenden von Prozessen, dem Drucksystem und dem Herunterfahren des Systems sowie alle Kommandos im Verzeichnis /usr/oper/bin/. Beachten Sie, dass ein Kommando im DUMPS Cmnd_Alias ein Digest "sha224" enthält (/home/operator/bin/start_backups). Dies ist der Fall, weil das Verzeichnis mit dem Skript vom Benutzer "operator" beschreibbar ist. Wenn das Skript geändert wird (was zu einer Digest-Abweichung führt), kann es nicht mehr über sudo ausgeführt werden.


joe ALL = /usr/bin/su operator

Der Benutzer joe darf nur das Kommando su für den operator ausführen.


pete      HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd sysroot

%opers    ALL = (: ADMINGRP) /usr/sbin/

Benutzer in der Gruppe opers können Kommandos in /usr/sbin/ als sie selbst mit jeder Gruppe im ADMINGRP Runas_Alias (den Gruppen adm und oper) ausführen.

Der Benutzer pete kann das Kennwort von allen Benutzern, außer von SYSROOT, auf den HPPA-Computern ändern. Beachten Sie, dass hierbei davon ausgegangen wird, dass "passwd" nicht mehrere Benutzernamen in der Kommandozeile annimmt.


bob SPARC = (OP) ALL : SGI = (OP) ALL

Der Benutzer bob kann alles auf den Computern SPARC und SGI als jeder Benutzer ausführen, der im OP Runas_Alias (SYSROOT und OPERATOR) angegeben ist.


fred ALL = (DB) NOPASSWD: ALL

Der Benutzer fred kann Kommandos als jeder Benutzer im DB Runas_Alias (Oracle oder Sybase) ausführen, ohne ein Kennwort anzugeben.


john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*

Auf den ALPHA-Computern kann der Benutzer john das Kommando su für alle, außer SYSROOT, ausführen, aber er kann keine Optionen für das Kommando su angeben.


jen ALL, !SERVERS = ALL

Der Benutzer jen kann alle Kommandos auf allen Computern, außer denen im SERVERS Host_Alias (master, mail, www und ns) ausführen.


jill SERVERS = /usr/bin/, !SU, !SHELLS

Für alle Computer im SERVERS Host_Alias kann jill alle Kommandos im Verzeichnis /usr/bin/, außer den Kommandos, die zu den SU und SHELLS Cmnd_Aliases gehören, ausführen.


steve CSNETS = (operator) /usr/local/op_commands/

Der Benutzer steve kann alle Kommandos im Verzeichnis /usr/local/op_commands/ ausführen, aber nur als Benutzer operator.


matt valkyrie = KILL

Auf seiner persönlichen Arbeitsstation valkyrie muss matt in der Lage sein, hängende Prozesse zu beenden.


WEBMASTERS www = (www) ALL, (sysroot) /usr/bin/su www

Auf dem Host www kann jeder Benutzer im WEBMASTERS User_Alias (will, wendy und wim) alle Kommandos als Benutzer www (Besitzer der Webseiten) ausführen oder einfach su auf www ausführen.


ALL       CDROM = NOPASSWD: /sbin/umount /CDROM,\

          /sbin/mount -o nosuidnodev /dev/cd0a /CDROM

Jeder Benutzer kann eine CD-ROM auf den Computern im CDROM Host_Alias (orion, perseus, hercules) einlegen oder entnehmen, ohne ein Kennwort einzugeben. Dies ist für Benutzer ein bisschen mühsam einzugeben und stellt damit einen Hauptkandidaten für eine Kapselung in einem Shell-Skript dar.

Sicherheitshinweise

Einschränkungen beim Operator '!'

Es ist in der Regel nicht effektiv, Kommandos mit dem Operator '!' von ALL "zu entziehen". Ein Benutzer kann dies ganz einfach umgehen, indem er das gewünschte Kommando auf einen anderen Namen kopiert und dann ausführt. Beispiel:

bill ALL = ALL, !SU, !SHELLS

Dies hindert "bill" nicht wirklich daran, die in SU oder SHELLS angegebenen Kommandos auszuführen, weil er diese Kommandos einfach auf einen anderen Namen kopieren oder eine Shell verwenden kann, um einen Editor oder ein anderes Programm zu beenden. Diese Art von Einschränkungen sollte deshalb bestenfalls als Warnung betrachtet (und durch Richtlinien verstärkt) werden.

Im Allgemeinen gilt: Wenn für einen Benutzer sudo ALL festgelegt ist, kann er ungehindert ein eigenes Programm erstellen, durch das er eine Root-Shell erhält (oder er kann eine eigene Kopie einer Shell erstellen), egal ob in der Benutzerspezifikation '!'-Elemente enthalten sind.

Sicherheitsauswirkungen von fast_glob

Wenn die Option fast_glob verwendet wird, können Kommandos nicht zuverlässig negiert werden, wenn der Pfadname Wildcards enthält. Dies ist der Fall, weil die C-Bibliotheksfunktion fnmatch keine relativen Pfade auflösen kann. Dies ist normalerweise nur ein Nachteil bei Regeln, die Rechte erteilen, aber es kann zu einem Sicherheitsproblem für Regeln werden, die Rechte entziehen oder widerrufen.

Beispiel anhand des folgenden sudoers-Eintrags:

john      ALL = /usr/bin/passwd [a-zA-Z0-9]*, /usr/bin/chsh [a-zA-Z0-9]*,\
          /usr/bin/chfn [a-zA-Z0-9]*, !/usr/bin/* sysroot

Der Benutzer john kann /usr/bin/passwd sysroot weiterhin ausführen, wenn fast_glob aktiviert ist, indem er zu /usr/bin wechselt und stattdessen ./passwd sysroot ausführt.

Shell-Escapes vermeiden

Sobald sudo ein Programm ausführt, kann dieses Programm tun, was es möchte. Hierzu zählt auch das Ausführen anderer Programme. Dies kann ein Sicherheitsproblem darstellen, weil es für ein Programm nicht ungewöhnlich ist, Shell-Escapes zu erlauben, mit denen ein Benutzer die Zugriffssteuerung und Protokollierung von sudo umgehen kann. Gängige Programme, die Shell-Escapes erlauben, sind unter anderem Shells (offensichtlich), Editoren, Paginatoren sowie E-Mail- und Terminal-Programme.

Basisansatz für dieses Problem:

Einschränken

Vermeiden Sie es, Benutzern Zugriff auf Kommandos zu erteilen, mit denen beliebige Kommandos ausgeführt werden können. Viele Editoren haben einen eingeschränkten Modus, in dem Shell-Escapes deaktiviert sind, aber sudoedit ist eine bessere Lösung, um Editoren über sudo auszuführen. Aufgrund der großen Anzahl von Programmen, die Shell-Escapes anbieten, ist es oft nicht praktikabel, Benutzer auf die Programme einzuschränken, bei denen dies nicht der Fall ist.

Beachten Sie, dass die Einschränkung von Shell-Escapes kein Allheilmittel ist. Programme, die als Administrator ausgeführt werden, sind weiterhin zu vielen potenziell gefährlichen Operationen (wie dem Ändern oder Überschreiben von Dateien) in der Lage, die zu einer unbeabsichtigten Rechteeskalation führen können. Im spezifischen Fall eines Editors besteht ein sichererer Ansatz darin, den Benutzer zum Ausführen von sudoedit zu berechtigen (siehe weiter unten).

Sichere Bearbeitung

Zur Richtlinie sudoers gehört sudoedit-Unterstützung, die es Benutzern erlaubt, Dateien mit dem Editor ihrer Wahl sicher zu bearbeiten. Da sudoedit ein integriertes Kommando ist, muss es in sudoers ohne einen führenden Pfad angegeben werden. Es kann jedoch Kommandozeilenargumente genau wie ein normales Kommando annehmen. Um es zum Beispiel dem Benutzer operator zu erlauben, die Datei "message of the day" zu bearbeiten, kann Folgendes verwendet werden:

operator sudoedit /etc/motd

Der Benutzer operator führt dann sudoedit wie folgt aus:

$ sudoedit /etc/motd

Der Editor wird als der Benutzer OPERATOR, nicht als SYSROOT, auf einer temporären Kopie von /etc/motd ausgeführt. Nach der Bearbeitung der Datei wird /etc/motd mit dem Inhalt der temporären Kopie aktualisiert.

Siehe auch

sudo, visudo

Vorsichtsmaßnahmen

Die sudoers-Datei sollte immer von dem visudo-Kommando bearbeitet werden, das die Datei sperrt und die Grammatik überprüft. Es ist unerlässlich, dass sudoers frei von Syntaxfehlern ist, weil sudo mit einer syntaktisch falschen sudoers-Datei nicht ausgeführt werden kann.