Thomas: Perl-Script zum anlegen Virtueller Hosts

Hallo Forum, ich bin neu hier und habe eine Frage an Euch. Wir haben ein Perl-Script (unter Debian 4.0 und Apache 2.2.3 und perl, v5.8.8 ) wo wir über das Webinterface virtuelle Hosts (anlegen, löschen und deaktivieren) verändern können. Das läuft auch unter dem o.g. System einwandfrei. Nun wollen wir das Script unter: Debian 6.0 - Apache/2.2.16 perl, v5.10.1 zum laufen bringen, aber es funktioniert nicht, d.h. virtuelle Hosts werden zwar angelegt und können gelöscht werden, aber aktiviert und deaktiviert funktioniert leider nicht. Ich weis leider nicht weiter....

hier das Script welches unter folgenden Rechten läuft: -rwsr-xr-T 1 root htadmin 9986 11. Feb 14:32 vh10.pl


#!/usr/bin/perl -wU

use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use File::Find;
use File::Path;

$ENV{"PATH"} = "/bin:/usr/bin:/usr/sbin:/sbin";

# pfad- und prüfvariablen
my $APACHE_CONFIG = "/etc/apache2";
my $APACHE_VIRTUAL_HOSTS_ENABLED = "/etc/apache2/sites-enabled/";
my $APACHE_VIRTUAL_HOSTS_AVAILABLE = "/etc/apache2/sites-available/";
my $WEBROOT = "/var/www/";
my $APACHE_LOG = "/var/log/apache2/";
my $APACHE_LOG_VACCESS = "/var/log/apache2/vaccess.log";
my $fail = "";
my $vh_temp = "";

# kopf der html-ausgabe
print "Content-type: text/html\n\n";
print <<END_OF_HTML1;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>sdvweb - Verwaltung Virtual Hosts</title></head>
<body bgcolor="#ffffe0">
<div align="center">
<h2>sdvweb</h2>
<hr>
END_OF_HTML1

# prozedur zur anzeige der virtuellen hosts und des aktuellen status
sub list() {
print <<END_OF_HTML2;
    <table border=1>
    <form action="#" method="post">
    <tr><td><strong>Virtual-Host:</strong></td></tr>
    <tr><td><input type="text" name="vh">.xxx-yyy.de</td>
    <td><input type="submit" name="action" value="create"></td>
    <td><input type="submit" name="action" value="list"></td></tr>
    </form>
    <br>
END_OF_HTML2

    # einlesen der existierenden hosts
    opendir(DIR, $APACHE_VIRTUAL_HOSTS_AVAILABLE);
    my @vh_hosts_temp = readdir(DIR);
    closedir(DIR);
    my @vh_hosts = sort(@vh_hosts_temp);
    # prüfen des status der existierenden hosts (aktiviert oder deaktiviert) und anzeige des entsprechenden auswahlbutton
    foreach (@vh_hosts) {
        # die elemente "." und ".." vom verzeichnis einlesen werden ignoriert
        if ($_ !~ /^\./ ) {
            # variablenzuweisung für suchprozedur "check"
            $vh_temp = $_;
            # prozeduraufruf "check" zum durchsuchen des angegebenen pfades (/etc/apache2/sites-enabled) nach dateiname $vh_temp
            find (\&check, $APACHE_VIRTUAL_HOSTS_ENABLED);
            # anzeige des button deactivate wenn hoststatus = aktiviert
            if ($fail == 1) {
print <<END_OF_HTML3;
                <form action="#" method="post">
                <tr><td>$_</td>
                <td><input type="submit" name="action" value="deactivate"></td>
                <td><input type="submit" name="action" value="destroy"></td>
                <input type="hidden" name="vh_temp" value="$_">
                <input type="hidden" name="vh_name_actdeactdest" value="$_"></tr>
                </form>
END_OF_HTML3
            }
            # anzeige des button activate wenn hoststatus = deaktiviert
            else {
print <<END_OF_HTML4;
                <form action="#" method="post">
                <tr bgcolor="red"><td>$_</td>
                <td><input type="submit" name="action" value="activate"></td>
                <td><input type="submit" name="action" value="destroy"></td>
                <input type="hidden" name="vh_temp" value="$_">
                <input type="hidden" name="vh_name_actdeactdest" value="$_"></tr>
                </form>
END_OF_HTML4
            }
        }
    }
    print "</table></form>";
}

