Linux-Rechte zum ausführen von exec() über Webserver

  • Hallo zusammen..

    ich drehe mich heute schon den ganzen Tag im Kreis.. wollte für einen User hier im Forum eine Funksteckdosen-Schaltung mit einem kleinen Web-Interface austesten..

    dazu hab ich am RasPi Apache2-php-mysql sowie wiringPI und rcswitsh-pi laufen

    wenn ich am RasPi folgende Zeile(n) eintippe, dann kann ich schalten...

    Code
    pi@raspberrypi ~/rcswitch-pi $ ./send 01111 1 0
    wiringPiSetup: Must be root. (Did you forget sudo?)
    pi@raspberrypi ~/rcswitch-pi $ sudo ./send 01111 1 0
    sending systemCode[01111] unitCode[1] command[0]
    pi@raspberrypi ~/rcswitch-pi $

    wiringPI und rcswitsh-pi liegen beide im Ordner /home/pi

    daher kann ich an dieser Stelle mal sagen, die Hardware funktioniert

    da ich bereits diverse gescheiterten Versuche hinter mir habe, hab ich mir nun vermutlich auch einige Dateirechte zerschossen...

    ..es mag mir einfach nicht gelingen, einen Schaltbefehl über ein PHP-Skript zu schicken..

    auch eine Kopie im Ordner /var/www/ kann ich von der Kommandozeile starten und die Funksteckdose schaltet ebenfalls...

    Code
    pi@raspberrypi ~/rcswitch-pi $ cd /var/www
    pi@raspberrypi /var/www $ sudo ./send 01111 1 0
    sending systemCode[01111] unitCode[1] command[0]
    pi@raspberrypi /var/www $

    nach allen Fehlversuchen sieht mein PHP nun so aus:
    [code=php]// hier werden die Codes für jede Funksteckdose festgelegt.<br>
    // dabei gilt: die ersten 5 Zeichen (00000 bis 11111) müssen als "Homecode" erstellt werden<br>
    // dann folgt ein Leerzeichen, und der Code für die Funksteckdose (1 bis 4)
    // der Status wird dann über die Variable status_xxx übergeben

    $code_001 = "01111 1";
    $code_002 = "01111 2";
    $code_003 = "01111 3";
    //--------------------------------------------------------------
    // hier wird geprüft ob ein Button geklickt wurde...

    if (isset($_GET[funk_001_EIN])) {
    $status_001 = '1';
    // hier den Befehl zum Einschalten der Funksteckdose 001 einfügen
    $output_test = 'sudo ./send '.$code_001.' '.$status_001;
    $output = exec('sudo ./send '.$code_001.' ' . $status_001);
    exec('sudo /home/pi/rcswitsh-pi/send '.$code_001.' ' . $status_001);

    echo "<pre>$output</pre>";
    echo $output_test;
    [/php]
    (verschieden Pfadangaben bereits getestet... ohne Erfolg

    die Ausgabe von output_test liefert--> sudo ./send 01111 1 1

    somit ist doch auch der String für den send-Befehl ok??

    Suche Gleichgesinnte für mein Projekt!
    jamesmatik_200.png
    soll ein Baukasten (Software und Hardwaremodule) für Temperatur-Logging, kleine Steuerungsaufgaben und Smart-Home werden.

  • Linux-Rechte zum ausführen von exec() über Webserver? Schau mal ob du hier fündig wirst!

  • ich bin tatsächlich zu alt für den RasPi...

    habe mit sudo visudo" als letzte Zeile eingefügt --> www-data ALL=(ALL) NOPASSWD: ALL

    und nun funzt es...

    und das ist der Teil meines PHP->Skrips

    [code=php]$code_001 = "01111 1";
    $code_002 = "01111 2";
    $code_003 = "01111 3";
    //--------------------------------------------------------------
    // hier wird geprüft ob ein Button geklickt wurde...

    if (isset($_GET[funk_001_EIN])) {
    $status_001 = '1';
    // hier den Befehl zum Einschalten der Funksteckdose 001 einfügen
    exec('sudo ./send '.$code_001.' ' . $status_001);
    }

    [/php]

    Suche Gleichgesinnte für mein Projekt!
    jamesmatik_200.png
    soll ein Baukasten (Software und Hardwaremodule) für Temperatur-Logging, kleine Steuerungsaufgaben und Smart-Home werden.

    Einmal editiert, zuletzt von RasPi-Azubi (9. Juni 2014 um 22:35)

  • *heul* bitte mach das wieder weg!
    Ich übersetze die Zeile:
    An alle im Internet: Ihr dürft ohne Passwortabfrage alles auf meinem Rechner tun was ihr wollt! Der korrekte Weg ist, www-data in die korrekte Systemgruppe hinzuzufügen, damit er die GPIOs steuern darf und absolut aus dem sudoers-file rauszuhalten.
    Ich glaube die korrekte Gruppe ist "dialout" aber das ist geraten, ich habe aktuell noch nichts an meinen GPIOs. Das möge bitte jemand bestätigen.

  • die gute Nachricht! so funtz es :)

    die schlechte Nachricht... ich habe selbst noch nicht verstanden, was ich da mache! :)

    aber zur Rettung meiner Ehre! ---> der RasPi ist übers Web nicht erreichbar, und das ganze läuft (nur) zum testen und lernen...
    (dieser Zwischenschritt ist jedoch für die Fehlersuche sehr hilfreich gewesen!)

    ALTE Männer wie ich begreifen jeden Tag langsamer! ... aber jeder Tipp ist natürlich wie immer herzlich willkommen!

    Suche Gleichgesinnte für mein Projekt!
    jamesmatik_200.png
    soll ein Baukasten (Software und Hardwaremodule) für Temperatur-Logging, kleine Steuerungsaufgaben und Smart-Home werden.

  • Wenn es nicht online ist, dann ist es keine Todsünde. Das große Problem ist
    1) Du lernst es falsch, und verwendest es IRGENDWANN vielleicht online
    2) Andere finden hier die "Lösung" für ihr Problem, und nutzen es online...

    Aufruf an alle mit einem Thread der dieses Thema behandelt: schreibt die korrekte Lösung bitte in den Startbeitrag, damit wir verhindern, dass 1000de unbedarfter Linux-Neulinge mit offenem Pi im Netz rumhängen.


  • Der korrekte Weg ist, www-data in die korrekte Systemgruppe hinzuzufügen, damit er die GPIOs steuern darf und absolut aus dem sudoers-file rauszuhalten.
    Ich glaube die korrekte Gruppe ist "dialout" aber das ist geraten, ich habe aktuell noch nichts an meinen GPIOs. Das möge bitte jemand bestätigen.

    ja, wenn das so gehen kann.... muss mich da aber noch schlau machen.

    Ein wirklich gute Lösung suche ich noch!

    Suche Gleichgesinnte für mein Projekt!
    jamesmatik_200.png
    soll ein Baukasten (Software und Hardwaremodule) für Temperatur-Logging, kleine Steuerungsaufgaben und Smart-Home werden.

  • Die Variante ist Sicherheitstechnisch auch ganz gut, aber prinzipiell wesentlich aufwendiger, denn das muss man für jeden Befehl machen, der sudo braucht. Mit der richtigen Gruppe erschlägt man die ganze Problem-Familie. Was besser ist, bin ich mir nicht sicher.

  • Naja, in meiner Beschreibung zum webscript steht ausdrücklich das man nicht ALL angeben soll sondern explizit nur die Befehle mit vollständigem Pfad über sudoers freigeben soll die auch wirklich benötigt werden - wobei ich auch dort darauf hinweise das der bessere Weg über besagtes webscript wäre, da man darüber den Befehl auch XYZ nennen könnte, was ein Angreifer so aber nicht herausfinden kann.

    Ich habe dort auch einen ausdrücklichen Hinweis aufgeführt, der erwähnt das man sowas später evtl. mal vergisst und seinen Webserver übers Internet zugänglich macht aber genau das ziemlich Fatal werden kann..

    Den www-data Benutzer in die Gruppe dialout hinzu zufügen löst auch nur das Problem bezüglich GPIO oder anderer Peripherie, aber zum Beispiel nicht um Sachen mit root-Rechten auszuführen.


    Wobei ich auch sagen muss dass das hier leider ziemlich oft gefragt wird und ich das bestimmt schon 5x in verschiedenen Ausführungen beschrieben habe - mittlerweile hab ich da selbst keinen Überblick mehr welche Beschreibung nun ausführlich genug is damits jeder versteht :-/

  • Mit deiner Originalfassung habe ich dann auch kein Problem. Eine weitere relativ sichere Variante. Es steht nur soo oft inzwischen "falsch" im Forum :(

    Die Gruppe dialout löst nur das GPIO Problem, das ist richtig, aber das ist auch das Problem in 99%, und von den restlichen 1% sollten sich alle überlegen ob es tatsächlich nötig ist Rootrechte zu haben (natürlich kann es das sein, aber meistens eher nicht).
    Persöhnlich finde ich es besser über die korrekte Gruppe zu gehen, als sich root (oder sudo) Rechte zu verschaffen, auch wenn sie eingeschränkt sind. Dafür sind die Gruppen da.

  • Was besser ist hängt wohl vom Anwendungsfall ab.
    Rein GPIO kannst du über die Gruppe abfangen. Wenn du Scripte aufrufst welchr in der Bash sudo brauchen (reboot, SMS senden, was auch immer...) ist das Webscript sicher der bessere Weg.

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • mal gucken... das "Webscript-Konzept" hatte ich auf die Schnelle nicht wirklich verstanden...

    mache an dieser Baustelle jedoch erst weiter, wenn ich nen RasPi zum testen frei habe...

    mein jetziger muss brav Daten sammeln...

    Suche Gleichgesinnte für mein Projekt!
    jamesmatik_200.png
    soll ein Baukasten (Software und Hardwaremodule) für Temperatur-Logging, kleine Steuerungsaufgaben und Smart-Home werden.


  • mal gucken... das "Webscript-Konzept" hatte ich auf die Schnelle nicht wirklich verstanden...

    Ist ganz einfach, erklär ich mal so :

    Du möchtest Programm xyz und abc mit root rechten starten.
    Aber nicht die Programme def und ghi

    Wenn du jetzt dem User www-data das allgemeine Sudo recht gibst kann er alle vier starten.

    Das umgehst du mit dem Webscript.
    Du erlaubst sudo nur für das script.
    In dem Script steht dann z.B. ( sehr sehr einfach dargestellt )

    /home/pi/abc blahblah.txt
    /home/pi/xyz bumbum.dat

    abc und xyz werden jetzt mit Rootrechten ausgeführt.
    Jetzt willst du doch noch def erlauben, also packst du das mit in das Webscript

    /home/pi/abc blahblah.txt
    /home/pi/xyz bumbum.dat
    /home/pi/def oweiowei.dat

    Und schon geht das auch, alles andere außer dem webscript.sh kann www-data nicht ausführen.
    Ist also in soweit sicher das nur Befehle welche über das Webscript ausgeführt werden auch nur per root laufen.

    Das Webscript ist schon etwas komplizierter aufgebaut jedoch ist es das Prinzip.

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • ok.. Danke...

    dann muss ich mal gucken, wie ich aus PHP dem webscript.sh den Code für die jeweilige FSD(Funksteckdose) übergeben kann.

    denn ich möchte ja die in PHP erstellten Codes verwenden können, ohne für jede FSD ein eigenes shell-script zu benötigen..

    denn dann ist ja der Konfig-Aufwand wieder sehr hoch, und für ANFÄNGER wie mich schwer nachvollziehbar...

    Suche Gleichgesinnte für mein Projekt!
    jamesmatik_200.png
    soll ein Baukasten (Software und Hardwaremodule) für Temperatur-Logging, kleine Steuerungsaufgaben und Smart-Home werden.


  • dann muss ich mal gucken, wie ich aus PHP dem webscript.sh den Code für die jeweilige FSD(Funksteckdose) übergeben kann.

    denn ich möchte ja die in PHP erstellten Codes verwenden können, ohne für jede FSD ein eigenes shell-script zu benötigen..

    denn dann ist ja der Konfig-Aufwand wieder sehr hoch, und für ANFÄNGER wie mich schwer nachvollziehbar...

    Ich versteh dein Problem nicht?

    Du hast ein einziges Script und übergibst an dieses sog. Parameter / Argumente - genauso wie es eben in der Konsole mit anderen Befehlen ist:
    ls -la /tmp

    ls ist der Befehl - in diesem Fall das Webscript
    -la ist der erste Parameter welcher an den Befehl übergeben wird
    /tmp ist der zweite Parameter


    Guck dir doch nur ein mal das von mir mehrmals erklärte Webscript an? Daran solltest du eigentlich schnell erkennen wie das funktioniert - und ansonsten stellst du halt genauere Fragen dann beantworte ich dir das gerne

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!