Cette question est totalement générale et ne s'applique pas seulement à ma situation, mais ... J'ai un petit boîtier occupé où je veux qu'un utilisateur non root puisse exécuter un script particulier avec des privilèges root. Par exemple, quelque chose comme ce petit script pour activer DHCP, où la seule variable ( $1
) à envoyer sur la ligne de commande (!!) est le nom d'hôte à envoyer:
#!/bin/bash
udhcpc -b -i eth0 -h $1
exécuter udhcpc comme celui-ci nécessite un accès root, donc pour ce faire, je prévois de modifier /etc/sudoers
pour contenir cette ligne:
joe ALL = NOPASSWD: /path/to/enable_dhcp.sh
ce qui devrait permettre à "joe" d'exécuter facilement ce script avec les privilèges root en exécutant simplement:
sudo /path/to/enable_dhcp.sh
et qu'on ne me demande pas de mot de passe (c'est ce que je veux, puisque je veux que joe puisse écrire ceci).
Maintenant .. Je sais (ou du moins pense que je le fais) que l'utilisation $1
dans un script qui peut facilement être exécuté avec des privilèges root est une idée HORRIBLE puisque vous pouvez injecter tout ce que vous voulez dans cela.
Alors ... quelle est la meilleure façon de gérer cela? Comment laisser joe faire ce que je veux avec les privilèges root, lui permettre de passer une variable (ou le faire efficacement comme avec une variable d'environnement), tout en n'étant pas ouvert aux attaques par injection?
Vous devez faire correspondre l'entrée passée avec un bon modèle connu.
Par exemple, il semble qu'une adresse IP puisse être une entrée valide pour vous. Vous pouvez donc utiliser quelque chose comme ceci:
Notez que l'expression régulière n'a pas été testée, vous êtes responsable de vous assurer que votre expression régulière ne permet rien de dangereux.
la source