my $cgi = new CGI;
#print "action#".$cgi->param('action')."#<br>";
#print "vh_name_x#".$cgi->param('vh_name_actdeactdest')."#<br>";
#print "vh#".$cgi->param('vh')."#<br>";

my $action = $cgi->param('action');

# notwendige variablen zum erstellen eines host (prozedur create)
my $vh_name_short = $cgi->param('vh') || "";
my $vh_name_create = $vh_name_short.".xxx-yyy.de";
my $vh_folder_create = $WEBROOT.$vh_name_create;
my $vh_config_create = $APACHE_VIRTUAL_HOSTS_AVAILABLE.$vh_name_create;
my $vh_log = $APACHE_LOG.$vh_name_create.".log";

# notwendige variablen zum aktivieren/deaktivieren/löschen eines host (prozedur activate, deactivate, destroy)
my $vh_name_actdeactdest = $cgi->param('vh_name_actdeactdest');
my $vh_folder_actdeactdest = $WEBROOT.$vh_name_actdeactdest;
my $vh_config_actdeactdest = $APACHE_VIRTUAL_HOSTS_AVAILABLE.$vh_name_actdeactdest;

# prozedur zur erstellung eines neuen host
sub create() {
    $vh_temp = $vh_name_create;
    find (\&check, $APACHE_VIRTUAL_HOSTS_AVAILABLE);
    # wenn angegebener name des host noch nicht existiert, nicht leer ist und nur aus buchstaben, ziffern, unter- und bindestrich besteht wird dieser angelegt
    if ($fail == 0 && $vh_name_short ne "" && $vh_name_short !~ /[^a-zA-Z0-9_-]/) {
        # erstellung verzeichnisse
        mkdir ($vh_folder_create,0775);
        mkdir ($vh_folder_create."_cgi-bin",0775);
        # mit schreibrechten für die gruppe, separat weil es mit mkdir nicht funktioniert
        chmod (0775,$vh_folder_create);
        chmod (0775,$vh_folder_create."_cgi-bin");
        # verzeichnisse werden dem nutzer www-data und der gruppe htadmin zugeordnet
        chown (33,1002,$vh_folder_create);
        chown (33,1002,$vh_folder_create."_cgi-bin");
        # erstellen der konfigdatei für neuen host in /etc/apache2/sites-available
        open (VHCONF, ">$vh_config_create");
        # die konfigdatei gehört nutzer root und gruppe root
        chown (0,0,$vh_config_create);
        # und wird mit inhalt gefüllt
        print VHCONF <<END_OF_VH;
<VirtualHost *:80>
    ServerName $vh_name_create
    ServerAlias $vh_name_short
    ServerAdmin webadmin\@xxx-yyy.de
    DocumentRoot $vh_folder_create
    ScriptAlias /cgi-bin/ $vh_folder_create\_cgi-bin/

    <Directory />
        Options FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

    CustomLog $vh_log vcombined
    CustomLog $APACHE_LOG_VACCESS vcombined

</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile $APACHE_CONFIG\/ssl/apache.crt
    SSLCertificateKeyFile $APACHE_CONFIG\/ssl/apache.key
    ServerName $vh_name_create
    ServerAlias $vh_name_short
    ServerAdmin webadmin\@xxx-yyy.de
    DocumentRoot $vh_folder_create
    ScriptAlias /cgi-bin/ $vh_folder_create\_cgi-bin/

    <Directory />
        Options FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

    CustomLog $vh_log vcombined
    CustomLog $APACHE_LOG_VACCESS vcombined

</VirtualHost>
END_OF_VH
        # neuer host wird aktiviert

        my $ensite = qx (/usr/sbin/a2ensite $vh_name_create);

print "Ensite: ".$ensite;

        # wenn die beiden zuvor angelegten verzeichnisse existieren und die ausgabe des aktivierungsbefehls "installed" enthält wurde der host erfolgreich angelegt und aktiviert
        if (-e $vh_folder_create && -e $vh_folder_create."_cgi-bin" && $ensite =~ /Enabling/) {
            print "Der Virtual Host <strong>$vh_name_create</strong> wurde erfolgreich angelegt.";
        }
        else {
            print "<font color='red'>Fehler: Der Virtuelle Host <strong>$vh_name_create</strong> konnte nicht angelegt werden.</font>";
        }
    }
    else {
        print "<font color='red'>Fehler: Der Virtual Host <strong>$vh_name_create</strong> existiert bereits oder der Name ist unzul&auml;ssig.</font>";
    }
    # prozeduraufruf "list" am ende jeder prozedur zur anzeige aller hosts
    list();
}

