(10 réponses)
Fermé il y a 6 ans.
Je veux m'assurer que mon programme ne peut être exécuté que par l'utilisateur xyz
en utilisant le privilège root. Pour ce faire, j'ai défini le bit setuid avec :
chmod u+s program1.sh
ls -l program1.sh
rwsr-x--- 1 root house 1299 May 15 23:54 program1.sh
De plus, j'ai ajouté l'utilisateur xyz
à la house
groupe de sorte que seulement xyz
et root peut exécuter program1.sh.
Dans program1.sh il y a
id -u
afin qu'il puisse me montrer l'ID effectif.
Exécution de program1.sh
en tant que root, il affiche root
. Mais courir avec le xyz
compte, il affiche xyz
. Il semble qu'il n'a pas fonctionné avec le privilège root. Je ne sais pas ce qui ne va pas ici.
Réponse acceptée :
Lors de l'exécution de scripts shell qui ont le bit setuid (par exemple, perms de rwsr-xr-x), les scripts s'exécutent en tant qu'utilisateur qui les exécute, et non en tant qu'utilisateur qui les possède. Ceci est contraire à la façon dont setuid est géré pour les binaires (par exemple, /usr/bin/passwd), qui s'exécutent en tant qu'utilisateur qui les possède, quel que soit l'utilisateur qui les exécute.
Consultez cette page :https://access.redhat.com/site/solutions/124693
Il s'agit d'une mesure de sécurité prise par le système d'exploitation. Vous devez utiliser votre script avec sudo à la place.
Si vous avez vraiment besoin d'utiliser setuid dans votre script, vous pouvez créer un binaire qui fera le travail. Créez un nouveau fichier "program.c" et copiez le code suivant :
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
setuid(0);
system("./program.sh"); #This line is dangerous: It allows an attacker to execute arbitrary code on your machine (even by accident).
return 0;
}
Compilez et exécutez le code à l'aide des commandes suivantes :
$ gcc program.c -o program
$ sudo chown root.root program
$ sudo chmod 4755 program
$ ./program
De cette façon, cela fonctionnera. Le setuid fonctionne pour le fichier compilé, et ce fichier peut exécuter d'autres fichiers en tant que root.