PDA

Bekijk Volledige Versie : Veilige/snelle/handige PHP Installatie



Cybafish
08/11/03, 19:58
Oké, aangezien er nogal wat discussie was over hoe PHP op een shared hosting server het beste gedraaid kan worden post ik hier even kort mijn ervaringen en oplossingen en vervolgens de manier om PHP te draaien zoals ik denk dat het 't beste is. Houd er wel rekening mee dat ik absoluut geen verantwoordelijkheid neem indien je hele server vastslaat, hoewel alles zou moeten werken kan ik niets garanderen. Ik raad je dan ook aan om de installatie eerst te proberen op een test server!

1. Verschillende manieren om PHP te draaien
Een groot probleem op shared hosting servers met scripting is de veiligheid, altijd al zo geweest. De ene user kan met wat handigheidjes gemakkelijk de bestanden van de andere user inlezen. Hiervoor zijn vele "oplossingen", de ene beter dan de andere.

- PHP in safe mode draaien
- Open_basedir tweak
- PHPsuExec
- SuPHP

PHP in safe mode draaien brengt de nodige bezwaren met zich mee. Het is namelijk zo dat bij safe_mode sommige commando's in PHP uitgesloten zijn, tot grote ergernis van de gebruikers. Een van de meest voorkomende klachten is dat het "system();" commando niet langer werkt.

Open_basedir is een simpele aanvulling op PHP. Met open_basedir kun je per user instellen welke directory's hij mag uitlezen. Klinkt mooi, maar werkt niet altijd even goed. open_basedir is namelijk te omzeilen met commando's als system();.

Voordat ik PHPsuExec kan uitleggen is enige voorkennis vereist. Het is namelijk zo dat PHP op twee manieren gedraaid kan worden. Ofwel via een apache module (mod_php) óf via de binary (/usr/bin/php). Dit laatste wordt ookwel "CGI-mode" genoemd. De apache module is de meest gebruikte manier om PHP te installeren. Het werkt snel, efficiënt, makkelijk maar daarnaast ook erg onveilig. De apache_module stuurt namelijk uiteindelijk ook gewoon /usr/bin/php aan, echter doet hij dit met de gebruikersnaam van apache. Je hebt dus als systeembeheerder zo goed als geen zicht op wie welk PHP script uitvoert. Tevens wordt alle mail die verzonden wordt via het PHP mail(); commando verzonden via de user van apache. Niet alleen krijgt een gebruiker op die manier de kans om vanaf jouw hostname mail te versturen, maar jij hebt als systeembeheerder geen zicht op het mail verkeer vanaf PHP. Iemand kan dus op die manier spam verzenden zonder dat je weet dat hij het was.

PHPsuExec laat PHP draaien op een “derde” manier. PHPsuExec zorgt er namelijk voor dat alle PHP scripts worden uitgevoerd met /usr/bin/php (de eerder beschreven CGI mode”) maar dan wel met de username van de eigenaar van de apache virtualhost. Een klein voorbeeld ter verduidelijking: http://www.futureflex.nl/ is een virtualhost met de username “futurefl”. Als PHPsuExec op deze server zou draaien dan zou iedere PHP file op futureflex.nl uitgevoerd worden door de user “futurefl”. Dit heeft als groot voordeel dat je precies kunt nagaan welke user welk PHP script uitvoert. Het zorgt er tevens voor dat ook de mail via PHP mail(); wordt verstuurd door de betreffende username. Het komt er uiteindelijk op neer dat PHPsuExec álle PHP scripts uitvoert via de juiste username, in plaats van via de username van apache. Dit alles klinkt bijna ideaal, alleen werkt het in de praktijk wat minder goed dan verwacht. “Internal Server Error” ’s zijn aan de orde van de dag met PHPsuExec. PHPsuExec valt dus net als de bovenste drie methoden af als geschikte kandidaat voor een goede PHP compilatie.

Als laatste methode komt dan “SuPHP”. SuPHP werkt grofweg hetzelfde als PHPsuExec, allen werkt SuPHP wél goed. Dus zonder Internal Server Errors en andere poespas. SuPHP is dan ook de beste methode om PHP in een veilige omgeving te draaien en deze zal ik dan ook verder uitwerken in de rest van de guide.