# prozedur zum aktivieren eines existierenden host
sub activate() {
    $vh_temp = $vh_name_actdeactdest;
    print "Vor schleife:". $vh_name_actdeactdest;
    find (\&check, $APACHE_VIRTUAL_HOSTS_ENABLED);
    # nur wenn datei $vh_temp in /etc/apache2/sites-enabled nicht existiert
    print "Ergebnis:". $fail;
    if ($fail == 0) {
        print "Vor enable:". $vh_name_actdeactdest;
        my $ensite = qx (/usr/sbin/a2ensite $vh_name_actdeactdest);
        print "Variable ensite:". $ensite;
        if ($ensite =~ /Enabling/) {
            print "Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> wurde erfolgreich aktiviert.";
            qx ("/etc/init.d/apache2 reload");
        }
        else {
            print "<font color='red'>Fehler: Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> konnte nicht aktiviert werden.</font>";
        }
    }
    else {
        print "<font color='red'>Der Virtual Host <strong>$vh_name_actdeactdest</strong> existiert nicht.</font>";
    }
    list();
}

# prozedur zum deaktivieren eines existierenden host
sub deactivate() {
    $vh_temp = $vh_name_actdeactdest;
    find (\&check, $APACHE_VIRTUAL_HOSTS_ENABLED);
    # nur wenn datei $vh_temp in /etc/apache2/sites-enabled existiert
    if ($fail == 1) {
        my $dissite = qx (/usr/sbin/a2dissite $vh_name_actdeactdest);
        qx (/usr/sbin/a2dissite $vh_name_actdeactdest);
        if ($dissite =~ /disabled/) {
            print "Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> wurde erfolgreich deaktiviert.";
            qx ("/etc/init.d/apache2 reload");
        }
        else {
            print "<font color='red'>Fehler: Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> konnte nicht deaktiviert werden.</font>";
        }
    }
    else {
        print "<font color='red'>Der Virtual Host <strong>$vh_name_actdeactdest</strong> existiert nicht.</font>";
    }
    list();
}

# prozedur zum löschen eines existierenden host
sub destroy() {
    $vh_temp = $vh_name_actdeactdest;
    find (\&check, $APACHE_VIRTUAL_HOSTS_AVAILABLE);
    # nur wenn datei $vh_temp in /etc/apache2/sites-available existiert
    if ($fail == 1) {
        # deaktivieren des host
        my $dissite = qx (/usr/sbin/a2dissite $vh_name_actdeactdest);
        # löschen der konfigdatei und webverzeichnisse
        unlink ($vh_config_actdeactdest);
        rmtree ($vh_folder_actdeactdest);
        rmtree ($vh_folder_actdeactdest."_cgi-bin");
        # wenn konfigdatei und webverzeichnisse nicht mehr existieren host gelöscht
        if (! -e $vh_folder_actdeactdest && ! -e $vh_folder_actdeactdest."_cgi-bin" && ! -e $vh_config_actdeactdest) {
            print "Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> wurde erfolgreich gel&ouml;scht.";
        }
        else {
            print "Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> konnte nicht gel&ouml;scht werden.";
        }
        qx (/etc/init.d/apache2 reload);
    }
    else {
        print "<font color='red'>Der Virtual Host <strong>$vh_name_actdeactdest</strong> existiert nicht.</font>";
    }
    list();
}

