Sécurisation du couple Apache / PHP

PHP

Désactivation de fonctions

Pour sécuriser PHP, j'ai choisi de désactiver des fonctions.

Pour cela il faut éditer le fichier /etc/php5/apache2/php.ini

# vi /etc/php5/apache2/php.ini

Avant :

disable_functions =

Après :

disable_functions = chgrp, chmod, chown, debugger_on, diskfreespace, dl, email, ftp_connect, exec, get_current_user, getmxrr, getmypid, getmyuid, imap_mail, leak, link, listen, mb_send_mail, openlog, passthru, pfsockopen, php_uname, popen, rmdir, sem_acquire, sem_get, set_time_limit, shm_attach, shm_open, socket, syslog, system, tmpfile, phpinfo

Désactivation des erreurs sur l'écran

Il faut ensuite désactiver la remontée des erreurs sur l'écran.

# vi /etc/php5/apache2/php.ini

Avant :

display_errors = On

Après :

display_errors = Off

Désactivation de l'affichage de la version de PHP

# vi /etc/php5/apache2/php.ini

Avant :

expose_php = On

Après :

expose_php = Off

Une fois ces modifications faite, il faut redémarrer Apache.

# /etc/init.d/apache2 restart

Module suhosin

Utilisation du module PHP Suhosin

Installation

# apt-get install php5-suhosin

Configuration

# vi /etc/php5/apache2/conf.d/suhosin.ini
extension=suhosin.so

[suhosin]
suhosin.log.syslog.facility = 9
suhosin.log.syslog.priority = 1

suhosin.executor.include.max_traversal = 4
suhosin.executor.disable_emodifier = on
suhosin.executor.disable_eval = on

suhosin.sql.bailout_on_error = on
suhosin.mail.protect = 2

suhosin.session.encrypt = Off

Une fois ces modifications faite, il faut redémarrer Apache.

# /etc/init.d/apache2 restart

APACHE

Désactivation de remontées d'Apache

# vi /etc/apache2/conf.d/security

ServerTokens

Avant :

ServerTokens Minimal

Après :

ServerTokens Prod

ServerSignature

Avant :

ServerSignature On

Après :

ServerSignature Off

TraceEnable

Avant :

TraceEnable On

Après :

TraceEnable Off

MaxRequestsPerChild

Il faut modifier la valeur de MaxRequestsPerChid pour éviter que cela soit en illimité.

Avant :

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

Après :

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   1000
</IfModule>

Il faut ensuite redémarrer Apache pour la prise en compte.

# /etc/init.d/apache2 restart

Mod_Security2

J'ai décidé d'utiliser le module mod_security pour augmenter la protection d'Apache.

Installation

Télécharger les sources du module sur le site de l'éditeur modsecurity-apache_2.5.12.tar.gz

Décompressez l'archive dans un répertoire temporaire

# tar xvfz modsecurity-apache_2.5.12.tar.gz

Il faut ensuite compiler ces sources

Pré-requis :

# apt-get install apache2-prefork-dev
# apt-get install libxml2-dev
# apt-get install lua50
# apt-get install liblua5.1-0
# apt-get install liblua5.1-0-dev
# apt-get install build-essential

Compilation :

# cd modsecurity-apache_2.5.12/apache2
# ./configure --with-apxs=/usr/bin/apxs2
# make
# make install

Le module /usr/lib/apache2/modules/mod_security2.so est crée. Il faut maintenant le charger dans Apache.

Pour cela, j'ai crée un fichier pour le charger par Apache.

# vi /etc/apache2/mods-available/security.load
LoadFile /usr/lib/libxml2.so
LoadFile /usr/lib/liblua5.1.so

LoadModule security2_module /usr/lib/apache2/modules/mod_security2.so
# cd /etc/apache2/mods-enabled
# ln -s ../mods-available/security.load
# ln -s ../mods-available/unique_d.load

Règles

Les règles mises en places sont celles fournies dans les sources du module.

Pour cela, il faut que voue recopiez le répertoire rules dans le répertoire /etc/apache2

# cp -Rp rules /etc/apache2/
# mv rules modsecurity_rules

Ensuite, il faut charger le contenu de se répertoire.

Pour cela on va créer un fichier de configuration

# vi /etc/apache2/mods-available/security.conf
<IfModule security2_module>
                Include /etc/apache2/modsecurity_rules/*.conf
                Include /etc/apache2/modsecurity_rules/base_rules/*.conf
                #Include /etc/apache2/modsecurity_rules/optional_rules/*.conf
</IfModule>
# cd ../mods-enabled
# ln -s ../mods-available/security.conf

Il faut ensuite redémarrer Apache.

# /etc/init.d/apache2 restart

PHPMyAdmin

Il faut ajouter les lignes suivantes pour que le PHPMyAdmin continue de fonctionner suite à toutes les modifications précédentes. Ajouter soit dans le VHost qui pointe sur le PHPMyAdmin, soit dans le fichier de configuration de phpmyadmin.

# allow phpmyadmin
<Directory /usr/share/phpmyadmin/>
        SecRuleInheritance Off
        php_value suhosin.executor.disable_eval off
</Directory>

Puis redémarrer Apache

# /etc/init.d/apache2 restart