Lancer une command sudoed lors de la fin du script?

Je encoding un script bash qui:

  • exécute une command sudoed lors de l'initialisation
  • Libère les permissions root à des fins de security ( sudo -K )
  • exécute un programme non privilégié
  • mais a besoin d'permissions root lors de la terminaison

Je cherche un moyen simple et sécurisé pour éviter de requestr à nouveau à l'user son mot de passe à la fin du script .

Je pense à une fourchette avant sudo -K attendant d'attraper un signal de terme. Je ne sais pas si c'est la solution la plus élégante / la plus sécurisée.

Voici le code:

 sudo unshare -m \ sudo -u "$USER" -g `id -g -n "$USER"` \ bash -c \ "sudo mount --bind \"$MOUNT_DIR\" \"$MOUNT_DIR\"; \ sudo mount --make-private \"$MOUNT_DIR\"; \ sudo -K; \ <unprivilegied program here>; \ sudo umount \"$MOUNT_DIR\"" 

NB: Pour info, cela crée un assembly privé dans un espace de noms auquel seul le programme aura access. unshare -r n'est pas une option pour exécuter le programme.

Je remarque que vous faites beaucoup de va-et-vient entre l'user régulier et la racine:

  • passer à la racine pour exécuter le unshare
  • revenir à l'user normal pour lancer bash (bien qu'il semble que vous n'utilisez pas de bashismes afin que vous puissiez aussi bien courir sh qui serait plus portable et peut-être plus léger)
  • revenir à la racine plusieurs fois à l'intérieur de ce shell bash pour faire des choses plus privilégiées

Je pense que vous pouvez simplifier cela et réduire le nombre de fois où vous devez rebondir entre les users et résoudre votre problème en même time.

 sudo unshare -m sh -c ' mount --bind "$1" "$1"; mount --make-private "$1"; exec sudo -u "#$SUDO_UID" -g "#$SUDO_GID" sh -c " sudo -K; <unprivilegied program here> " ' - "$MOUNT_DIR" 

Techniquement, il y a un shell racine qui fonctionne continuellement tout au long de l'exécution de la partie non privilégiée, mais la seule chose que le shell va faire est d'attendre que la partie non privilégiée se termine et rien d'autre. Mais si vous voulez vraiment renoncer à vos privilèges sudo avance et ne pas avoir à requestr à l'user de les renouveler, toutes les alternatives vont également impliquer un process long attendant que le signal exécute la command umount d'une manière ou d'une autre .

En aparté, c'est bien que votre command soit autonome et tout, et j'ai gardé cet esprit dans ma suggestion, mais honnêtement, de grands blocs de code fournis comme option de command line pour sh -c sont difficiles à écrire et à lire en raison de toutes les complexités de citations que vous avez à vous soucier, et je recommand de les intégrer dans leur propre script et de gérer le tout comme:

 sudo unshare -m /usr/local/bin/script-that-does-the-rest-of-the-work 

En outre, cela faciliterait l'écriture de vos règles sudo pour les commands autorisées, qui sont difficiles à écrire en utilisant ma suggestion, sauf si vous permettez à l'user d'exécuter n'importe quelle command, ce qui revient à lui donner un access root complet. Dans ce cas, vous devez autoriser la command unshare -m sh -c <huge block> "$MOUNT_DIR" qui est un joli challenge Cmnd_Alias à écrire.