« Installation et configuration d'un serveur http apache 2.2 » : différence entre les versions

Aller à la navigation Aller à la recherche
Ligne 480 : Ligne 480 :


Pour plus d'information : http://wiki.apache.org/httpd/SecuringPHP
Pour plus d'information : http://wiki.apache.org/httpd/SecuringPHP
===SuPHP===
SuPHP est un module apache permettant d'exécuter les scripts php avec les permissions de leur propriétaire.
Nous allons voir comment coupler le <code>mod_php5</code> traditionnel de apache2 avec <code>SuPHP</code>. En fait, SuPHP sera utilisé pour les comptes utilisateurs (dans /home) tandis que mod_php5 sera utilisé pour les sites n'étant pas rattachés à un utilisateur (dans /srv/http/)
Commencez par installer suphp :
<pre>aptitude install libapache2-mod-suphp suphp-common</pre>
Comme vous pouvez le voir, php5-cgi sera automatiquement installé. Activez SuPHP :
<pre>a2enmod suphp</pre>
Le fichier de configuration SuPHP de apache 2 est <code>/etc/apache2/mods-enabled/suphp.conf</code>. Le fichier de configuration de SuPHP est <code>/etc/suphp/suphp.conf</code>. Dans ce dernier fichier, adaptez la ligne <code>docroot=</code> afin qu'elle pointe sur le répertoire contenant le <code>DocumentRoot</code> de toutes les vhosts qui utiliseront SuPHP (/home dans notre cas). Vous pouvez aussi y modifier l'umask (cela défini avec quels permissions les fichiers seront créés) en 0027.
Modifiez le fichier <code>/etc/apache2/mods-enabled/php5.conf</code> comme suit :
<pre><nowiki>
<IfModule mod_php5.c>
  AddType application/x-httpd-php .php .phtml .php3
  AddType application/x-httpd-php-source .phps
  php_flag engine off
  <Directory /srv/http>
    php_flag engine on
  </Directory>
</IfModule>
</nowiki></pre>
<code>mod_php5</code> étant prioritaire sur <code>suPHP</code> ces quelques lignes permettent de désactiver <code>mod_php5</code> partout sauf dans /srv/http/.
Dans la même idée, vous pouvez limiter SuPHP à /home en modifiant <code>/etc/apache2/mods-enabled/suphp.conf</code> comme suit :
<pre><nowiki>
<IfModule mod_suphp.c>
        AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
        suPHP_AddHandler application/x-httpd-php
    <Directory /home>
        suPHP_Engine on
    </Directory>
    # By default, disable suPHP for debian packaged web applications as files
    # are owned by root and cannot be executed by suPHP because of min_uid.
    <Directory /usr/share>
        suPHP_Engine off
    </Directory>
#suPHP_ConfigPath /home/*/php.ini
</IfModule>
</nowiki></pre>
Si vous utilisez des utilitaires d'administration web comme <code>PhpMyAdmin</code> n'oubliez pas d'activer <code>mod_php5</code> dans le répertoire correspondant. Par exemple, pour <code>PhpMyAdmin</code>, il faudra ajouter les lignes suivantes au fichier <code>/etc/apache2/mods-enabled/php5.conf</code> :
<pre>
<Directory /usr/share/phpmyadmin>
  php_flag engine on
</Directory>
</pre>
SuPHP ne permet pas l'utilisation de <code>php_admin_value</code> et il est donc impossible de définir open_basedir de cette manière pour les vhosts de /home. Pourtant, il peut-être pratique de limiter les fichiers accessibles en php (même si théoriquement, le principe de suPHP est largement suffisant).
Pour contourner ce problème, il faut définir un fichier de configuration php propre pour chaque vhost utilisant SuPHP. Il suffit d'ajouter dans le fichier de configuration de la vhost la directive <code>suPHP_ConfigPath</code> suivie du répertoire dans lequel le fichier <code>php.ini</code> personnalisé est présent.
Par exemple, si le fichier de configuration de la vhost <code>blah.csnu.org</code> ayant comme <code>documentroot /home/blah/www/</code> est <code>/home/blah/php.ini</code> il faut ajouter la directive <code>suPHP_ConfigPath /home/blah</code> (sans le / final !) dans le fichier de configuration de la vhost.
Ce php.ini personnalisé peut être une copie conforme de <code>/etc/php5/cgi/php.ini</code> mais dans lequel vous pouvez définir <code>open_basedir = /home/blah/www/</code> par exemple. Si vous ne voulez pas que les utilisateurs puissent modifier leurs directives php, placez le fichier php.ini personnalisé dans un dossier auquel ils n'ont pas accès (n'oubliez pas que l'utilisateur www-data doit toujours pouvoir lire ce fichier).
Vous pouvez aussi spécifier un open_basedir par défaut dans le fichier <code>/etc/php5/cgi/php.ini</code> qui sera appliqué pour toutes les vhosts n'ayant pas de php.ini personnalisé.
Si vous voulez vérifier que tout fonctionne bien, créez une vhost ayant son documentroot quelque part dans /srv/http/ et une autre ayant son documentroot quelque part dans /home/, puis appelez la directive <code>phpinfo()</code> avec un fichier .php dans ce genre :
<pre><nowiki>
<?php
    phpinfo();
?>
</nowiki></pre>
Notez que si vous utilisez <code>mod_userdir</code> il sera impossible d'exécuter les scripts php à cause de la directive <code>check_vhost_docroot=true</code> de SuPHP. Vous pouvez ajouter la directive <code>suPHP_Engine off</code> dans le fichier de configuration de <code>mod_userdir</code>.
N'oubliez pas de relancer apache2 après tout celà :
<pre>/etc/init.d/apache2 restart</pre>
4 231

modifications

Menu de navigation