Ceci est une ancienne révision du document !
Installer PHP
Retour à la liste des tutoriels
- Aucun prérequis pour ce tutoriel.
Installation de PHP
apt-get install php5
PHP est maintenant installé sur notre serveur, et est automatiquement intégré à Apache.
Le script d'installation a mis à jour automatiquement la configuration d'Apache, et l'a relancer pour prendre en compte les modifications.
Sécurisation / configuration de PHP
La configuration de PHP s'effectue en éditant le fichier /etc/php5/apache2/php.ini .
Avant toute chose, j'effectue une sauvegarde du fichier de configuration original
cd /etc/php5/apache2/ mv php.ini php.ini.back
Et je vais me baser sur le fichier de configuration recommandé pour un environnement de production
cp /usr/share/doc/php5-common/examples/php.ini-recommended ./php.ini
cp /usr/share/php5/php.ini-production ./php.ini
SafeMode
Nous n'allons pas activer cette fonctionnalité de PHP qui est devenue obsolète avec la version 5.3.0 de PHP !
Doc. PHP
disable_functions
Toutefois, je recommande de les appliquer : ceci peut permettre de réduire l'impact d'une faille dans un de vos logiciels !
Nous allons désactiver certaines fonctions de PHP pouvant mettre en péril la sécurité du serveur.
chgrp
Permet de modifier le groupe propriétaire d'un fichier.
Les mauvaises utilisations de cette fonction sont partiellement inhibées par la modification du fichier /etc/apache2/conf.d/security → Directory / .
Doc. PHP
disk_free_space
Retourne l'espace disque disponible sur la partition. Une personne malveillante pourrait l'utiliser pour savoir si elle peut saturer le disque ou non.
Doc. PHP
disk_total_space
Retourne l'espace disque utilisé sur la partition. Une personne malveillante pourrait l'utiliser pour savoir si elle peut saturer le disque ou non.
Doc. PHP
diskfreespace
Alias de disk_free_space
Doc. PHP
dl
Charge des extensions PHP à la volée. Ce genre d'action n'a pas à être mis en place dans un script !
Doc. PHP
exec
Permet d'exécuter une commande (comme si elle était saisie dans le shell). Faille de sécurité monstrueuse !
Doc. PHP
ini_alter, ini_set, ini_restore
Permettent de modifier certaines valeurs de la configuration effectuée dans le fichier php.ini .
Si certaines valeurs doivent être ajustées, l'administrateur du serveur peut les définir dans le fichier de configuration Apache.
Doc. PHP
leak
Cette fonction permet d'allouer de la mémoire.
Toutefois, elle n'est présente que si PHP à été compilé avec l'option debug-mode.
Autant la supprimer pour éviter tout risque.
passthru
Exécute une requête au niveau du shell et retourne le résultat.
Cette fonction est une faille de sécurité monstrueuse également !
Doc. PHP
popen
Exécute une commande au niveau du shell et retourne un pointeur de fichier.
Cette commande peut-être utilisée pour passer des commandes et est donc à proscrire.
Doc. PHP
pclose
Ferme un flux de fichier ouvert avec popen.
Doc. PHP
proc_close, proc_get_status, proc_nice, proc_open, proc_terminate
Fonctions similaires au popen / pclose.
Doc. PHP - proc_close
Doc. PHP - proc_get_status
Doc. PHP - proc_nice
Doc. PHP - proc_open
Doc. PHP - proc_terminate
putenv, apache_setenv
Définit la valeur d'une variable d'environnement. Ce genre de configuration n'a pas à être effectuée à travers un script !
Doc. PHP - putenv
Doc. PHP - setenv
set_include_path
Cette commande permet de modifier le path accessible par nos scripts.
Nous le définirons à l'endroit précis voulu ultérieurement avec openbasedir (dans le fichier de configuration Apache).
Doc. PHP
set_time_limit, ignore_user_abort, apache_reset_timeout
Permet de modifier la configuration PHP quand à la durée d'exécution d'un script, ou les paramètres d'arrêt.
Doc. PHP - set_time_limit
Doc. PHP - ignore_user_abort
Doc. PHP - apache_reset_timeout
shell_exec, system
Exécute des commandes au niveau du shell, et retourne le résultat.
Doc. PHP - shell_exec
Doc. PHP - system
syslog
Permet d'insérer des entrées dans le journal du système.
Doc. PHP
La configuration devient donc :
disable_functions = chgrp, disk_free_space, disk_total_space, diskfreespace, dl, exec, ini_alter, ini_set, ini_restore, leak, popen, pclose, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, putenv, apache_setenv, set_include_path, set_time_limit, ignore_user_abort, apache_reset_timeout, shell_exec, system, syslog
expose_php
Définit si PHP doit-être annoncé à vos visiteurs comme étant installé sur votre serveur (entête).
Je n'indique pas à mes visiteurs que mon serveur exécute PHP : cela ne leur apporte rien, et peut protéger mon serveur contre une attaque ciblée.
Doc. PHP
expose_php = Off
max_execution_time
Définit la durée maximale d'exécution d'un script PHP.
Par défaut la valeur est 30 secondes, à n'augmenter que si vos scripts n'ont pas le temps de s'exécuter entièrement !
Doc. PHP
memory_limit
Quantité maximale de RAM qu'un script PHP peut utiliser.
La valeur par défaut est de 128 Mo maximum par exécution du script.
Adaptez la valeur à la quantité de RAM que vous possédez.
Doc. PHP
Envoi de fichiers
L'envoi de fichier sur le serveur est autorisé.
Je vais définir upload_tmp_dir
sur /tmp (répertoire temporaire du système dont le contenu est effacé à chaque redémarrage du serveur).
Je vais définir upload_max_filesize
à 5M (au lieu de 2) pour les besoins d'un de mes sites.
Attention à être cohérent entre upload_max_filesize
(taille maximale d'un fichier envoyé) et post_max_size
(quantité maximale de données envoyées à une page PHP).
Doc. PHP - upload_max_filesize
Doc. PHP - upload_tmp_dir
Doc. PHP - post_max_size
session.save_path
Définit le répertoire dans lequel PHP enregistre les sessions des visiteurs de votre site.
Il faut un chmod de 600 minimum sur ce répertoire.
Je pensais utiliser le répertoire /tmp (chmod 777) principalement pour son auto-effacement à chaque relance du système.
Je ne l'ai pas fait car tous mes sites web ont accès à ce répertoire (servant à stocker temporairement les fichiers envoyés par exemple).
Laisser le répertoire de sessions dans /tmp représente donc une faille de sécurité !
J'ai donc créé un répertoire sessions dans /var/www (propriétaire www-data:www-data ; chmod 700)
session.save_path = /var/www/sessions
Pour chaque nouvelle session crée via un script PHP, un fichier sera créé dans /var/www/sessions .
Il faut vider de temps en temps les fichiers correspondant à une session qui n'est plus utilisée. Pour cela, PHP intègre une probabilité d'exécution d'un processus de nettoyage (garbage collector) lorsqu'une nouvelle session est créée.
J'utilise la valeur par défaut : une probabilité de 1 / 1000.
session.gc_probability = 1
Doc. PHP - session.gc-probability