Marcus: CGI Skripte mit root rechten ausführen?

Hi @all,

ich bin gerade dabei ein paar Skripte zu Enwickeln, die den Status bestimmter dienste abfragen. Jetzt habe ich das Problem, dass wenn ein Skript aufgerunfen wird mit dem wwwrun User ausgefürht wird.
Wie kann ich die Skripte mit root-Rechten laufen lassen?
Das Skript sieht wie folgt aus:

#!/usr/bin/perl  
  
  
use strict;  
  
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Variablen ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
  
my $ServicesDirectory="/etc/init.d/rc3.d";  # Verzeichnis in dem sich die zu Startenden Dienste befinden  
  
  
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Hauptprogramm ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
  
print"<table border=1 align=center>";  
print"<center><h1>Auswertung Dienste</h1></center>";  
  
my @service = <$ServicesDirectory/S*>;  
foreach my $service (@service){  
        $service=~s/$ServicesDirectory\///;  
        next if "$service" =~ "S[0-9]*bigbrother"   ||  
        "$service" =~ "S[0-9]*hwscan"    ||  
        "$service" =~ "S[0-9]*learnvipa"   ||  
        "$service" =~ "S[0-9]*fbset"    ||  
        "$service" =~ "S[0-9]*rpmconfigcheck"  ||  
        "$service" =~ "S[0-9]*smbfs"    ||  
        "$service" =~ "S[0-9]*nfs"     ||  
        "$service" =~ "S[0-9]*nfsboot"    ||  
        "$service" =~ "S[0-9]*splash_early"  ||  
        "$service" =~ "S[0-9]*running-kernel"  ||  
        "$service" =~ "S[0-9]*kbd"    ||  
        "$service" =~ "S[0-9]*splash"    ||  
        "$service" =~ "S[0-9]*ITCAM"    ||  
        "$service" =~ "S[0-9]*rebootmail"  ||  
        "$service" =~ "S[0-9]*dsmcad"   ||  
        "$service" =~ "S[0-9]*custstart";  
  
  
        $service=~s/S[0-9]*/rc/;  # Sxx nach rc wandeln (z.B. S016apache --> rcapache)  
  
        my $ServiceStatus=`$service status >/dev/null && echo OK || echo FEHLER`;  
  
        #print "$service ==> $ServiceStatus\n";  
  
        #print "<br>";  
  
  
        if ($ServiceStatus eq "OK"){  
                $service=~s/rc//;  
                print "<tr>  
                <td>$service</td>  
                <td bgcolor=#00FF00>ok</td>  
  
                </tr>";  
        }  
        elsif($ServiceStatus eq "FEHLER"){  
                $service=~s/rc//;  
                print "<tr>  
                <td>$service</td>  
                <td bgcolor=#ff0000>FEHLER</td>  
  
                </tr>";  
  
        }  
}  
print "</table>";
  1. Hallo,

    die obligatorische Ansprache, mit der du auch sicherlich schon gerechnet hast: es ist sau gefährlich ein CGI Skript mit root Rechten laufen zu lassen. Daher schlage ich dir folgende Alternative vor.

    Du brauchst die root Rechte ja nur, um die rc Kommados aufzurufen, um den Status der Dienste zu prüfen. Du kannst das sicherlich mit nur ein wenig mehr Mühe aus der Ausgabe des ps Kommandos (z.B. ps -Al) rausholen, wofür man dann keine root Rechte braucht.

    Gruß,
    Cruz

    1. Hi,

      danke für deine Antwort.
      Das Habe ich mir schon gedacht, dass sowas kommt.
      Ich bin auch bereit, eine Alternative zu ergreifen, aber ich bin mir nicht sicher ob das so Funkt wie du das dargestellt hast.
      Ich möchte das Skript auf über mehr als 40 Servern laufen lassen! Und jeder Server hat andere Dienste die gestartet werden müssen.
      Wenn ich jetzt z.B. ps -Al | grep hotplug ausführe, dann bekomme ich keine rückmeldung, weil hotplug z.B. nicht in der Liste Vorhanden ist.
      Wie könnte ich das sonst noch lösen?

      1. Hallo,

        Wenn ich jetzt z.B. ps -Al | grep hotplug ausführe, dann bekomme ich keine rückmeldung, weil hotplug z.B. nicht in der Liste Vorhanden ist.

        Dann weisst du ja, dass der hotplug Dienst gerade nicht läuft. :)
        Aber es gibt da tatsächlich ein Haken, du kannst nicht die Namen der Dienste aus den rc Verzeichnissen eins zu eins in die Ausgabe von ps mappen, weil die Programme, die tatsächlich laufen, dann doch anders heissen. Allerdings kann man dieses Mapping einmal manuell aufbauen und dann ist es gut.

        Wie könnte ich das sonst noch lösen?

        Du könntest auch mit dem Apache Modul suEXEC das Skript unter einem bestimmten User ausführen, der sudo Rechte auf die rc Kommandos hat. Das wäre auch noch eine gute Ecke sicherer, als das Skript gleich unter root laufen zu lassen. Ich weiss übrigens wirklich nicht wie man das bewerkstelligen kann. suEXEC erlaubt es nämlich nicht ein Skript als root auszuführen. Man müsste also wahrscheinlich dafür sorgen, dass ganz Apache mit root Rechten läuft und bei dem Gedanken rollen sich gerade eine Million Fußnägel in Deutschland hoch. :)

        Gruß,
        Cruz

        1. Dann weisst du ja, dass der hotplug Dienst gerade nicht läuft. :)

          Das stimmt leider nicht ganz, hotplug läuft:
          rchotplug status
          checking Hotplug                running

          Wie kann ich ihn sonst über die Prozessliste finden?

          Aber es gibt da tatsächlich ein Haken, du kannst nicht die Namen der Dienste aus den rc Verzeichnissen eins zu eins in die Ausgabe von ps mappen, weil die Programme, die tatsächlich laufen, dann doch anders heissen. Allerdings kann man dieses Mapping einmal manuell aufbauen und dann ist es gut.

          Welche Programme meinst du, hast du da was genaues im Kopf?

          Man müsste also wahrscheinlich dafür sorgen, dass ganz Apache mit root Rechten läuft und bei dem Gedanken rollen sich gerade eine Million Fußnägel in Deutschland hoch. :)

          Also nee, so krass wollen wir das natürlich nicht angehen lassen ;)
          Dann lieber über die Prozessliste :)
          Aber ich müsste nur wissen, wie ich jeden Prozess finde, über ps -Al scheint das nicht wirklich zu funken.

          Gruß
          Marcus

          1. Hallo Marcus,

            Das stimmt leider nicht ganz, hotplug läuft:
            rchotplug status
            checking Hotplug                running

            Das ist wahrscheinlich genau das, was ich meine. Nur weil das rc Kommando den Namen "hotplug" impliziert, heisst es noch lange nicht, dass das laufende Programm auch hotplug heisst.

            Welche Programme meinst du, hast du da was genaues im Kopf?

            Beispiel:

            Wenn "rcpostfix status" dir den Wert "running" ausgibt, dann befindet sich in der Prozessliste ps -A ein Programm namens "master". Und du suchst ja nach der umgekehrten Implikation, also ps -A enthält master bedeutet rcpostfix status wird running ausgeben.

            Wie kann ich ihn sonst über die Prozessliste finden?

            Es gibt wahrscheinlich auch für dein hotplug Problem ein entsprechedes  Programm in der ps -A Liste, was du auf den ersten Blick nicht erkennst. Zieh dir doch mal eine ps -A Liste und dann stopp den hotplug mit rchotplug stop und dann wieder ps -A Liste und vergleich die beiden mit diff, dann kommst du wahrscheinlich auf den Namen, den du wirklich in ps -A suchen musst.

            Wenn du dich also auf die ps -A Liste stützen willst, musst du erst manuell alle rc* und Programmpaare herausfinden und in deinem Perl Skript unterbringen. Wenn du das einmal gemacht hast, dann kommst das Skript ohne root Rechte aus.

            Gruß,
            Cruz

      2. Wenn ich jetzt z.B. ps -Al | grep hotplug ausführe, dann bekomme ich keine rückmeldung, weil hotplug z.B. nicht in der Liste Vorhanden ist.

        Es ist sicherlich nicht auszuschliessen, dass es nicht zu jedem Dienst einen Prozess gibt, den man mit ps -A sehen kann. Ich kann mir zwar nicht vorstellen, wie ein Dienst anders als mit einem laufendem Programm bereit gestellt wird, aber ich weiss zu wenig darüber, um es mit Sicherheit sagen zu können. Es liegt jetzt bei dir, um das herauszufinden. :)

        Wie könnte ich das sonst noch lösen?

        Was mir noch einfällt: du könntest dir das z.B. das rchotplug Skript einfach mal anschauen und rausfinden wie es feststellt, ob der hotplug Dienst läuft. Die rc Skripte sind in der Regel recht einfach zu lesen.

        Cruz

        1. Es ist sicherlich nicht auszuschliessen, dass es nicht zu jedem Dienst einen Prozess gibt, den man mit ps -A sehen kann. Ich kann mir zwar nicht vorstellen, wie ein Dienst anders als mit einem laufendem Programm bereit gestellt wird, aber ich weiss zu wenig darüber, um es mit Sicherheit sagen zu können. Es liegt jetzt bei dir, um das herauszufinden. :)

          So hab es jetzt raus gefunden :D

          Was mir noch einfällt: du könntest dir das z.B. das rchotplug Skript einfach mal anschauen und rausfinden wie es feststellt, ob der hotplug Dienst läuft. Die rc Skripte sind in der Regel recht einfach zu lesen.

          Hab ich gemacht, dass ist ja mal richtig bescheuert gelöst.
          Es wird überprüft ob ein bestimmter eintrag in einer bestimmten Datei vorhanden ist.

          Wie dem auch sei, ich werde mein Skript jetzt so schreiben, dass er jede 15 Sekunden eine abfrage startet und eine HTML Seite generiert.

          Danke dir für deine Hilfe.

          Gruß

          Marcus

  2. Cross-Posting, siehe
    http://www.perlunity.de/cgi-bin/forum/forum_thread.cgi?tid=19931&mid=40461

    Siechfred

    --
    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.