PDA

Afficher la version complète : [Réglé] Python + SetUid + fichier root



zesamoth
30/03/2007, 11h06
Bonjour à tous,

Alors voila, je vais esayer d'être clair... J'aimerais depuis un script python pouvoir lancer un autre script qui nécessiterait les droits d'administration pour écrire dans certains fichiers. Alors je me suis tourné vers la solution du SetUid pour que le premier script appelant prenne les droits de son propriétaire à savoir "root". Avant même de faire cela j'ai voulu tester le SetUid, sans succès. J'ai besoin de votre aide pour me dire à quel moment je me plante dans la manip ci dessous http://www.alionet.org/style_emoticons/<#EMO_DIR#>/wink.gif

1 ) Je crée le script python, petit script tout simple se trouvant dans /home/zesamoth/Desktop:

tutu@linux:~/Desktop> touch /home/tutu/Desktop/test.py
contenant :

#! /usr/bin/python
import os
os.system("echo coucou>>/var/log/log_serveur")#Doit juste écrire une ligne dans un fichier accessible qu'à root

2) Je change le propriétaire du script pour qu'il appartienne à Root et au groupe Root. Je donne les droits d'éxecution et lecture au groupe et au reste du monde et je donne le SetUid au script.

chmod 755 test.py
chmod u+s test.py
tutu@linux:~/Desktop> ls -l test.py
-rwsr-xr-x 1 root root 77 mar 30 00:44 test.py

3) Je crée le fichier /var/log/log_serveur qui va recevoir du texte. Il appartient à Root et seul root à le droit d'écrire dedans.

zesamoth@linux:~/Desktop> ls -l /var/log/log_serveur
-rw-r--r-- 1 root root 7 mar 29 23:50 /var/log/log_serveur

Et pourtant.......

zesamoth@linux:~/Desktop> python test.py
sh: /var/log/log_serveur: Permission non accordée

Une piste me vient à l'esprit: Quand je lance la commande python test.py, quels sont les droits ? En fait je pense qu'ici le SetUid du fichier ne joue pas du tout puisque c'est la commande python qui est lancée, le fichier n'étant qu'un paramètre.
Alors comment faire pour que je puisse lancer mon script python sans entrer la commande python. Un peu comme un ls ou comme un rcapache2, ici je ferais un test.py tout court.

Merci beaucoup pour votre aide.

Zesamoth

Heero_Yuy
30/03/2007, 11h12
Juste une petite question. Avant de lancer la commande :


python trest.py

as-tu fait :


su root
mot_de_passe_root

où mot_de_passe_root est le mot de passe défini pour root ?

zesamoth
30/03/2007, 12h32
Disons que quand je le fais ça passe sans problèmes. Mais justement tout l'intérêt de la manip que je veux faire est de donner les droits du créateur ( root ) à un script. Et ce afin de le lancer depuis n'importe quel utilisateur et de toujours avoir les droits root pour ce script. Je sais pas si j'arrive à bien me faire comprendre.... http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif

@ +++ et merci pour la réponse

Heero_Yuy
30/03/2007, 12h54
Je récapépète :

Tu veux que n'importe quel utilisateur puisse exécuter ce script.

Or ce script nécessite les droits de root pour être exécuté.


Si c'est bien ça, le problème avec ce que tu as fait, c'est que seul root peut exécuter la commande. User = root, Group = root


Une solution pourrait être de déclarer chaque utilisateur pouvant exécuter ce script comme appartenant au groupe Root. Ceci se fait dans Yast (je ne sais plus où exactement, mais il y a un module de gestion d'utilisateurs).

Mais bon, ce n'est pas forcément ce que tu recherches, car là, si je ne me trompe pas, ils auront accès également à Yast et pourront modifier certains paramètres systèmes. S'ils connaissent Linux et SUSE, c'est pas forcément gênant, mais si ce sont des newbies, là ils pourraient f**tre la merde dans le système. http://www.alionet.org/style_emoticons/<#EMO_DIR#>/mad.gif


Il doit donc y avoir une autre solution.

Tu peux remettre tout d'équerre comme avant de faire le <div class='quotetop'>Citation </div>
chmod 755 test.py[/b] .

On va essayer autrement.

Une fois que tu auras remis comme cela était avant (à savoir les droits pour l'utilisateur classique), fais :


su root
<mot_de_passe_root>
chown root.root test.py
chmod u+s test.py
exit

et retest ton script.

zesamoth
30/03/2007, 14h25
Alors.... J'ai tout simplement supprimer et recrée le fichier pour qu'il ai les règles par défaut.

Voici donc les règles par défaut:

zesamoth@linux:~/Desktop> ls -l test.py
-rw-r--r-- 1 zesamoth users 139 mar 30 14:05 test.py

Ensuite je fais ta manip ( très proche de ce que j'avais d'ailleurs déjà testé, voici les nouvelles règles:

linux:/home/zesamoth/Desktop # ls -l test.py
-rwSr--r-- 1 root root 139 Mar 30 14:05 test.py

LE résultat est éloquent:

zesamoth@linux:~/Desktop> python test.py
sh: /var/log/log_serveur: Permission non accordée

Tu crois pas qu'on devrait plutôt essayer de creuser pour rendre ce script executable sans être obligé de taper "python" devant. Parce que là je crois que le SetUid n'est pas pris en compte puisque dans la commande tapée "test.py" n'est qu'un paramètre. La véritable commande, et donc celle qui fixe les droits, est la commande python. Peut-être me trompe-je....?

En tout cas merci de te soucier de mon problème. http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif

P.S : Effectivement la solution de donner les droits à chacun des utilisateurs susceptibles de lancer le script ne me plait pas trop puisque au final ce script sera lancé par Apache ( donc le groupe wwwrun), donc gros risque en matière de sécu.....

Thomas



Une autre tentative ( en étant root ) :

linux:/home/zesamoth/Desktop # chgrp users test.py
linux:/home/zesamoth/Desktop # chmod u+s test.py
linux:/home/zesamoth/Desktop # ls -l test.py
-rwSr--r-- 1 root users 139 Mar 30 14:05 test.py

Puis en repassant utilisateur:

zesamoth@linux:~/Desktop> python test.py
sh: /var/log/log_serveur: Permission non accordée

Beuheyyyyyy http://www.alionet.org/style_emoticons/<#EMO_DIR#>/sad.gif

Heero_Yuy
30/03/2007, 14h26
Tu crois pas qu'on devrait plutôt essayer de creuser pour rendre ce script executable sans être obligé de taper "python" devant. Parce que là je crois que le SetUid n'est pas pris en compte puisque dans la commande tapée "test.py" n'est qu'un paramètre. La véritable commande, et donc celle qui fixe les droits, est la commande python. Peut-être me trompe-je....?[/b]

C'est fort possible.

Et en passant par un script qui contiendrait :


# !/bin/sh

kdesu python test.py

Mais, l'utilisateur sera invité à saisir le mot de passe root. Peut-être pas non plus la meilleure des solutions.


[Edit]

Ton script demande accès en écriture à un fichier que seul root peut modifier, il faut donc être root pour pouvoir le modifier.

Je ne connais pas Python, mais n'y a-t-il pas moyen comme en C, d'utiliser une fonction setuid pour changer temporairement les droits ?

zesamoth
30/03/2007, 14h27
La même chose avec un script executable:

linux:/home/zesamoth/Desktop # chmod 755 test.py
linux:/home/zesamoth/Desktop # ls -l test.py
-rwxr-xr-x 1 root users 139 Mar 30 14:05 test.py
linux:/home/zesamoth/Desktop # chmod u+s test.py
linux:/home/zesamoth/Desktop # ls -l test.py
-rwsr-xr-x 1 root users 139 Mar 30 14:05 test.py

Bien sur le résultat est toujours le même.... Je sais plus trop comment faire, j'avoue....

Heero_Yuy
30/03/2007, 14h28
Lis mon [Edit] sur mon message précédent http://www.alionet.org/style_emoticons/<#EMO_DIR#>/wink.gif

zesamoth
30/03/2007, 14h37
JE viens de voir ton edit, je vais essayer de me pencher sur cette solution....

Juste pour revenir sur ce que je disais à propos de rendre le script executable... Tu connais le programme "passwd" pour changer de mot de passe. Et bien ce fichier est programmé en "je sais pas quoi" mais permet à un utilisateur lambda de pouvoir écrire dans un fichier root. Donc c'est qu'il y a une possibilté pour le faire...

Tu sais pas comment on rend un script executable directement. Je sais qu'il faut rajouter l'instruction

#! /usr/bin/python
pour indiquer quel est l'interpréteur. Et puis certainement le placer dans un répertoir tel que usr/bin ou usr/sbin un truc comme ça...
PAs que je veuille pas tester ta solution mais je suis sur qu'il ya une possibilité de la faire sans toucher au code du script http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif

Thomas

Heero_Yuy
30/03/2007, 14h42
Ca me dit quelque chose ce


# !/usr/bin/python

Mais je ne peux pas affirmer que ça va le rendre exécutable, désolé.

zesamoth
30/03/2007, 14h45
Ben pour l'instant je suis en train d'essayer de chercher une fonction setuid en python comme pour le C, j'éspère pouvoir trouver une solution et je vous tiendrais au courant de l'évolution.
MAis si en attendant quelqu'un à une autre idée je suis preneur, toute proposition est bienvenue.

Merci d'avoir pris le temps de regarder ce pb Angel59

@ bientôt

Heero_Yuy
30/03/2007, 14h47
De rien zesamoth http://www.alionet.org/style_emoticons/<#EMO_DIR#>/wink.gif J'aime bien me rendre utile http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif

zesamoth
30/03/2007, 14h48
Et bien ça fait plaisir de voir des gens comme toi.
Je regarde, je regarde...; rien de très concluant pour l'instant mais on avance !!

http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif

Heero_Yuy
30/03/2007, 14h51
Je viens de trouver un PDF de plus de 300 pages sur la programmation Python. Je le feuillette vite fait pour trouver une solution à ton problème.

Voici le lien : ftp://ftp-developpez.com/python/cours/Tut...ython_notes.pdf (ftp://ftp-developpez.com/python/cours/TutoSwinnen/fichiers/python_notes.pdf)

Spyhawk
30/03/2007, 17h59
Hum, je risque de dire une connerie, mais c'est pas tout simplement impossible ?
Je veux dire, le système unix est fait de tel manière qu'il n'est pas possible pour script de s'exécuter sur l'ensemble du système s'il n'a pas les droits root, et par extension, pas la possibilité de les avoir de façon automatique.

A mon avis, tu devrais regarder du côté de la configuration sudo, histoire de permettre aux utilisateurs de permettre l'exécution du script avec leur propre mot de passe (et non root).

Chninkel
30/03/2007, 19h00
Bonsoir,
Sur le site de Tyrtamos, j'avais utilisé ce tuto pour utiliser un programme :
http://linux.jpvweb.com/droitsdexecutionsudo.html#Principe
En espérant que cela aidera.
Cordialement.

zesamoth
30/03/2007, 19h55
Re-bonsoir tous,

JE suis désolé je vais faire une réponse rapide parce que j'ai un train à prendre.
D'ailleurs je ne pourrais pas retoucher à nux avant lundi donc cette discussion sera en standby pour ce week end.

Pour spyhawk: Je pense qu'il doit y avoir une astuce car en reprenant l'exemple du script passwd: c'est un script apartenant à root, il peut être lancé par n'importe quel utilisateur et surtout il modifie des fichiers sur lequel un utilisateur lambda n'a normalement pas les droits. Je suis suurr qu'il y a une solution beuuuuh http://www.alionet.org/style_emoticons/<#EMO_DIR#>/sad.gif En tout cas merci de prendre part à la recherche.

Pouur Spyhawk et Chninkel : Je veux à tout prix éviter la méthode du sudo, comme je le disais avant ce script est voué a être appelé par Apache donc il faudrait que je donne les droits root au groupe wwwrun et là bonjour les dégats..... En plus le script devra être portable et il me sembler que c'est les debianiens qui ne veuelnt pas entendre parler du sudo....

Pour Angel 59 : Le tuto doit être de Gérard Swinnen il me semble. Une bible pour l'apprentissage du python.... mais qui ne répond malheureusement pas à ma question... http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif

@ ++ tous

Au fait j'ai réussi à rendre mon script executable: il suffit en fait de lui adjoindre la ligne

#! /usr/bin/python
au début

Et de le placer dans le rep /bin
Tout simplement...... http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif

devloop
01/04/2007, 21h18
http://www.alionet.org/index.php?showtopic=14453

zesamoth
01/04/2007, 23h50
Bonsoir tout le monde,

Je viens de voir la réponse de Devloop et ça confirme la réponse de Spyhawk, c'est tout simplement impossible de faire ca que je veux faire. ( http://www.alionet.org/style_emoticons/<#EMO_DIR#>/sad.gif pleurs..... lol http://www.alionet.org/style_emoticons/<#EMO_DIR#>/sad.gif ).
A moins que ce soit un poisson d'avril, mais j'y crois pas trop..... Tant pis...

Alors je reformule ma question : Est-ce que quelqu'un à une idée pour executer un script python CGI avec Apache. Ce script devant "toucher" à des fichiers appartenant à root.

C'était en fait l'origine de ma recherche mais je voulais d'abord au moins réussir à faire un script executable par tout le monde et qui ai les droits root ou tout au moins le droit de "toucher" certains fichiers.

Marchi bien !! http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif

P.S : Bon week end sinon ? http://www.alionet.org/style_emoticons/<#EMO_DIR#>/laugh.gif

zesamoth
02/04/2007, 19h16
Bonsoir,

Bon et bien pour les petites nouvelles, au comble du désespoir j'ai trouvé une autre solution pour mon problème. En fait un changement radical d'orientation.
Pour comprendre il faut revenir un peu sur le projet. En fait les scripts python qui devaient être lancé depuis Apache devait servir à manipuler un serveur construit en python. Les scripts servaient donc à lancer des commandes du type "python elise -start" ou python elise -adduser" ( elise etant le nom du projet vous l'aurez compris http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif ).
Et bien on s'est dit avec mon formateur que plutot que de se prendre la tête à deux mains on allait profiter du socket du serveur pour s'y connecter et lui balancer les instructions à executer depuis l'interieur.
Donc maintenant le script qu'Apache lance se connecte sur le serveur elise et fait son boulot par la suite. Plus besoin de droit root puisque apache communique par socket avec elise et elise est lancé par root. C'est maintenant elise et plus Apache qui touche les fichiers root.

Merci à tous ceux qui auront pu m'aider et désolé pour ce "baissage de bras" malgré vos réponses http://www.alionet.org/style_emoticons/<#EMO_DIR#>/sad.gif http://www.alionet.org/style_emoticons/<#EMO_DIR#>/biggrin.gif .