Salut
Je suis quasiment sûr que c'est possible mais je ne sais plus comment.
Le script script.sh
nécessite des droits root pour fonctionner correctement.
L'utilisateur toto
est un compte Machine-To-Machine (SSH) qui n'est pas root.
Comment faire pour que toto
puisse obtenir les permissions root uniquement pour exécuter ce script et rien d'autre ?
Est-ce que je peux faire ça via une configuration Sudo ? Il me semble que sudo va demander un mot de passe, ce qui n'est pas souhaitable pour un compte M2M automatique ? À moins que j'ai raté quelque chose.
Il me semble qu'il y a une autre solution, peut-être meilleure, via les droits du fichier directement, plus précisément via le bit S
ou s
?
Comment est-ce qu'il faudrait configurer ces permissions alors ? J'imagine que script.sh
devrait avoir comme owner:group root:toto
, et le bit s
je le met où ? De façon à ce que toto
puisse prendre l'identité root seulement à l'exécution ?
Il faudrait aussi que toto
puisse exécuter sans pouvoir modifier le script (donc permission execute mais pas write).
Est-ce que je suis sur la bonne piste ou bien je fais fausse route ?
Salut mon pote
T'es sur la bonne piste avec le setuid bit, ça pourrait faire le taf sans que sudo demande un mot de passe. Voici comment tu peux faire ça
Change le propriétaire du script ,l faut que le script soit possédé par root
sudo chown root:toto /path/to/script.sh
Configure les permissions ,donne les permissions nécessaires et mets le setuid bit:
sudo chmod 4750 /path/to/script.sh
Avec ça, quand l'utilisateur toto exécute script.sh, il aura les permissions root juste pour ce script
Mais dis-moi: tu fais ça dans quel cadre ?
Salut, merci pour la réponse
J'ai fait un test rapide avec le script suivant :
#!/bin/bash
echo "you are : $(whoami)"
service --status-all | tail -n 1
j'ai utilisé service parce qu'il ne peut fonctionner qu'avec root, et tail parce que osef de la liste complète
Les permissions du fichier sont les suivantes :
ls -lh
-rwsr-x--- 1 root toto 72 29 juin 14:17 test.sh
Il fonctionne correctement en root :
toto@debian:~$ sudo ./test.sh
you are : root
[ + ] udev
Par contre ça ne fonctionne pas avec seulement le SUID :
toto@debian:~$ ./test.sh
you are : toto
./test.sh: ligne 3: service : commande introuvable
Après une recherche rapide, je me rend compte qu'en fait ce n'est pas une bonne façon de faire.
https://unix.stackexchange.com/questions/364/allow-setuid-on-shell-scripts
Le kernel va détecter qu'il s'agit d'un script lorsque qu'il exécute un fichier avec SUID, et refuser son exécution, car il y a un risque de propagation.
Mais finalement on peut faire pareil voire mieux avec sudo
.
Alors j'ai d'abord remis les permissions du fichier comme suit:
chmod 740 test.sh
chown root:root test.sh
ls -lh
-rwxr----- 1 root root 72 29 juin 14:17 test.sh
Puis modifié le fichier /etc/sudoers
:
root@debian:~# grep toto /etc/sudoers
toto debian=(root:toto) NOPASSWD: /home/toto/test.sh
Test d'exécution du script sans sudo :
toto@debian:~$ ./test.sh
-bash: ./test.sh: Permission non accordée
Permission refusée, parfait.
Test d'exécution du script avec sudo :
toto@debian:~$ sudo ./test.sh
you are : root
[ + ] udev
ça fonctionne, et le mot de passe n'a pas été demandé.
Test de la commande service qui est exécutée dans le script, mais sans le script :
toto@debian:~$ service --status-all
-bash: service : commande introuvable
toto@debian:~$ sudo service --status-all
[sudo] Mot de passe de toto :
Sorry, user toto is not allowed to execute '/usr/sbin/service --status-all' as root on debian.
Sans sudo, la commande n'est pas disponible, c'est normal.
Avec sudo, cette fois le mot de passe est demandé. Et la permission est refusée.
Voilà, parfait
Je te conseille de faire très attention à ta manière d'utiliser le SUID, il est très facile de le détourner pour obtenir les privilèges root sur ta machine, dans le cas où un attaquant aurait déjà eu un point d'entrée. Je ne sais pas sur quelle machine tourne le script, si elle est exposée ou non etc... Mais fais quelques recherches avant de poser des SUID à tout va .
Le 22 juillet 2024 à 09:00:07 :
Je te conseille de faire très attention à ta manière d'utiliser le SUID, il est très facile de le détourner pour obtenir les privilèges root sur ta machine, dans le cas où un attaquant aurait déjà eu un point d'entrée. Je ne sais pas sur quelle machine tourne le script, si elle est exposée ou non etc... Mais fais quelques recherches avant de poser des SUID à tout va .
Bonjour,
Oui en effet c'est la conclusion que j'ai tiré sur mon dernier post.
La solution était l'utilisation du Sudo.