Sudo gentoo

Aus xinux.net
Zur Navigation springen Zur Suche springen

Gentoo Sudo(ers) Anleitung

Rechte vergeben

Das Paket sudo erlaubt es dem Admininstrator anderen Benutzern Rechte auf eine oder mehrere Anwendungen zu vergeben, auf die sie normalerweise keine Rechte hätten. Anstatt das setuid Bit für diese Anwendungen zu setzen, bietet sudo eine präzise Kontrolle darüber wer wann einen bestimmten Befehl ausführen darf.

Mit sudo kann man eine klare Liste erstellen, wer eine bestimmte Anwendung ausführen darf. Würde man das setuid Bit setzen, könnte jeder Benutzer die jeweilige Anwendung starten (bzw. jeder Benutzer einer bestimmten Gruppe, je nach dem welche Berechtigungen vergeben wurden). Sie können (und sollten sogar) vom Benutzer die Eingabe eines Passworts verlangen, wenn er eine Anwendung ausführen will und Sie können die Berechtigungen anhand des Standorts an dem sich der Benutzer befindet genau festlegen: ob er direkt am System angemeldet ist oder über SSH von einem entfernten Rechner.

Aktivitäten protokollieren

Ein weiterer Vorteil von sudo ist, dass jeder Versuch (erfolgreich oder nicht) eine Anwendung auszuführen, protokolliert werden kann. Das kann sehr hilfreich sein, wenn man denjenigen finden will, der für diesen fatalen Fehler verantwortlich ist, für dessen Beseitigung man 10 Stunden gebraucht hat :)

Sudo konfigurieren

Die sudo Konfiguration wird in /etc/sudoers verwaltet. Diese Datei sollte man nie mit nano /etc/sudoers, vim /etc/sudoers oder irgendeinem anderen Editor bearbeiten. Wenn Sie diese Datei verändern wollen, sollte Sie immer visudo verwenden.

Dieses Werkzeug stellt sicher, dass diese Datei niemals von zwei Systemadministratoren gleichzeitig bearbeitet wird, es erhält die Rechte der Datei und überprüft die Syntax der Einstellungen um schwerwiegende Fehler zu verhindern.

Über diese Anleitung

Diese Anleitung ist als kurze Einführung gedacht. Das sudo Paket ist wesentlich mächtiger als das, was hier beschrieben wird. So gibt es spezielle Funktionen zum Bearbeiten von Dateien als anderer Benutzer (sudoedit), zum Einsatz innerhalb von Skripten (es läuft dann im Hintergrund und liest das Passwort von der Standardeingabe anstatt von der Tastatur, ...) usw.

  • Bitte lesen Sie die sudo und sudoers manual Seiten für weitere Informatione

Sudoers Syntax

Grundlegende Syntax

Der schwierigste Teil von sudo ist die Syntax in /etc/sudoers. Die grundlegende Syntax lautet in etwa so:

Befehlsauflistung 2.1: Grundlegende Syntax in /etc/sudoers

user  host = commands

Diese Zeile teilt sudo mit, dass der Benutzer, festgelegt durch user, von host aus eingeloggt, die Befehle die in commands aufgelistet sind als root ausführen darf. Ein praxisnäheres Beispiel macht es vielleicht verständlicher: Erlaube dem Benutzer swift das Ausführen von emerge wenn er lokal (nicht über SSH) eingeloggt ist:

Befehlsauflistung 2.2: Praktisches Beispiel für /etc/sudoers

swift  localhost = /usr/bin/emerge

Eine große Warnung ist allerdings angebracht: Erlauben Sie keinem Benutzer eine Anwendung auszuführen, die dazu genutzt werden kann weitere Zugriffsrechte zu erlangen. Zum Beispiel können Benutzer durch emerge Rootzugriff aufs gesamte System erlangen, da emerge so manipuliert werden kann, dass der Benutzer beliebige Dateien zu seinem Vorteil verändern kann. Wenn Sie Ihren sudo Benutzern nicht vertrauen dann gewähren Sie ihnen keine Rechte.

Der Name des Benutzers kann auch durch einen Gruppennamen ersetzt werden. In dem Fall muss dem Gruppennamen ein % vorangestellt werden. Zum Beispiel jeden in der Gruppe wheel dazu berechtigen emerge zu starten:

Befehlsauflistung 2.3: Der wheel-Gruppe das Ausführen von emerge erlauben

%wheel  localhost = /usr/bin/emerge

Anstatt für jedes Programm eine einzelne Zeile anzulegen, können die Einträge auch erweitert werden. Zum Beispiel um dem Benutzer zu erlauben nicht nur emerge sondern auch ebuild und emerge-webrsync als root zu starten:

