Sécurisez votre PHP

PHP est très souvent installé sur un serveur web car c'est un langage de programmation très couramment utilisé. PHP, comme tout langage de scripts, comporte des failles de sécurités intentionnelles ou non. Voici comment renforcer la sécurité de PHP.
Ces vulnérabilités s'expliquent par de mauvaises habitudes de programmation (souvent un défaut de validation des entrées) ou par des erreurs dans le fichier de configuration php.ini.

Fonctionne pour toute version de PHP-FPM

Pré-requis / Difficultés

Il faut au préalable avoir installé PHP-FPM (à partir de la version 5.3) pour utiliser ce guide. Toutes les lignes de commandes sont saisies dans un terminal avec accès administrateur root.

Difficulté
Moyen

Préambule

Avant de commencer à sécuriser votre version de PHP, il est important de connaître la version PHP que vous avez installé sur votre machine avec la ligne de commande suivante.

versionPHP="$(readlink -f /usr/bin/php | cut -c 13-)"

Interdire l'exécution de fonctions PHP

Certaines fonctions de PHP peuvent directement lancer des scripts à distance qui peuvent être malveillant. Il est donc judicieux, surtout si vous ne les utilisez pas, d'interdire l'utilisation de certaines fonctions de PHP. Pour cela, nous allons modifier la configuration de PHP-FPM. Le fichier de configuration se trouve en général à : /etc/php5/apache2/php.ini ou /etc/php5/fpm/php.ini.

if [ ! -e "/etc/php/${versionPHP}/fpm/conf.d/50-secure.ini" ]; then
    echo "
    ;Dangerous : disable system functions. This can break some administration softwares.
    disable_functions = symlink,shell_exec,system,exec,proc_close,proc_open,popen,system,dl,passthru,escapeshellarg,escapeshellcmd
" > "/etc/php/${versionPHP}/fpm/conf.d/50-secure.ini"
fi

Sur Debian, nous stockons les fichiers de configuration de PHP dans le répertoire /etc/php/${versionPHP}/fpm/conf.d .
Le nom du fichier de configuration s'écrit par convention priorite-nom_fichier.ini, priorite fixe le niveau de priorité du fichier (99 étant le plus haut). Par convention, nous le fixons à 50. Le nom du fichier de configuration sera donc 50-secure.ini.
Le if permet de vérifier si le fichier 50-secure.ini existe ou pas.

Il ne reste plus qu'a redémarrer php-fpm et apache2.

service "php${versionPHP}-fpm" restart
service apache2 restart

Supprimer l'exposition de la version de PHP

Nous pouvons aussi supprimer l'affichage de la version de PHP. Même principe que précédemment.

if [ ! -e "/etc/php/${versionPHP}/fpm/conf.d/50-version_exposure.ini" ]; then
    echo "
; Disable PHP exposure
expose_php = Off
" > "/etc/php/${versionPHP}/fpm/conf.d/50-version_exposure.ini"
fi

Et nous relançons php-fpm et apache2.

service "php${versionPHP}-fpm" restart
service apache2 restart

Vérification des paramètres par défaut

Par mesure de sécurité, il vaut mieux vérifier les paramètres suivants dans les fichiers php.ini.

safe_mode = Off
safe_mode_gid = Off
memory_limit = -1
display_errors = Off
display_startup_errors = Off
register_globals = Off
magic_quotes_gpc = Off
magic_quotes_runtime = Off
allow_url_fopen = Off
allow_url_include = Off

Pour le paramètre memory_limit si votre machine possède une mémoire limitée mieux vaut mettre la valeur à 128MB (valeur par défaut).
Pour le paramètre allow_url_fopen, si vous devez utiliser la fonction fopen dans vos scripts, mettre cette valeur à ON

Aller plus loin

Si vous avez aussi installé le paquet php-cli pour lancer des scripts PHP directement en ligne de commande (une tâche CRON par exemple), vous pouvez modifier les commandes ci-dessus pour sécuriser php-cli. Il suffit de remplacer fpm par cli dans les lignes de commandes.

Une fois les modifications effectuées, relancer les services PHP-FPM et apache2.

Notes de version

  • [27/11/2017] : Création de l'article
  • [30/01/2020] : Mise à jour complet du guide

Auteurs et sources

Serveur Debian - PHP

12/01/2020 00:35 · montuy337513