![]() |
|
|
|||||||
| Registrieren | Hilfe | Benutzerliste | Interessengemeinschaften | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
|
|
Das Sudo KommandoAus Linux-Forum WikiAchtung: Dieser Text ist kein Ersatz für die eigentliche Dokumentation. Er soll Konzepte und Funktionsweisen verdeutlichen. Details liefern die entsprechenden Handbücher und Manpages.
Dieser Artikel befindet sich noch im Aufbau und ist somit unvollständig oder nicht detailiert genug.
ZweckDer Zweck von sudo ist es, einfach Befehle unter anderen Benutzerkonten auszuführen. Anders als su ist sudo über die Datei (/etc/sudoers) sehr fein und relativ sicher konfigurierbar. Dort wird festgehalten, welcher Benutzer auf welchem Host welche Befehle als welcher Benutzer mit welchen Einschränkungen oder Eigenschaften ausführen darf. sudo kann, wenn man es korrekt konfiguriert, einen loginfähigen Systemadministratoraccount überflüssig machen. Dies wird zum Beispiel bei Ubuntu-Linux so gemacht. Der root Benutzer kann sich nicht anmelden, per sudo ist aber eine begrenzte Benutzergruppe in der Lage, Befehle als root auszuführen. Ob und in welcher genauen Form eine solche Einstellung Sinn ergibt, bleibt natürlich dem jeweiligen Administrator vorbehalten. Abgrenzung zum su KommandoDas su-Kommando ist dazu gedacht, ohne grosse Konfiguration das Starten eines Prozesses (oder per Default einer Shell) unter anderen Benutzerkonten zu ermöglichen. Dies ist auch nicht (ausser für root) Passwortlos möglich. Weiterhin gibt es keinerlei Möglichkeiten, Einschränkungen wie zum Beispiel erlaubte Programme, zu vergeben. su gehört in dieselbe Kategorie wie sg bzw. newgrp: Es ist ein kleines Tool, um schnell den Benutzeraccount zu wechseln. Es ist aufgrund seiner Einschränkungen nicht für den großflächigen Einsatz geeignet, da von den Zielbenutzerkonten die Passwörter bekannt sein müssen. Kleiner Dämpfer: Wenn man sich mit PAM beschäftigt, kann man su natürlich in gewisser Weise passwortlos konfigurieren. Aufgrund der fehlenden Konfigurationsmöglichkeit, würde dies allerdings ein sehr hohes Sicherheitsrisiko darstellen. Der Befehl selbstDer sudo Befehl selbst wird wie in der Manpage beschrieben benutzt. Grundform ist: sudo BEFEHL ARGUMENTE... Damit wird der Befehl BEFEHL mit den Argumenten ARGUMENTE als Defaultbenutzer (normalerweise root) ausgeführt. Ob das so funktioniert, hängt natürlich von der Konfiguration in der Datei /etc/sudoers ab. Wenn man nicht den Defaultbenutzer als Zielbenutzer haben will, so gibt man den gewünschten Account mit -u an: sudo -u BENUTZER BEFEHL ARGUMENTE... Es gibt noch eine ganze Reihe von weiteren Kommandozeilenoptionen. Einige werden wir nachher noch kennenlernen, aber eine genaue Übersicht gibt es in der zugehörigen Manpage. Die meisten von ihnen ergeben erst Sinn wenn man ungefähr weiss wie sudo tickt. Grobe interne Funktionsweisesudo ist grundsätzlich erstmal ein Programm, dass mit root-Rechten laufen muss. Daher ist es im Dateisystem mit SUID ("set user ID on execution") gekennzeichnet (siehe auch Dateirechte (klassisch)). Nur Programmen die als root laufen ist es gestattet, beliebig den Benutzer zu wechseln. Nach dem Aufruf wird sudo etwa folgendes tun:
Die KonfigurationsdateiDie Konfigurationsdatei beschreibt, wie oben schon erwähnt, welcher Benutzer was unter welchen Voraussetzungen per sudo machen darf. Normal ist es /etc/sudoers und sollte nur mit dem Programm visudo bearbeitet werden (startet einen Editor, sperrt die Datei und macht vor dem endgültigen Speichern eine Syntaxprüfung). Neben den Beschreibungssätzen und Aliases gibt es auch noch generelle Optionen. Einige davon werden weiter unten beschrieben. Grundsätzlicher AufbauDa sudo für eine grosse Anzahl von Benutzern, Hosts und Befehlen konzipiert ist, werden normalerweise Aliases gesetzt, die später dann nur verwendet werden. Wenn die Aliases sprechend sind ("SHUTDOWN_KOMMANDOS" anstatt "XYZ"), dann erhöht sich dadurch natürlich auch die Lesbarkeit. Der grundsätzliche Aufbau eines Beschreibungssatzes ist BENUTZER HOSTNAME = (ZIELBENUTZER) EINSTELLUNGEN: BEFEHL
So kann man auch den Satz in der Einleitung oben ein bisschen ableiten:
ausführen? Das kann und darf natürlich etwas komplexer ausfallen. Für alle oben genannten Dinge kann eine Liste angegeben werden (mehrere BENUTZER, mehrere HOSTNAME, ...). Und hier kommen dann auch - der Lesbarkeit wegen - die Aliases ins Spiel (ausser für EINSTELLUNGEN). Man definiert zum Beispiel eine Liste von Befehlen in einem Alias, und nutzt diesen Alias (oder mehrere) dann im Beschreibungssatz. Die genaue Syntaxbeschreibung ist der Manpage zu entnehmen. Man kann noch ein paar Spielereien wie Angaben über mehrere Zeilen oder mehrere Beschreibungssätze für einen Benutzer machen. Dieser Artikel soll die Manpage nicht ersetzen, sondern eine Grundlageneinführung darstellen. AliasesDie Aliasdefinitionen haben die Form ALIASTYP ALIASNAME = ALIASINHALT Der Typ des Alias ist
Beispiel: Cmnd_Alias SHUTDOWN_KOMMANDOS = /sbin/shutdown, !/sbin/init, !/sbin/init *, /sbin/init 0, /sbin/halt Hier am Beispiel von /sbin/init, sieht man auch implizite Einschränkungen, die man für die Befehlssyntax machen kann. Hier werden Negation (Ausrufezeichen) und Wildcards verwendet, um genau anzugeben welche Parameter an /sbin/init übergeben werden dürfen und welche nicht. Übrig bleibt hier nur "/sbin/init 0", was normalerweise einen Systemshutdown auslöst. Andere Parameter (oder garkeine) dürfen hier nicht gegeben werden. Auch gibt es für alle Typen den vordefinierten Alias ALL, dieser bedeutet, je nach Typ, alle Möglichkeiten (z.B. "alle Befehle", "von allen Hosts", ...). Erlaubte Namen: Aliasnamen beginnen mit Grossbuchstaben und enthalten nur Grossbuchstaben, Ziffern und den Underscore ("_"). Was hat es mit der Hostangabe auf sich?sudo ist wie schon gesagt, für einen grossflächigen Einsatz konzipiert. Auch wenn gerade aktuelle Desktopumgebungen wie KDE oder GNOME dazu neigen, immer nur den einzelnen Rechner ohne Netzwerkverbund zu betrachten (und damit einen Grossteil ihrer Flexibilität aufgeben!) sollte niemals vergessen werden, dass UNIX schon sehr lange ein netzwerkfähiges Betriebssystem ist. Alle interessanten Dinge sollten so geschrieben werden, dass man sie ohne grosse Probleme in einem gesamten Rechnerverbund nutzen kann. Darüberhinaus kann sudo seine Konfiguration auch aus einem LDAP-Directory auslesen, was das Verteilen der Konfigurationsdatei auf die einzelnen Rechner unnötig macht. Man kann eine Konfigurationsdatei erstellen, die von allen Rechnern im Netzwerk gleich genutzt wird. Der Hosteintrag ist dazu da, um Einschränkungen auf bestimmte Rechner zu geben. Beispiel: Ein Benutzergruppe webadmin darf per sudo den Rechner www herunterfahren, aber keine anderen Rechner. Hier wäre eine Hostangabe von www sinnvoll. Wenn man keine Verwendung für eine solche Angabe hat (Einzelplatzkonfiguration) sollte man einfach den Alias ALL verwenden. BeschreibungssätzeDie einzelnen Beschreibungssätze werden nach dem oben erwähnten Schema aus Aliases oder direkten Angaben zusammengesetzt. Wenn sudo zu einer angeforderten Sache mehrere Beschreibungssätze findet, so wird der letzte passende verwendet. Dies ist nicht immer der, der am genauesten passt. Man sollte sich daher gut überlegen, in welcher Reihenfolge man die Beschreibungssätze eingibt. Beispiel: wheel-GruppeEin einfaches Beispiel ist ein Beschreibungssatz, der es Benutzern in der Gruppe wheel erlaubt, ohne Passwortabfrage jeglichen Befehl als root oder andere Benutzer auszuführen. Die Gruppe wheel ist im BSD-Bereich traditionell eine Art "Co-Administrator" Gruppe, es könnte also durchaus sein, dass Ihr ein System habt bei dem das bereits konfiguriert ist. %wheel ALL=(ALL) NOPASSWD: ALL Beispiel: Systemupgrades als UserEin weiteres Beispiel: Ich benutze ein Debian-System. Das einzige was ich regelmäßig als root tun muss sind Systemupgrades. Da ich recht faul bin, habe ich mir für meinen Benutzer bonsai eine kleine sudo-Konfiguration hinterlegt: Cmnd_Alias APT_COMMANDS = /usr/bin/apt-get, /usr/bin/apt-cache, /usr/bin/aptitude bonsai ALL=(root) NOPASSWD:APT_COMMANDS Somit kann ich einfach per sudo aptitude update && sudo aptitude upgrade zum Beispiel ein Systemupgrade fahren. Der Hostalias ALL wird hier übrigens keineswegs wegen Einzelplatznutzung verwendet. Ich betreibe mehrere Debian-Systeme und der Benutzer bonsai ist ein netzwerkweiter Benutzer. Auf allen Systemen kann ich somit - mit der identischen sudo-Konfiguration - Systemupgrades fahren. Wenn ich mein Internet-Gateway ("gate") von dieser Regel ausnehmen möchte, muss ich nur die Zeile ändern in: bonsai ALL,!gate=(root) NOPASSWD:APT_COMMANDS EinschränkungsmöglichkeitenWie oben schon erwähnt und auch an einigen Beispielen gesehen, kann man einige Einschränkungen vergeben. In der Regel passiert dies innerhalb der Listen (Benutzerliste, Befehlsliste, ...). Für die meisten Sachen werden Textvergleiche benutzt, die den Wildcards (Globbing) der Shell nicht unähnlich sind. Zum Negieren eines Listenelements wird ein Ausrufezeichen vorangestellt. Hier nur einige Beispiele:
ALL,!kurt ALL=(root) NOPASSWD:/bin/hallo
%wheel ALL=(root) NOPASSWD:ALL,!NETWORK_COMMANDS,!SHELLS AusführungsbeschränkungenDie wahrscheinlich populärste Ausführungsbeschränkung haben wir in fast jedem Beispiel gesehen: NOPASSWD. Es gibt mehr Ausführungsbeschränkungen, hier eine hoffentlich vollständige Liste:
ShellescapesUnter Shellescapes wird hier alles zusammengefasst, was brauchbar ist, um von einem Programm aus ein beliebiges anderes Programm auszuführen. In der Regel sind das Kommandos wie "!BEFEHL" im VIM Texteditor. Diese Kommandos starten eine Shell und führen die angegebenen Befehle aus. Dies stellt natürlich ein Risiko dar, da man mit sudo auf der einen Seite versucht möglichst viele Einschränkungen zu geben, aber auf der anderen Seite Texteditoren gestartet werden können, von denen aus man beliebige Befehle ausführen kann. Eine Möglichkeit dies zu verhindern ist das NOEXEC Flag von sudo. Wenn dies für einen Befehl konfiguriert wird, werden die Systemfunktionen die zum Starten von Prozessen benötigt werden mit Dummies überladen, und somit unbrauchbar gemacht. Der Texteditor der eine Shell starten will wird nur eine Fehlermeldung erhalten. Auch eine Shell wird niemals etwas ausführen können. Ob diese Lösung sinnvoll ist oder nicht hängt von der Situation ab. Es ist auf jeden Fall eine Lösung die greift: bonsai@mainserver:~$ sudo bash root@mainserver:~# ls bash: /bin/ls: Keine Berechtigung Generelle OptionenGenerelle Optionen steuern das Verhalten von sudo, das nicht direkt mit Beschreibungssätzen angegeben werden kann - zum Beispiel welches Passwort abgefragt wird (aufrufender Benutzer, Rootpasswort oder Zielbenutzer). Die Angaben dieser Optionen überschreiben das Defaultverhalten von sudo. Man kann auch verschiedene Defaults für Benutzer, Zielbenutzer, Hosts und Befehle setzen. Optionssyntax
Defaults OPTION
Defaults>ZIELBENUTZER OPTION
Defaults:BENUTZER OPTION
Defaults@HOST OPTION
Defaults!BEFEHL OPTION Es gibt mehrere Optionstypen:
An dem Beispiel passwd_timeout sieht man auch gut, dass man bestimmte Optionen sowohl als Integer (oder auch String) als auch Boolean setzen kann. Beispiele
Defaults syslog=auth
Defaults>root !env_delete
Defaults:FULLTIMERS !lecture
Defaults!PAGERS noexec Einige OptionenDie nachfolgenden Optionen sind lange nicht die einzigen, eine detailierte Übersicht gibt wie immer die Manpage. Benachrichtigung
Limits und Sperren bzw. Freigaben
Ticketing (Caching)Das Ticketing ermöglicht das Benutzen von sudo ohne Passwort, nachdem erstmalig ein Passwort eingegeben wurde.
Einige WarnhinweiseTicketingsudo kann wie oben angedeutet, einmal ein Passwort entgegennehmen und dann nie wieder danach fragen. Dieses sog. "Ticketing" kann benutzerbasiert sein. Doch Vorsicht: Wenn es benutzerbasiert ist, kann nachdem der Benutzer einmal sein Passwort eingegeben hat, ein etwaiger Schadcode per sudo passwortlosen Zugang zu anderen Accounts (im schlimmsten Fall root) erlangen. Aus diesem Grund empfehle ich benutzerbasiertes Ticketing nicht. Auch sollte ein sinnvoller Timeout für Tickets gewählt werden. Zielbenutzer rootAuch wenn es bequem erscheint, (und auch in der Praxis bei mancher Distribution so ausgeliefert wird) so sollte man sehr gründlich darüber nachdenken, ob man generell per ALL als Befehl erlaubt, wenn der Zielbenutzer root ist. Es gibt nicht ohne Grund eine Trennung zwischen Administratoren und Benutzern. Ein falscher Befehl an der falschen Stelle - absichtlich oder nicht - kann komplettes systemweites Chaos nach sich ziehen. Wenn root im Spiel ist, darf man sich einfach keine Fehler leisten. Diejenigen die Systeme betreiben deren Ausfall Geld kostet werden das verstehen. AusklangGenerell habe ich bemerkt, dass die meisten garnicht verstehen wie und warum sudo funktioniert oder für was es eigentlich da ist (und für was es nicht da ist). sudo scheint zu den Tools zu gehören, denen viele lieber aus dem Weg gehen. Ich hoffe diese Übersicht hilft ein bisschen die Berührungsangst zu überwinden. Eigentlich - und das meine ich wirklich - ist es ja doch keine Hexerei. Kritik?Gerne nehmen alle Beteiligten Ideen und Kritik zu dem Artikel entgegen. |