Problèmes de droit pi-4 php et www-data

Bonjour,

Je vais essayer d’être le plus clair, ce qui n’est pas évident.

J’ai un raspberry pi 4 avec raspbian 64 bits (mis à jour ce matin) et python 3.9. J’ai également installé apache pour faire du php.

Je suis dans le répertoire /var/www/html/steeve. Le répertoire steeve est dans le groupe www-data et raspberry (moi) est le propriétaire. Pour le moment, ce répertoire à tous les droits (pas bien).

Dans ce répertoire, j’ai un programme python qui génère une image (.png). Le programme est dans le groupe www-data et raspberry (moi) est le propriétaire. Je lance ce programme depuis Thonny et le programme crée l’image sans soucis.

Ensuite, j’ouvre un shell et je tape :

echo ‹ debut › && cd /var/www/html/steeve/ && ls -lart && python /var/www/html/steeve/correction_RST_BD_BO.py && echo ‹ fin ›

Les echos servent à voir qu’il exécute bien du début à la fin. L’exécution se passe sans soucis et l’image est créée.

Maintenant, je crée un fichier php :

<?php

$output = shell_exec("echo 'debut' && cd /var/www/html/steeve/ && ls -lart && python /var/www/html/steeve/correction_RST_BD_BO.py && echo 'fin'") ;

print "<pre>$output</pre>";

?>

Dans un shell, je lance php test.php depuis le répertoire steeve et tout fonctionne correctement.

Le problème vient maintenant. Mon ip est 138.231.yy.xx. Depuis un navigateur, je tape http://138.231.yy.xx/steeve/test.php

J’ai un message qui affiche « début » puis le résultat de ls -lart mais il n’exécute pas mon fichier .py et je n’ai jamais le message « fin ». L’image n’est pas non plus créée.

Je suis vraiment à court d’idée pour comprendre ce qu’il se passe.

Auriez vous un peu d’aide à m’apporter?

Merci

Apache ne gère pas bien les droits utilisateurs et groupe de mon expérience, j’ai le même problème avec mon serveur sous Debian 10.

J’ai beau mettre le dossier /var/www/html avec le user moi et le groupe www-data, faire l’inverse, rien ne marche vraiment.

Apache semble que gérer l’utilisateur et non le groupe. Alors la solution est gérer les droits selon ce qui est le mieux selon le besoin.

Si tu donne le user a tes fichiers, tous va marcher, dans le cadre du droit de www-data. SI tu désire faire des actions, comme du sudo, ou sortir du dossier pour lire des dossiers dans /home ou /etc par exemple, ce ne sera pas possible.

Encore la selon ton besoin, tu peux faire plusieurs modifications ou contournements

  • Rendre le dossier web gérer par www-data et to su www-datapour y travailler
  • Faire que ton site cré un fichier et qu’un process en background le lise pour savoir quoi exécuter, et sauvegarder le résultat dans un autre fichier qui sera la. Cette méthode je m’en sert avec mon code PHP pour télécharger des vidéo Youtube. J’ai dont des droits adéquats entre le Web et le process pour gérer le youtube-dl et ffmpeg, et manipuler les fichiers.
  • Créer un serveur Web en python qui aura le bon accès utilisateur <<=== attention, mal codé ça peut devenir dangereux si accessible sur internet.

Bref, il n’y as pas de solution miracle. Je sais que Virtualmin me permet de mieux gérer ces situation en demandant à Apache d’éxécuter PHP sous un login spécifique, même là, ce n’est pas sans problèmes.

Merci pour la réponse.

Je vais regarder tout cela et voir si l’une des méthodes fonctionne pour moi.

En regardant /var/log/apache2/error.log, j’ai cela :

[Wed Jun 15 08:42:33.516628 2022] [mpm_prefork:notice] [pid 657] AH00163: Apache/2.4.53 (Debian) configured -- resuming normal operations
[Wed Jun 15 08:42:33.516787 2022] [core:notice] [pid 657] AH00094: Command line: '/usr/sbin/apache2'
Traceback (most recent call last):
File "/var/www/html/steeve/correction_RST_BD_BO.py", line 20, in <module>
import control as ctl # Pour l'automatique
ModuleNotFoundError: No module named 'control'

Etrange car depuis un shell si je fais :

/usr/bin/python
import control

Je n’ai aucune erreur…

Arggggg, j’en deviens fou…

Peut-être voi-t-il la mauvaise version de python, des modules présent dans la v2 ne le sont pas dans la v3, et vice versa.
Après, est-ce que le module est disponible que pour un user ou pour tout le monde ?

Si j’enlève le « import control » et ce qui s’y rapporte, tout fonctionne bien.

C’est le serveur apache qui n’arrive pas à avoir accès ou n’a pas le lien vers les modules installées.

J’ai pourtant rajouté le lien vers les modules dans le php :

putenv(‹ PYTHONPATH=/home/raspberry/.local/lib/python3.9/ ›);

dans le php mais rien n’y fait…

Bonjour , oui mais non .

premiere question , a partir d’ une ip distante , comment l’ ordinateur reconnait que c’ est toi ?
comment te connectes tu a l’ ordinateur pour y executer le script ?
Ha je viens de voir :

