Je comprends les implications de l'exécution d'un script en tant que Root, en particulier par une application web. Cependant, dans le cadre de mon application web, j'ai besoin d'utiliser curl avec tor et cela nécessite de réinitialiser l'ip de tor de temps en temps. tor peut obtenir une nouvelle ip lorsque le service est redémarré avec service tor restart
. Comme seul Root peut le faire, j'ai écrit un wrapper C script pour faire ce dont j'ai besoin, et je l'ai compilé et mis setuid Root dessus, et changé la propriété de l'utilisateur Root. Cependant, il me demande toujours le mot de passe Root lorsqu'il est exécuté en tant qu'utilisateur non privilégié. En tant que Root, le redémarrage d'un service ne devrait pas demander de mot de passe.
Mon script :
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void ExecAsRoot (char* str);
int main ()
{
setuid (0);
setvbuf(stdout, NULL, _IONBF, 0);
printf ("Host real ip is: ");
ExecAsRoot("ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/'");
ExecAsRoot("/usr/sbin/service tor restart");
// sleep(2);
printf ("Tor should have switched to a new ip by now.\nNew ip is: ");
ExecAsRoot("torify curl ifconfig.co 2>/dev/null");
return 0;
}
void ExecAsRoot (char* str) {
system (str);
}
J'ai fait ce qui suit :
chown root restartor
chmod u=rwx,go=xr restartor
Sortie :
Host real ip is: 7.17.11.23
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to restart 'tor.service'.
Authenticating as: root
Password:
Comment puis-je faire en sorte que cela fonctionne en tant qu'utilisateur web sans fournir de mot de passe Root ?