# Renforcement du service mosquitto par défaut du paquet Debian. # L'utilisateur dédié "mosquitto" est déjà créé par le paquet ; ce drop-in # ne fait que restreindre ses droits système. # # Déployé par install.sh vers /etc/systemd/system/mosquitto.service.d/override.conf [Service] # User=/Group= explicites : sans ça, RuntimeDirectory= (ci-dessous) crée # /run/mosquitto appartenant à root (propriétaire par défaut quand User= # est vide), car ce chemin est bind-monté dans le namespace propre à # ExecStart avec cette ownership-là — le `chown mosquitto:mosquitto # /run/mosquitto` du ExecStartPre du paquet Debian n'a aucun effet # persistant sur cette vue. Résultat observé : mosquitto démarre root, # abandonne ses privilèges en interne vers l'utilisateur "mosquitto" # (aucune directive "user" dans mosquitto.conf nécessaire, comportement # par défaut du binaire), puis échoue avec "Unable to write pid file" # (EACCES sur /run/mosquitto/mosquitto.pid, confirmé via strace). Fixer # User=/Group= ici fait créer /run/mosquitto directement avec le bon # propriétaire, sans dépendre du chown du ExecStartPre. User=mosquitto Group=mosquitto NoNewPrivileges=true ProtectSystem=strict ProtectHome=true PrivateTmp=true ReadWritePaths=/var/lib/mosquitto /var/log/mosquitto # /run/mosquitto est du tmpfs, recréé à chaque démarrage : lister ce chemin # dans ReadWritePaths= exige qu'il existe déjà AVANT que systemd ne monte le # namespace de l'unité (donc avant même le premier ExecStartPre), ce que # rien ne garantit après un redémarrage du VPS ("Failed to set up mount # namespacing: /run/mosquitto: No such file or directory", 226/NAMESPACE). # RuntimeDirectory= est le mécanisme systemd natif pour ce cas précis : il # crée /run/mosquitto (proprio mosquitto, cf. User=/Group= ci-dessus) lui- # même, avant tout Exec*, et le recrée à chaque démarrage — pas de # dépendance sur un état laissé par un run précédent. RuntimeDirectory=mosquitto ProtectKernelTunables=true ProtectKernelModules=true ProtectControlGroups=true RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6