Le problème vient maintenant. Mon ip est 138.231.yy.xx. Depuis un navigateur, je tape http://138.231.yy.xx/steeve/test.php

Evidemment !

le probleme est simple , un navigateur de fichier n’ execute aucune commande , n ’ execute aucun script , il envoie une requete au serveur et affiche ensuite du code HTMLque tu peux lire .

Comment ton serveur , a travers le navigateur , sait que c ’ est toi qui te connecte ?

Heureusement que c ’ est impossible de faire ce que tu souhaites sinon ca ne serait pas une faille de securité mais un trou noir beant .

Bref , tu confonds le module PHP avec l’ interpreteur PHP .
cela arrive souvent .

On ne peut en aucun cas executer un script ou une commande a partir d ’ un ordinateur distant et d ’ un navigateur puisque ce n’ est pas securitaire , vu qu ’ il n’ y a aucun moyen de se logguer sur la machine . ce n’ est en aucun cas un probleme de droit .

c ’ est la façon dont tu t ’ y prends qui n’ est pas bonne .

Si tu veux pouvoir executer des scripts commandes a distance etc , il faut alors te connecter au serveur en utilisant SSH et clé cryptées de preferences .

Fait une recherche tu as pleins de tutos sur le net .

Un serveur WEB auquel on accede donc via un navigateur , n ’ execute jamais de scripts ou de commandes . il interprete du code PHP ( les pages que tu heberges dans /var/www/html ) et les transforme en fonction des requetes du client en code HTMLCSS etc , puis les envoies au client a travers le reseau . il n’ a aucun droit d’ executer quoi que ce soit .
le client les recois et le navigateur affiche les resultats a l’ ecran .

Tu code tu web parce que moi j’y arrive sans trop de problème en ajustant les droits de fichier, c’est Apache le Hote du process qui le run, comme il explique, il veux que sur une demande Web sont script s’exécute, alors c’est TOTALEMENT POSSIBLE car je le fait moi même dans plusieurs cas;

  • Actualiser ma liste du SC_TRANSCODER, et le relancer via son service
  • Commander un Shutdown, reboot ou autre via mon interface Web pour un appareil « headless »
  • Envoyer des texto via un script Python depuis un appel d’un formulaire Web

C’est juste savoir comment ajuster le tout.

Le problème n’est pas qu’il ne sait pas qui il est quand Apache le sert, il comprend parfaitement le bug entre Apache (www-data) et quand il est en SSH via son compte utilisateur.

Son problème est qu’il veux jouer avec ces fichiers directement (SSH) ou via Apache (en visitant une page). Et CE problème est connu et c’est ça qu’ont tente de résoudre…


Au passage, j’ai plus de 300 sites Web fait dans ma vie, je gère actuellement 1 dédié, 1 vps et un serveur local, sans compter tout l’infractuture TI d’une compagnie. J’ai déjà eu a gérer une dizaine de VPS ensemble, entre CentOS et Debian, et tout ce passait en PHP pour commander les système.

Merci à tous pour vos conseils.

Je viens d’arriver à faire marcher tout cela. Le problème était qu’en exécutant mon python via le serveur apache, celui ci ne connaissait pas le chemin d’accès vers les modules complémentaires de python. Ca se résout donc en ajoutant en

putenv('PYTHONPATH=/home/raspberry/.local/lib/python3.9/site-packages/')

Merci à tous pour vos conseils!

@iznobe Je suis d’accord avec tes propos. Cette façon de faire n’est pas propre. Néanmoins, je n’ai pas vraiment le choix (dans un premier temps).

Pour poser le décors, je suis dans une université et nous avons beaucoup de salles de manipulation expérimentales. Avec le covid nous avons souhaité rendre ces manipulations faisables à distance. Un collègue a crée un serveur où les étudiants se connectent. Ce serveur sert d’interface. Ils peuvent choisir l’expérience à réaliser et les paramètres de cette expérience. Moi, j’ai un raspberry qui va piloter les expériences en python ou c ou… Il me faut donc un programme php qui va lancer le script python de l’expérience. Ce script lance l’expérience et récupère les données qui sont ensuite transmises au serveur puis du serveur aux étudiants.

Mon cadre étant donc très contraint.

J’espère à l’avenir faire mieux que ce que j’ai actuellement.

Merci

Ta solution est bonne, vu que le problème rendu la était que les chemin d’environnement ne sont pas les mêmes de l’« user » et du « apache ».

Pour revenir à l’exécution d’un script Python depuis Apache/PHP…
Le problème de sécurité n’est pas réellement le fait d’exécter une commande « système » depuis PHP, mais de bien protéger le script qui va l’exécuter. Idéalement pour éviter un détournement, les fichiers à exécuter ne devrais pas être dans le document web (var/www/html pour le web, /var/www/scripts pour les apps a rouler, par exemple). De s’assurer que la demande PHP ne permet pas d’éditer la demande pour injecter un code qui pourrais être interpréter (par le système).

Il faut également utiliser un « user » qui n’as pas les accès au root, ni au sudo, pour éviter d’exécuter la commande avec un niveau qui peut donner accès à tout le système.