Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
php:securisation_open_basedir [2011/08/27 02:05] – import - création Anael MOBILIAphp:securisation_open_basedir [2014/05/27 03:32] (Version actuelle) – modification externe 127.0.0.1
Ligne 1: Ligne 1:
-<style float-right>{{tag>XXX}}</style>+<style float-right>{{tag>PHP open_basedir}}</style>
  
-<style float-left>{{:icones:page_web.png?nolink&70}}</style> +<style float-left>{{:icones:php.png?nolink&70}}</style> 
-====== Titre_page ======+====== Configuration d'open_basedir ======
  
 //[[:|Retour à la liste des tutoriels]]// //[[:|Retour à la liste des tutoriels]]//
  
-<note tip>Présentation rapide.</note>+<note tip>Explication de l’intérêt de l'open_basedir PHP pour sécuriser votre serveur.</note>
 <note>**Prérequis** <note>**Prérequis**
-  * Aucun prérequis pour ce tutoriel.+  * [[php:installation_configuration|Avoir installé PHP]]. 
 +  * [[apache:ajout_domaine|Avoir configuré un domaine Apache]].
 </note> </note>
 \\ \\
-===== grand1 ===== +===== Faille de sécurité ===== 
-lorem ipsum+Mon serveur web est opérationnel, et héberge deux sites : 
 +  * http://www.anael.eu dans /var/www/anael.eu/www/ 
 +  * http://88.191.122.115 dans /var/www/www/default/www
  
-\\ 
-===== Liens ===== 
-  * [[.:|Retour à la liste des tutoriels XXX]] 
-  * [[:|Retour à la liste des tutoriels]] 
  
-++__But : Mettre en place la directive [PHP|tag:PHP] open_basedir__++ +Chacun des deux sites doit-être indépendant : comme deux maisons, on ne rentre pas sans être invité !
-%%% +
-!!!! I) Faille de sécurité +
-Le serveur marche sans soucis, et j'héberge maintenant 2 sites : +
-* http://www.anael.eu (dans /var/www/vhosts/anael.eu/httpdocs/+
-* http://88.191.122.115  (/var/www/vhosts/default/+
-Chacun des deux sites (même si le second n'est qu'une bête page html :-p) doit-être indépendant : comme deux chambres séparées, on ne rentre pas chez l'autre comme ça ! +
-%%%Hors, par défaut, je peux accéder avec un script PHP à n'importe qu'elle page ! +
-%%%Une proof of concept très simple : +
-///[php] +
-<?php +
-$f = fopen('/var/www/vhosts/default/index.html', 'r'); +
-echo fread($f, 150); +
-fclose($f); +
-?> +
-/// +
-Retourne : +
-///[html] +
-<html><body><h1>dedi.anael.eu</h1> +
-<p>Bienvenue sur mon serveur :-)</p> +
-</body></html> +
-/// +
-C'est quand même gênant, d'autant plus si j'utilisais cette méthode pour lire un fichier de configuration contenant des logins / passwords !+
  
-!!!! II) Correctif +Orpar défautje peux accéder avec un script PHP à n'importe qu'elle page !
-Fort heureusementnous pouvons réduire l'arborescence autorisée pour chacun des sites hébergé ! +
-%%% Direction le fichier de config Apache de chaque site : +
-///[bash] +
-nano /etc/apache2/sites-available/anael.eu +
-/// +
-On y ajoute l'arborescence minimale pour le site : +
-///[apache] +
-        <IfModule mod_php5.c> +
-                php_admin_value open_basedir /var/www/vhosts/anael.eu/httpdocs/ +
-        </IfModule> +
-/// +
-Recharge de la config Apache +
-///[apache] +
-service apache2 reload +
-/// +
-Et le tour est joué :) +
-%%%Afin de s'en assureron relance le script PoC : +
-///[apache] +
-[Sun Jun 20 02:21:23 2010] [error] [client xx.xxx.xxx.xxx] PHP Warning:  fopen() [<a href='function.fopen'>function.fopen</a>]: open_basedir restriction in effect. File(/var/www/vhosts/default/index.html) is not within the allowed path(s): (/var/www/vhosts/anael.eu/httpdocs/) in /var/www/vhosts/anael.eu/httpdocs/poc.php on line 2 +
-///+
  
-Il faut configurer l'open_basedir pour chaque nouveau site qui sera ajouté +Voici un script permettant d'illustrer mes propos (Proof of Concept) : 
-%%%Cette manip 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 ! +<code php><?php 
-%%%Note : Suite à une demande sur IRC, si on souhaite préciser plusieurs dossiers, il convient de les séparer par un __:__ (deux-points). + $f = fopen('/var/www/default/www/index.html', 'r'); 
-%%%Exemple :  + echo fread($f, 150); 
-///[apache+ fclose($f); 
-        <IfModule mod_php5.c> +?></code> 
-                php_admin_value open_basedir /var/www/vhosts/anael.eu/httpdocs/:/tmp/:/dev/null/ + 
-        </IfModule> +Ce script exécuté depuis www.anael.eu retourne le contenu de la page d'index par défaut : 
-///+<code html><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></code> 
 + 
 +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 
 +<code bash>nano /etc/apache2/sites-available/anael.eu</code> 
 + 
 +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 : 
 +<code apache><IfModule mod_php5.c> 
 + php_admin_value open_basedir /var/www/vhosts/anael.eu/www/ 
 +</IfModule></code> 
 + 
 +Rechargement de la config Apache 
 +<code bash>service apache2 reload</code> 
 + 
 +La configuration de PHP empêche maintenant de remonter dans l'arborescence de fichiers. 
 + 
 +<note>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)//.</note> 
 + 
 +Afin de s'en assurer, on relance le script PoC : 
 +<code apache>[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</code> 
 + 
 +<note important>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 !</note> 
 + 
 +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 ! 
 + 
 +<note>Pour autoriser l'accès à plusieurs répertoires séparés, il convient de les séparer par un "**:**" 
 +<code apache><IfModule mod_php5.c> 
 + php_admin_value open_basedir /var/www/vhosts/anael.eu/www/:/tmp/:/dev/null/ 
 +</IfModule></code
 +</note> 
 + 
 +\\ 
 +===== Liens ===== 
 +  * [[.:|Retour à la liste des tutoriels PHP]] 
 +  * [[:|Retour à la liste des tutoriels]]