2. SuPHP en performance
Een veelgenoemd bezwaar van menig systeembeheerder om SuPHP te draaien is dat het de performance van de server zou drukken. Ik heb echter zelf geconcludeerd dat niets minder waar is. Het tegendeel dunkt mij zelfs: SuPHP genereert een webpagina sneller dan de standaard apache module! Hoewel ik niet zeker weet waarom heb ik een sterk vermoeden dat dit is omdat apache niet hoeft te wachten op zijn eigen PHP module tijdens het verzenden van een webpagina naar de eindgebruikerm, aangezien de standaard apache bewerkingen simultaan met de PHP code uitgevoerd kunnen worden.

3. SuPHP Installatie
SuPHP werkt alleen i.c.m. linux. Windows gebruikers kunnen dan ook beter hier stoppen met lezen en zich afvragen waarom ze hun portomonnaie zo wijd hebben opengetrokken voor een systeem dat ’s werelds meest gebruikte scripting taal slecht ondersteunt ;)

Ik heb SuPHP succesvol geïnstalleerd op Linux Redhat servers i.c.m. cPanel/WHM, maar ook op Redhat servers zonder control panel. Daarvan kan ik dus zeggen dat het mogelijk is. Of het mogelijk is i.c.m. bijv. Ensim of Plesk kan ik niet garanderen. Tevens kan de installatie guide iets afwijken indien je een andere linux distro gebruikt dan Redhat.

3.1 Benodigdheden voor een SuPHP installatie
- Apache
- PHP
- SuPHP
- Evt. Add-ons voor de compilatie zoals GCC etc., deze zijn echter vaak al geinstalleerd.

3.2 Voorbereidingen
Allereerst dien je apache 1.3.x te installeren, dit ga ik verder niet uitleggen, dat moet je gewoon kunnen :)

Als apache geïnstalleerd is log je in op je server met gebruikersnaam root. Maak een mapje aan in de /root directory genaamd “tempinstall” o.i.d. met het “mkdir” commando.

Browse naar deze directory met het “cd” commando. Eenmaal in de directory aangekomen gaan we even de benodigde bestanden ophalen.

- PHP (in dit geval versie 4.3.4) http://nl2.php.net/get/php-4.3.4.tar.gz/from/this/mirror
- SuPHP http://www.suphp.org/download/suphp-0.3.1.tar.gz

Hiervoor geef je achtereenvolgens de commando’s “wget http://nl2.php.net/get/php-4.3.4.tar.gz/from/this/mirror “ en “wget http://www.suphp.org/download/suphp-0.3.1.tar.gz”.

3.3 PHP compileren
Nu de vereiste bestanden binnen zijn kan het feest beginnen. Allereerst moet je php compileren. Dit kan met een hele waslijst van bijkomende module’s, deze kun je al dan niet toevoegen bij het configure commando. In deze guide geef ik een hele basic setup van PHP om compicaties te vermijden indien jullie zelf aan de slag gaan.

Voor de ervaren gebruikers: ik heb het zelf gecompileerd met xml, bcmath, calendar, curl, ftp, gd, jpeg, png, xpm, gettext, mbstring, mbsring encriptie, mbregex, mcrypt, mhash, magic quotes, mysql, pear, socketsupport, track-vars, zlib en ttf en geen problemen ondervonden.

Voor de basic install pakken we php-4.3.4.tar.gz uit met het commando “tar –zxvf php-4.3.4.tar.gz” en gaan we naar de extraction map. (cd php-4.3.4)

Aldaar voer je achtereenvolgens de volgende commando’s uit:

“./configure”
“make”
“make install”

Als je hiermee klaar bent kun je checken of alles goed is geïnstalleerd met het commando “/usr/bin/php –v”. Staat er vervolgens iets in de trant van

“PHP 4.3.4 (cgi) (built: Nov 4 2003 16:57:42)
Copyright (c) 1997-2003 The PHP Group”

dan is de installatie gelukt :)

3.4 SuPHP compileren
PHP is geïnstalleerd, nu SuPHP nog! Hiervoor moeten we eerst weer SuPHP uitpakken met het commando “tar –zxvf suphp-0.3.1.tar.gz”. Browse daarna naar de map waarin suphp is uitgepakt.

Voordat we verder kunnen moet je nagaan onder welke username apache draait. Deze username moet je namelijk in de onderstaande ./configure reeks invullen. Je kunt de username vinden door in Apache’s httpd.conf te zoeken naar “User”. Uiteindelijk kom je dan uit op de plek waar apache’s username gedefinieerd staat.

Als je weet onder welke username apache draait kun je naar de map van suphp gaan. Aldaar voer je de volgende commando’s uit:

“chmod +x ./configure”
“./configure –with-php=/usr/bin/php –with-apache-user=<username>”
“make”
“make install”

SuPHP is dan geïnstalleerd. Nu zijn er echter nog een aantal modificaties benodigd aan apache. Open hiervoor Apache’s httpd.conf met een editor, bijvoorbeeld “vi” of “pico”.

Als je PHP al had geïnstalleerd met apache via de standaard apache module dan dien je eerst een aantal dingen te “commentariseren”. Dit doe je door er een # voor te zetten.

Zoek allereerst naar “AddModule” en commentariseer “AddModule mod_php4.c”.

Zoek vervolgens naar “LoadModule” en commentariseer “LoadModule php4_module libexec/libphp4.so”.

Het kan tevens zo zijn dat je PHP als CGI binary had draaien, dan dien je ook de volgende dingen te commentariseren:

AddType application/x-httpd-php .php
AddType application/x-httpd-php .php4
AddType application/x-httpd-php .php3
AddType application/x-httpd-php-source .phps
AddType application/x-httpd-php .phtml

Als je de bovenstaande dingen hebt gedaan dien je een aantal dingen toe te voegen. Dit kan in principe op iedere gewenste plek in httpd.conf.

AddModule mod_suphp.c (kan zijn dat deze er al staat)
LoadModule suphp_module libexec/mod_suphp.so (kan zijn dat deze er ook al staat)
AddHandler x-httpd-php .php

Sla de wijzigingen op en herstart apache met het commando “httpd restart”.

Als er geen foutmeldingen omhoog kwamen tijdens het herstarten van apache dan is de installatie succesvol en heb je SuPHP geïnstalleerd.


4. Na de installatie
Na de installatie is het handig om het een en ander te testen. Draai een paar PHP scripts en kijk of ze netjes worden uitgevoerd. Een handig testje om te kijken of de boel veilig en wel draait is om te proberen of je de /home directory kunt listen met PHP.

Maak een PHP script met de volgende inhoud:


<?php system(‘ls /home/’); echo(‘Je ziet er strak uit, Sjonnie’); ?>

Als je het script uitvoert en er staat enkel dat je er strak uit ziet dan is de boel waarschijnlijk veilig en wel geïnstalleerd ;)

Succes!

The MAzTER
08/11/03, 20:03
...

reneovertoom
08/11/03, 20:16
Oh je had hem al gemaakt!! :D Cool, ik ga hem meteen even lezen :)

RobbertC
08/11/03, 20:45
Mooie post :) :W:

Dit soort initiatieven zien we graag :)

Dennis
08/11/03, 20:51
Superpost :)
Misschien wel interessant voor een heel apart HOWTO forum, nu er members zijn die echt goed bezig zijn met het bijdragen van threads waar iedereen wat aan heeft.

RobbertC
08/11/03, 21:03
DennisCitus: in principe kunnen al deze posts nog in de desbetreffende forums. Misschien al er echt veel komen, dat het dan een goed idee is :)

The MAzTER
08/11/03, 21:39
...

igmar
13/11/03, 12:01
Even niet over suPHP (de andere threads zoek ik straks wel op) : suPHP geeft overhead, door alle fork()'s en exec'().

mod_suid is een mod_become hack die hetzelfde doet als suPHP, alleen dan ook met de compiled-in versie :

www.jdimedia.nl/igmar/mod_suid

Hopelijk heeft men d'r wat aan.

UbErZ
13/11/03, 12:11
Gaaf initiatief!

Ik hoop dat er meer van dit soort leerzame howtos komen :)

Deimos
13/11/03, 18:33
Origineel geplaatst door igmar
Even niet over suPHP (de andere threads zoek ik straks wel op) : suPHP geeft overhead, door alle fork()'s en exec'().

mod_suid is een mod_become hack die hetzelfde doet als suPHP, alleen dan ook met de compiled-in versie :

