De la sécurité de systemd

J'ai voulu modifier l'emplacement de fichiers de logs d'une application. Redis, pour ne pas le citer.

J'ai donc bêtement modifié le paramètre logfile de /etc/redis/redis.conf, et mis les bonnes permissions sur le fichier en question.

Ça marche très bien sur Debian Wheezy, mais pas du tout sur Debian Jessie, impossible de démarrer le service. Je me retrouvais avec un :

[user@jessie:~/] $ sudo /etc/init.d/redis-server restart
[....] Restarting redis-server (via systemctl): Job for redis-server.service failed. See 'systemctl status redis-server.service' and 'journalctl -xn' for details.
failed!  

Bon, alors déjà, la commande journalctl -xn ne retourne rien. Il faut aller voir les logs dans /var/log/syslog. Et là, je constate :

Mar 30 17:29:47 jessie redis-server[14822]: *** FATAL CONFIG FILE ERROR ***  
Mar 30 17:29:47 jessie redis-server[14822]: Reading the configuration file, at line 108  
Mar 30 17:29:47 jessie redis-server[14822]: >>> 'logfile /home/user/logs/redis/redis-server.log'  
Mar 30 17:29:47 jessie redis-server[14822]: Can't open the log file: Permission denied  
Mar 30 17:29:47 jessie systemd[1]: redis-server.service: control process exited, code=exited status=1  
Mar 30 17:29:47 jessie systemd[1]: Failed to start Advanced key-value store.  
Mar 30 17:29:47 jessie systemd[1]: Unit redis-server.service entered failed state.  

Pourtant, j'ai bien le répertoire log qui existe ET les droits pour l'utilisateur redis qui conviennent !

[user@jessie:/lib/systemd/system] $ ls -al /home/user/logs/redis/
total 16  
drwxrwxr-x 2 redis redis 4096 Mar 30 17:29 .  
drwxr-xr-x 7 user  user  4096 Mar 30 17:26 ..  

De plus, quand je lance tout à la main depuis l'utilisateur redis, ça marche impeccable. Ca vient donc forcément de systemd...

Après quelque recherche, je constate que le fichier unit de redis comporte des instruction ReadWriteDirectories. Et là, bingo. Il faut préciser tous les répertoires dans lequel le processus à le droit d'écrire ici. Il y a aussi une instruction ProtectHome qui permet de restreindre l'accès au répertoire home des utilisateurs. Dans mon cas, j'ai aussi besoin de le modifier.

Un rapide sed :

sed -i s#ReadWriteDirectories=-/var/log/redis#ReadWriteDirectories=-/home/user/logs/redis# /lib/systemd/system/redis-server.service  
sed -i s#ProtectHome=yes#ProtectHome=no# /lib/systemd/system/redis-server.service  

Puis on fait un daemon-reload pour relire le fichier de configuration :

sudo systemctl daemon-reload  

Enfin, on redémarre le service, et tout va bien !

sudo systemctl start redis  

Damien Gustave

Read more posts by this author.