utok na apache

Martin Tiršel lk na blackpage.eu
Pondělí Září 21 01:11:03 CEST 2009


Zdravim,

virtualne weby s php je mozne cez suexec a fcgid (nepliest s fastcgi)  
spustat s pravami ineho uzivatela/skupiny. Nastavenie je sice zlozitejsie  
a je potreba sa s tym vyhrat a potestovat, ale vo vysledku to stoji za to.  
V tejto konfiguracii je mozne pouzit apache v rezime worker, pre ktory  
mod_php nieje vhodny, pretoze PHP4/5 nieje thread safe.

Tu je par rad, ktore mozno zachrania hodiny alebo dni googlenia :)

*) a2enmod suexec fcgid
*) /etc/apache2/suexec/www-data nastavit prvy riadok na root adresar webov  
(toto je obmedzenie suexec, ide nastavit len jeden adresar), druhy riadok  
zakomentovat
*) /etc/apache2/mods-available/fcgid.conf: treba nastavit parametry,  
dokumentacia mizerna, ale je par tutorialov s nejakymi info. Za zmienku  
stoji navysit IPCConnectTimeout (pripadne dalsie timeouty) na nejaku  
rozumnu hodnotu (pozor, toto treba nastavovat aj uplne vo vsetkych  
virtualoch, inak sa bude brat vsade 20(alebo 40?) sekundovy hardcoded  
timeout - jedna z veci, nad ktorou som dlho laboroval), nastavit  
DefaultMin[Max]ClassProcessCount na 0 a X (X je podla potrieb),  
MaxRequestsPerProcess (viz http://fastcgi.coremail.cn/doc.htm), ...

Konfiguracia virtualu vyzera nejako takto:


<VirtualHost *:80>
    ServerName www.domena.xy
    DocumentRoot /var/www/user/webs/www.domena.xy

    SuexecUserGroup user group

    <Directory /var/www/user/webs/www.domena.xy>
       AddHandler fcgid-script .php
       FCGIWrapper /var/www/user/.user_config/www.domena.xy.php-cgi .php
       Options ExecCGI FollowSymLinks
       Order Allow,Deny
       Allow From all
    </Directory>

    IPCConnectTimeout 80
    IPCCommTimeout 300
    BusyTimeout 300
	
</VirtualHost>

fcgid wrapper na php potom treba nejako takto:

#!/bin/bash

umask 027
TMPDIR="/var/www/user/tmp"
export TMPDIR
TEMPDIR="/var/www/user/tmp"
export TEMPDIR
PHP_FCGI_CHILDREN=2
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=2000
export PHP_FCGI_MAX_REQUESTS

exec /usr/bin/php-cgi --php-ini  
/var/www/user/.user_config/www.domena.xy.php.ini $@


Nastavenie PHP_FCGI_CHILDREN na hodnotu vyssiu ako nula sice spawnuje  
procesy pod rodicovskym PHP procesom, co umozni zdielanie pamate medzi  
tymito PHP procesami, ale vznika tu problem, kedy (zrejme pri necinnosti -  
ak nieje dosiahnuta hodnota PHP_FCGI_MAX_REQUESTS a nastane skorej  
fcgid.conf: ProcessLifeTime alebo MaxRequestsPerProcess [skorej by som  
tipoval ten lifetime] ) je hlavny PHP proces killnuty, ale tieto dcerske  
procesy smrt rodica "preziju" a osamostatnia sa, cim sa postupne tieto  
procesy mnozia a mina sa tak pamat. Zatial som ine riesenie ako periodicke  
spustanie skriptu, ktore treba raz za hodinu tieto procesy vycisti,  
neobjavil. Nieje to ale nic tragicke a da sa s takymto riesenim fungovat.  
Ak sa nastavi na 0, tak netreba takto hackovat, ale potom nemaju rozne  
akceleratory/cache velky vyznam, kedze kazdy PHP proces daneho virtualu ma  
len svoju pamat (snad som to dobre popisal, pochopil som to takto z  
diskusii).

Vykonovo by som povedal, ze to nieje poznat (max. ak este nieje spusteny  
proces daneho virtualu, tak prva poziadavka je o par stoviek milisekund  
pomalsia, u tych dalsich nepozorujem rozdiel). Co sa tyka konzumacie  
pamati, tak ta by teoreticky mala byt lepsia (hlavne pri velkom prenose  
statickych suborov sa apache odlahci, pretoze nemusi mat dalsich (tusim)  
30MB per www-data proces, plus pri dobrom zladeni niektorych virtualnych  
webov sa da dosiahnut daleko mensia konzumacia pamate, nez u mod_php), u  
mna to vyzera, ze asi trocha narastla, ale je to len pocit, kedze  
konfiguracia servera je trochu odlisna nez za doby mod_php (a niektore  
veci este nemam uplne doladene).

Niektore veci v takejto konfiguracii ale niesu 100% kompatibilne (vdaka za  
info p. Kouril), ako napr.:
* HTTP autorizacia do PHP (riesitelne)
* v htaccess nefunguju php.ini nastavenia (riesitelne)
* apache preda fcgid procesu data az po kompletnom obdrzani, takze napr.  
upload suboru sa neda priebezne kontrolovat (ajax progress bar u uploadov)  
(u apache zatial asi neriesitelne, u inych webserverov mozno)

Na viacej si teraz nevzpominam (alebo o nich neviem :), ale vacsina by  
mala byt nejako riesitelna. Rozhodne je takato konfiguracia lepsia,  
bezpecnejsia a pod vacsou kontrolou, vyuzije sa lepsie vykon viacjadrovych  
procesorov, atd...

-- 
S pozdravom,
Martin Tiršel



On Sun, 20 Sep 2009 22:28:24 +0200, Petr Stehlik <pstehlik na sophics.cz>  
wrote:

> Pavel Kankovsky píše v Ne 20. 09. 2009 v 21:36 +0200:
>> On Sun, 20 Sep 2009, Petr Stehlik wrote:
>>
>> > ano, to útočník může vždycky, to je běžná chyba uživatele, že mu  
>> utečou
>> > hesla, ale ten útočník by pak neměl mít možnost měnit běžící procesy,
>> > IMHO.
>>
>> Když necháte uživatele spouštět kód pod stejným uživatelem, jako běží
>> Apache
>
> jaký je doporučený způsob pouštění PHP pod jiným uživatelem (v Debianu)?
> Četl jsem, že všechny dobré způsoby jsou příliš pomalé (ve smyslu
> snížení výkonu webového serveru).
>
> Petr
>
>
> _______________________________________________
> Linux mailing list
> Linux na linux.cz
> http://www.linux.cz/mailman/listinfo/linux



Další informace o konferenci Linux