S
server4downs
Guest
Hallo zusammen.
Hier kommt das ultimative, langerwartete, geniale, einzigartige HowTo...
Note: Please click here to see the English version.
Achtung! Dieses HowTo richtet sich an fortgeschrittene Linux-Serveradministratoren!
Es werden grundlegende Linux-Kenntnisse (u.a. auch Apache-Kenntnisse etc) vorausgesetzt.
Ziel dieses HowTo's:
- PHP4 und PHP5 parallel laufen zu lassen und
- trotzdem nicht auf open_basedir verzichten
Voraussetzungen:
- Linux-Webserver
- Apache 1.xx oder 2.xx
- gute Linuxkenntnisse (es wird auf Grundlagen aufgebaut)
- 20 Minuten Zeit
- 20 Liter Bier (Erfolg feiern, bzw. Frusttrinken)
So, nun geht´s los:
Kleine Geschichte zum Anfang:
Wer kennt das Problem nicht? Man will einerseits auf PHP4 nicht verzichten (z.B. Kunden benötigen es noch) aber anderseits will man PHP5 testen.
Zwei Apache-Module auf ein und dem selben Webserver sind unmöglich (höchstens mit 2. Apache-Instanz, was hier nicht erklärt werden soll).
Nun ist guter Rat teuer. Um es nicht zu spannend zu machen:
Man muss zumindest eine Version als CGI-Version laufen lassen. Es empfiehlt sich hierbei jedoch nur z.B. PHP5 als CGI laufen zu lassen.
Wir gehen nun also davon aus, dass PHP4 schon als Apache-Modul installiert ist.
Kleiner Hinweis, wieso dieses HowTo als "einzigartig" bezeichnet wird:
Die CGI-Edition bringt den Nachteil mit sich, dass über den Apachen keine Einstellungen mehr an PHP vorgenommen werden können. D.h. dass Einstellungen, wie z.B. die open_basedir flachfallen. Und genau diese function wird in diesem HowTo gepatched. Denn ohne open_basedir sieht der Server nicht mehr unbedingt sicher aus. Man kann zwar einfach verschiedene Verzeichnis-Berechtigungen setzen, die verhindern, dass man vom einem Doc_Root in den Doc_Root des anderen Kunden gelangt, aber der Rest des Servers bleibt weitestgehend offen (siehe 1&1 Webhosting-Sever).
Um dies zu vermeiden habe ich mich an den Source von PHP4/5 rangemacht. Hierbei wird die open_basedir gefälscht. Es sollte jedoch kein Grund zur Sorge bestehen, dass dies ein unsicheres Workaround ist. Es wurde mehrfach und auf verschiedenen Maschinen getestet (Wahrscheinlichkeit eines Bugs: 0,00000000000000000000000001%).
Es werden KEINE C-Kenntnisse erfordert! (das habe ich schon erledigt).
So, nun gehts wirklich los:
1. PHP-Sources ziehen:
z.B.:
2. Entpacken:
3. In's Verzeichnis wechseln:
4. Configure ausführen:
z.B.:
Hinweis:
--enable-force-cgi-redirect wird zur CGI-Version benötigt. Hierbei darf kein apxs/apxs2 verwendet werden.
--with-mysql=/usr MySQL muss bei PHP5 mit eincompiliert werden.
Natürlich ist dies nur eine Minimal-Konfiguration. Weitere Dinger können selbstverständlich mit eingetippt werden.
5. ENTER schmettern
6. Abwarten. Configure läuft durch. Bei Fehlern bitte Google befragen. Meistens wird Configure wegen fehlender Header-Files meckern. Hierzu einfach diese installieren (devel-packages).
7. (optional) Die ersten 0,5l können getrunken werden. Je nach Servergeschwindigkeit können auch 1-2l getrunken werden.
8. Configure ist nun fröhlichst durchgerattert und ist mit einer Success-Meldung fertig.
9. Nun gehts erstmal an´s Patchen:
aufsuchen. Dies ist die Funktion, die wir faken werden.
d) Jetzt kommt der tricky part... wir fügen nun folgenden Code ein:
Erklärung hierzu (bitte genau lesen):
wird durch
ersetzt.
11. Warten... (Bier aufmachen und trinken)
12. Alles gut durchgelaufen? Super!
Dann jetzt:
reinkloppen
13. Warten. Files werden installiert!
14. Fertig mit PHP-Installation.
15. Ganze Geschichte nun auf Apache anwenden...
16. In Vhost-File, bzw. httpd.conf folgendes eintragen:
17. Natürlich kann man auch noch suexec einsetzen (empfohlen).
Hierzu biete ich jetzt allerdings kein HowTo an. Einfach unter gewünschtem User laufen lassen. Eventuell noch an suexec rumschrauben:
18. Nun werden alle *.php5 als PHP5-CGI geparst.
19. Entgültig fertig!
20. Geschafft!
21. Rest auftrinken!
Nachwort:
Das HowTo ist auch auf PHP4 anwendbar!
In diesem HowTo steckt massig Arbeit. Ich bitte dies zu berücksichtigen und aus diesem Thread deshalb keine Laber-Ecke zu machen.
Das HowTo ist für Fortgeschrittene Admins bestimmt. Deswegen fang ich auch nicht von NULL an bei der Beschreibung.
Sollte das HowTo euch wirklich gefallen haben, so freut sich CwCity.de jederzeit über eine Geldspende (Paypal).
Ich weise darauf hin, dass ich keinen kostenlosen Support per ICQ/MSN zu selbigem Thema anbiete!
Ich konnte auch nach wochenlangem Suchen keine Lösung über Google und PHP.net finden. Deshalb ist dieses HowTo etwas wirklich Besonderes!
Selbstverständlich können auch noch andere Lösungswege existieren.
Ich übernehme KEINE Haftung für dieses HowTo!
Copyright © 2005-2006 by server4downs at serversupportforum.de and PHP-Installation.de - Installation/Update PHP4, PHP5 Apache-Modul, CGI, suPHP, FastCGI, CLI
Stand des HowTos: 22.10.2005 (13:24Uhr)
Hier kommt das ultimative, langerwartete, geniale, einzigartige HowTo...
Note: Please click here to see the English version.
Achtung! Dieses HowTo richtet sich an fortgeschrittene Linux-Serveradministratoren!
Es werden grundlegende Linux-Kenntnisse (u.a. auch Apache-Kenntnisse etc) vorausgesetzt.
Ziel dieses HowTo's:
- PHP4 und PHP5 parallel laufen zu lassen und
- trotzdem nicht auf open_basedir verzichten
Voraussetzungen:
- Linux-Webserver
- Apache 1.xx oder 2.xx
- gute Linuxkenntnisse (es wird auf Grundlagen aufgebaut)
- 20 Minuten Zeit
- 20 Liter Bier (Erfolg feiern, bzw. Frusttrinken)
So, nun geht´s los:
Kleine Geschichte zum Anfang:
Wer kennt das Problem nicht? Man will einerseits auf PHP4 nicht verzichten (z.B. Kunden benötigen es noch) aber anderseits will man PHP5 testen.
Zwei Apache-Module auf ein und dem selben Webserver sind unmöglich (höchstens mit 2. Apache-Instanz, was hier nicht erklärt werden soll).
Nun ist guter Rat teuer. Um es nicht zu spannend zu machen:
Man muss zumindest eine Version als CGI-Version laufen lassen. Es empfiehlt sich hierbei jedoch nur z.B. PHP5 als CGI laufen zu lassen.
Wir gehen nun also davon aus, dass PHP4 schon als Apache-Modul installiert ist.
Kleiner Hinweis, wieso dieses HowTo als "einzigartig" bezeichnet wird:
Die CGI-Edition bringt den Nachteil mit sich, dass über den Apachen keine Einstellungen mehr an PHP vorgenommen werden können. D.h. dass Einstellungen, wie z.B. die open_basedir flachfallen. Und genau diese function wird in diesem HowTo gepatched. Denn ohne open_basedir sieht der Server nicht mehr unbedingt sicher aus. Man kann zwar einfach verschiedene Verzeichnis-Berechtigungen setzen, die verhindern, dass man vom einem Doc_Root in den Doc_Root des anderen Kunden gelangt, aber der Rest des Servers bleibt weitestgehend offen (siehe 1&1 Webhosting-Sever).
Um dies zu vermeiden habe ich mich an den Source von PHP4/5 rangemacht. Hierbei wird die open_basedir gefälscht. Es sollte jedoch kein Grund zur Sorge bestehen, dass dies ein unsicheres Workaround ist. Es wurde mehrfach und auf verschiedenen Maschinen getestet (Wahrscheinlichkeit eines Bugs: 0,00000000000000000000000001%).
Es werden KEINE C-Kenntnisse erfordert! (das habe ich schon erledigt).
So, nun gehts wirklich los:
1. PHP-Sources ziehen:
z.B.:
Code:
wget http://de3.php.net/get/php-5.0.5.tar.gz/from/this/mirror
Code:
tar xfz php-5.0.5.tar.gz
Code:
cd php-5.0.5
z.B.:
Code:
./configure --prefix=/usr/share/php5 --datadir=/usr/share/php5 --bindir=/usr/bin/php5 --libdir=/usr/share/php5 --with-config-file-path=/etc/php5 --with-exec-dir=/usr/lib/php5/bin --enable-memory-limit [B]--enable-force-cgi-redirect[/B] --enable-track-vars [B]--with-mysql=/usr[/B] --without-pear --enable-session --without-sqlite --enable-exif
--enable-force-cgi-redirect wird zur CGI-Version benötigt. Hierbei darf kein apxs/apxs2 verwendet werden.
--with-mysql=/usr MySQL muss bei PHP5 mit eincompiliert werden.
Natürlich ist dies nur eine Minimal-Konfiguration. Weitere Dinger können selbstverständlich mit eingetippt werden.
5. ENTER schmettern
6. Abwarten. Configure läuft durch. Bei Fehlern bitte Google befragen. Meistens wird Configure wegen fehlender Header-Files meckern. Hierzu einfach diese installieren (devel-packages).
7. (optional) Die ersten 0,5l können getrunken werden. Je nach Servergeschwindigkeit können auch 1-2l getrunken werden.
8. Configure ist nun fröhlichst durchgerattert und ist mit einer Success-Meldung fertig.
9. Nun gehts erstmal an´s Patchen:
a) Mit einem beliebigen Editor die Datei /php-5.0.5/main/fopen_wrappers.c öffnen (z.B. mit vi)
b) Nun die Zeile mit dem Inhalt
Code:
PHPAPI int php_check_open_basedir_ex(const char *path, int warn TSRMLS_DC)
c) Nun gehen wir noch ein paar Zeilen runter und bewegen uns mit dem Cursor unter folgenden Auszug:
Code:
if (PG(open_basedir) && *PG(open_basedir)) {[/COLOR][/COLOR][/INDENT][/COLOR][/COLOR][/INDENT]
[COLOR=Indigo][COLOR=Black][INDENT][COLOR=Indigo][COLOR=Black][INDENT] char *pathbuf;[/INDENT][/INDENT]
[INDENT][INDENT] char *ptr;[/INDENT][/INDENT]
[INDENT][INDENT] char *end;
Code:
/*faked base_dir */[/INDENT][/INDENT]
[INDENT][INDENT][/INDENT][/INDENT]
[INDENT][INDENT] char awesome[MAXPATHLEN];[/INDENT][/INDENT]
[INDENT][INDENT] char pathstuff[MAXPATHLEN];[/INDENT][/INDENT]
[INDENT][INDENT] int counter = 0;[/INDENT][/INDENT]
[INDENT][INDENT] strlcpy(awesome, "", sizeof(awesome));[/INDENT][/INDENT]
[INDENT][INDENT] strlcpy(pathstuff, SG(request_info).path_translated, sizeof(pathstuff));[/INDENT][/INDENT]
[INDENT][INDENT] int i;[/INDENT][/INDENT]
[INDENT][INDENT] for(i = 0; pathstuff[i]; i++)[/INDENT][/INDENT]
[INDENT][INDENT] {[/INDENT][/INDENT]
[INDENT][INDENT] if(pathstuff[i] == '/')[/INDENT][/INDENT]
[INDENT][INDENT] counter++;[/INDENT][/INDENT]
[INDENT][INDENT] if(counter == [COLOR=Red][B]6[/B][/COLOR])[/INDENT][/INDENT]
[INDENT][INDENT] {[/INDENT][/INDENT]
[INDENT][INDENT] pathstuff[i+1] = 0;[/INDENT][/INDENT]
[INDENT][INDENT] strlcpy(awesome, pathstuff, sizeof(awesome));[/INDENT][/INDENT]
[INDENT][INDENT] break;[/INDENT][/INDENT]
[INDENT][INDENT] }[/INDENT][/INDENT]
[INDENT][INDENT] }[/INDENT][/INDENT]
[INDENT][INDENT][/INDENT][/INDENT]
[INDENT][INDENT] strlcat(awesome, ":/other/base/dirs/dude/:/tmp/", sizeof(awesome));[/INDENT][/INDENT]
[INDENT][INDENT][/INDENT][/INDENT]
[INDENT][INDENT] /* end! */
Dieser Patch basiert auf folgendem Gedankengut:
Jeder sollte beim Hosting auf eine gewisse Verzeichnisbaumstruktur seiner User achten.
Beispiel:
Doc_Root: /home/www/hostedstuff/users/username/
Hierbei sollte beachtet werden, dass /username durch den Username oder sonst was ersetzt wird.
Das Script (oben) checkt nun einfach den jeweils aufgerufenen Scriptpfad ab und ermittelt hierdurch den Doc_Root.
Hierbei wird einfach nach "/" gesucht. Hier muss nun bis 6x "/" durchlaufen werden und dieser String wird dann als Doc_Root verwendet.
Beispiel:
Username: sweetheart
Dieser User ruft nun sein Script fools.php im Ordner /donuts auf.
Script-Path: /home/www/hostedstuff/users/sweetheart/donuts/fools.php
Dies wird nun sofort von unserem Script analysiert und heraus kommt der Doc_Root
/home/www/hostedstuff/users/sweetheart/ in welchen der User eingesperrt werden soll.
Hinzu kommen dann noch zusätzliche open_basedirs, welche mit ":" getrennt werden. Dies ist jedoch optional und kann auch rausgelassen werden.
Das Geniale an diesem Patch ist, dass es auch mit Mass-Hosting-Solutions arbeitet (mod_vhost_alias).
d) Nun muss noch der Funktionsaufruf geändert werden:
Code:
pathbuf = estrdup(PG(open_basedir));
Code:
pathbuf = estrdup(awesome);
e) nun speichern wir die ganze Geschichte ab! (von Editor zu Editor anders deshalb keine Beschreibung)
f) Editor verlassen.
g) erfolgreich gepatcht. Herzlichen Glückwunsch. Was dich jetzt 5 Minuten gekostet hat ist nur durch fast 5 monatiger Arbeit an diesem Patch möglich. Hier steckt wirklich viel Arbeit und die damit verbundenen Hirnzellen drinnen. Ich bitte deshalb den Code nicht ins Lächerlich zu ziehen (ich bin kein Profi).
h) (optional) wir leisten uns nun nochmals ein Bier
10. Wir kommen nun zum make-Befehl:
Code:
make
12. Alles gut durchgelaufen? Super!
Dann jetzt:
Code:
make install
13. Warten. Files werden installiert!
14. Fertig mit PHP-Installation.
15. Ganze Geschichte nun auf Apache anwenden...
16. In Vhost-File, bzw. httpd.conf folgendes eintragen:
Code:
<Directory "/usr/bin/php5">
AllowOverride None
Options +ExecCGI +FollowSymLinks
Order allow,deny
Allow from all
</Directory>
ScriptAlias /php5rocks /usr/bin/php5
Action php5-cgi /php5rocks/php
AddType php5-cgi .php5
Hierzu biete ich jetzt allerdings kein HowTo an. Einfach unter gewünschtem User laufen lassen. Eventuell noch an suexec rumschrauben:
Mini HowTo: suexec neukompilieren
Hallo zusammen, ich wollte hier einfach mal schnell posten wie man an suexec Änderungen vornehmen kann ohne gleich den gesamten Apachen neuaufzusetzen. -Wieso kann man denn nicht einfach Änderungen einfach so durchführen, ohne zu kompilieren? Das geht wegen verschiedenen Security-Issues...
serversupportforum.de
19. Entgültig fertig!
20. Geschafft!
21. Rest auftrinken!
Nachwort:
Das HowTo ist auch auf PHP4 anwendbar!
In diesem HowTo steckt massig Arbeit. Ich bitte dies zu berücksichtigen und aus diesem Thread deshalb keine Laber-Ecke zu machen.
Das HowTo ist für Fortgeschrittene Admins bestimmt. Deswegen fang ich auch nicht von NULL an bei der Beschreibung.
Sollte das HowTo euch wirklich gefallen haben, so freut sich CwCity.de jederzeit über eine Geldspende (Paypal).
Ich weise darauf hin, dass ich keinen kostenlosen Support per ICQ/MSN zu selbigem Thema anbiete!
Ich konnte auch nach wochenlangem Suchen keine Lösung über Google und PHP.net finden. Deshalb ist dieses HowTo etwas wirklich Besonderes!
Selbstverständlich können auch noch andere Lösungswege existieren.
Ich übernehme KEINE Haftung für dieses HowTo!
Copyright © 2005-2006 by server4downs at serversupportforum.de and PHP-Installation.de - Installation/Update PHP4, PHP5 Apache-Modul, CGI, suPHP, FastCGI, CLI
Stand des HowTos: 22.10.2005 (13:24Uhr)
Last edited by a moderator: