[CMD] Exécuter une commande root sans l'être Le sujet est résolu

Demande d'aide : c'est ici.
Répondre
MaxdeConde
Membre
Membre
Messages : 25
Inscription : 03 mai 2016, 08:40
Status : Hors-ligne

Bonjour à tous,

J'ai un script qui tourne à la connexion des utilisateurs. Ce script est en place, il est fonctionnel.... excepté une commande qui nécessite d'être root : "chown".
Le script capte le $USER, et doit attribuer la propriété d'un dossier "/var/POL" à l'user qui se connecte.

Le lancement de ce script se fait par un fichier .desktop dans "/etc/xdg/autostart".
Le script est placé dans "/usr/local/bin/"

Donc, comme c'est l'user qui se connecte, et que l'user n'a pas le droit de faire chown, et bien ça ne fonctionne pas. (Opération non permise)

J'ai fait un SetId sur le script, le chown ne passe pas.
J'ai fait un

Code : Tout sélectionner

Exec=sudo bash /usr/local/bin/monscript.sh
ça ne marche pas.
Dans mon script, j'ai écrit un "sudo chown", ça ne marche pas (logique).
J'ai ajouté un fichier dans /etc/sudoers.d/ (et décommenté la ligne dans /etc/sudoers relative à l'inclusion du dossier /etc/sudoers.d), attribuant les droits root à tous les users à ce script précisément, et ça ne marche pas plus....

Il y a bien une solution pour attribuer les droits d'une commande root à un utilisateur ?! Quand je clique sur "Eteindre", ça me permet d'éteindre l'ordinateur en tant que user, alors que la commande "halt" nécessite d'être root.....

Une idée ?

Merci pour votre lecture.
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5860
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Le fichier sudoers permet d'attribuer des droits sur une commande (pas forcément à root).
Dans ton cas, il faut attribuer les droits root sur la commande chown aux utilisateurs.
Il faut pour cela que tu crés un groupe regroupant les utilisateurs autorisés à faire cela.
Mais ce que tu veux faire ouvre une faille de sécurité béante. Les utilisateurs pourons s'attribuer la propriétés de toutes les commandes systèmes, et les exécuter (puisque ils sont exécutable par le owner qui est normalement root).
.
hybridemoineau
Membre
Membre
Messages : 390
Inscription : 24 avr. 2016, 15:34
Status : Hors-ligne

Sudoers ne permet-il pas de donner les droits sur une commande et une commande seulement, dossier compris, du type :

Code : Tout sélectionner

# User privilege specification
root    ALL=(ALL:ALL) ALL
ton_utilisateur    ALL=(root) NOPASSWD:    /sbin/shown le_dossier
?

Seul tel ou tel utilisateur aurait le droit de faire un shown sur un dossier déterminé et un seul.
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 5054
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Salut,
Si c'est bien encadré, pourquoi pas:

Code : Tout sélectionner

toto@tor:~$ sudo chown -R www-data:www-data /var/www/html/essai

Nous espérons que vous avez reçu de votre administrateur système local les consignes traditionnelles. Généralement, elles se concentrent sur ces trois éléments :

    #1) Respectez la vie privée des autres.
    #2) Réfléchissez avant d'utiliser le clavier.
    #3) De grands pouvoirs confèrent de grandes responsabilités.

Mot de passe [sudo] de toto :
toto n'apparaît pas dans le fichier sudoers. Cet événement sera signalé.
Edition du fichier sudoers pour définir avec précision ce que toto à le droit de faire:

Code : Tout sélectionner

toto ALL=NOPASSWD:/bin/chown -R www-data\:www-data /var/www/html/essai

Code : Tout sélectionner

toto@tor:~$ sudo chown -R www-data:www-data /var/www/html/essai
toto@tor:~$
Ce qu'il ne faut surtout pas c'est autoriser tout le monde à utiliser chown ou chmod (évidemment), et en tout cas pas partout...
Il faut lister les répertoires ou c'est possible, et si possible les UID (dans mon exemple c'est www-data).

Code : Tout sélectionner

toto@tor:~$ sudo chown -R toto:toto /var/www/html/essai
Mot de passe [sudo] de toto :
Désolé, l'utilisateur toto n'est pas autorisé à exécuter « /bin/chown -R toto:toto /var/www/html/essai » en tant que root sur tor.zehome.org.
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
MaxdeConde
Membre
Membre
Messages : 25
Inscription : 03 mai 2016, 08:40
Status : Hors-ligne

Salut,

Merci pour vos réponses.

Alors voici la ligne présente dans mon sudoers.d/transfertPOL :

Code : Tout sélectionner

%users ALL=NOPASSWD: /usr/local/bin/transfertPOL.sh
Et ainsi, même en lançant le script à la main :

Code : Tout sélectionner

$sh /usr/local/bin/transfertPOL.sh
Et bien le chown me répond: "Opération non permise".

Entre temps, je viens d'avoir un problème avec mon sudoers, dès que je décommente le includedir /etc/sudoers.d, j'ai une erreur de parse. Je suis en train de chercher à résoudre ça....

De plus, je ne peux pas mettre ni d'utilisateur ni de groupe autorisé dans le sudoers car j'ai un truc comme 25 groupes et 750 utilisateurs (connexion en LDAP, le /home est construit à la connexion, et le dossier /var/POL doit être accessible à tout utilisateur se connectant, d'où ce chown)
hybridemoineau
Membre
Membre
Messages : 390
Inscription : 24 avr. 2016, 15:34
Status : Hors-ligne

Je vois au moins un souci.
MaxdeConde a écrit :Alors voici la ligne présente dans mon sudoers.d/transfertPOL :

%users ALL=NOPASSWD: /usr/local/bin/transfertPOL.sh
Tu donnes des droits sudo sur une commande utilisateur, /usr/bin, alors qu'il faudrait qu'elle soit en admin, usr/sbin. (ça ne serait pas plutôt d'ailleurs cette commande à lancer, /user/sbin/bash/ton_script ?)

Tu pourrais aussi placer, c'était l'idée de départ, un "sudo shown" dans ton script.
Avatar de l’utilisateur
filoha
Membre
Membre
Messages : 148
Inscription : 04 avr. 2016, 14:48
Localisation : Moitié Sud Métropole
Contact :
Status : Hors-ligne

Je pensais comme ce qui a été décrit plus haut, mais si ça ne fonctionne pas, et que tu doives ouvrir ce script à toute personne qui se connecte, je ne vois que la solution du chmod 755, voire pire : 777 pour ton script :005:

Et si ça ne fonctionne pas encore, le placer dans un dossier ouvert, lui aussi.
L'oubli est chose facile, mais la mémoire reste.
hybridemoineau
Membre
Membre
Messages : 390
Inscription : 24 avr. 2016, 15:34
Status : Hors-ligne

D'ailleurs, le principal désavantage de passer par sudo sur un script est de devoir modifier les droits de ce script pour qu'il ne puisse être modifié et exécuté que par root.

Sinon, en modifiant ton script exécutable par sudo on peut exécuter n'importe quelle commande en root.
Avatar de l’utilisateur
filoha
Membre
Membre
Messages : 148
Inscription : 04 avr. 2016, 14:48
Localisation : Moitié Sud Métropole
Contact :
Status : Hors-ligne

hybridemoineau a écrit :D'ailleurs, le principal désavantage de passer par sudo sur un script est de devoir modifier les droits de ce script pour qu'il ne puisse être modifié et exécuté que par root.

Sinon, en modifiant ton script exécutable par sudo on peut exécuter n'importe quelle commande en root.
Prépare ton parapluie, Piratebab arrive. :021:
L'oubli est chose facile, mais la mémoire reste.
MaxdeConde
Membre
Membre
Messages : 25
Inscription : 03 mai 2016, 08:40
Status : Hors-ligne

Salut,

Le script se lance, donc ce n'est pas un problème de lancement (j'ai un lien symbolique créé, et j'ai un chown, et du mkdir).
J'ai mis le chmod 777, histoire de tester, et le chown ne passe toujours pas.

Désolé hybridemoineau, mais je n'ai rien compris à ton intervention sur le soucis que tu vois. Mon script, quelqu'il soit est lancé au démarrage, et il est de la propriété de root (chmod 755), j'ai essayé chmod 4755) également. Donc où qu'il soit, je pense que ce n'est pas un soucis puisque de toute façon, il se lance.

Et question de sécurité, ce n'est juste pas une préoccupation, mais but c'est que ça marche, parce que :
1) Les machines sont sous image. Ce qui est fait sur le poste le temps d'une session est écrasé au redémarrage suivant.
2) Les machines sont donc derrière un serveur, et elles n'ont aucune influence possible sur ce dernier.
3) Un utilisateur crash la machine, m'en fout, je la redémarre et on en reparle plus.

Pour résumer :
1) J'ai un dossier /var/POL (PlayOnLinux) qui appartient à root.
2) Un utilisateur se connecte à l'ordinateur, ça lui crée un /home/groupe/identifiant et ça lance un script qui donne des droits d'écriture et de lecture à /var/POL
=> Je ne peux pas mettre tous les groupes ou tous les utilisateurs dans les sudoers, donc, le plus simple c'est que les utilisateurs aient le droit d'exécuter chown (ils peuvent avoir envie de le faire à tout le système mais de 1) c'est pas grave, de 2) mes configurations pam interdisent le lancement de terminal en tant que user)

