Se connecter

Informatique

Linux

Sujet : Droits root pour exécuter uniquement 1 script
1
[Soft]Ware
Niveau 48
28 juin 2024 à 16:41:00

Salut :ok:

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 ?

:merci:

SeiferGamer]57
Niveau 7
28 juin 2024 à 18:34:14

Salut mon pote https://image.noelshack.com/fichiers/2018/04/4/1516883601-pascalmcmo4.png

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 https://image.noelshack.com/fichiers/2019/30/6/1564241042-merde-il-a-avast.png

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 https://image.noelshack.com/fichiers/2018/02/6/1515878370-pascalmcmo15.png

Mais dis-moi: tu fais ça dans quel cadre https://image.noelshack.com/fichiers/2021/10/4/1615417809-sans-titre.png ?

[Soft]Ware
Niveau 48
29 juin 2024 à 15:11:41

Salut, merci pour la réponse :ok:

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 :hap:

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 :ok:

chaussette2fer
Niveau 5
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 :) .

[Soft]Ware
Niveau 48
22 juillet 2024 à 10:38:52

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. :ok:

1
Sujet : Droits root pour exécuter uniquement 1 script
   Retour haut de page
Consulter la version web de cette page