Table des matières

Installer PHP

Retour à la liste des tutoriels

Installation et configuration de PHP.
Prérequis
  • 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
A partir de squeeze (Debian 6.0):
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

Si vous êtes la seule personne déposant des logiciels sur votre serveur, ces configurations servant à limiter les accès des fonctions PHP ne vous concernent pas pleinement.

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


Doc. PHP - session_save_path

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


Liens