Sécurité des gestionnaires PHP décide du degré de séparation des sites web dans les environnements partagés et des surfaces d'attaque qu'un serveur web expose ; dans la comparaison directe FPM-vs-CGI, ce sont surtout l'isolation des processus, les droits des utilisateurs et les limites strictes qui comptent. Je montre pourquoi FPM avec des pools dédiés réduit le risque, alors que CGI classique isole certes strictement, mais génère de la latence et une charge CPU en raison d'un overhead élevé.
Points centraux
- Isolation décide de la surface d'attaque et des risques de cross-account.
- Piscines FPM séparent les utilisateurs, fixent des limites et protègent les ressources.
- CGI isole fortement, mais coûte du CPU et du temps par requête.
- OPcache a besoin de segments de mémoire séparés par compte.
- hébergement partagé bénéficie d'instances FPM dédiées.
Comment les gestionnaires PHP façonnent la sécurité
Chaque gestionnaire relie le serveur web et l'interpréteur PHP, mais les Version mod_php charge PHP directement dans le processus du serveur web ; cela donne de la vitesse, mais partage le même contexte utilisateur et augmente le risque d'hébergement. CGI démarre un nouveau processus par requête sous l'utilisateur cible, ce qui permet de maintenir une séparation nette des droits, mais avec un surcoût sensible. FastCGI maintient les processus en vie et réduit les coûts de démarrage, mais ce n'est qu'avec FPM qu'il offre le contrôle fin qu'exigent les configurations multi-utilisateurs modernes. Je préfère FPM parce qu'il permet d'avoir des pools distincts par compte, des UID séparés et des limites précises sans perdre en efficacité.
FPM vs CGI : délimitation de la sécurité au quotidien
En comparaison directe, CGI sépare certes strictement, mais FPM applique la séparation durable et réduit la latence. Les pools FPM fonctionnent sous l'utilisateur du compte correspondant, isolent les chemins et encapsulent les ressources ; ainsi, un exploit sur le site A empêche l'accès au site B. En outre, je limite l'effet des scripts erronés avec memory_limit, max_execution_time et request_terminate_timeout. CGI termine certes chaque processus après la requête, mais gaspille du temps de CPU en démarrant et en chargeant constamment des extensions. Dans les environnements partagés, le FPM prévaut donc, idéalement sous forme de pool dédié par domaine ou par projet.
L'isolement dans l'hébergement partagé : risques et remèdes
C'est dans les environnements partagés qu'apparaît le plus grand risque d'hébergement, lorsque les comptes partagent involontairement des ressources ou des droits. Les attaquants ciblent les droits de fichiers faibles, les répertoires temporaires erronés ou les caches non séparés. Avec des pools FPM dédiés par compte, j'encapsule les processus, les chemins d'accès aux fichiers, les logs et les segments OPcache. En outre, je sépare les chemins de téléchargement et empêche les attaques par symlink grâce à des options de montage restrictives et à des modèles de propriétaires propres. à plusieurs niveaux Isolation des processus avec chroot, CageFS ou Jails réduit considérablement l'impact d'une intrusion, car l'attaquant n'atteint pas le système hôte.
Contrôle des ressources : pools, limites et timeouts
FPM marque des points parce que je peux cibler les ressources et les utiliser à bon escient. allocations et ainsi limiter les abus. Avec pm.max_children, je limite les processus PHP simultanés, tandis que pm.max_requests redémarre les workers à longue durée de vie après X requêtes, afin d'éviter les fuites de mémoire. request_terminate_timeout met fin aux accrochages qui occuperaient sinon la RAM, et protège contre les attaques de freinage. Pour les téléchargements, je définis post_max_size et upload_max_filesize de manière à ce que les flux de travail normaux fonctionnent, mais que les fichiers gigantesques ne soient pas acceptés. En combinaison avec des cgroups à l'échelle du système pour le CPU et la RAM, l'hôte reste réactif même en cas de pics de charge.
Comparaison chiffrée de la performance et de la sécurité
Une comparaison directe des handlers met en évidence les différences pratiques tangible. J'utilise l'aperçu suivant pour prendre des décisions et calibrer les attentes. Les valeurs décrivent des tendances typiques dans des configurations réelles et montrent pourquoi FPM est le premier choix dans les scénarios d'hébergement partagé. CGI donne la priorité à la dureté par le redémarrage, FPM équilibre l'isolation et la vitesse, LSAPI brille dans les piles LiteSpeed. Ce qui reste important : L'isolation sans limites ne sert pas à grand-chose, les limites sans isolation non plus.
| manipulateur | Performance | Sécurité | Consommation de RAM | Isolation | Idéal pour |
|---|---|---|---|---|---|
| mod_php | Haute | Faible | Faible | Faible | Petits sites simples |
| CGI | Faible | Haute | Haute | Haute | Tests, séparation stricte |
| FastCGI | Moyens | Moyens | Moyens | Moyens | Phase de transition |
| PHP-FPM | Très élevé | Haute | Faible | Haute | Hébergement mutualisé, CMS |
| suPHP | Faible | Très élevé | Haute | Très élevé | Sécurité maximale des fichiers |
| LSAPI | Très élevé | Moyens | Très faible | Moyens | Trafic élevé avec LiteSpeed |
De cette confrontation, je tire une conclusion claire ConséquencePour les hébergements multi-utilisateurs, FPM fournit la meilleure sécurité globale par unité de puissance. CGI reste une option pour les cas spéciaux avec une séparation maximale et peu de requêtes. J'évite mod_php dans les environnements avec plusieurs clients. LSAPI mérite l'attention lorsque LiteSpeed est utilisé et que la RAM est extrêmement limitée. Cependant, dans la plupart des scénarios, les avantages des pools FPM séparés avec des limites claires l'emportent.
Pièges de la configuration : des valeurs par défaut sûres pour les piles FPM
De nombreux cambriolages sont dus à Mauvaise configuration, et non par des exploits exotiques. Deux interrupteurs sont obligatoires pour moi : je mets cgi.fix_pathinfo=0, pour éviter les traversées de PATH_INFO, et limitez avec security.limit_extensions les terminaisons exécutables (par exemple .php,.php8,.phtml). Dans les configurations Nginx, je vérifie que SCRIPT_FILENAME est correctement défini et qu'aucune requête ne glisse sur des chemins arbitraires. De plus, je désactive les fonctions rarement utilisées comme exec, shell_exec, proc_open et popen via disable_functions. Ce n'est pas la panacée, mais cela réduit considérablement l'impact des simples webshells. open_basedir j'utilise le système de manière très sélective : il peut aider, mais il entraîne facilement des effets secondaires avec les tâches CLI, les bibliothèques de manipulation d'images ou Composer. Mieux vaut une séparation cohérente des chemins par compte et des droits de propriété propres.
Isoler correctement les sessions, les téléchargements et les répertoires temporaires
Commune Chemins de Temp sont un classique pour l'escalade des privilèges. Par pool FPM, je définis session.save_path et upload_tmp_dir dans un répertoire propre au compte, sous le Home, avec des droits restrictifs et Sticky-Bit uniquement là où c'est nécessaire. noexec, nodev et nosuid sur les montages réduisent la surface d'attaque d'autres niveaux. Pour les GC de session, je mets session.gc_probability/gc_divisor de manière à ce que les fichiers au sein de Je refuse les buckets de session globaux pour tous les utilisateurs. Ceux qui utilisent Redis pour les sessions séparent strictement les espaces de noms et attribuent des identifiants et des limites propres à chaque compte. Nous évitons ainsi qu'un code erroné n'affecte les sessions d'autres projets.
Conception de socket, autorisations et durcissement de systemd
Les pools FPM communiquent via des sockets. Je préfère Sockets UNIX pour la communication locale et placez-les dans un répertoire propre au compte avec 0660 et le groupe correspondant. global 0666-Les sockets sont tabous. Comme alternative, j'utilise TCP uniquement avec Bind sur 127.0.0.1 ou sur une interface interne et des pare-feux. Au niveau du service, la systemd de manière fiable : NoNewPrivileges=true, ProtectSystem=strict, ProtectHome=true, PrivateTmp=true, CapabilityBoundingSet= Ensemble de compétences (vide), Limites pour MemoryMax, Quota CPU, TasksMax et LimitNOFILE. Cela permet d'éliminer de nombreuses voies d'escalade, même si une faille de l'application web est touchée. Je place en outre les pools dans leurs propres tranches pour atténuer les voisins bruyants et faire respecter les budgets.
CLI, Cron et Queue-Worker : la même isolation que sur le web
Un fréquent Blindspot: php-cli ne passe pas par FPM. C'est pourquoi je démarre explicitement les cronjobs, les indexeurs et les queues de travail en tant qu'utilisateur du compte correspondant et j'utilise ma propre php.ini par projet (ou php_value-Overrides), les limites, les extensions et les open_basedir-reflète des équivalents. Les travailleurs de la file d'attente (par exemple des CMS et des frameworks courants) reçoivent les mêmes budgets RAM/CPU que les processus web, y compris la stratégie de redémarrage en cas de fuites. Pour les tâches récurrentes, je fixe des limites de backoff et de taux afin qu'un importateur de flux défectueux ne bloque pas l'hôte. La parité est importante : ce qui est interdit dans le pool web ne devrait pas être soudainement autorisé sur la CLI.
Logging, slowlogs et backpressure
La visibilité détermine la rapidité avec laquelle je détecte une attaque ou une mauvaise configuration. Pour chaque pool, j'écris mes propres Journaux d'erreurs et active request_slowlog_timeout y compris slowlog, pour obtenir des traces de la pile en cas d'accrocs. log_limit empêche les requêtes individuelles d'inonder les logs. Avec pm.status_path et un point d'accès ping, je surveille les processus, les temps d'attente et la charge de travail. Au niveau du serveur web, je mets en place Limites de taux, Les limites de corps de requête et les délais d'attente (lecture de l'en-tête et du corps) permettent d'éviter la surcharge des backends. Une base de règles WAF peut en outre intercepter des vecteurs d'attaque triviaux ; il reste toutefois décisif que FPM maintienne la surface d'attaque par compte à un niveau faible et que les limites soient fiables.
Séparer proprement les versions multi-PHP et les extensions
Dans l'hébergement mutualisé en particulier, plusieurs Versions de PHP en parallèle, comme d'habitude. Je tiens à disposition mes propres binaires FPM, extensions et configurations pour chaque version et je les lie à d'autres versions. par compte à . Les sockets sont placés dans des répertoires séparés, de sorte qu'aucune demande ne soit envoyée par erreur dans le mauvais pool. OPcache reste séparé par version et par compte ; revalidate_freq et validate_timestamps en fonction de la stratégie de release. Je fais preuve de prudence avec le JIT : Il accélère rarement les charges de travail CMS typiques et augmente la complexité - désactivé, il constitue souvent un choix plus sûr et plus stable. Je charge un minimum d'extensions ; tout ce qui n'est pas absolument nécessaire (par ex. pdo_mysql vs. pilotes inutilisés), reste en dehors.
Modèle de menace : voies d'attaque typiques et influence du gestionnaire
Dans la pratique, je vois toujours les mêmes schémas : des téléchargements de fichiers avec des extensions exécutables, une désérialisation non sécurisée, une utilisation peu soignée de l'Internet. PATH_INFO-transfert, inclusion de fichiers locaux et astuces de symlink. FPM ne résout pas cela automatiquement, mais il limite la portée: Un pool compromis ne voit que son propre espace de nommage. Avec security.limit_extensions et une configuration correcte du serveur web, j'empêche que les téléchargements d'images soient interprétés comme du PHP. Des chemins d'accès Temp et Session séparés empêchent les sessions à comptes croisés et les courses Tempfile. Avec des droits de fichiers restrictifs, umask et noexec-Le taux de réussite d'exploits simples diminue sensiblement avec l'utilisation de la fonction "Moniteurs".
Droits sur les fichiers, umask et concepts de propriété
Les systèmes de fichiers restent un problème fréquent Point faible, si les droits sont mal définis. Avec umask, je régule les droits par défaut, de sorte que les téléchargements n'aboutissent pas en écriture globale. suPHP ou FPM avec une affectation UID/GID correcte garantissent que le propriétaire du script est le même que le propriétaire du fichier. J'évite ainsi qu'un processus tiers modifie des fichiers ou lise des journaux. En outre, je bloque les chemins sensibles, je mets noexec sur les montages /tmp et je réduis la surface d'attaque en séparant systématiquement les chemins de lecture et d'écriture.
Utiliser OPcache en toute sécurité
La mise en cache apporte de la vitesse, mais sans une séparation propre, le stockage partagé génère de l'espace. Effets de bord. Pour les pools FPM, je garde OPcache séparé pour chaque compte afin que les clés et le code ne se chevauchent pas. J'active validate_timestamps en mode développement et je ne l'abaisse en production que pour les déploiements stables, afin que les modifications de code soient correctement appliquées. En outre, je vérifie file_cache uniquement dans le répertoire personnel du compte, pas globalement. Pour ceux qui utilisent la mémoire partagée, il est conseillé d'utiliser l'option Risques liés à la mémoire partagée connaître et limiter strictement la visibilité.
Combinaisons de serveurs web : Apache, Nginx, LiteSpeed
Le choix du front-end influence la latence, les handshakes TLS et la gestion des requêtes sensible. Apache avec mpm_event s'harmonise bien avec FPM si le keep-live et le proxy buffer sont corrects. Nginx avant FPM est convaincant pour les assets statiques et peut repousser la charge, tandis que PHP ne reçoit que des chemins dynamiques. LiteSpeed avec LSAPI fournit des frais généraux très bas, mais reste lié à un autre écosystème. Dans chaque pile, il faut séparer proprement les pools FPM, définir des limites, surveiller les logs et configurer consciemment les couches de cache.
Durcissement : chroot, CageFS et Jails
En plus des gestionnaires, l'isolation du système d'exploitation détermine Effet d'une intrusion. Avec chroot, CageFS ou Jails, je verrouille le compte dans un univers de système de fichiers propre. Un attaquant perd ainsi l'accès aux binaires de l'hôte et aux chemins d'accès sensibles des appareils. En combinaison avec FPM par compte, on obtient une défense à plusieurs niveaux qui s'applique également aux faiblesses des plug-ins dans les systèmes CMS. Si vous souhaitez comparer les options, vous trouverez dans le Comparaison des gestionnaires PHP une orientation précieuse pour classer les piles.
Conteneurs, SELinux/AppArmor et attentes réalistes
les conteneurs et les frameworks MAC comme SELinux ou AppArmor complètent efficacement FPM. La conteneurisation aide à lier les dépendances par projet et à limiter l'accès au système de fichiers racine. Je garde les images au minimum, retire les capacités inutiles et ne monte que les répertoires vraiment nécessaires. Les profils SELinux/AppArmor limitent les appels système et empêchent qu'un processus n'agisse en dehors de son contexte. Ce qui reste important : Les conteneurs ne remplacent pas l'isolation FPM et les droits de fichiers propres - ils constituent une couche supplémentaire qui intercepte les erreurs et ne remplace pas la base.
Liste de contrôle pratique pour les hébergeurs et les équipes
Dans les projets, je commence par une définition claire OrdreD'abord, je sépare techniquement les comptes, puis je déploie des pools de FPM par domaine. Ensuite, je fixe des limites réalistes, je mesure les pics de charge et j'adapte pm.max_children et pm.max_requests. Ensuite, je vérifie les droits des fichiers, sécurise les répertoires de téléchargement et supprime les droits d'écriture inutiles. Je configure OPcache par pool afin que le code, les sessions et les caches restent isolés. Enfin, je teste le basculement : je simule des accrocs, des modèles de DoS et des situations de out-of-memory jusqu'à ce que les mécanismes de protection fonctionnent de manière fiable.
En bref
Pour moi, une chose est sûre : FPM offre la meilleure Balance entre sécurité et performance, en particulier dans la comparaison fpm vs cgi. CGI reste utile lorsque la séparation absolue prime sur la vitesse, mais FPM atteint des objectifs de sécurité similaires avec beaucoup moins de frais généraux. Des pools dédiés, des limites strictes et des caches séparés réduisent sensiblement le risque d'hébergement dans les environnements partagés. Complété par l'isolation des processus, des droits de fichiers propres et une utilisation contrôlée de l'OPcache, un hôte pose les garde-fous décisifs. En combinant ces éléments de manière cohérente, on protège efficacement les projets tout en réduisant les temps de réponse.


