Comment faire en sorte qu'un script s'exécute en tant que root, peu importe qui l'exécute?
J'ai lu sur setuid mais je ne sais pas comment faire.
J'utilise Linux, Ubuntu 12.04 LTS.
Soyez vraiment prudent: les scripts combinés avec setuid sont dangereux!
Tout d’abord, veuillez regarder cette question/réponses , en particulier sur cette réponse et cet avertissement de sécurité .
Si vous souhaitez toujours exécuter votre script avec setuid
set, vous pouvez alors écrire un court programme C comme wrapper et définir le bit setuid
sur le fichier binaire compilé.
Exemple d'emballage:
int main(void) {
setuid(0);
clearenv();
system("/absolute/path/to/your/script.sh");
}
Une autre solution utilisant Sudo
(mentionné ici ):
En tant que root, empêchez l'accès en écriture (et peut-être d'autres) à votre script:
racine chown /absolute/path/to/votre/script.sh chmod 700 /absolute/path/to/votre/script.sh
Vérifiez que personne d'autre que la racine ne peut remplacer le script , par exemple. en modifiant les droits d'accès du dossier parent:
racine chown /absolute/path/to/votre/ chmod 755 /absolute/path/to/votre/
Modifiez les droits d'accès Sudo dans /etc/sudoers
avec visudo
:
ALL ALL = (racine) NOPASSWD: /absolute/path/to/votre/script.sh
Vous trouverez plus de détails sur les paramètres (par exemple, restreindre l'accès à des utilisateurs ou à des groupes spécifiques) dans la page de manuel sudoers.
Ensuite, tous les utilisateurs peuvent exécuter le script en tant que root sans mot de passe:
Sudo /absolute/path/to/your/script.sh
Ceci est similaire à l'utilisation de la solution wrapper/setuid ci-dessus.
Le moyen le plus simple et le plus sûr consiste à utiliser les bits SETUID dans les autorisations de fichier. De cette façon, les autorisations de commande seront élevées aux autorisations de propriétaire de fichier.
pour empêcher l’édition du script, ne définissez pas d’écriture pour tous.
Je ne sais pas si cela peut être utile mais, pour que le script ne s'exécute qu'en tant que root, vous pouvez utiliser ce Shebang sur la première ligne du script:
#!/bin/su root