Skip to content

Configurer SELinux pour les services web

Picture of mindtech

mindtech

Biographical Info

In this article

Get fresh finance insights, monthly

Time and money-saving tips, straight to your inbox

No comment yet, add your voice below!


Add a Comment

Your email address will not be published. Required fields are marked *

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.

Don't miss these

Procédure

Configurer Red Hat Satellite pour le patch management

Procédure

Automatiser la gestion des serveurs avec Ansible

Procédure

Déploiement d’un cluster Kubernetes avec OpenShift