Hello les amis, pour ceux d'entre-vous qui utilisent mon script de monitoring SMS (
christophe-casalegno.com/con…), une mise à jour récente des paquets PHP-FPM sur Debian s'est accompagné d'un durcissement systemd plus strict, notamment le passage par défaut.
[ Je profite de ce message pour mettre en ligne la dernière version à laquelle j'ai ajouté les test opensearch, redis, postgresql et réplication postgresql aux tests préexistants. ]
PrivateDevices est désormais à true en valeur par défaut, ce qui donne au service PHP-FPM une vue privée et limitée de /dev.
Dans la pratique c'est plutôt un mesure de sécurité / mitigation intéressante pour un service web : sans être magique, si une application PHP est compromise, elle voit moins de périphériques système et la surface d’attaque en est d'autant réduite.
Toutefois cela provoque un effet de bord sur le module de chez ZFS de sms où la commande zpool status -x peut échouer avec un message du type /dev/zfs and /proc/self/mounts are required
Le pool ZFS peut être parfaitement sain, mais le script lancé via PHP-FPM ne voit simplement plus /dev/zfs, ce qui remonte dans la page de monitoring un pool ZFS en erreur.
Pour ceux qui utilisent SMS chez eux avec ZFS, le correctif temporaire consiste à créer un override systemd pour PHP-FPM sur la version de PHP sur laquelle tourne SMS. Par exemple avec PHP 8.4 :
--------------------------------------------------
mkdir -p /etc/systemd/system/php8.4-fpm.service.d
cat >/etc/systemd/system/php8.4-fpm.service.d/override.conf <<'EOF'
[Service]
PrivateDevices=false
EOF
systemctl daemon-reload
systemctl restart php8.4-fpm
À adapter évidemment selon votre version de PHP :
php8.3-fpm
php8.4-fpm
etc.
--------------------------------------------------
L'autre solution consister à renvoyer la sortie de sms(.sh) dans un fichier statique via une cron, mais vous perdez alors la vérification de fait que ce que vous voyez est la réalité et non une page figée.
Vous pouvez vérifier l’état effectif avec :
systemctl show php8.4-fpm -p PrivateDevices -p DropInPaths
Le résultat attendu après override :
PrivateDevices=no
Attention : ce correctif restaure l’ancien comportement, mais il réduit aussi le confinement ajouté à PHP-FPM. Il redonne au contexte PHP-FPM accès au vrai /dev de la machine. Ce n’est donc pas un changement neutre d’un point de vue sécurité.
C’est acceptable dans certains contextes de monitoring local maîtrisé, mais ce n’est pas une solution idéale à long terme.
Comme j'utilise cet outil pour ma production et bien que zfs ne soit actuellement présent que sur des serveurs de backups dédiés pour lesquels la surface d'exposition via php est nulle, j'ai commencé à travailler sur une évolution : stackx-smsd.
L’idée est de ne plus faire dépendre SMS de PHP-FPM pour exécuter sms(.sh). SMS restera en Bash, tel qu’aujourd’hui, la différence c'est qu'au lieu d'être appelé via PHP (je sais toutefois que certains d'entre vous l'appellent via d'autres langages / systèmes), il sera appelé par un petit service dédié, lancé sous l’utilisateur dédié au monitoring sur mes serveurs, sans dépendance à PHP-FPM et sans devoir désactiver le hardening global du service PHP.
Objectif :
- conserver les checks live ;
- conserver SMS en full Bash ;
- éviter les faux positifs liés au sandboxing PHP-FPM ;
- ne pas affaiblir d'autres applications PHP qui exploiteraient le même pool ;
- rendre SMS plus robuste face aux évolutions des paquets PHP/Debian.
J'ai hésité à me contenter de dupliquer une version de php pour la dédier au monitoring, mais je pense qu'avec les différentes déclinaisons de produits que j'élabore en ce moment, ce serait plus facile à gérer ainsi à long terme et insensible à d'autres futures modifications.
Excellente soirée à tous !