Migrate vers systemd-sysusers et tmpfiles pour gérer comptes et répertoires proprement
Créez des comptes système, définissez les permissions et gérez les répertoires de service avec systemd-sysusers et tmpfiles, sans scripts fragiles.
Pour déployer un service interne proprement, déclarez son compte avec systemd-sysusers, ses répertoires persistants avec systemd-tmpfiles et son processus dans l’unité systemd. Cette séparation remplace les suites fragiles de useradd, mkdir, chown et rm par des déclarations relues de façon idempotente.
Elle convient aux paquets comme aux déploiements gérés par configuration. Les fichiers de déclaration fournissent une source de vérité lisible, y compris lorsque le compte ou les répertoires existent déjà.
Déclarer le compte et les répertoires
Pour un logiciel distribué par paquet, placez les déclarations de l’éditeur dans /usr/lib/sysusers.d/ et /usr/lib/tmpfiles.d/. Un administrateur peut les remplacer avec un fichier de même nom dans /etc/, selon les règles de sysusers.d et de tmpfiles.d.
Créez par exemple /usr/lib/sysusers.d/acme-sync.conf. Le type g déclare le groupe, le type u l’utilisateur et le tiret demande à systemd de choisir un identifiant disponible.
g acme-sync -
u acme-sync acme-sync "Service de synchronisation Acme" /var/lib/acme-sync /usr/sbin/nologin
Le champ /var/lib/acme-sync définit le répertoire personnel, mais tmpfiles doit créer explicitement ce chemin et ses droits. Évitez de fixer un UID numérique sans besoin opérationnel précis : il peut entrer en conflit avec des politiques locales ou d’autres logiciels.
Créez ensuite /usr/lib/tmpfiles.d/acme-sync.conf. La directive d crée le répertoire s’il manque et applique son mode, son propriétaire et son groupe.
d /var/lib/acme-sync 0750 acme-sync acme-sync -
d /var/cache/acme-sync 0750 acme-sync acme-sync 30d
Le premier chemin conserve l’état durable ; le second est un cache que systemd-tmpfiles peut nettoyer après 30d. Appliquez les règles avec systemd-tmpfiles --create et exécutez le nettoyage avec systemd-tmpfiles --clean.
N’utilisez pas Z, qui ajuste récursivement propriétaires, modes et contextes de sécurité, sans vérifier que le service est seul propriétaire du contenu. Sur un chemin partagé, cette règle peut modifier des fichiers qui ne lui appartiennent pas.
Confier l’exécution à l’unité
L’unité exécute le processus sous l’identité déclarée et peut gérer son répertoire d’exécution. Pour Acme Sync :
[Service]
User=acme-sync
Group=acme-sync
RuntimeDirectory=acme-sync
RuntimeDirectoryMode=0750
ExecStart=/usr/libexec/acme-sync
RuntimeDirectory=acme-sync crée /run/acme-sync pour la durée d’exécution. Ne déclarez pas ce même chemin dans tmpfiles : chaque répertoire doit avoir un responsable clair.
Testez d’abord la déclaration avec systemd-sysusers, puis vérifiez le compte avec getent passwd acme-sync et getent group acme-sync. Vérifiez enfin que l’outil de paquetage ou la procédure de déploiement applique systemd-sysusers et systemd-tmpfiles --create avant d’activer le service.