www.jdimedia.nl/igmar/mod_suid

Hopelijk heeft men d'r wat aan.
Mod_suid vereist echter wel dat je apache als root moet draaien en het verleden heeft meermalen uitgewezen dat dat niet een slim idee is. Zelfde verhaal geldt voor mod_become.

Herbert
15/11/03, 01:22
Is een leerzaam verhaal, dank je!
Nu mijn vraag, is suPHP ook te gebruiken op een bestaande php 4.3.4 met Apache 2.0.48 die al geinstaleerd is of moet de alles opnieuw doen?

The MAzTER
15/11/03, 02:37
...

Dillard
16/11/03, 02:24
Goede post!

Ik kende PHPsuEXEC al wel (en ook niet zulke goede ervaringen mee), maar SuPHP klinkt interessant. Wat mij niet helemaal duidelijk wordt uit je posting is ofdat (naast het uitvoeren van de PHP onder eigen UID) er ook restricties voor gebruikers gelden zoals open_basedir ? Of stel je een combinatie van beiden voor?

Daarnaast: moet je (zoals bv. met suEXEC) nog een pad opnemen naar de CGI in je script-headers ?

Dillard

HBCS
17/11/03, 11:51
Dit zijn de post waar een hoop mensen wat aan hebben
ik ook dus bedankt

The MAzTER
19/11/03, 00:31
...

Cybafish
19/11/03, 00:48
Okay, probeer eens in shell "php -v", wat staat er dan? En daarnaast, heb je


AddModule mod_suphp.c
LoadModule suphp_module libexec/mod_suphp.so
AddHandler x-httpd-php .php

In httpd.conf staan?

The MAzTER
19/11/03, 00:57
...

Cybafish
19/11/03, 16:44
Jep, SuPHP is erg strict wat betreft CHMOD. Scripts die niet op 777 horen te staan zal hij als een 500 weergeven. CHMOD naar 644 is meestal de oplossing.

[edit] suPHP_Engine on

Dat zet de installer van SuPHP er meestal al in..

StarInternet
16/01/04, 00:45
----
Opmerkingen over deze howto:
Gebruik http://www.suphp.org/download/suphp-current.tar.gz
En niet met versie nummer, zo krijg je altijd de laatste versie. vooral omdat suphp nog niet echt stable versie heeft uitgegeven.
------------------------------------------------------
Apache 2.0.48 wordt nu ondersteund door suPHP-0.5
Deze is te downloaden via de bovenstaande url!
Hoe te installeren?
-----------------------------------------------------------
a. ik neem aan dat php al als CGI is geïnstalleerd op uw systeem.

1. wget http://www.suphp.org/download/suphp-current.tar.gz
2. tar -zxvf suphp-0.5.tar.gz
3. cd suphp-0.5
4. ./configure --apxs=/usr/local/apache2/bin/apxs –with-php=/usr/local/bin/php –with-apache-user=nobody
5. make
6. make install

De rest kan u van de vorige howto, let op de path's van php en apxs en de gebruikersnaam van apache waar hij op draait.

Bij ons werkt het vlekkeloos.

[tijdelijke url]
http://www.starinternet.nl:8080/tools/
[/tijdelijke url]

StarInternet
16/01/04, 00:48
Origineel geplaatst door The MAzTER
.......
(vreemde is dat ie het bij plaatjes wel op 777 wilde hebben).

is niet erg vreemd. Apache zou erg veel load gaan trekken als php voor elke bestand wordt geopent. PHP wordt alleen over een bestand heengehaald als het om een .php bestand gaat (of zelf anders aangegeven).

most2host
09/04/08, 22:19
Bedankt dit kan ik gebruiken :)

RayManZ
10/04/08, 00:02
Ik weet niet of dat wel zo slim is. Deze thread is namelijk al 4 jaar oud...

RedoX
10/04/08, 00:06
Lijkt me dat na 4 jaar het een en ander wel veranderd is.. Ik zou maar even een beetje rond gaan google'n.. Er zijn veel van dit soort tutorials te vinden..

Dillard
10/04/08, 02:37
Inderdaad, deze informatie zal inmiddels verouderd zijn.

@most2host: Tickets van ruim 4 jaar ophalen is eigenlijk not-done. Volgende keer even opletten voordat je post svp.

-Topic closed-