Introduction
SELinux (Security-Enhanced Linux) est un module de sécurité pour le noyau Linux conçu pour appliquer des politiques de contrôle d’accès obligatoires (MAC). Lorsqu’il s’agit de services web tels qu’Apache ou Nginx, SELinux joue un rôle clé dans la sécurisation du système contre les élévations de privilèges et les accès non autorisés aux ressources système. Sa configuration correcte est essentielle pour assurer à la fois la disponibilité et la sécurité des services exposés.
Dans cet article, nous présentons une méthode structurée pour configurer SELinux avec Apache et Nginx, en définissant les bons contextes, en ajustant les politiques de sécurité et en maintenant une posture de sécurité proactive.
Pourquoi SELinux est crucial pour les services web
Selon la documentation officielle de Red Hat, SELinux implémente des règles strictes qui restreignent les actions des processus, même lorsqu’ils sont exécutés avec les droits root. Dans un contexte d’hébergement web, cela permet de limiter l’impact d’une compromission d’un site ou d’un composant logiciel malveillant.
Par défaut, SELinux applique des contextes spécifiques aux fichiers, ports et processus. Par exemple, le processus Apache (httpd) ne pourra accéder qu’à des fichiers marqués avec le bon type SELinux (comme httpd_sys_content_t
), sauf si on lui attribue explicitement d’autres permissions via des politiques personnalisées.
Vérifier le mode SELinux et le service cible
Avant toute configuration, il est crucial de vérifier le mode de fonctionnement actuel de SELinux et les services concernés :
getenforce
sestatus
ps -eZ | grep httpd
ps -eZ | grep nginx
Les modes possibles sont Enforcing (en vigueur), Permissive (logge sans bloquer), ou Disabled (inactif). Pour appliquer les politiques, SELinux doit être en mode Enforcing.
Configurer les contextes des fichiers web
Pour que les serveurs web accèdent correctement aux fichiers web, ceux-ci doivent avoir le contexte SELinux approprié. Par défaut, Apache et Nginx lisent les fichiers avec le type httpd_sys_content_t
.
Définir et restaurer le contexte sur un répertoire personnalisé :
semanage fcontext -a -t httpd_sys_content_t "/var/www/custom(/.*)?"
restorecon -Rv /var/www/custom
💡 Utiliser semanage
nécessite le paquet policycoreutils-python-utils
sur RHEL 8+ ou Fedora.
Ouvrir les ports personnalisés
Si Apache ou Nginx écoutent sur des ports non standards (autres que 80, 443), SELinux doit autoriser explicitement l’utilisation de ces ports par les processus web :
semanage port -a -t http_port_t -p tcp 8080
⚠️ S’assurer que le port est libre côté pare-feu (firewalld
ou iptables
) en plus de SELinux.
Activer l’accès en écriture si nécessaire
Si le serveur web doit écrire dans certains répertoires (ex : téléchargement de fichiers, logs personnalisés), il faut attribuer le type httpd_sys_rw_content_t
:
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/custom/uploads(/.*)?"
restorecon -Rv /var/www/custom/uploads
⚠️ Ne pas étendre l’usage de ce type à l’arborescence principale sans justification – cela accroît la surface d’attaque.
Gérer les Boolean SELinux
SELinux utilise des booléens pour activer ou désactiver certaines capacités des services web sans modifier la politique complète. Quelques booléens courants pour Apache/Nginx :
getsebool -a | grep httpd
setsebool -P httpd_can_network_connect on
setsebool -P httpd_enable_homedirs on
💡 L’option -P
rend la modification persistante après redémarrage.
Créer une politique personnalisée (optionnel)
Dans certains cas, il peut être nécessaire de définir des règles plus fines via une politique modulaire :
audit2allow -a -M myhttpdpolicy
semodule -i myhttpdpolicy.pp
⚠️ Toujours inspecter la sortie de audit2allow
pour vérifier que les règles ne sont pas trop permissives.
Vérification post-configuration
Une fois la configuration appliquée, vérifier que SELinux ne bloque rien d’inattendu :
ausearch -m avc -ts recent
sealert -a /var/log/audit/audit.log
En cas de problème, ces messages indiqueront les accès interdits et les types incorrects à corriger.
Rétablissement de l’état initial
Pour annuler une configuration SELinux, on peut supprimer les règles ajoutées :
semanage fcontext -d "/var/www/custom(/.*)?"
semanage port -d -t http_port_t -p tcp 8080
setsebool -P httpd_can_network_connect off
Restaurer les contextes par défaut :
restorecon -Rv /var/www/custom
Conclusion
Cette procédure permet de configurer SELinux pour sécuriser efficacement des services web comme Apache ou Nginx. En respectant la logique des contextes, des ports autorisés et des booléens SELinux, on renforce la défense du serveur sans compromettre sa fonctionnalité.
Prochaine étape recommandée : auditer régulièrement les logs SELinux avec auditd
pour maintenir une politique de sécurité à jour en fonction des usages réels.
No comment yet, add your voice below!