Warning: Declaration of syntax_plugin_styler_styler::handle($match, $state, $pos, &$handler) should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /home/anaeleufv/mon-serveur.anael.eu/lib/plugins/styler/syntax/styler.php on line 20

Warning: Declaration of syntax_plugin_styler_styler::render($mode, &$renderer, $data) should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /home/anaeleufv/mon-serveur.anael.eu/lib/plugins/styler/syntax/styler.php on line 20
php:securisation_open_basedir - Installation et configuration d'un serveur Web (Linux Apache MySQL PHP...)

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]
Anael MOBILIA import - création
php:securisation_open_basedir [2014/05/27 03:32] (Version actuelle)
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]]