Un mac_do sain et léger

Tout système UNIX fonde une bonne partie de sa sécurité sur la gestion des utilisateurs et la limitation de leurs privilèges. Toutefois, l’administration d’un système est impossible sans privilèges élevés. Pour administrer le système, il n’est cependant pas toujours souhaitable de se connecter en root via su. Si la démarche est simple, elle implique cependant que tous les processus lancés sont alors privilégiés, même lorsque ça n’est pas nécessaire. L’autre possibilité est traditionnellement de faire précéder toute commande qui nécessite des privilèges de la commande sudo ou doas. Mais il s’agit alors d’un exécutable dont le propriétaire est root et qui possède un Set owner User ID (abrégé setuid). Un tel programme est par essence dangereux, puisque toute erreur dans sa programmation peut permettre à n’importe quel utilisateur de s’arroger les privilèges les plus élevés, le programme conférant par le mécanisme du setuid root ces privilèges à celui qui l’invoque.

Je viens de découvrir il y a peu un nouvel outil qui permet une élévation de privilèges sans utiliser de setuid. Il est construit autour d’un module du noyau FreeBSD appelé mac_do qui utilise le Contrôle d'accès obligatoire (abrégé MAC en anglais) du noyau FreeBSD. Un exécutable du doux nom de mdo, qui n’a aucun setuid et est un programme très simple de 15 Ko, est invoqué par l’utilisateur s’il veut exécuter une commande qui nécessite des privilèges. Ce binaire transmet la demande au module du noyau, qui regarde si l’utilisateur concerné a le droit d’obtenir ces privilèges. Il faut donc au préalable que root ait défini la liste des utilisateurs ou des groupes à qui accorder ces droits. Cela se fait généralement par l’ajout d’une ligne dans /etc/sysctl.conf de type :

security.mac.do.rules=uid=1001>uid=0,gid=0,+gid=0,+gid=5

Contrairement à sudo ou doas, le principe est de ne pas demander de mot de passe : l’authentification de l’utilisateur est supposée faite en amont de son accès au shell, par exemple via SSH. C’est particulièrement pratique pour une commande où il faut se connecter via SSH pour exécuter une commande privilégiée sur une machine où le compte root n’est pas accessible via SSH – ce qui paraît de bon sens :

mdo zfs send mondataset@maintenant | ssh monserveurdistant mdo zfs recv mondataset

Si mdo est bien configuré sur les deux machines, l’opération utilise seulement l’authentification SSH par clé et ne demande aucun mot de passe. C’est un peu comme un sudoers configuré sur NOPASSWD mais sans les risques liés à la complexité de l’outil sudo (256 Ko tout de même) et au goût de nitroglycérine du setuid.

Je suis pour l’instant très content du résultat, mais il faut rester prudent du fait de la jeunesse du projet, apparu seulement avec FreeBSD 14.3 en juin 2025. Si l’idée est excellente, la réalisation n’a pas la patine du vénérable sudo, ausculté sous tous les angles depuis plus de 30 ans !

Pour plus de détails sur ce projet, il faut consulter l’article de son créateur.

links

social