Tutoriel de sécurisation de PHP niveau serveur et code

Introduction :

Nous allons traiter dans ce tutoriel des aspects touchant à la sécurité de PHP. Nous commencerons par nous intéresser à la sécurisation niveau serveur puis nous nous attarderons sur la sécurisation au niveau du code avec un petit tour d'horizon des erreurs les plus connues. La version PHP utilisée ici est la 5.3.

Sécurisation niveau serveur

Cette partie est bien évidemment destinée à tout ceux qui dispose du contrôle de leur serveur PHP, qu'ils soient hébergeurs ou particuliers avec un serveur privé.
On s'intéresse souvent à la sécurisation du code PHP en lui même sans penser que des failles pourraient être évitées en configurant correctement son serveur.

Fichier de configuration php.ini

Le fichier de configuration de PHP est un fichier php.ini se situant habituellement dans le répertoire /etc/php5/. Suivant que vous utilisez PHP en tant que module Apache ou en CGI le fichier de configuration pourra être différent. Vous pouvez connaître le fichier de configuration utilisé en utilisant la commande phpinfo() (ligne "Loaded Configuration File"). Nous allons voir un peu plus en détail les paramètres principaux. Nous ne traiterons bien sur pas l'ensemble des paramètres possibles mais uniquement ceux relatifs de près ou de loin à la sécurité.


; Safe Mode
; NOTE: this is considered a "broken" security measure.
;les variables safe mode ne doivent plus être utilisées et seront supprimées dans PHP6
safe_mode = Off		

;La variable open_basedir permet de "chrooter" un script PHP. 
;C'est à dire que les opérations sur les fichiers seront restreintes à ceux présent dans ce répertoire.
;Cela permet notamment d'éviter qu'un script PHP puisse aller fouiner sur votre disque dur.
open_basedir=/home/	

; This directive allows you to disable certain functions for security reasons.
; It receives a comma-delimited list of function names. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
;Certaines fonctions peuvent être potentiellement dangereuses si utilisées à des fins malicieuses comme par exemple exec() ou system() qui permettent d'exécuter des commandes systèmes.
;La désactivation de ces fonctions est bien sur à étudier en fonction des besoins.
;par exemple : proc_open , popen, disk_free_space, diskfreespace, set_time_limit, leak, tmpfile, exec, system, shell_exec, passthru
disable_functions =

;La variable expose_php n'est pas réellement critique, mais positionnée à Off elle permet de cacher votre version de PHP.
expose_php = Off

;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
;Les variables relatives aux ressources disponibles pour l'exécution des scripts PHP sont à configurer 
;en fonction de votre système mais sont très importantes afin d'éviter tout problème de saturation.
max_execution_time = 30     	; Temps d'exécution de chaque script, en secondes
max_input_time = 60 		; Maximum amount of time each script may spend parsing request data
;max_input_nesting_level = 64 	; Maximum input variable nesting level
memory_limit = 128M


;Suivent les variables relatives à la gestion des erreurs PHP, elles ne seront pas détaillées ici car dépendent trop de vos critères.

;La variable register_globals est obsolète et à positionnée à Off dans la mesure du possible ! Plusieurs gros problèmes de sécurité se posent avec l'utilisation.
;De plus la fonctionnalité sera supprimée dans PHP6.
;Plus d'infos ici : http://fr.php.net/manual/fr/security.globals.php
register_globals = Off

; Permet de limiter la taille maximale des données envoyées par la méthode POST
post_max_size = 8M

;Permet de limiter la taille maximale des fichiers uploader
upload_max_filesize = 2M

;Il est vivement conseiller de positionner ces 2 variables à Off afin d'interdire l'inclusion de site distant
allow_url_fopen = Off
allow_url_include = Off


suPHP

L'un des problèmes récurrent avec les scripts PHP est les droits dont ils disposent lors de leur exécution.
En effet par défaut un script PHP sera exécuté par l'utilisateur www-data correspondant à l'user avec lequel Apache est lancé.
Le problème est qu'avec ce type d'utilisation un script PHP à accès à tous les fichiers appartenant à www-data.
Dans un environnement multi-site il peut être non souhaitable qu'un site puisse accéder aux données d'un autre site. La variable open_basedir permet déjà une certaine protection contre ce problème.
Mais si l'on veut être encore plus rigoureux, il serait intéressant qu'un script appartenant à un utilisateur soit exécuté par cette utilisateur. Et c'est la qu'intervient suPHP! suPHP se présente en tant que module Apache et va exécuter les scripts PHP en CGI avec les droits de leurs propriétaires. Un autre avantage de suPHP est de pouvoir faire cohabiter les versions 4 et 5 de PHP sans problèmes et ainsi pouvoir exécuter les anciens sites. Deux ombres au tableau cependant : - l'exécution de scripts PHP en tant que CGI serait plus gourmande en ressource (il serait intéressant de faire des benchmarks car la différence ne dot pas être énorme) - Il n'est plus possible de configurer les variables du fichier php.ini directement dans le virtualhost ou dans un fichier .htaccess. Ca peut être un point bloquant mais il est alors possible de définir un fichier php.ini par virtualhost.

Installation de suPHP

apt-get install modapache_suphp

Configuration du suPHP

[global]
;Path to logfile
logfile=/var/log/suphp.log

;Loglevel
loglevel=info

;User Apache is running as
webserver_user=www-data

;Path all scripts have to be in
docroot=

;Path to chroot() to before executing script
;chroot=/mychroot

; Security options
allow_file_group_writeable=false
allow_file_others_writeable=false
allow_directory_group_writeable=false
allow_directory_others_writeable=false

;Check wheter script is within DOCUMENT_ROOT
check_vhost_docroot=true

;Send minor error messages to browser
errors_to_browser=false

;PATH environment variable
env_path=/bin:/usr/bin

;Umask to set, specify in octal notation
umask=0077

; Minimum UID
min_uid=100

; Minimum GID
min_gid=100


[handlers]
;Handler for php-scripts
x-httpd-php="php:/usr/bin/php"

;Handler for CGI-scripts
x-suphp-cgi="execute:!self"

Il est possible maintenante de définir dans chaque vhost, quel fichier php.ini est à utiliser grâce à la commande suPHP_ConfigPath

suHosin

suHosin est un système de protection avancé de PHP. Il permet de protéger votre serveur et vos utilisateurs des problèmes connus et inconnus que peut introduire PHP dans les applications. Parmis les différentes fonctionnalités que suHosin propose on retrouve :

Installation de suHosin

Configuration de suHosin

Sécurisation du code PHP

Vous trouverez un maximum d'information à cet endroit : http://phpsec.org/projects/guide/fr/

Positionnement et Statistiques Gratuites Ajoutez votre site Top des sites