Perl-Script zum anlegen Virtueller Hosts
Thomas
- perl
0 Jens Holzkämper0 Thomas0 Jens Holzkämper0 Jörg Reinholz0 M.
0 Jens Holzkämper
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ä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öscht.";
}
else {
print "Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> konnte nicht gelö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);
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
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. :-(
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.
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.
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?
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
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...
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).
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:~#
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.
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.
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
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
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).
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
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.
Tach,
entschuldigt bitte, dass ich einen Teil vergessen habe mitzuschreiben.
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.
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
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
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