Securiser apache

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Durcissement Apache + PHP (hors TLS)
Fichier de conf /etc/apache2/apache2.conf (ou httpd.conf)
Voir aussi Securiser apache 2 · Modsecurity · Php-fpm

Cette page couvre le durcissement général d'un serveur Apache et de PHP : masquage de version, permissions de répertoire, contrôle d'accès, désactivation de fonctions dangereuses. Pour le durcissement spécifique du chiffrement TLS/SSL (choix des suites de chiffrement, protocoles, forward secrecy), voir Securiser apache 2.

Masquer les informations de version

Par défaut, Apache annonce sa version et le système d'exploitation dans les en-têtes HTTP et les pages d'erreur — une information utile à un attaquant pour cibler des vulnérabilités connues d'une version précise.

# apache2.conf / httpd.conf
ServerSignature Off
ServerTokens Prod
TraceEnable Off

Côté PHP, désactiver de même la bannière X-Powered-By :

; php.ini
expose_php = Off

TraceEnable Off désactive la méthode HTTP TRACE, utilisée dans certaines attaques de type Cross-Site Tracing (XST). En complément, sur les versions d'Apache antérieures à 1.3.34 / 2.0.55 (qui ne connaissent pas TraceEnable), le blocage peut se faire via mod_rewrite :

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]

Exécuter Apache avec un utilisateur dédié

Vérifier que le serveur tourne avec un utilisateur système non privilégié dédié (www-data sur Debian/Ubuntu, apache sur RHEL/CentOS), jamais en root :

User www-data
Group www-data

Contrôle d'accès aux répertoires

Empêcher le listing d'un répertoire ne contenant pas d'index :

<Directory /var/www/monsite>
    Options -Indexes
    Require all granted
</Directory>

(la source utilisait la syntaxe Order Allow,Deny / Allow from all, propre à Apache 2.2 — obsolète et supprimée en Apache 2.4+, remplacée par Require all granted, utilisée ci-dessus.)

Empêcher la lecture des fichiers .htaccess par les clients :

AccessFileName .htaccess
<FilesMatch "^\.ht">
    Require all denied
</FilesMatch>

Bloquer une IP précise :

<Directory /var/www/monsite>
    Require all granted
    Require not ip 192.0.2.5
</Directory>

Désactiver l'exécution de scripts CGI dans un répertoire :

Options -ExecCGI

Penser aussi à désactiver les modules Apache non utilisés (voir Modules apache) — chaque module chargé est une surface d'attaque potentielle.

Chrooter Apache (mod_security)

Il est possible d'isoler le process Apache dans un chroot via le module ModSecurity (voir Modsecurity) :

SecChrootDir /chroot/apache

(à vérifier selon la version de ModSecurity — cette directive a été retirée des versions récentes du module, le chroot applicatif étant aujourd'hui plutôt délégué à des mécanismes au niveau OS/conteneur.)

Bloquer les scanners de vulnérabilités

Règle générique de blocage des requêtes contenant une URL absolue dans la chaîne de requête (signature fréquente de scanners automatisés et de tentatives de RFI) :

RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.*)http(\:|%3A)(.*)$
RewriteRule .* - [F]

Durcissement PHP

; php.ini
expose_php = Off
display_errors = Off
log_errors = On
error_log = /var/log/httpd/php_scripts_error.log
file_uploads = Off              ; à activer seulement si le site en a réellement besoin

allow_url_fopen = Off
allow_url_include = Off

; Contrôle des ressources (protection DoS applicative)
max_execution_time = 30
max_input_time = 30
memory_limit = 40M

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
cgi.force_redirect = On

; Limiter l'accès au système de fichiers
open_basedir = "/var/www/html/"

; Chemins de session
session.save_path = "/var/lib/php/session"
upload_tmp_dir = "/var/lib/php/session"

(directives retirées du code source par rapport à la version originale : sql.safe_mode et magic_quotes_gpc — supprimées de PHP depuis PHP 5.4/PHP 7, leur présence dans un php.ini moderne n'a aucun effet.)

Audit de code PHP

Outils d'analyse statique pour repérer des vulnérabilités dans du code PHP existant (état à vérifier — plusieurs de ces outils n'ont plus été maintenus depuis) :

  • RIPS — analyse statique orientée vulnérabilités PHP
  • RATS (Rough Auditing Tool for Security)

Voir aussi

  • Securiser apache 2 — durcissement du chiffrement TLS/SSL
  • Modsecurity — pare-feu applicatif, y compris le chroot évoqué ci-dessus
  • Modules apache — désactivation des modules inutiles
  • Php-fpm — isolation par pool utilisateur, alternative à mod_php