sub check {
    return ($fail = 1) if (-e $vh_temp);
    return ($fail = 0) if (! -e $vh_temp);
}

# mögliche aktionen
if ($action eq "" || $action eq "list") {
    list(); }
elsif ($action eq "create") {
    create(); }
elsif ($action eq "activate") {
    activate(); }
elsif ($action eq "deactivate") {
    deactivate(); }
elsif ($action eq "destroy") {
    destroy(); }

# ende der html-ausgabe
print <<END_OF_HTML5;
</div>
</body>
</html>
END_OF_HTML5

exit;
# neustart des apache-prozesses
qx (/etc/init.d/apache2 restart);


  1. Tach,

    Debian 6.0 - Apache/2.2.16 perl, v5.10.1 zum laufen bringen, aber es funktioniert nicht, d.h. virtuelle Hosts werden zwar angelegt und können gelöscht werden, aber aktiviert und deaktiviert funktioniert leider nicht. Ich weis leider nicht weiter....

    dann schau dir doch mal die Ausgaben der aufgerufenen Programme an ($ensite, $dissite), ob ein Fehler auftritt oder ob vielleicht nur die Ausgaben anders sind, als das Script sie erwartet.

    mfg
    Woodfighter

    1. Tach,

      Debian 6.0 - Apache/2.2.16 perl, v5.10.1 zum laufen bringen, aber es funktioniert nicht, d.h. virtuelle Hosts werden zwar angelegt und können gelöscht werden, aber aktiviert und deaktiviert funktioniert leider nicht. Ich weis leider nicht weiter....

      dann schau dir doch mal die Ausgaben der aufgerufenen Programme an ($ensite, $dissite), ob ein Fehler auftritt oder ob vielleicht nur die Ausgaben anders sind, als das Script sie erwartet.

      mfg
      Woodfighter

      Hallo Woodfighter..

      das habe ich auch schon und das Script angepasst. :-(

      1. Tach,

        dann schau dir doch mal die Ausgaben der aufgerufenen Programme an ($ensite, $dissite), ob ein Fehler auftritt oder ob vielleicht nur die Ausgaben anders sind, als das Script sie erwartet.

        das habe ich auch schon und das Script angepasst. :-(

        und, wie lauten sie, was passiert, was passiert nicht?

        mfg
        Woodfighter

        P.S. Bitte zitiere nur den relevanten Teil, das macht alles übersichtlicher.

        1. und, wie lauten sie, was passiert, was passiert nicht?

          Also normalerweise wird ein vhost angelegt, in dem in

          /etc/apache2/sites-available/

          die Konfigurationsdateien angelegt werden.

          Der vhost wird aktiviert, in dem mit

          cd /etc/apache2/sites-enabled/
          ln  /etc/apache2/sites-available/DER_VHOST.conf ./DER_VHOST.conf
          oder ln -s /etc/apache2/sites-available/DER_VHOST.conf ./DER_VHOST.conf

          ein Link von

          /etc/apache2/sites-available/DER_VHOST.conf
          nach
          /etc/apache2/sites-enabled/DER_VHOST.conf

          gelegt wird. Du kannst natürlich auch Verwirrung stiften, in dem Du die Dateien kopierst

          Der vhost wird deaktiviert, in dem der Link

          /etc/apache2/sites-enabled/DER_VHOST.conf

          gelöscht wird. Was davon funktioniert nicht?

          Der vhost wird gelöscht, in dem (soweit vorhanden!) erst:

          /etc/apache2/sites-enabled/DER_VHOST.conf und dann /etc/apache2/sites-available/DER_VHOST.conf gelöscht wird.

          Danach reload der Konfiguration - übrigens findet dabei ein Test der Konfiguration statt, geht der schief verweigert der Apache tapfer das Reload. Hole Dir auch auch dessen Rückgaben aus der Error-Konsole eventuell aus dem error-log.

          =====================================================================
          Thomas: Schaue bitte auch nach, was GENAU davon "nicht funktioniert".

          Jörg Reinholz

          1. Läuft das Script unter dem APache-User per Webinterface oder als CLI?
            Hat der entsprechende User die Berechtigungen, um Links anzulegen?
            Wird evtl. der PATH vor der Ausführung verbogen?

            1. Tach,

              Läuft das Script unter dem APache-User per Webinterface oder als CLI?
              Hat der entsprechende User die Berechtigungen, um Links anzulegen?

              aus dem Originalpost: „-rwsr-xr-T 1 root htadmin 9986 11. Feb 14:32 vh10.pl“

              Das Script läuft mit setuid root.

              mfg
              Woodfighter

              1. Hallo,

                entschuldigt bitte, dass ich einen Teil vergessen habe mitzuschreiben.

                1. Das anlegen der virtuellen Host funktioniert, d.h. alle notwendigen Dateien werden angelegt. Beim anlegen soll er auch gleich den Host aktivieren, aber das funktioniert nicht.

                2. Das nachträgliche aktivieren schlägt ebenso fehl, d.h. die Variable ist zwar mit dem Namen gefüllt. aber die Meldung kommt, dass der Host nicht aktiviert werden kann

                3. das Löschen des Host's mittels destroy funktioniert auch wunderbar...

                1. Deinen Ausführungen nach müsste es ergo an folgendem Abschnitt liegen:

                  my $ensite = qx (/usr/sbin/a2ensite $vh_name_actdeactdest);  
                          print "Variable ensite:". $ensite;  
                          if ($ensite =~ /Enabling/) {  
                              print "Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> wurde erfolgreich aktiviert.";  
                              qx ("/etc/init.d/apache2 reload");  
                          }  
                          else {  
                              print "<font color='red'>Fehler: Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> konnte nicht aktiviert werden.</font>";  
                          }
                  

                  Überprüfe also die Ausgaben von /usr/sbin/a2ensite. Und zwar darauf, ob es die erwartete Ausgabe macht - Es soll laut Skript den String "Enabling" enthalten. Auch für uns wären GENAU diese Ausgaben von höchsten Interesse.

                  Ich will nicht verschweigen, dass das Skript etwas seltsam ist. Normalerweise würde man nicht per se die Ausgaben von /usr/sbin/a2ensite auswerten (das kann man dem fehlerfall vorbehalten).

                  Bei mir sieht das in der Shell im Fehlerfall so aus:

                  fastix@trainer:~$ sudo bash
                  root@trainer:~# txt=a2ensite 010\_dummy 2>&1;echo $?
                  1
                  root@trainer:~# echo $txt
                  ERROR: Site 010_dummy does not exist!
                  root@trainer:~#

                  Im Erfolgsfall:

                  root@trainer:~# txt=a2ensite 009\_src.selfhtml.org 2>&1;echo $?
                  0
                  root@trainer:~#

                  Passe also Dein Skript an und werte aus, ob a2ensite Konfigurationsname einen Fehler wirft. ($? ist im Fehlerfall verschieden von 0) oder keinen. Den Text auszuwerten ist immer dann fragwürdig, wenn man den gar nicht haben will - der kann sich ändern. ich vermute aber nicht, dass es hier daran liegt. Ich denke, a2ensite stolpert wahrscheinlich über Rechte.

                  Übrigens: Auch das Neuladen der Apache-konfiguration muss auf die gleiche Weie überwacht werden, der Neustart ganz am Ende des Skriptes ist höchst unnötig.

                  Jörg Reinholz

                  1. Noch was:

                    Hier überhaupt mit Perl auf die Shell zu schießen halte ich für Unsinn. Wenn ich das Skript so durchsehe, dann werden praktisch alle relevanten Sachen in der Shell erledigt qx().

                    Wenn Perl als CGI läuft müsste dazu in der Apache-Konfig nur eine Zeile und das Skript angepasst werden.

                    AddHandler cgi-script .cgi .pl  .sh

                    Natürlich müsste das Skript auch noch angepasst (umgeschrieben) werden. Aber mit dem häufigen Kontextwechsel werden Probleme geschaffen, die man ohne diese nicht hätte.

                    Alternativ:

                    Wie wäre es denn, gleich ein Shell-Skript zu verwenden oder eben auch das Anlegen der Links statt von a2ensite durch etwas viel einfacheres zu ersetzen? a2ensite setzt nur einen symbolischen Link von /etc/apache2/sites/available/DATEI nach /etc/apache2/sites-enabled/LINK bzw. löscht den.  Das Einschalten geht auch mit ls -s quelle ziel, das Abschalten mit rm /etc/apache2/sites-enabled/LINK

                    Insofern ist neben perl auch a2ensite hier so unnötig wie ein Kropf, weil es alles nur komplizierter macht.

                    Jörg Reinholz

                  2. Hallo Jörg,

                    wenn ich als User "root" auf der Shell:

                    root@sdvweb10:~# /usr/sbin/a2ensite test1.xxx-yyy.de  
                    Enabling site test1.xxx-yyy.de.  
                    Run '/etc/init.d/apache2 reload' to activate new configuration!  
                    
                    

                    Daher hatte ich das Enabling in das Script hineingesetzt.

                    Die apache-error log sagt mir beim anlegen eines Hosts folgendes:

                      
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Use of uninitialized value $vh_name_actdeactdest in concatenation (.) or string at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 104., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Use of uninitialized value $vh_name_actdeactdest in concatenation (.) or string at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 105., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chdir while running setuid at /usr/share/perl/5.10/File/Find.pm line 773., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in mkdir while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 114., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in mkdir while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 115., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chmod while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 117., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chmod while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 117., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chmod while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 118., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chmod while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 118., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chown while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 120., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chown while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 120., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chown while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 121., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chown while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 121., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in open while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 123., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chown while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 125., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chown while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 125., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in `` while running setuid at /var/www/vh10.xxx-yyy.de_cgi-bin/vh10.pl line 171., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] Insecure $ENV{PATH} while running setuid at /usr/sbin/a2ensite line 331., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chdir while running setuid at /usr/share/perl/5.10/File/Find.pm line 773., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chdir while running setuid at /usr/share/perl/5.10/File/Find.pm line 773., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chdir while running setuid at /usr/share/perl/5.10/File/Find.pm line 773., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chdir while running setuid at /usr/share/perl/5.10/File/Find.pm line 773., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chdir while running setuid at /usr/share/perl/5.10/File/Find.pm line 773., referer: http://vh10/cgi-bin/vh10.pl  
                    [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chdir while running setuid at /usr/share/perl/5.10/File/Find.pm line 773., referer: http://vh10/cgi-bin/vh10.pl  
                      
                    
                    
                    1. Tach,

                      Die apache-error log sagt mir beim anlegen eines Hosts folgendes:

                      [Tue Mar 12 14:06:41 2013] [error] [client IP.IP.IP.IP] [Tue Mar 12 14:06:41 2013] vh10.pl: Insecure dependency in chdir while running setuid at /usr/share/perl/5.10/File/Find.pm line 773., referer: http://vh10/cgi-bin/vh10.pl

                        
                      <https://www.washington.edu/perl5man/pod/perlsec.html>  
                        
                      Klingt, als ob der Aufruf von a2ensite nicht mehr so einfach für dich machbar sein wird.  
                        
                      mfg  
                      Woodfighter
                      
                      1. Die verlinkte Dokumentation ist von vor 16 Jahren und somit veraltet. Bitte vermeide diesen Fehler in Zukunft und verlinke immer auf die Original-Doku.

                        Die aktuelle Version befindet sich unter http://p3rl.org/sec (Permalink).

                        1. Tach,

                          Die verlinkte Dokumentation ist von vor 16 Jahren und somit veraltet. Bitte vermeide diesen Fehler in Zukunft und verlinke immer auf die Original-Doku.

                          Die aktuelle Version befindet sich unter http://p3rl.org/sec (Permalink).

                          ah danke, war vermutlich der erste Google-Treffer zum Thema.

                          mfg
                          Woodfighter

                    2. Die apache-error log sagt mir beim anlegen eines Hosts folgendes:

                      Die ersten beiden Warnungen musst Du schon selbst abfangen:

                      Use of uninitialized value $vh_name_actdeactdest

                      Tja. Diese hier "Insecure dependency in PROGRAMMNAME while running setuid" sagen mir, dass wie ich mir schon dachte, etwas mit den Rechten nicht stimmt.

                      Lösung:

                      Nimm nicht den root als Eigentümer, sondern lege einen weiteren Benutzer mit eingeschränkten Rechten an.
                      Gib diesem mit einer ACL Rechte (rwx) an /etc/apache2/sites-enabled und /etc/apache2/sites-available.

                      Gib diesem in /etc/sudoers GENAU das Recht /etc/init.d/apache2 reload als root auszuführen, besser /usr/bin/service apache2 reload. Im Zweifelsfall schreibe beides in eines Schell-Skript, teste darin, was da ist und lass es nur von root ausführen (und schreiben!) - mit einem Eintrag für den  angelegten Benutzer  in /etc/sudoers.

                      Im Skript dann qx('/usr/bin/sudo /etc/init.d/apache2 reload');
                      Übrigens wirst Du bald qx('/usr/bin/sudo /usr/bin/service apache2 reload') angeben müssen.

                      Ansonsten gilt: Was Du da treibst ist SEHR gefährlich. Du nimmst ein Perl-Skript, darin übernimmst Du - ohne Taint-Modus - Werte aus der Umgebung (hier auch noch Eingaben aus einem Webformular)  und willst - als root - damit im System herumpfuschen?

                      Da hat man inzwischen wohl schon einiges davon verhindert.

                      Jörg Reinholz

                2. Tach,

                  entschuldigt bitte, dass ich einen Teil vergessen habe mitzuschreiben.

                  1. Das anlegen der virtuellen Host funktioniert, d.h. alle notwendigen Dateien werden angelegt. Beim anlegen soll er auch gleich den Host aktivieren, aber das funktioniert nicht.

                  2. Das nachträgliche aktivieren schlägt ebenso fehl, d.h. die Variable ist zwar mit dem Namen gefüllt. aber die Meldung kommt, dass der Host nicht aktiviert werden kann

                  3. das Löschen des Host's mittels destroy funktioniert auch wunderbar...

                  das hatte ich deinem Post schon entnommen, aber, um dir zu helfen, müssen wir genau wissen, was schiefläuft. Wird a2ensite gefunden und ausgeführt, was wird ausgegeben, werden die Links angelegt?

                  mfg
                  Woodfighter

  2. Tach,

    my $vh_name_actdeactdest = $cgi->param('vh_name_actdeactdest');
    […]
            my $ensite = qx (/usr/sbin/a2ensite $vh_name_actdeactdest);

      
    ich würde mal davon ausgehen, dass man durch das fehlende Escaping, hier belibigen Code als root ausführen kann, indem man z.B. vh\_name\_actdeactdest als „test;ls -la /root“ übergibt. Hier sollte $vh\_name\_actdeactdest in einfache Anführungszeichen gepackt werden qx (/usr/sbin/a2ensite '$vh\_name\_actdeactdest') und ebenso müssen alle weiteren Aufrufe von qx behandelt werden.  
      
    mfg  
    Woodfighter