• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

sudo als nicht - root

Lodentoni

Newbie
Hallo,

ich habe ein Problem mit sudo. Ich will ein Program (avarice) per Webserver starten. Auf dem Server läuft Opensuse 11.3 mit Apache als Benutzer "wwwrun". Ich habe einen Benutzer "debug" eingerichtet, dieser kann avarice starten (getestet).

Sudo habe ich per Yast eingerichtet:
Benutzer | Rechner | RunAs | NOPASSWD | Befehle
wwwrun | ALL | (debug) | Ja | /usr/local/bin/avarice

Wenn der Webserver jetzt versucht per php das Programm zu starten:
exec("sudo /usr/local/bin/avarice -g -B 1MHz -j usb :$port &> $logfile &");
steht im &>$logfile die Meldung "sudo: no tty present and no askpass program specified" das Programm startet nicht mit sudo.

Trage ich in RunAs statt "debug" den Benutzer "root" ein funktioniert alles. Gibt es eine Möglichkeit, dass ich das Programm nicht als root ausführen lassen muss? Später will ich es auch irgendwie beenden, ist es günstig wenn ich "killall avarice" per sudo dem Webserver zugänglich mache, oder ist das zu gefährlich?

Vielen Dank für eure Tips

Nachtrag: Es sieht quasi so aus, als ob die NOPASSWD Funktionalität nur bei RunAs "root" funktioniert?
 

leanUX

Member
Schau doch mal in Deiner /etc/sudoers nach, ob hinter der Zeile mit dem debug-user etwas in der Art wie

Code:
%debuggersgroup ALL=(ALL) ALL
steht. Wenn debug in diesem Beispiel Member in der Gruppe debuggersgroup wäre, so würde durch diese nachfolgende Zeile die NOPASSWD Direktive für den User debug wieder zurückgenommen.
 

spoensche

Moderator
Teammitglied
leanUX schrieb:
Code:
%debuggersgroup ALL=(ALL) ALL
steht. Wenn debug in diesem Beispiel Member in der Gruppe debuggersgroup wäre, so würde durch diese nachfolgende Zeile die NOPASSWD Direktive für den User debug wieder zurückgenommen.

So schon mal gar nicht. Das gibt ein dickes Sicherheitsloch.

Code:
debug ALL=NOPASSWD: /pfad/zum/programm

Siehe auch:
Code:
man sudoers
 

leanUX

Member
Hi spoensche,

da hast Du meine Antwort aber sowas von missverstanden.
Es war lediglich ein Beispiel, wie eine evtl. bereits vorhandene nachgestellte Zeile die NOPASSWD - Einstellung einer vorherigen Zeile überschreiben könnte.
Schau Dir meine Antwort nochmal an, dann siehst Du was ich meine.
 
OP
L

Lodentoni

Newbie
Hallo,

danke erst einmal für den Tip. Ich habe mich mal mit der syntax von /etc/sudoers beschäftigt. Alles was standartmäßig oder was von yast eingetragen wurde habe ich entfernt (Gruppenregeln für %debuggroup waren nicht dabei).

Als Benutzer habe ich mich mal selbst eingetragen, da kann man schneller die funktion prüfen (die hibernate Regel ist für eine andere funktionalität und spielt hier keine Rolle). Eine Variante die funktioniert ist diese:
Code:
wwwrun	ALL = (root) NOPASSWD:/usr/sbin/pm-hibernate 
lodentoni	ALL = (root) NOPASSWD:/usr/local/bin/avarice

Ich möchte aber nicht, dass das Programm als root ausgeführt wird. Folglich habe ich den Benutzer geändert:
Code:
wwwrun	ALL = (root) NOPASSWD:/usr/sbin/pm-hibernate 
lodentoni	ALL = (lodentoni) NOPASSWD:/usr/local/bin/avarice
Jetzt werde ich aber nach einem Passwort gefragt wenn ich "sudo /usr/local/avarice" ausführen will. Das soll nicht sein. Soweit ich dass in den man-pages richtig verstehe, fragt sudo nach dem Passwort um festzustellen ob wirklich derjenige das Kommando aufruft, der es auch darf. Warum fragt sudo aber nicht nach meinem Passwort wenn ich ein Programm als root ausführen möchte?
 

spoensche

Moderator
Teammitglied
Lodentoni schrieb:
Ich möchte aber nicht, dass das Programm als root ausgeführt wird. Folglich habe ich den Benutzer geändert:
Code:
wwwrun	ALL = (root) NOPASSWD:/usr/sbin/pm-hibernate 
lodentoni	ALL = (lodentoni) NOPASSWD:/usr/local/bin/avarice
Jetzt werde ich aber nach einem Passwort gefragt wenn ich "sudo /usr/local/avarice" ausführen will. Das soll nicht sein. Soweit ich dass in den man-pages richtig verstehe, fragt sudo nach dem Passwort um festzustellen ob wirklich derjenige das Kommando aufruft, der es auch darf. Warum fragt sudo aber nicht nach meinem Passwort wenn ich ein Programm als root ausführen möchte?