Befehlsauflistung: Mehrere Befehle

swift  localhost = /usr/bin/emerge, /usr/bin/ebuild, /usr/sbin/emerge-webrsync

Es ist auch möglich einen präzisen Befehl und nicht nur den Pfad zum Programm selbst anzugeben. Dies kann dazu verwendet werden, um die Benutzung einer Anwendung auf einen Satz von vorgeschriebenen Befehlsoptionen zu begrenzen. Das Programm sudo erlaubt die Verwendung von Wildcards im Shell-Stil (auch bekannt als Meta- oder Glob-Zeichen) für Pfadnamen, sowie auch Befehlszeilenargumente in der sudoers-Datei. Beachten Sie bitte, dass dies nicht reguläre Ausdrücke sind.

Lassen Sie uns das testen:

Befehlsauflistung: Versuch das System mit sudo zu updaten

$ sudo emerge -uDN world

We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things:

   #1) Respect the privacy of others.
   #2) Think before you type.
   #3) With great power comes great responsibility.

Password: (Das Benutzerpasswort eingeben, nicht Root!)

sudo verlangt das Passwort des Benutzers. Damit wird sichergestellt, dass kein versehentlich offen gelassenes Terminal für bösartige Zwecke missbraucht wird.

Sie sollten wissen, dass sudo die ${PATH} Variable nicht verändert: Jeder Befehl den Sie nach sudo eingeben, geht von Ihrer Umgebung aus. Will ein Benutzer zum Beispiel ein Programm in /sbin ausführen, so muss er sudo den vollständigen Pfad übergeben, etwa so:

Befehlsauflistung 2.6: Den vollständigen Pfad zu einem Programm angeben

$ sudo /usr/sbin/emerge-webrsync

Aliase verwenden

In größeren Umgebungen kann es eine ermüdende Aufgabe sein alle Benutzer (oder Hosts oder Befehle) immer und immer wieder einzugeben. Um die Administration von /etc/sudoers zu vereinfachen können Sie Aliase definieren. Das Format um Aliase festzulegen ist ziemlich einfach:

Befehlsauflistung : Aliase in /etc/sudoers definieren

Host_Alias hostalias = hostname1, hostname2, ...
User_Alias useralias = user1, user2, ...
Cmnd_Alias cmndalias = command1, command2, ...

Ein Alias der immer und an jeder Stelle funktioniert, ist der ALL Alias (Um Aliase von Nicht-Aliasen deutlich zu unterscheiden, wird empfohlen Aliase in großen Buchstaben zu schreiben). Wie Sie sich vielleicht denken können, ist ALL ein Alias für alle möglichen Einstellungen.

Ein Anwendungsbeispiel des ALL Alias, dass jedem lokal angemeldetem Benutzer erlaubt shutdown auszuführen:

Befehlsauflistung: Jedem Benutzer erlauben shutdown auszuführen

ALL  localhost = /sbin/shutdown

Ein weiteres Beispiel ist dem Benutzer swift zu erlauben emerge als root auszuführen, egal von wo aus er angemeldet ist:

Befehlsauflistung 2.9: Einem Benutzer ortsunabhängig erlauben eine Anwendung auszuführen

swift   ALL = /usr/bin/emerge

Interessanter ist es eine Liste von Benutzern festzulegen, die Anwendungen zur Softwareverwaltung (wie emerge und ebuild) auf dem System ausführen dürfen und eine Gruppe von Administratoren, die die Passwörter aller Benutzer (root ausgenommen) ändern dürfen.

Befehlsauflistung : Aliase für Benutzer und Befehle

User_Alias  SOFTWAREMAINTAINERS = swift, john, danny
User_Alias  PASSWORDMAINTAINERS = swift, sysop
Cmnd_Alias  SOFTWARECOMMANDS    = /usr/bin/emerge, /usr/bin/ebuild
Cmnd_Alias  PASSWORDCOMMANDS    = /usr/bin/passwd [a-zA-Z0-9_-]*, !/usr/bin/passwd root
SOFTWAREMAINTAINERS  localhost = SOFTWARECOMMANDS
PASSWORDMAINTAINERS  localhost = PASSWORDCOMMANDS

Ausführen als anderer Benutzer (nicht root)

Es ist auch möglich einen Benutzer eine Anwendung als ein anderer Benutzer (nicht root) auszuführen zu lassen. Das kann interessant sein, wenn man Dienste als anderer Benutzer ausführt (wie apache für den Webserver) und man bestimmten Benutzern erlauben will administrative Aufgaben als dieser Benutzer auszuführen (wie das Killen von Zombieprozessen).

In /etc/sudoers listen Sie die Benutzer zwischen ( und ) vor der Auflistung der Befehle auf:

