Version complète: sur le forum Webmaster Hub : Débrider PHP sur un dédié
Webmaster Hub > Création et exploitation de Sites Internet > Les fondations d'un site > Hébergement de Sites
renaud63
Bonjour à tous,

Sur mon serveur dédié Linux / PLesk 8.3 (qui n'héberge que mes sites), je voudrais "débrider" les fonctions php...c'est à dire pouvoir utiliser les fonctions dites "dangereuses" qui sont souvent interdites sur les mutus pour des raisons de sécurité : par exemple exec(), chmod(), readfile(), mkdir() et autres...tout en laissant le safe_mode à On.

Je suis allé voir dans le php.ini et :

CODE
disable_functions =
;open_basedir =


Donc ça doit être ailleurs... oui mais où ?
Mon test porte sur la fonction chmod("dossier", 0777) qui ne fonctionne pas chez moi, mais ailleurs oui.

chmod() [function.chmod]: Operation not permitted.....
Je sais que c'est une question de droits d'utilisateur...mais comment le modifier ?

Si quelqu'un a une idée, je suis preneur et merci d'avance.
Dan
Elles ne sont pas bridées par défaut, en tout cas pas sur une installation standard. Je ne sais pas pour Plesk par contre...
renaud63
Merci de ta réponse...

Je n'ai vu nulle part, sur plesk, quelque chose qui ressemble à "config php" ou dans le genre...
Je vais devoir aller dans le camboui, mais j'aimerais savoir où...

Tu sais, éviter les warning du genre open_basedir restriction in effect...
Dan
L'Open_Basedir se configure dans le fichier php.ini, ou vraisemblablement aussi dans Plesk.
mjouan
CODE
/usr/local/psa/admin/conf/php.ini


Marc
renaud63
@ Dan : je vais faire des recherches sur la config PHP depuis Plesk... parce que fouillé partout dans l'admin et rien vu.
Dans Ce post, tu dis :

CITATION
C'est vraisemblablement parce que ton hébergeur a désactivé cette fonction.


Ben c'est justement ce qui m'interesse...mais le contraire.

@ Marc: question idiote : le php.ini que tu m'indiques... en quoi est il différent de celui qui est dans /etc/ ? Lequel modifier ?
phpinfo me dit : /etc/php.ini

ils ont l'air d'être configurés idem... et notamment :

CODE
; open_basedir, if set, limits all file operations to the defined directory
; and below.  This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
;open_basedir =

; This directive allows you to disable certain functions for security reasons.
; It receives a comma-delimited list of function names. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
disable_functions =


Faut-il passer open_basedir à On ?
Je précise que je veux faire ces modifs pour tout le serveur, et non pas site par site avec un vhost.conf, puisque je ne suis pas hébergeur (et heureusement, hein... biggrin.gif )
rdd
Salut,

Plusieurs pistes pour t'aider :

- As tu le safe_mode a on coche par defaut lorsque tu cree ton domaine sous plesk (je n'ai pas encore tester de le desactiver perso) ?
- Pour ton php.ini, si tu modifies dans /etc, les modifications seront effectives sur tous tes sites (normal puisque c'est le fichier de conf du moteur php).
- Pour le php.in que _AT_Marc t'as indique, les modifications de ce fichier n'affecteront que les sites que tu creeras avec Plesk, et UNIQUEMENT ces sites (En fait Plesk se base sur ce fichier et ajoute des directives dans le fichier /var/www/vhosts/tondomaine/conf/httpd.include).


Donc dans ton cas, soit la 2eme ou 3eme solution, tout depend de ton utilisation. Si tu utilises uniquement Plesk, la solution de _AT_Marc est la meilleure. (Verifie dans ton dossier conf de ton domaine pour voir si tes modifs ont ete ajoutees).

Voila, en esperant t'aider un minimum.
renaud63
Bonjour et merci pour ces précisions.

Alors: je suis allé modifier le etc/php.ini et passé le safe mode à On.
Le phpinfo() me dit maintenant :

CODE
safe_mode Off Off
safe_mode_exec_dir no value no value
safe_mode_gid Off Off


Et pourtant, sur une page test :

CODE
Warning: mkdir() [function.mkdir]: Permission denied


et aussi
CODE
Warning: chmod() [function.chmod]: Operation not permitted in


Je deviens fou !!!
Dan
Tu dis que tu passes le Safe Mode à On ... et le Phpinfo le montre à off !

Il ne faut pas l'activer (mettre à on) sinon quantité de fonctions seront inaccessibles (dont mkdir et chmod)
http://fr.php.net/manual/en/features.safe-mode.functions.php

Recherche dans Plesk, vraisemblablement dans Domaines->Cliquer sur le domaine->Setup (ou équivalent en français) . Il doit être activé pour ton domaine.

Dan

PS: je n'ai pas Plesk sous la main et ne suis certainement pas expert en Plesk, mais tu dois pouvoir activer/désactiver le safe mode par domaine. Idem pour open_basedir.
renaud63
Oup's me suis mélangé les pinceaux ! oui je l'ai mis à Off... pensant ainsi le désactiver et autoriser toutes les fonctions.
Ce n'est pas ça ?
Dan
Il faut tout de même aller changer cela sous Plesk ... voir mon post précédent.

A mon avis, Plesk doit modifier les httpd.conf des domaines en ce sens (et l'activer par défaut?)
renaud63
J'ai bien sûr suivi ton conseil... dans domaines/le domaine/config/ la coche safe mode est bien décochée !
J'ai regardé si on pouvait le faire pour tout le serveur, mais rien trouvé...
Le prob se situe peut être dans le httpd.conf...mais comme tu dis, je crois que Plesk le remet par défaut à la moindre modif.
J'ai vu aussi qu'on pouvait utiliser un vhost.conf et lui donner des directives "stables", mais je n'ai pas trop capté où le mettre et comment l'écrire...

CODE
Prise en charge de PHP  ('safe_mode' de PHP activé )
rdd
Pour le fichier vhost.conf, il faut que tu le place dans /var/www/vhosts/tondomain/conf/

Tu met ceci a l'interieur de ton fichier :
CODE
<Directory /var/www/vhosts/tondomain/httpdocs>
php_admin_value safe_mode off
php_admin_value open_basedir none
</Directory>


Et tu reconstruit tes fichiers de conf avec la commmande suivante :
CODE
/usr/local/psa/admin/sbin/websrvmng -u --vhost-name=tondomain


Il faudra alors le faire pour chaque domain. Si tu a plusieurs domain a gerer, tu creer un vhost.conf pour chaque et au lieu d'utiliser la commande ci-dessus, tu peux utiliser celle ci :
CODE
/usr/local/psa/admin/sbin/websrvmng -a

qui va regenerer tous tes fichiers de conf
renaud63
Merci à toi rdd, j'ai suivi tes consignes à la lettre, mais, 3 fois hélas, ma page de test affiche toujours les warning pour les fonctions chmod et mkdir : permission denied.
C'est quand même un truc de fou furieux !
Kioob
Question bête : où as tu vu que le chmod() et le mkdir() étaient bloqués à cause du safe_mode ?
Il faudrait les lire les messages d'erreur en entier, mais tu ne nous en as mis que le début...

Du coup ça pourrait être un "simple" problème de droits unix, et non une restriction du safe_mode ou de l'open_basedir.
renaud63
Et bien, en fait, j'ai lu un peu partout sur le net que le safe mode à Off rendait toutes les fonctions exécutables...

Les messages d'erreurs sont ceux que j'ai indiqués avec le chemin en plus :

CODE
Warning: chmod() [function.chmod]: Operation not permitted in /var/www/vhosts/vt-boutique-net.com/httpdocs/boutique/installer.php on line 254
Warning: mkdir() [function.mkdir]: Permission denied in /var/www/vhosts/vt-boutique-net.com/httpdocs/boutique/installer.php on line 8


Effectivement j'ai aussi vu des problèmes de droits groups/users.... mais en tant qu'admin du serveur, comment et où je peux déclarer ça pour chaque site ?
Dans le httpd.conf, j'ai :

CODE
User apache
Group apache


Faut il que je me déclare quelque part group et user (avec un vhost.conf au même niveau que httpd.conf ?) pour tout le serveur, puis qu'ensuite j'aille également mettre ces données dans les vhost de chaque domaine ?

Kioob
Quand il s'agit d'une restriction du safe_mode ou bien d'open_basedir c'est généralement clairement indiqué dans le message d'erreur.

Là il s'agit vraiment d'erreurs "unix" classiques : pour pouvoir faire un chmod sur un fichier (ou dossier), il faut soit être root (ce qui n'est pas le cas là, ton PHP tournant sous le compte apache) soit être propriétaire du fichier en question. Si c'est un fichier uploadé par FTP le propriétaire n'est pas Apache non plus ; chmod ne sera utilisable que sur les fichiers créés via PHP.

Quant à mkdir il faut avoir les droits d'écriture dans le dossier supérieur pour pouvoir y créer un dossier.

Bref, je ne suis pas certain de savoir ce que tu cherchais à faire, mais pour ton chmod à priori c'est à toi de le faire manuellement via FTP, ce qui te permettra ensuite de faire le mkdir via PHP.

Et ré-active le safe_mode et l'open_basedir, tu as retiré la seule protection des environnement configurés via Plesk biggrin.gif
renaud63
Bonjour,

hummm... oui c'est sûr, je pourrais faire les chmods à la main...mais sur 100 sites c'est un peu fastidieux, lol. En fait, j'installe des boutiques clés en main, toutes les mêmes, et je voudrais automatiser la procédure d'install. Donc chmod(), tu vois, c'est un peu indispensable.
Quant à mkdir, mes scripts en ont besoin. Si je remets safe mode à On, fini les unlink(), les fopen() et autres fonctions indispensables...

Et puis, je loue un dédié... c'est pas pour m'emm... comme sur un mutu.
D'ailleurs, je suis étonné de constater que sur 1 and 1 (qui vaut ce qu'il vaut, là n'est pas la question), un hébergement mutu lambda à 9€/mois donne ceci au niveau du phpinfo() :

CODE
safe_mode Off Off
safe_mode_exec_dir /usr/local/php/bin /usr/local/php/bin
safe_mode_gid Off Off


Et dans cette formule de base, chmod, mkdir, unlink et toute la bande des "dangereuses" tournent comme sur des roulettes...

Pourquoi moi, je peux pas faire pareil ???
rdd
Si c'est une erreur de droit ou juste de group user, tu peux deja essayer de faire un test pour voir.

Tu vas dans /var/www/vhosts/vt-boutique-net.com et tu fais un ls -l dans ce rep.
Tu recuperes alors ton user et group qui s'affiche pour le httpdocs.

Ensuite tu tapes dans ton shell en tant que root :

CODE
chown -R userhttpdocs:grouphttpdocs httpdocs


userhttpdocs et grouphttpdocs seront bien sur les resultats de ton ls -l.

Et retest pour voir si ca donne quelque chose.

Paste aussi ce que te donne le ls -l au dessus.

Test aussi un petit
CODE
chmod -R 775 boutique dans ton dossier httpdocs
si jamais ca ne fonctionne toujours pas.
renaud63
Encore merci...

dans le shell, cette commande /var/www/vhosts/vt-boutique-net.com me répond :

CODE
  
-bash: /var/www/vhosts/vt-boutique-net.com: is a directory


et idem pour /var/www/vhosts/vt-boutique-net.com/httpdocs

ls -l ne serait pas la bonne commande ?
rdd
Pardon je ne t'ai pas mis la premiere commande a taper donc je recapitule dans l'ordre rolleyes.gif

CODE
cd /var/www/vhosts/vt-boutique-net.com
ls -l


Tu recuperes alors ton user et group qui s'affiche pour le httpdocs.

CODE
chown -R userhttpdocs:grouphttpdocs httpdocs
cd httpdocs
chmod -R 775 boutique


(En faisant les 2 commandes on sera sur)
Kioob
CITATION(renaud63 @ vendredi 6 juin 2008 à 07:47) *
hummm... oui c'est sûr, je pourrais faire les chmods à la main...mais sur 100 sites c'est un peu fastidieux, lol. En fait, j'installe des boutiques clés en main, toutes les mêmes, et je voudrais automatiser la procédure d'install. Donc chmod(), tu vois, c'est un peu indispensable.


Il s'agit là d'une sécurité UNIX, donc soit tu fais la modif depuis le compte root soit tu le fais par FTP, mais tu n'aurais guère plus de solutions.


CITATION
Quant à mkdir, mes scripts en ont besoin. Si je remets safe mode à On, fini les unlink(), les fopen() et autres fonctions indispensables...

Ca n'a absolument aucun rapport. mkdir(), unlink(), fopen() et toutes les fonctions de manipulation de fichiers fonctionnent parfaitement en safe_mode, y compris avec open_basedir actif.


CITATION
Et puis, je loue un dédié... c'est pas pour m'emm... comme sur un mutu.

Si tu veux conserver un minimum de sécurité, il faut que l'utilisateur exécutant les scripts soit différent de l'utilisateur propriétaire des scripts... et ça, peu importe le modèle choisi (mod_php, fastcgi+suexec, ou suphp).

Après tu peux évidement t'assoir sur l'aspect sécurité et faire sauter ça...


CITATION
D'ailleurs, je suis étonné de constater que sur 1 and 1 (qui vaut ce qu'il vaut, là n'est pas la question), un hébergement mutu lambda à 9€/mois donne ceci au niveau du phpinfo() :


Comme la plupart des hébergeurs mutualisés d'assez grosse taille, ils sont certainement en FastCGI + suExec, ce qui est généralement plus sécurisé que le "mod_php" classique.


CITATION
Et dans cette formule de base, chmod, mkdir, unlink et toute la bande des "dangereuses" tournent comme sur des roulettes...

Pourquoi moi, je peux pas faire pareil ???


Parce que tu ne cherches pas à comprendre pourquoi ça ne marche pas ?
renaud63
Bonjour à vous

_AT_rdd
CODE
cd /var/www/vhosts/vt-boutique-net.com ls -l


me retourne

CODE
drwxr-x--- 5 vt-boutique-net psaserv   48 Jun  6 17:05 httpdocs


mais ensuite :

CODE
chown -R vt-boutique-net httpdocs:psaserv httpdocs cd httpdocs


me retourne
CODE
chown: cannot access `httpdocs:psaserv': No such file or directory
chown: cannot access `httpdocs': No such file or directory
chown: cannot access `cd': No such file or directory
chown: cannot access `httpdocs': No such file or directory


Peut être que j'ai mal compris ta consigne...
Bon le chmod 775 sur le dossier boutique je peux le faire par ftp...actuellement il est à 755
renaud63
Bonjour Kioob,

CITATION
Il s'agit là d'une sécurité UNIX, donc soit tu fais la modif depuis le compte root soit tu le fais par FTP, mais tu n'aurais guère plus de solutions
///
Comme la plupart des hébergeurs mutualisés d'assez grosse taille, ils sont certainement en FastCGI + suExec, ce qui est généralement plus sécurisé que le "mod_php" classique.


Tu as sûrement raison...mais n'empêche que la fonction chmod() de php fonctionne parfaitement sur un hébergement de base 1 and 1...et j'aimerais bien qu'il en soit de même sur mon dédié...quant à mkdir() et unlink(), elles me retournent systématiquement permission denied... et je vois pas comment je peux exécuter ces fonctions en tant que root depuis le script.

FastCGI + suExec : oui, là, j'avoue que je n'ai jamais entendu parler de ça.

CITATION
Parce que tu ne cherches pas à comprendre pourquoi ça ne marche pas ?


Oh mais si, je t'assure ! une semaine que je bouffe des tutos, que je lis les forums, j'ai le feu à la tronche ! mais ce monde est, comment dire, un peu fermé...
En tout cas, vous êtes des gens cool sur ce forum, et ça il fallait le dire.
wink.gif
Kioob
Ce qu'il faut bien voir c'est que tu as une installation de type Plesk, donc quoi que tu fasses tu seras toujours limité à ce que propose Plesk... et justement à ma connaissance Plesk ne gère qu'un seul type d'installation Apache/PHP.

Pour les autres schémas qui te font tellement envie, il faut repartir sur un OS "propre", quitte à déléguer l'installation/infogérance à Dan par exemple.

En attendant, il te faudra bien faire avec les contraintes de l'installation actuelle... en essayant d'en comprendre le fonctionnement. Faire du chmod ou chown à droite et à gauche sans savoir pourquoi, c'est risqué.
Par exemple si le "chown" indiqué par rdd fonctionne (si tu ne te trompes pas dans la syntaxe quoi), il y aura fort à parier que tu perdras ton accès FTP, en écriture du moins... le "access denied" ne sera plus pour tes scripts PHP mais pour ton accès FTP, quel est le mieux ?
renaud63
Oui je vois ce que tu veux dire...
Mais il n'y a donc rien à faire pour donner tous les droits à tous les domaines, et tant pis pour la sécurité ?
Kioob
Sous Plesk, pas de manière automatique à ma connaissance.

Mais il y a peut-être moyen de modifier le "umask" du serveur FTP (il me semble que Plesk installe un ProFTPd), afin de le mettre à 000 et ainsi avoir tous les dossiers en 777 et les fichiers en 666. Mais à ce niveau, autant installer un Windows.
renaud63
Excuse moi de m'accrocher à mon idée comme un naufragé, lol

Mais, comme je dispose du shell, de l'accès FTP à tout le serveur (je peux donc zapper Plesk), il n'y a pas un fichier .conf, ou .ini ou un vhost.con à modifier/ajouter pour autoriser cette p... de fonction unlink() et chmod() pour tout les domaines ? Ou, allez...au pire, pour chaque domaine ?

r_question6161.gif
Kioob
Soit tu modifies le Umask comme je t'ai indiqué ci dessus, soit il te faut changer de compte Unix pour chaque domaine.

Et donc en plus de changer le propriétaire de tous les fichiers du site, il faut revoir toute la configuration du serveur FTP, et c'est géré par Plesk... donc dès que tu retoucheras à Plesk, il ré-écrira par dessus. Sans oublier les éventuels effets de bord, tels que Webalizer, ou les crons qui auront de très grandes chances de ne plus fonctionner.

Si tu ne veux plus utiliser Plesk, il faut repartir sur une installation sans Plesk... mais bidouiller à l'aveugle n'amènera rien de bon.
renaud63
Bon, et bien ok... je capitule.
Merci à toi pour ta patience et bonne journée.
rdd
Salut,

Dsl renaud63, je n'ai pas pu te repondre ce WE.

En fait le chown ne fonctionne pas comme ca (mais vu que tu as paste les resultats de ls -l je vais pouvoir t'ecrire les commandes).

Donc je te met la marche a suivre complete pour que ca fonctionne (normalement).

CODE
cd /var/www/vhosts/vt-boutique-net.com

CODE
chown -R vt-boutique-net:psaserv httpdocs

CODE
cd httpdocs

CODE
chmod -R 755 boutique
.

Voila.

Pour repondre a Kioob egalement, le fait de faire un chown sur le httpdocs ne changera en rien les droits d'acces ftp puisque proftd (contrairement a pureftpd) cree des comptes utilisateurs UNIX. La je lui demande juste de faire cette commande pour etre sur que tous les sous-dossiers de httpdocs aient bien le meme user:group que le rep parent.

Je ne pense pas non plus que les hebergements utilisant Plesk utilisent suExec (peut etre mis a part pour l'admin), mais sont plutot batis sur un environnement chroote (imagine certaines commandes en suExec ...). Apres bien sur tout depend des hebergeurs et du niveau de securite qu'ils accordent a leurs becannes en Datacenter, mais ca c'est un autre debat wink.gif
Kioob
Effectivement ton chown ne cassera rien, j'avais lu trop vite désolé (j'avais cru que tu mettais tout sous l'utilisateur Apache, ce qui aurait réglé son problème de script).

ProFTPd (mais peu importe le soft), accède actuellement à ce dossier via le compte Unix vt-boutique-net et hérite donc de tous les droits qui vont avec ; c'est à dire que les fichiers et dossiers sont créés avec comme propriétaire vt-boutique-net.
Pour que PHP ait les droits d'écriture, il faut "juste" qu'il colle un 0777 sur les dossiers dans les lesquels il veut créer des fichiers... c'est crade et complètement insécurisé, mais avec Plesk guère d'autres solutions. Et pour les fichiers à modifier via PHP, c'est évidement du 0666.
Donc vu les droits nécessaires "à la Windows", je pense qu'il ne faut surtout pas affecter ça à l'aveugle sur toute son arborescence. Surtout qu'il faudra recommencer pour chaque dossier/fichier créé par FTP...

En passant, à moins que Plesk ait furieusement changé son mode de fonctionnement, il n'y a absolument aucun chroot de fait coté Apache/PHP. C'est un bète PHP en module Apache, avec pour seule sécurité le safe_mode+open_basedir.

PS : PureFTPd fonctionne en standard avec des comptes UNIX, mais là n'est pas le problème.
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.