Daniel OG
per en 1 Març 2011
1,027 Vistes

Si es vol mantenir segura una instal·lació d'apache i aïllar cada Virtualhost, habitualment es presenten les següents opcions:

  1. Apache Suexec + suphp + suhosin
    És una solució que han adoptat la majoria de hosting i que aïlla correctament cada virtualhost. No obstant, té un rendiment horrible, amb executar 1000 vegades una pàgina de phpinfo() aquests són els resultats:
    * suexec: 127.219 segons
    * mod_php: 3.753 segons
     
  2. Canviar a servidor litespeed
    Aquest servidor és la millor solució realment, tal i com es descriu a http://www.litespeedtech.com/litespeed-web-server-is-the-best-platform-for-php-powered-sites.html
    No obstant, inexplicablement, inclou php4 en comptes de php5, per la qual cosa requereix compilar php5 i substituir l'executable de php-cgi per la versió 5. Com tot el món, sóc massa gos i no m'agrada tenir php compilat a ma perquè es perd la senzillesa d'afegir mòduls a php amb només apt-get. Ho sent.
     
  3. Usar Paralels Plesk.
    Aquest panel de control per a apache configura els permisos per a cada virtualhost de manera correcta i impideix interferències entre els virtualhost.
    L'inconvenient és que es perd capacitat de maniobra amb les configuracions, augmenta la càrrega del servidor i, principalment, costa molts diners.
     
  4. La solució definitiva: el mòdul apache2-mpm-itk
    Amb el meravellós mòdul apache2-mpm-itk és possible aconseguir una veritable  instal·lació de apache2 multiusuari sense embolicar les coses amb SuExec. Després d'alguns passos senzills és possible especificar un usuari + grup per a cada virtualhost, de manera que Apache (i el PHP) s'executarà amb aquest usuari per a les peticions del virtualhost en qüestió.

Aturem el servei apache, abans de res.

service apache2 stop
(o bé: /etc/init.d/apache2 stop)

S'asumeix que apache s'executa amb l'usuari  www-data  i grup www-data (comprovar l'arxiu  /etc/apache2/envvars )
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Nota: si s'ha instal·lat suexec, s'ha de desactivar, simplement amb:

mv /usr/lib/apache2/suexec /usr/lib/apache2/suexec.disable

Instal·lar mpm-itk amb debian/ubuntu és molt fàcil ja que el mòdul de l'apache2-mpm-itk està al repositori. Tingueu en compte que la instal·lació suposa el fi de la versió standard de apache2 i la desactivació del mòdul apache2-mpm-prefork, ja que mpm-itk es compila dins de l'apache2. Així que per instal·lar-ho sols s'ha d'executar, com a root:

apt-get install apache2-mpm-itk

Una vegada fet això, no cal habilitar-ho ni a2enmod ni res. Només s'ha de configurar la llista de virtualhosts(habitualment /etc/apache2/sites-available/default) i permetre que mitjançant l'addició d'aquesta línia en cada <virtualhost>, apache2 s'execute amb l'usuari determinat:

AssignUserId USUARI GRUP

Canviant USUARI i GRUP per l'usuari i grup que es vol, per exemple:

<VirtualHost *:80>
    DocumentRoot /var/www/flog
    ServerName flog.cat
    ServerAlias www.flog.cat
    AssignUserId flog http
    ....
</VirtualHost>

També es pot  afegir així de manera que no provocarà conflictes si mpm es deshabilita:

<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>

Si no s'especifica cap usuari per algun virtualhost, s'executarà amb l'usuari apache2 (www-data o el que s'especifique a l'arxiu de configuració).

Abans d'activar apache de nou, ens hem d'assegurar d'establir els permisos del DocumentRoot del virtualhost canviant-los de www-data per al nou usuari i grup amb l'eina chown i chmod si és necessari.

chown USUARI:GRUP /var/www/paginaweb/ -R
chmod 644 /var/www/paginaweb/ -R

Ara ja es pot iniciar apache i gaudir de la protecció de mpm-itk :)

service apache2 start
(o bé: /etc/init.d/apache2 start)


Ah, per cert, aquest és el rendiment de mpm-itk per a la mateixa prova d'executar phpinfo() 1000 vegades: 37.01 segons. Molt millor que suphp, veritat?

Publicat a: Personal
Sigues el primer a qui li agrada això.
Daniel OG
No s'ha d'oblidar l'ús de open_basedir per restringir del tot PHP, suhosin i les disabled_functions si els virtualhost són de terceres persones
1 Març 2011