Je pense que de nombreux détails de votre question pourraient s'appliquer également avahi-daemon
, que j'ai examinés récemment. (J'ai peut-être manqué un autre détail qui diffère cependant). L'exécution d'avahi-daemon dans un chroot présente de nombreux avantages, au cas où avahi-daemon serait compromis. Ceux-ci inclus:
- il ne peut pas lire le répertoire personnel des utilisateurs et exfiltrer des informations privées.
- il ne peut pas exploiter les bogues dans d'autres programmes en écrivant dans / tmp. Il existe au moins une catégorie entière de ces bogues. Par exemple https://www.google.co.uk/search?q=tmp+race+security+bug
- il ne peut ouvrir aucun fichier socket Unix en dehors du chroot, sur lequel d'autres démons peuvent écouter et lire des messages.
Le point 3 pourrait être particulièrement agréable lorsque vous n'utilisez pas dbus ou similaire ... Je pense qu'avahi-daemon utilise dbus, donc il s'assure de garder l'accès au système dbus même depuis l'intérieur du chroot. Si vous n'avez pas besoin d'envoyer des messages sur le système dbus, le fait de refuser cette capacité pourrait être une fonctionnalité de sécurité assez intéressante.
le gérer avec le fichier d'unité systemd
Notez que si avahi-daemon a été réécrit, il pourrait potentiellement choisir de s'appuyer sur systemd pour la sécurité, et utiliser par exemple ProtectHome
. J'ai proposé un changement à avahi-daemon pour ajouter ces protections en tant que couche supplémentaire, ainsi que des protections supplémentaires qui ne sont pas garanties par chroot. Vous pouvez voir la liste complète des options que j'ai proposées ici:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
Il semble qu'il y ait plus de restrictions que j'aurais pu utiliser si avahi-daemon n'a pas utilisé chroot lui-même, dont certaines sont mentionnées dans le message de validation. Je ne sais pas combien cela s'applique cependant.
Remarque, les protections que j'ai utilisées n'auraient pas empêché le démon d'ouvrir des fichiers socket Unix (point 3 ci-dessus).
Une autre approche serait d'utiliser SELinux. Cependant, vous seriez en quelque sorte en train de lier votre application à ce sous-ensemble de distributions Linux. La raison pour laquelle j'ai pensé positivement à SELinux ici, c'est que SELinux restreint l'accès aux processus sur dbus, de manière fine. Par exemple, je pense que vous pourriez souvent vous attendre à ce que systemd
ce ne soit pas dans la liste des noms de bus dont vous avez besoin pour pouvoir envoyer des messages à :-).
"Je me demandais si l'utilisation du sandboxing systemd était plus sûre que chroot / setuid / umask / ..."
Résumé: pourquoi pas les deux? Décodons un peu ce qui précède :-).
Si vous pensez au point 3, l'utilisation de chroot offre plus de confinement. ProtectHome = et ses amis n'essaient même pas d'être aussi restrictifs que chroot. (Par exemple, aucune des listes noires d'options systemd nommées /run
, où nous avons tendance à placer des fichiers socket Unix).
chroot montre que restreindre l'accès au système de fichiers peut être très puissant, mais tout n'est pas sous Linux un fichier :-). Il existe des options systemd qui peuvent restreindre d'autres choses, qui ne sont pas des fichiers. Ceci est utile si le programme est compromis, vous pouvez réduire les fonctionnalités du noyau qui lui sont disponibles, dans lesquelles il pourrait essayer d'exploiter une vulnérabilité. Par exemple, avahi-daemon n'a pas besoin de prises bluetooth et je suppose que votre serveur web non plus :-). Ne lui donnez donc pas accès à la famille d'adresses AF_BLUETOOTH. Ajoutez simplement la liste blanche AF_INET, AF_INET6, et peut-être AF_UNIX, en utilisant l' RestrictAddressFamilies=
option.
Veuillez lire la documentation de chaque option que vous utilisez. Certaines options sont plus efficaces en combinaison avec d'autres, et certaines ne sont pas disponibles sur toutes les architectures CPU. (Pas parce que le CPU est mauvais, mais parce que le port Linux pour ce CPU n'était pas aussi bien conçu. Je pense).
(Il y a un principe général ici. C'est plus sûr si vous pouvez écrire des listes de ce que vous voulez autoriser, pas de ce que vous voulez refuser. Comme définir un chroot vous donne une liste de fichiers auxquels vous êtes autorisé à accéder, et ce plus robuste que de dire que vous voulez bloquer /home
).
En principe, vous pouvez appliquer vous-même les mêmes restrictions avant setuid (). C'est tout simplement du code que vous pouvez copier depuis systemd. Cependant, les options d'unité systemd devraient être beaucoup plus faciles à écrire, et comme elles sont dans un format standard, elles devraient être plus faciles à lire et à examiner.
Je peux donc fortement recommander de lire la section sandboxing de man systemd.exec
votre plate-forme cible. Mais si vous voulez la conception la plus sécurisée possible, je n'aurais pas peur d'essayer chroot
(puis de supprimer les root
privilèges) dans votre programme également . Il y a un compromis ici. L'utilisation chroot
impose certaines contraintes à votre conception globale. Si vous avez déjà un design qui utilise chroot et qu'il semble faire ce dont vous avez besoin, cela sonne plutôt bien.