Befehlsauflistung 2.11: Syntax zum Ausführen als anderer Benutzer

users  hosts = (run-as) commands

Um beispielsweise swift zu erlauben das Programm kill als Benutzer apache oder gorg auszuführen:

Befehlsauflistung 2.12: Beispiel für Ausführung als anderer Benutzter

Cmnd_Alias KILL = /bin/kill, /usr/bin/pkill
swift   ALL = (apache, gorg) KILL

Mit diesen Einstellungen kann der Benutzer sudo -u aufrufen um den Benutzer auszuwählen als der er die Anwendung ausführen will:

Befehlsauflistung 2.13: Starten von pkill als apache-Benutzer

$ sudo -u apache pkill apache

Mit der Runas_Alias Direktive können Sie für die Benutzer, unter deren Namen die Anwendung ausgeführt werden soll, ebenfalls Aliase anlegen. Die Benutzung ist identisch zu den anderen _Alias Direktiven, die wir vorher behandelt haben.

Passwörter und Standardeinstellungen

Standardmäßig fordert sudo den Benutzer auf sich mit seinem eigenen Passwort zu identifizieren. Ist das Passwort einmal eingegeben, merkt sudo es sich für 5 Minuten um den Benutzer nicht durch andauernde Passwortabfragen von der Arbeit abzuhalten.

Natürlich kann dieses Verhalten geändert werden: Sie können die Defaults: Direktive in /etc/sudoers setzen, um das Verhalten für die einzelnen Benutzer zu ändern.

Um zum Beispiel die standardmäßigen 5 Minuten auf 0 (nicht merken) zu verändern:

Befehlsauflistung 2.14: Den Wert für das Timeout ändern

Defaults:swift timestamp_timeout=0

Mit der Einstellung -1 wird das Passwort unendlich lange gemerkt (bis das System neu gestartet wird).

Durch eine weitere Einstellung, kann vom Benutzer anstelle des eigenen Passworts, das des Benutzers unter dessen Namen der Befehl ausgeführt werden soll, verlangt werden. Dies wird mit runaspw erreicht. Im folgenden Beispiel wird außerdem die Anzahl der Versuche für die Passworteingabe (wie oft ein Benutzer das Passwort erneut eingeben kann, bevor sudo abbricht) auf 2 statt der normalen 3 gesetzt.

Befehlsauflistung 2.15: Verlangen des root-Passworts anstelle des Benutzerpassworts

Defaults:john runaspw, passwd_tries=2

Ein anderes interessantes Feature ist das Beibehalten der DISPLAY Variable, so dass man grafische Programme ausführen kann:

Befehlsauflistung 2.16: Die DISPLAY-Variable erhalten

Defaults:john env_keep=DISPLAY

Sie können etliche Standardeinstellungen über die Defaults: Direktive ändern. Lesen Sie dazu die sudo Manual-Seiten und suchen nach Defaults.

Wenn Sie einem Benutzer das Ausführen von Befehlen ohne vorherige Passworteingabe erlauben wollen, ist NOPASSWD: erforderlich:

Befehlsauflistung 2.17: emerge als root erlauben, ohne dass nach einem Passwort gefragt wird

swift     localhost = NOPASSWD: /usr/bin/emerge

3. Sudo benutzen

Berechtigungen anzeigen

Um sich von seinen eigenen Möglichkeiten ein Bild zu machen, verwendet man sudo -l:

Befehlsauflistung 3.1: Möglichkeiten anzeigen

$ sudo -l
User swift may run the following commands on this host:
    (root)   /usr/libexec/xfsm-shutdown-helper
    (root)   /usr/bin/emerge
    (root)   /usr/bin/passwd [a-zA-Z0-9_-]*
    (root)   !/usr/bin/passwd root
    (apache) /usr/bin/pkill
    (apache) /bin/kill

Wenn Sie einen Befehl in /etc/sudoers haben, der die Eingabe eines Passworts nicht erfordert, wird auch zum Anzeigen der Einträge kein Passwort nötig sein. Andernfalls werden Sie zur Eingabe des Passworts aufgefordert, wenn sich sudo nicht mehr daran erinnert.

Verlängern des Passwort Timeouts

Normalerweise merkt sudo sich das Passwort für 5 Minuten, nachdem es der Benutzer eingegeben hat. Um diese Frist zu verlängern, kann sudo -v aufgerufen werden. Der Zeitstempel wird dann zurückgesetzt, so dass sudo erst nach weiteren 5 Minuten wieder nach dem Passwort fragt.

Befehlsauflistung 3.2: Die Frist des Passworts verlängern

$ sudo -v

Umgekehrt kann der Zeitstempel mit sudo -k gelöscht werden.