Protéger un serveur PHP avec Suhosin
Suhosin est une extension de PHP qui permet de protéger un serveur contre une série de failles et d'attaques. Il ne protège naturellement pas contre toutes les attaques, et le développeur web devra donc toujours veiller à créer une application sécurisée, mais suhosin permet:
- de se protéger contre certaines failles du coeur PHP (comme par exemple la vulnérabilité "hash collision");
- d'éviter certaines fautes d’inattention du programmeur;
- de limiter les dégâts si une application web est compromise.
L'installation sur Ubuntu est comme toujours extrêmement simple:
apt-get install php5-suhosin
Le fichier de configuration de suhosin se trouve dans /etc/php5/apache2/conf.d/suhosin.ini, et la liste complète des options est clairement expliquée sur le site du projet Suhosin.
Une des options par défaut (suhosin.get.max_name_length=64) limite la longueur du nom des paramètres GET passés au script. Il est très facile de tester ce paramètre avec le code suivant:
<?php
var_dump($_GET);
?>
<a href="suhosin_test.php?abcd=1&azertyuiopqsdfghjklmwxcvbnazertyazertyuiopqsdfghjklmwxcvbnazertyazer=2">
Test...
</a>
Comme on peut le voir sur le screenshot ci-dessous, lorsqu'on utilise ce lien le deuxième paramètre (azert...) n'est pas transmis au script.
D'autres options intéressantes sont malheureusement désactivées par défaut, et il faudra donc les configurer manuellement:
- suhosin.executor.include.max_traversal=5
- suhosin.executor.disable_eval=On
- suhosin.executor.disable_emodifier=On
- suhosin.memory_limit=20M
Par défaut les alertes générées par Suhosin sont enregistrées dans /var/log/syslog. Ce n'est pas très pratique et je préfère donc utiliser un fichier séparé. Pour ce faire il suffit de créer un fichier /etc/rsyslog.d/30-suhosin.conf contenant les lignes suivantes:
:programname,contains,"suhosin" /var/log/suhosin.log
& ~
Puis de redémarrer rsyslog:
sudo restart rsyslog
Les alertes Suhosin seront désormais enregistrées dans /var/log/suhosin.log. Ce fichier est important car Suhosin pourrait malheureusement aussi empêcher certains scripts PHP de fonctionner correctement, mais c'est la contrepartie d'une plus grande sécurité...