Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajout d'une exeption Sudoers

"Privileges Spécification"

Sujet résolu
    20 octobre 2014 à 18:44:12

    Bonsoir à tous,

    J’essaye depuis déjà pas mal de temps d'ajouter une exception de privilège pour l'utilisateur apache2 à savoir www-data afin de pouvoir dans un script PHP exécuter un autre script python nécessitant d'être en Root :

    Mon script PHP :

    <?php
            session_start();
            if(isset($_SESSION['confirm']))
            { 
                if(isset($_GET['action'])=='open')
                {
                    system('sudo -u www-data python /home/door/UP455.py');
                }
                else
                {
                    system('python /home/door/UP456.py');
                }  
                ?>
                <div id="principal">
                    <a href="admin.php?action=open">OPEN</a><a href="admin.php?action=close">CLOSE</a>
                </div>   
            <?php
            }
            else
            {
                header('Location: index.php');
            }
            ?>
    
    
    

    Grâce à la commande en root "visudo", j'ai rajouté sous :

    root ALL=(ALL:ALL) ALL

    ceci :

    www-data ALL=(ALL:ALL) NOPASSWD: /home/door/UP455.py
    

    Cepandant rien n'y fait, je retrouve toujours dans mes logs Apache2 aprés l’exécution PHP :

    soit ci je ne spécifie pas d'utilisateur :

    sudo: no tty present and no askpass program specified

    Ou alors avec dans php www-data de spécifié comme ci-dessus :

    FILE "home/door/UP455.py",line9, in <module>
    
           GPIO.setup(GPIO_RELAY, GPIO.OUT)
    
    RuntimeError : No access to /dev/mem. Try running as Root !
    
    Sorry, user www-data is not allowed to execute /home/door/UP455.py


    Merci d'avance de vos réponses,

    Sachant que le Script Python à la base marche très bien ;)



    -
    Edité par Ourumov 20 octobre 2014 à 18:45:39

    • Partager sur Facebook
    • Partager sur Twitter
      20 octobre 2014 à 18:50:57

      Bonjour,

      Ourumov a écrit:


      Grâce à la commande en root "visudo", j'ai rajouté sous :

      root ALL=(ALL:ALL) ALL

      Je ne pense pas que ce soit d'une grande utilité : root a déjà les pleins-pouvoir... :-°.

      Ourumov a écrit:


      ceci :

      www-data ALL=(ALL:ALL) NOPASSWD: /home/door/UP455.py

      Je ne pense pas que ce soit la bonne ligne : la commande que tu lances est python et pas /home/door/UP455.py. C'est sans doute ce que signifie cette erreur :

      Ourumov a écrit:

      Sorry, user www-data is not allowed to execute /home/door/UP455.py

      • Partager sur Facebook
      • Partager sur Twitter
      Mon projet : www.raighost.com un hébergeur web gratuit sans publicité. Essayez-le !
        20 octobre 2014 à 19:07:24

        Merci,

        je devrais donc essayer ceci :

        www-data (ALL=ALL) NOPASSWD: python. ?

        Et pour ce qui est du root, il s'agit du paramétrage d'origine. 

        • Partager sur Facebook
        • Partager sur Twitter
          20 octobre 2014 à 19:45:49

          Teste et dis-nous si ça fonctionne ^^. Je pense qu'il faudra des guillemets autour de python /home/door/UP455.py dans ta ligne
          system('sudo -u www-data python /home/door/UP455.py');

          -
          Edité par Rem's 20 octobre 2014 à 19:47:01

          • Partager sur Facebook
          • Partager sur Twitter
          Mon projet : www.raighost.com un hébergeur web gratuit sans publicité. Essayez-le !
            20 octobre 2014 à 22:41:59

            Bon voila :

            Après avoir rentré :

            www-data ALL=(ALL) NOPASSWD: python

            Le fichier sudoers devient inaccessible, la commande sudo ne répond plus même après un redémarrage.

            Résultats des courses j'ai du éditer le fichier en question via un PC (en récupérant la carte SD de la RPI) sous deb et tout est revenu à la normale.

            Alors je pense qu'il faudait essayer autre chose ^^, mais quoi ? bonne question .... :/

            -
            Edité par Ourumov 20 octobre 2014 à 22:42:28

            • Partager sur Facebook
            • Partager sur Twitter
              21 octobre 2014 à 9:35:09

              Il faut toujours éditer le fichier sudoers avec la commande visudo pour éviter se genre de problème.

              Après il ne faut pas mettre python mais ton script avec le chemin complet.

              www-data ALL= NOPASSWD: /home/door/UP455.py



              • Partager sur Facebook
              • Partager sur Twitter
                21 octobre 2014 à 11:08:17

                Re,

                Je viens donc de rentrer exactement cette ligne avec visudo en root :

                www-data ALL= NOPASSWD: /home/door/UP455.py

                Par la même occasion je me suis aperçu que dans /etc/ il y'avait trois fichiers Sudoers : sudoers, sudoers.tmp et surdoers.tmp1

                Sinon rien n'y fait le script python n'est pas exécuté je retrouve toujours dans les logs Apache2 :

                Sudo : no tty present and no askpass program specified.

                ?


                • Partager sur Facebook
                • Partager sur Twitter
                  21 octobre 2014 à 12:11:13

                  Tu es sûr qu'il n'est pas exécuter en root ?

                  Ajoute un print de l'uid dans ton script avec os.geteuid().

                  Puis exécute ton script dans la console avant de le faire par apache :

                  su -u www-data -c "sudo /home/door/UP455.py"


                  D'ailleurs au passage pas besoin d'être root pour écrire dans /dev/mem il suffit que www-data à les droits.

                  Et dans le script php enlève le "-u www-data" car le paramètre -u c'est pour lancer le script avec un autre utilisateur que root.

                  -
                  Edité par millman 21 octobre 2014 à 12:14:55

                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 octobre 2014 à 13:47:16

                    Re,

                    Rien de plus, toujours un "Try as root !" dans les logs,

                    Et ceci ne fonctionne pas :

                    su -u www-data -c "sudo /home/door/UP455.py"

                    Le paramètre "-u" n'est pas reconnu, sinon ceci :

                    su www-data -c "sudo /home/door/UP455.py"

                    Me demande un mot de passe.



                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 octobre 2014 à 14:02:56

                      Remplace su par sudo alors.

                      Et tu as qu'elle uid du coup ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 octobre 2014 à 14:07:43

                        Tu n'aurais pas créé un alias pour la commande python qui ne serait valable que pour toi et pas pour www-data ? Il y a parfois le nom de version dans la commande. Pour moi l'erreur Sudo : no tty present and no askpass program specified. signifie qu'un mot de passe t'es demandé mais comme la commande n'est pas lancé depuis un shell, on ne peut pas te demander de rentrer un mot de passe.

                        Essaye

                        sudo -u www-data "/home/door/UP455.py"


                        ou encore

                        sudo -u www-data "python /home/door/UP455.py"



                        • Partager sur Facebook
                        • Partager sur Twitter
                        Mon projet : www.raighost.com un hébergeur web gratuit sans publicité. Essayez-le !
                          21 octobre 2014 à 21:46:41

                          Bon je crois que l'on va faire plus simple :

                          Voici le contenu de mon fichier php :

                          <!DOCTYPE html>
                          <html>
                          
                          	<head>
                          		<meta charset="UTF-8" />
                          		<meta name="viewport" content="width=device-width"/>
                          		<link rel="stylesheet" href="style.css" />	
                          		<title>Door</title>
                          	</head>	
                          	
                          	<body>		
                          		<?php
                          		session_start();
                          		if(isset($_SESSION['confirm']))
                          		{  
                          			if(isset($_GET['action'])=='open')
                          			{
                          				system('python /home/door/UP455.py');
                          			}
                          			else
                          			{
                          				system('python /home/door/UP456.py');
                          			} 	
                          			?>
                          			<div id="principal">
                          				<a href="admin.php?action=open">OPEN</a><a href="admin.php?action=close">CLOSE</a>
                          			</div>	
                          		<?php
                          		}
                          		else
                          		{
                          			header('Location: index.php');
                          		}
                          		?>
                          			
                          	</body>
                          
                          </html>		

                          Maintenant le contenu du fichier Surdoers vu par la commande "visudo" :

                          #
                          # This file MUST be edited with the 'visudo' command as root.
                          #
                          # Please consider adding local content in /etc/sudoers.d/ instead of
                          # directly modifying this file.
                          #
                          # See the man page for details on how to write a sudoers file.
                          #
                          Defaults	env_reset
                          Defaults	mail_badpass
                          Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
                          
                          # Host alias specification
                          
                          # User alias specification
                          
                          # Cmnd alias specification
                          
                          # User privilege specification
                          root	ALL=(ALL:ALL) ALL
                          www-data ALL= NOPASSWD: /home/door/UP455.py
                          
                          # Allow members of group sudo to execute any command
                          %sudo	ALL=(ALL:ALL) ALL
                          
                          # See sudoers(5) for more information on "#include" directives:
                          
                          #includedir /etc/sudoers.d
                          pi ALL=(ALL) NOPASSWD: ALL
                          

                          Et pour finir les logs d'erreur d'Apache2 à l'éxécution de php :

                          Traceback (most recent call last):
                            File "/home/door/UP455.py", line 9, in <module>
                              GPIO.setup(GPIO_RELAY, GPIO.OUT)
                          RuntimeError: No access to /dev/mem.  Try running as root!
                          sudo: no tty present and no askpass program specified
                          sudo: no tty present and no askpass program specified
                          [Mon Oct 20 21:06:21 2014] [error] [client 127.0.0.1] PHP Notice:  Use of undefined constant os - assumed 'os' in /home/pi/www/ouglouglou/web_interface/admin.php on line 35, referer: http://localhost/ouglouglou/web_interface/admin.php
                          [Mon Oct 20 21:06:21 2014] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined function geteuid() in /home/pi/www/ouglouglou/web_interface/admin.php on line 35, referer: http://localhost/ouglouglou/web_interface/admin.php
                          sudo: no tty present and no askpass program specified
                          [Mon Oct 20 21:06:28 2014] [error] [client 127.0.0.1] PHP Notice:  Use of undefined constant os - assumed 'os' in /home/pi/www/ouglouglou/web_interface/admin.php on line 35, referer: http://localhost/ouglouglou/web_interface/admin.php
                          [Mon Oct 20 21:06:28 2014] [error] [client 127.0.0.1] PHP Fatal error:  Call to undefined function geteuid() in /home/pi/www/ouglouglou/web_interface/admin.php on line 35, referer: http://localhost/ouglouglou/web_interface/admin.php
                          

                          Voila vous avez toutes les infos et j'avoue que je suis un peu perdu :/

                          Merci d'avance.



                          -
                          Edité par Ourumov 21 octobre 2014 à 21:48:02

                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 octobre 2014 à 22:45:21

                            Désolé d'insister mais je ne vois pas "sudo" dans ton code or c'est indispensable car sinon le fichier sudoers n'est pas pris en compte ! Si apache est bien lancé en tant qu'utilisateur www-data alors un sudo python /home/door/UP456.py devrait fonctionner. Je pense qu'il ne faut pas d'espace entre ALL= et NOPASSWD (mais visudo ne t'aurais pas laissé enregistrer un fichier incorrect :-°).

                            -
                            Edité par Rem's 21 octobre 2014 à 22:45:54

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Mon projet : www.raighost.com un hébergeur web gratuit sans publicité. Essayez-le !
                              21 octobre 2014 à 23:19:20

                              Comme le dit Rem's il n'y a pas sudo dans l'appel system.

                              Avec ça cela devrait marcher :

                              <!DOCTYPE html>
                              <html>
                               
                                  <head>
                                      <meta charset="UTF-8" />
                                      <meta name="viewport" content="width=device-width"/>
                                      <link rel="stylesheet" href="style.css" />   
                                      <title>Door</title>
                                  </head>  
                                   
                                  <body>       
                                      <?php
                                      session_start();
                                      if(isset($_SESSION['confirm']))
                                      { 
                                          if(isset($_GET['action'])=='open')
                                          {
                                              system('sudo /home/door/UP455.py');
                                          }
                                          else
                                          {
                                              system('sudo /home/door/UP456.py');
                                          }  
                                          ?>
                                          <div id="principal">
                                              <a href="admin.php?action=open">OPEN</a><a href="admin.php?action=close">CLOSE</a>
                                          </div>   
                                      <?php
                                      }
                                      else
                                      {
                                          header('Location: index.php');
                                      }
                                      ?>
                                           
                                  </body>
                               
                              </html>       



                              • Partager sur Facebook
                              • Partager sur Twitter
                                22 octobre 2014 à 9:59:39

                                Là franchement je ne comprend pas :

                                Tout les fichiers sudoers sont correctement enregistrés par visudo :

                                # User privilege specification
                                root    ALL=(ALL:ALL) ALL
                                www-data ALL=NOPASSWD: /home/door/UP455.py

                                Le code php contient correctement :

                                 system('sudo python /home/door/UP455.py');

                                Mais pourtant cette chose infâme continu à enregistrer dans les logs Apache2 :

                                "Sudo : no tty and no askpass program specified" :colere: :colere:

                                Comme si rien n'avait était modifié et puis pour le fichiers sudoers j'ai dû trouvé au moins 5 ou 6 syntaxes différentes :waw: sur le Web ....

                                J'ai donc voulu vérifier dans le httpd.conf si l'utilisateur Web apache était www-data, et oui User agent : [une variable],

                                cette variable est définie dans un autre fichier et en effet l'utilisateur est bien www-data.

                                Certain "tutos" donnent pourtant cette méthode et elle semble marcher mais là .... y'a une couille dans le pâté.

                                Le pire c'est que je suis obligé d'utiliser python pour manipuler des GPIOS de raspberry car c'est pour un projet scolaire ou Python est imposé :/

                                -
                                Edité par Ourumov 22 octobre 2014 à 10:01:05

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  22 octobre 2014 à 11:51:38

                                  Ourumov a écrit:

                                  Le code php contient correctement :

                                   system('sudo python /home/door/UP455.py');

                                  Il est là le problème vire le python devant ou alors modifie le fichier sudoers.

                                  Dans ta commande system tu dois mettre sudo suivi d'exactement la ligne que tu mis dans sudoers sinon cela ne marchera pas.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    22 octobre 2014 à 11:58:56

                                    Et oui je suis d'accord,

                                    mais si je vire le "python" dans le code PHP, je me retrouve dans les logs avec un joli "Uknow command type" et si dans le fichier Sudoers je met quelque chose de ce gout là :

                                     "www-data ALL=NOPASSWD: python /home/door/UP455.py"
                                    La fonction sudo plante totalement et je me retrouve à devoir éditer le fichier manuellement via un autre pc sous deb sinon impossible de récupérer la fonction "Sudo" :(

                                    -
                                    Edité par Ourumov 22 octobre 2014 à 12:03:58

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      22 octobre 2014 à 12:03:29

                                      Ajoute #!/usr/bin/python au début de ton script
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        22 octobre 2014 à 12:07:42

                                        Je met ça dans le script python et je laisse dans php :

                                        system('sudo python /home/door/UP455.py');
                                        Et également je laisse sudoers sans python avant le répertoire ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          22 octobre 2014 à 12:12:52

                                          Mets des guillemets au tour de python /home/door/UP455.py dans ton fichier sudoers (il faut laisser le python : ça doit être exactement ce que tu écris après sudo dans ta commande system) : le fichier sudoers n'aime pas les espaces. Il doit comprendre qu'il s'agit de deux commandes différentes et pas d'une seule donc forcément, sudo te demande un mot de passe !

                                          Un conseil, teste ta commande avant en te loggant en www-data et en faisant "sudo python /home/door/UP455.py" depuis le terminal.

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Mon projet : www.raighost.com un hébergeur web gratuit sans publicité. Essayez-le !
                                            22 octobre 2014 à 12:30:05

                                            Bon bon :

                                            Dans sudoers l'écriture : www-data ALL=NOPASSWD: "python /home/door/Up455.py" ;

                                            n'est pas acceptée et fait de nouveau planter le fichier, mais cette fois nano me préviens de la mauvaie syntaxe mais ne fourni pas de solution.

                                            Je viens de mettre #!/usr/bin/python mais ça ne change rien.

                                            EDIT : j'ai testé la commande dans le shell avant et voila : sh: 0: Can't open sudo.

                                            -
                                            Edité par Ourumov 22 octobre 2014 à 12:37:02

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              22 octobre 2014 à 13:52:33

                                              Ourumov a écrit:

                                              EDIT : j'ai testé la commande dans le shell avant et voila : sh: 0: Can't open sudo.

                                              C'est normal, www-data utilise sh et pas bash. Il faut que tu mette les chemins absolu devant tes commande. Tu trouveras l'emplacement d'une commande grâce à which commande. Met aussi un chemin absolu dans /etc/sudoers. Désolé pour les guillemets en fait les commandes sont séparées par des virgules dans ce fichier

                                              Dans ton fichier sudoers :

                                              www-data ALL=NOPASSWD:/usr/bin/python /home/door/Up455.py


                                              Dans ton fichier php :

                                              system('/usr/bin/sudo /usr/bin/python /home/door/UP455.py');

                                              J'ai utilisé les chemins absolus des commandes sudo et python tels qu'ils étaient chez moi. Vérifie que tu as les même avec which et adapte les au besoin.



                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Mon projet : www.raighost.com un hébergeur web gratuit sans publicité. Essayez-le !
                                                22 octobre 2014 à 14:05:43

                                                Ourumov a écrit:

                                                Je met ça dans le script python et je laisse dans php :

                                                system('sudo python /home/door/UP455.py');
                                                Et également je laisse sudoers sans python avant le répertoire ?

                                                Tu #!/usr/bin/python au début de ton script python et après tu enlèves le python partout.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  22 octobre 2014 à 14:48:15

                                                  Merci beaucoup ça marche NIQUEL !!

                                                  Ne pas oublier les virgules dans sudoers à la place des espaces.

                                                  Merci encore à vous deux ;) !

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  Ajout d'une exeption Sudoers

                                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                  • Editeur
                                                  • Markdown