Merci pour votre aide...
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5860
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Comme déjà dit par plusieurs, ce n'est pas sur tout le script qu'il faut monter les privilèges via sudo, mais sur la seule commande chown.
en adaptant la commande de lol, tu peux généraliser à tout les utilisateurs, voire à tous les fichiers.
Si ce sont des machines jetables, le risque est limité.
C'est juste que tes utilisateurs vont perdre une notion importante des systèmes UNIX: la gestions des droits.
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 5054
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

Salut,
Je crois qu'on a pas vu le script, ou alors sur un autre forum... :003:
La solution serait:

1) Virer tous les sudo du script en question
2) Lancer le script lui même avec sudo, avec ceci dans sudoers:

Code : Tout sélectionner

Cmnd_Alias MonscriptDeLaMortQuiTue=/usr/local/bin/monscript.sh
ALL ALL=NOPASSWD: MonscriptDeLaMortQuiTue
ET de préserver les variables d'environnement dont tu as besoin.
Par exemple si tu as beoins du $HOME de l'utilisateur, il faudra mettre ceci dans sudoers:

Code : Tout sélectionner

#Defaults       env_reset
Defaults env_keep += "HOME"
Je pense que tu tourne en rond à cause des variables d'environnement depuis le début.
Sous Debian le réglage par défaut est:
Defaults env_reset
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
MaxdeConde
Membre
Membre
Messages : 25
Inscription : 03 mai 2016, 08:40
Status : Hors-ligne

Re,

Oui, je n'ai pas mis le script, c'était volontaire, pour éviter qu'on se concentre sur ce dernier qui marche dans l'ensemble, mais je vous le poste :
(Il a été complexifié chez .org, mais je l'ai de nouveau simplifié):

Code : Tout sélectionner

#!/bin/bash
groupe=$(id -gn $1)
POL=/var/POL
lien=$HOME/.PlayOnLinux

#changement de propriétaire du dossier de POL
chown -v -h -R $USER:$groupe $POL

ln -s $POL $lien

chown -v -h -R $USER:$groupe $lien

#copie des raccourcis sur le Bureau
cp --preserve=ownership $POL/shortcuts/*.desktop $HOME/Bureau
Et mon desktop entry dans /etc/xdg/autostart/

Code : Tout sélectionner

[Desktop Entry]

    Type=Application

    Exec=sh /usr/local/bin/transfertPOL.sh
Donc je vais tester vos derniers conseils et je reviens vers vous.

EDIT : j'ai fait la modif de sudoers, mais il commence très sérieusement à mon gonfler celui là, parce que dès que je lui ajoute un truc, j'ai un souci de parse... Même juste en décommentant le "include /etc/sudoers.d/ Ce qui n'a aucun sens, puisque c'est dans le fichier lui même, je ne peux pas avoir d'erreur de syntaxe!

(Pour l'instant, je me contente de lancer le script à la main avec sudo)
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5860
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

tu le modifies avec visudo ?
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 5054
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

MaxdeConde a écrit :Même juste en décommentant le "include /etc/sudoers.d/ Ce qui n'a aucun sens, puisque c'est dans le fichier lui même, je ne peux pas avoir d'erreur de syntaxe!
Peut-être que dans /etc/sudoers.d/ il y a un fichier avec une erreur ?
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
MaxdeConde
Membre
Membre
Messages : 25
Inscription : 03 mai 2016, 08:40
Status : Hors-ligne

Ah non, je ne modifie pas avec visudo, c'est peut être là mon erreur. Je vais zieuter de ce côté là.
Je fais mes modifs avec vim et je fais :wq! Pour contourner le message d'erreur.

Dans sudoers.d/ il y e le README et mob transfertPOL avec les instructions données ci-dessus....

Je reviens vers vous après avoir réglé ce souci de sudoers.
Avatar de l’utilisateur
filoha
Membre
Membre
Messages : 148
Inscription : 04 avr. 2016, 14:48
Localisation : Moitié Sud Métropole
Contact :
Status : Hors-ligne

"sudo" ne se configure pas autrement qu'avec la commande visudo et exclusivement en tant que root # et pas avec 'sudo'. :002:
L'oubli est chose facile, mais la mémoire reste.
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5860
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

Je reviens sur un point de sécurité: si tu donnes les droits rrot via sudo à tout tout ton script, il a intérêt à étre verrouillé fortement en lecture seule. Sinon, celui qui peux le modifier à tout controle sur la machine, voire plus suivant le config du réseau.
hybridemoineau
Membre
Membre
Messages : 390
Inscription : 24 avr. 2016, 15:34
Status : Hors-ligne

Je profite du relatif calme de ce fil pour poser une question à la suite d'une réponse de lol: à quoi sert de mettre des commandes en /usr/bin dans le fichier sudoers alors que, par définition, ces commandes ne demandent pas de privilèges et que sudoers se limite à donner accès aux commandes exactes qu'on lui donne ?

Ne faut-il pas toujours mettre des commandes en /usr/sbin
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 5860
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

le s de sbin, c'est pour "systeme".
Répondre