Configuration d'open_basedir

Retour à la liste des tutoriels

Explication de l’intérêt de l'open_basedir PHP pour sécuriser votre serveur.


Faille de sécurité

Mon serveur web est opérationnel, et héberge deux sites :

Chacun des deux sites doit-être indépendant : comme deux maisons, on ne rentre pas sans être invité !

Or, par défaut, je peux accéder avec un script PHP à n'importe qu'elle page !

Voici un script permettant d'illustrer mes propos (Proof of Concept) :

<?php
	$f = fopen('/var/www/default/www/index.html', 'r');
	echo fread($f, 150);
	fclose($f);
?>

Ce script exécuté depuis www.anael.eu retourne le contenu de la page d'index par défaut :

<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>

Il s'agit d'une faille de sécurité importante : que se passerait-il si j'accédais à un fichier contenant de utilisateurs / mot de passe appartenant à un autre site !

Correctif

PHP comporte une directive de configuration permettant de limiter les répertoires auxquels un script peut avoir accès !

Pour ce faire, il faut éditer le fichier de configuration Apache du domaine

nano /etc/apache2/sites-available/anael.eu

Et définir un répertoire dans l'arborescence qui sera le répertoire le plus proche de la racine du système de fichier auquel les scripts PHP du domaine pourront accéder :

<IfModule mod_php5.c>
	php_admin_value open_basedir /var/www/vhosts/anael.eu/www/
</IfModule>

Rechargement de la config Apache

service apache2 reload

La configuration de PHP empêche maintenant de remonter dans l'arborescence de fichiers.

Autoriser l'accès au répertoire /var/www/default/ autorise l'accès à l'ensemble des répertoires et fichiers contenus dans ce répertoire (de manière récursive).

Afin de s'en assurer, on relance le script PoC :

[Sun Jun 20 02:21:23 2010] [error] [client 88.191.122.115] PHP Warning:  fopen() [<a href='function.fopen'>function.fopen</a>]: open_basedir restriction in effect. File(/var/www/default/www/index.html) is not within the allowed path(s): (/var/www/anael.eu/www/) in /var/www/anael.eu/www/poc.php on line 2
Il faut définir l'open_basedir dans la configuration de chaque domaine Apache pour protéger l'ensemble de vos domaines de manière optimale !

Cette configuration permet de parer à un très grand nombre d'attaques, réduisant la zone de dégâts uniquement au répertoire contenant le site web fautif !

Pour autoriser l'accès à plusieurs répertoires séparés, il convient de les séparer par un “:
<IfModule mod_php5.c>
	php_admin_value open_basedir /var/www/vhosts/anael.eu/www/:/tmp/:/dev/null/
</IfModule>


Liens