Files
2026-07-20 11:05:07 +02:00

41 lines
2.1 KiB
Plaintext

# 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