Nur root darf den Recherner üper Hibernate schlafen legen, weil nur er die dafür nötigen Rechte hat. Als "normaler" User kommunizierst du nur mit dem Daemon (Userspace).

Zu deiner eigentlichen Frage:
Lodentoni schrieb:
Code:
wwwrun	ALL = (root) NOPASSWD:/usr/sbin/pm-hibernate
lodentoni	ALL = (lodentoni) NOPASSWD:/usr/local/bin/avarice

Der User wwwrun darf pm-hibernate als root und ohne Passwort ausführen, weil du es mit" = (root)...." so festgelegt hast. In der zweiten Zeile definierst du, dass der User lodentoni per sudo avarice ausführen darf, was er auch ohne sudo vorher schon durfte, aber keine Berechtigung hat, u,m auf das USB-Device zu schreiben.

Du müsstest also "(lodentoni)" mit "(root)" ersetzen.

Du wirst vermutl. nicht darum herum kommen avarice als Root zu starten. Zum einen wird direkt auf die Hardware zugegriffen (darf nur Root) und zum anderen wird ein Serverprozess gestartet, der eine serielle Schnittstelle für den GDB simuliert.
 
OP
L

Lodentoni

Newbie
Hallo,

das mit dem hibernate ist klar, das funktioniert so wie es ist. Damit lege ich den Server per Webinterface schlafen, das kann nur root, das weiß ich.

Der Benutzer lodentoni kann, wenn er angemeldet ist "/usr/local/bin/avarice" starten, ohne Probleme. Der Benutzer hat alle nötigen Rechte und Gruppenmitgliedschaften, die er benötigt um den gdb Server zu starten und die USB Hardware zu nutzen.

Wenn ich ein sudo einrichte mit "wwwrun AL = (lodentoni) NOPASSWD:/usr/local/bin/avarice" dann müsste wwwrun doch den gdb server mit allen rechten starten die auch der benutzer lodentoni besitzt und somit sollte er auch USB Zugang, etc. haben. Verstehe ich dass falsch?
 

spoensche

Moderator
Teammitglied
Lodentoni schrieb:
Wenn ich ein sudo einrichte mit "wwwrun AL = (lodentoni) NOPASSWD:/usr/local/bin/avarice" dann müsste wwwrun doch den gdb server mit allen rechten starten die auch der benutzer lodentoni besitzt und somit sollte er auch USB Zugang, etc. haben. Verstehe ich dass falsch?

Al muss ALL heissen.

Der Benutzer wwwrun darf per sudo nur avarice starten, aber keinen GDB. Avarice erzeugt beim Start einen Socket und verbindet diesen per JTAG mit dem Gerät. Der GDB nutzt dann diesen Socket (lokal) oder per TCP/IP von einem anderen Rechner für die Kommunikation mit dem Gerät.
 
OP
L

Lodentoni

Newbie
Ok, man benötigt also einmal die nötigen Rechte um das Programm avarice zu starten und man benötigt weitere Rechte, damit das gestartete avarice das tun kann, was es soll.

Wenn wwwrun das Programm per sudo als root ausführt funktioniert das, weil root sowieso alles darf. Wenn wwwrun das Programm per sudo als lodentoni ausführt funktioniert das nicht, obwohl lodentoni alle nötigen Rechte hat?

Ich danke dir ja soweit für deine Hilfe, aber ich verstehe das nicht. So wie ich das verstanden habe kann man doch per sudo ein Programm ausführen mit den Rechten anderer?
 

spoensche

Moderator
Teammitglied
Lodentoni schrieb:
Wenn wwwrun das Programm per sudo als root ausführt funktioniert das, weil root sowieso alles darf. Wenn wwwrun das Programm per sudo als lodentoni ausführt funktioniert das nicht, obwohl lodentoni alle nötigen Rechte hat?

Lodentoni schrieb:
Ich danke dir ja soweit für deine Hilfe, aber ich verstehe das nicht. So wie ich das verstanden habe kann man doch per sudo ein Programm ausführen mit den Rechten anderer?

Doch du hast es verstanden. Mit sudo führst du Programme als anderer User und damit mit seinen Berechtigungen aus. Kannst du als lodentoni den GDB ausführen, wenn wwwrun avarice als root gestartet hat?
Wenn nicht, poste bitte die Fehlermeldungen und der User lodentoni hat nicht die nötigen Berechtigungen, weil avarice eine serielle Schnittstelle emuliert.
 
Oben