Jump to content
  • 0
M@ttew

Chmod Sur Partition Du Nas Depuis Serveur Web Du Nas...

Question

Bonjour à tous,

 

Difficile de donner un titre explicite à ce que je souhaite réaliser.

Voici donc le contexte.

 

J'ai un QNAP NAS TS-119 P+ avec un disque interne sur lequel j'ai installé un site WEB sur la partition /Web

Et sur ce NAS, en eSATA, un disque (externe donc), sur lequel j'ai une arboresence de fichiers medias classés dans des dossiers numérotés.

Afin de gérer le contenu de ces fichiers, j'ai réalisé une interface en php/sql sur laquelle chaque fiche correspond à un fichier media avec ses différentes caractéristiques modifiables à l'aide de menus déroulants.

A ce stade, tout fonctionne mais d'une certaine manière, il n'y a aucun lien entre le site web (l'interface de gestion des fiches) et les fichiers eux-mêmes.

 

D'où, ma question:

Dans l'interface web, je renseigne un champ qui correspond aux droits d'accès des fichiers medias.

Concrètement, je voudrais pouvoir modifier ces droits par un chmod, soit 644 (lecture pour tous), soit 640 (interdit pour les autres) à l'aide d'un simple bouton php.

 

Le problème consiste à exécuter cette commande chmod sur le fichier qui va bien, sachant que les fichiers ne sont pas accessibles directement par le serveur Web, évidemment.

Dis autrement, exécuter un chmod depuis un script php d'un serveur A sur un fichier hébergé sur un volume accessible uniquement en mode console.

Dans les faits, je peux très bien monter le volume en AFP (je suis sous OSX...) en tant qu'admin, mais je voudrais pouvoir effectuer la chose en dehors du LAN.

C'est pour cela que j'ai activé ssh sur le NAS et grâce à un Tutoriel trouvé sur ce site, j'utilise cette commande pour accéder à mon NAS depuis l'extérieur.

 

ssh -L 8080:localhost:443 -p 36758 admin@machinbidule.no-ip.org    (les ports et le no-ip sont pipos bien sûr...)

 

J'imagine que la solution consiste à déclencher l'exécution d'un script ssh situé à la racine des fichiers medias.

Seulement, je n'y connais rien ou presque en bash et je ne sais pas comment, depuis un script php de mon serveur web, je peux lancer le script ssh avec comme paramètre le nom du fichier à 'chmoder' ainsi que son chemin, bien sûr...

 

Voilà, j'espère avoir été clair dans mes explications.

 

Vos avis seront les bienvenus.

D'ailleurs, il y a peut-être une manière plus simple pour faire ce que je veux, mais je suis un newbie en php donc avec peu d'idées lumineuses...

 

@+, M@ttew :)

Share this post


Link to post
Share on other sites

48 answers to this question

Recommended Posts

  • 0

Bonjour,

 

Si je résume ... vous voulez :

en connaissant le chemin d'un fichier, changer ces droits, même si ce fichier, ne vous appartient pas (donc en admin) et même si ce fichier n'est pas accessible depuis l'application Web ???

 

Étant nul en php ...mais supposant qu'il existe des fonctions "exec, shell, system ou autres" pour exécuter une commande ... il va falloir convertir cette commande pour la rendre "droit Linux compatible"

 

Sur le QNAP il y a 2 serveurs Web

1 pour certains outils QNAP (web admin / file manager / download station)

1 pour les applications Web publiques

... une des principales différences (sauf application QNAP et certaines comme Plugmedia de notre administrateur) est que le premier gére les utilisateurs du QNAP (Linux), l'autre NON

ce qui implique que :

dans Web admi ou filemanager, c'est l'utilisateur Linux correspondant qui exécute les actions

dans les applications courante c'est l'utilisateur Apache (hhtpdusr:everyone) qui exécute les actions, lequel utilisateur a peu de droits ...

 

Pour changer les droits d'un fichier ... il faut en être le propriétaire, ou avoir des droits sur le répertoire supérieur.

 

Solutions possible :

1 utiliser le web file manager, celui-ci via une interface Web ... tel que vous connaissez permettra d'être admin et de modifiez les droits des fichiers

...  quel qu’ils soient (droits admin)

2 utilisez la connexion ssh actuelle pour lancer un shell (les commandes se mettent derrière la connexion :

ssh -p 36758 admin@machinbidule.no-ip.org 'chmod 664 /share/Multimedia/video/fichier_a_modifier'

... la seule modification a prévoir, est de transmettre la clef rsa, de votre client, au QNAP pour ne plus avoir a entrer le mot de passe, ceci permettra d'enchainer des commandes ...

3 intégrer ceci dans votre php ... là je ne sais pas si ssh est appelable par httpdusr (apache user), si oui vous pouvez faire de même en boucle locale la cible devenant 127.0.0.1

4 les autres solutions php ... à voir avec un "bon" en php

5 vous pourrez utiliser des fichiers "pipe nommés" pour envoyer à une sorte de serveur vos demandes ... pour votre php, cela reviendra a écrire dans un fichier ... si vous n'avez pas d'autres solutions ... je vous enverrai un petit shell serveur, qu'il faudra lancer via un des moyens habituels ...

 

Philippe.

Share this post


Link to post
Share on other sites
  • 0

Bonjour,

 

Un grand merci pour votre réponse rapide.

Aux vues du contenu, je vais prendre le temps de digérer tout cela et je reviens vers vous dans quelques temps avec _ c'est certain _ d'autres questions...

 

@ bientôt,

 

M@ttew

Share this post


Link to post
Share on other sites
  • 0

Bon, voilà où j'en suis...

J'ai réussi à envoyer la commande via ssh en activant les clés RSA sur mon client et sur le QNAP.

Donc, dans un terminal sous OSX, ça fonctionne bien ainsi:

 

ssh -p 49157 admin@192.168.1.22 'chmod 640 /share/external/sdz1/fichier.jpg'

 

J'ai essayé de transposer la commande dans le script php à l'aide de la fonction shell_exec() comme ceci:

 

<?php
      shell_exec('ssh -p 49157 admin@192.168.1.22 \"chmod 640 /share/external/sdz1/fichier.jpg\" ');
?>

Et là, forcément, il ne se passe rien!

J'ai un doute sur la façon dont il faut écrire la commande avec les ' ou les " et les \

Et reste à savoir si httpdusr pourra effectivement appeler ssh, je n'ai pas trouvé la réponse sur Google...

 

Pour le point 4/ je vais essayer voir sur des sites dédiés.

 

Pour le point 5/, je n'ai pas compris de quoi il s'agit...

 

@+, M@ttew

Share this post


Link to post
Share on other sites
  • 0

Bonjour,

 

Pour PHP, comme je vous l'ai dit ... je suis au point débutant balbutiant ... donc je ne peux aider ...

 

Pour le point 5, ça c'est du Linux de chez Linux et je suis un peu mieux ...

Les fichiers "pipe (tube en Français) nommées" sont des fichier particuliers qui fonctionnent comme ceci :

 

Un programme (un simple shell, par ex.) est en lecture sur le fichier ... ce qui le bloque (le programme) en attente d'un écrivain ...

Un second programme écrit dans le même fichier, cela le bloque (le second programme) tant que ce qu'il a écrit n'est pas lu ...

Le 1er lit donc ce qui lui a été "envoyé" ... ce qui débloque au passage le second programme ... et peut (même si c'est un shell) en faire ce qu'il veut ... .

le 1er se remet en lecture en attente d'un nouveau message ...

 

c'est un moyen simple de faire de l'inter processus dans une même machine entre 2 environnement distincts ...

ex. QNAP l'utilise pour lancer et arrêter les applications dans HD_Station car HD_Station s’exécute dans un environnement "prison" (chroot en Linux) qui de par sa définition de "prison" ne sait pas naturellement voir le Linux du QNAP ... ceci permet de manière simple (simpliste) les échanges entre les 2 environnement clos.

 

Depuis PHP, cela reviendrait a écrire dans un fichier ...

 

Je vous laisse à vos recherches (ou, si vous n'avez pas d'autres réponses, mettez un émail a Cris, qui a peut-être "sauté" votre message, notre admin, qui est un "expert" en PHP, c'est lui qui a écrit Plugmedia ... )

 

Philippe.

Share this post


Link to post
Share on other sites
  • 0

Bonjour M@ttew,


Je voudrais dans un premier temps résumer votre situation pour que vous disiez si j'ai bien compris ^_^.


Alors, d'après ce que j'ai pu lire, vous avez une application PHP sur votre NAS qui vous sert à gérer des fiches qui servent à décrire des fichiers placés sur votre disque dur externe (qui est relié au NAS en eSata).

Par la suite, vous souhaitez pour certaines raisons, modifier les droits d'accès aux fichiers média pour en autoriser la lecture ou non (chmod 644 ou chmod 600).


Est-ce bien cela ? (désolé, je n'ai pas pris mon café, alors normal que ne je comprenne pas bien xD)


Vous souhaitez apparemment faire ça en PHP ? Mais alors, pourquoi faire ça en SSH ?


Je m'explique, vous pouvez très bien réaliser cette opération en local depuis votre application PHP (en tant qu'administrateur, si vous avez implémenté un système de compte utilisateur) et ne pas utiliser SSH; étant donné que vous êtes en local (NAS + disque dur externe).


Par ailleurs, vous pourriez faire ça d'une autre façon (base d'accès en XML/SQL), mais si vous souhaitez utiliser les droits d'accès j'essayerais de vous aider ;)

 

Et pour résumer encore un peut plus (nouvelle version ^^):

  • Vous vous connecter à votre application PHP présente dans le répertoire "Web" du NAS
  • Vous gérer des fiches en relation avec des fichiers média
  • Vous souhaitez autoriser ou restreindre l'accès aux fichiers média en utilisant le chmod
  • Et évidemment, effectuer cette opération depuis votre application web

Est-ce bien cela que vous souhaiter réaliser ? 

Share this post


Link to post
Share on other sites
  • 0

Bonjour archimede333,

 

Et bien, ce résumé est parfait.

A la base, je souhaite faire la chose en php évidemment, car je n'y connais rien en ssh, à part créer un tunnel pour utiliser le proxy squid du QNAP et accéder de manière sécurisée au WebAdmin et au WebFileManager (je n'ai pas que des données sur le eSATA mais aussi sur l'interne du NAS... sauvegardes et autres documents importants)

Avec mes rudiments de console (je suis sur OSX depuis sa naissance...), j'ai appris ça et là quelques commandes UNIX comme l'usage des chmod, chown et chgrp. Les débuts d'OSX ne permettaient pas de modifier les droits depuis un GUI, il fallait en passer par le terminal!

C'est donc tout naturellement que j'ai pensé au tunneling ssh pour envoyer la commande chmod.

Et c'est là que je galère en fait.

 

Father_Mande m'a indiqué comment utiliser la commande chmod dans un tunnel ssh en se loggant admin via des clés RSA, et effectivement, la chose fonctionne dans le terminal.

Seulement, je ne trouve pas la syntaxe pour transposer ce code en php d'une part, et d'autre part, je vais devoir gérer un nom de fichier dynamique dans ce code, en ce sens que celui-ci sera récupéré dans une variable php lorsque l'usager cliquera sur un bouton html renseignant la fiche relative au fichier considéré... (ça, c'est de la phrase à deux balles, ou je ne m'y connais pas!!!)

 

Rapport à votre première question:

Je n'ai pas de gestionnaire de compte utilisateur dans mon appli php, seulement un espace admin dont les scripts sont dans un sous-dossier protégé par htaccess...

Cela dit, rien de plus simple que d'implémenter ce système de compte, j'ai une autre appli php qui fonctionne dans ce sens...

En revanche, je ne vois pas comment faire le lien car l'instruction php aura forcément des droits de httpdusr propres à /Web du NAS alors que la partition /eSATADisk1 requiert les droits admin (donc root) du NAS pour manipuler la commande chmod.

Certes, restreindre cette fonctionnalité en local (soit 192.168.1.22 au lieu de machinbidule.no-ip.org) n'est pas limitative (je ne vais pas m'amuser à changer ces droits tous les 4 matins...) mais même dans ce contexte, je ne comprends pas comment faire!

 

Rapport à l'autre façon (xml/sql), là aussi, je manque d'explications.

Mes fiches sont stockées dans une base SQL résidente dans /Web (ou www), et sont le reflet des metadonnées des fichiers media dans /eSATADisk1 (plus exactement ce chemin: /share/external/sdz1/).

 

Voilà, je pense que vous avez bien cerné le problème… je sais, je suis un boulet!

 

@ bientôt, j'espère…

 

M@ttew  :)

Share this post


Link to post
Share on other sites
  • 0

Ne vous inquiétez pas, nous sommes là pour nous entraider, et partager notre expérience.

Étant donné que je développe en PHP (personnellement), je connais un peu le langage


Par ailleurs, j'ai moi-même eu un problème pour gérer une commande Shell sur un serveur ou j'héberge mon site (et grâce à une superbe utilisation de la commande rm, j'avais tout supprimé..., merci les backups de mon hébergeur); mais je peux dire que j'ai appris de cette leçon.


Pour en revenir à votre problème, déjà, il est déjà plus simple que ce qu'il n’y parait, étant donné que le NAS et le disque externe sont connectés ensemble


Par ailleurs, vous utilisez déjà la fonction de PHP qu'il faut pour exécuter un Shell Linux, c’est-à-dire "shell_exec()".

 

Vous avez noté ceci :

"

<?php

      shell_exec('ssh -p 49157 admin@192.168.1.22 \"chmod 640 /share/external/sdz1/fichier.jpg\" ');

?>

"

 

La commande la plus adéquate est :

<?php

      shell_exec('\"chmod 640 /share/external/sdz1/fichier.jpg\" ');

?>

 

Etant donné que je n'ai jamais eu à faire ça sur mon NAS, je vais faire quelques test et vous proposer une ou plusieurs solution ;)

 

De votre coté, il faudrait que le script récupère l'arborescence complète si nécessaire, et le nom du fichier à traiter.

Share this post


Link to post
Share on other sites
  • 0

Super, merci pour le coup de main...

 

Concernant l'arborescence, elle est connue car le site web gère justement la localisation du fichier.

Sachant que la racine 'relative' sur le disque externe peut-être considérée comme ceci:

 

/eSATADisk1/Dossier vu depuis le WebFile Manager au même titre que /Web

correspond à ceci dans l'arborescence du Linux:

/share/external/sdz1/Dossier

 

Ensuite l'arborescence interne est de type /Dossier 1 à /Dossier n avec n variant de 2 à indéfini...

Je crée les dossiers au fur et à mesure de mes besoins.

Donc pour un fichier 'bidule.xyz', l'arborescence est celle-ci:

 

/Dossier/Dossier n/bidule.xyz

 

La fiche correspondante au fichier 'bidule.xyz' connait dans la base sql la valeur de 'n' ainsi que l'extension 'xyz' et le nom du fichier 'bidule'

Ainsi, je suis à même lors du clic sur le bouton html de reconstituer l'arborescence complète:

 

/share/external/sdz1/Dossier/Dossier n/bidule.xyz

 

En revanche, venant de Mac OS, je suis un réfractaire des noms de fichiers du style 'truc_bidule_machin.txt' et un adepte de l'équivalent 'truc bidule machin.txt'

Je sais qu'au terminal, cela s'écrit 'truc\ bidule\ machin.txt' mais est-ce que php va apprécier mes espaces ainsi que l'accentuation à la française avec des éèçàüô et autres joyeuseries...

 

Certes, je peux toujours faire un élagage de printemps mais avec 1 millier de fiches, je préfèrerais conserver ma ponctuation!

 

Pour en revenir au tunnel, le fait de n'avoir accès à cette fonctionnalité que depuis le LAN pourrait peut-être résolu par une connexion ssh toute simple depuis un terminal du type:

 

 

ssh -L 8080:machinbidule.no-ip.org:3128 -p 49157 admin@machinbidule.no-ip.org

 

Puis dans Firefox, ceci:

https://www.dropbox.com/s/w6dy94cz7js6r9y/ProxyFirefox.png?m

 

Ainsi, je pourrais naviguer comme si j'étais sur le NAS, et donc en local, non?!...

 

à suivre...

Share this post


Link to post
Share on other sites
  • 0

Alors voila, je suis sur mes test et c'est dur ! ^^

 

En tout cas, le ssh ne fonctionne pas avec la commande "exec_shell" de PHP étant donné qu'il faut accépter le certificat lors de le première connexion.

 

Il y a plusieurs solution :

  • Soit éditer le fichier php.ini il me semble pour changer l'utilisateur et mettre le compte admin, mais cela poserait d'énorme problème de sécurité, je déconseille (mais je la dis quand même ^^)
  • Soit passer par PHP pour se connecter dans un premier temps en SSH, en local, et exécuter la commande chmod, mais il faudra mettre le mot de passe en clair dans le script php...
  • pour l'instant, je n'en vois pas d'autre...

 

Je regarde donc pour la deuxième solution ;)

 

Edit :

La solution la plus simple est souvent la meilleure.

 

Et oui, elle me trottait dans la tête, et voila que je l'essaye après tant d'autres opérations vaines.

 

Il suffit de changer l'utilisateur et le groupe pour le script PHP, et lors de son exécution, cela fonctionne parfaitement.

 

<?php
	echo shell_exec('cd ../Public; ls; mkdir truc; chmod 600 truc/');
?>

 

Bon, c'est un code de test ;)

 

Alors maintenant, il faut améliorer le script pour qu'avait chaque espace, il mette des slash (facile avec des fonctions de PHP), par contre, le seul problème que je vois, c'est celui pour les caractères : "é,à,è", etc.

Share this post


Link to post
Share on other sites
  • 0

Concernant la commande exec_shell via ssh, on peut s'en sortir étant donné que la fourniture du mot de passe n'est pas obligatoire une fois la création des clés RSA effectuées...

Pour se faire, j'ai utilisé la méthode décrite sur un des posts du forum.

Seulement, je n'arrive pas à formater la commande en language php...

<?php
      shell_exec('ssh -p 49157 admin@192.168.1.22 \"chmod 640 /share/external/sdz1/fichier.jpg\" ');
?>

Comment utiliser les ' " et autres \ ...

 

Pour le php.ini, il est évident qu'il faut bannir cette solution.

 

D'ailleurs, en fouillant le net, je suis tombé sur ce post très instructif mais très au-delà de mes connaissances...

 

http://blog.khemael.net/2010/08/26/de-la-maniere-de-faire-de-lexec-et-system-root-en-php/3/

 

 

 

La méthode ssh+rsa_key

Une sympathique que j’ai peu croisé et plutôt rigolote.

Le principe est fort simple : générer une paire de clés privée/publique à l’utilisateur du serveur web, puis déposer la clé publique de celui-ci dans /root/.ssh/authorized_keys.

< ?php system('ssh root@localhost -t rm -rf /'); ?>

La grande classe.

 

Du coup, je me demande quand même si ce que je veux réaliser n'est pas une incitation à la faille béante?!....

 

Et le coup des wrappers comme décrit dans le lien, c'est du coréen pour moi!

 

Je vais tout de même tenter l'aventure de la seconde solution qui doit finalement revenir à ce que je tente de faire en ssh...

Share this post


Link to post
Share on other sites
  • 0

Ne vous inquiété pas, je planche sur un code, mais il reste un petit défaut pour échapper le caractère arobase, je vais devoir utiliser une boucle (pas terrible), car il semble que la fonction str_replace ne soit pas fonctionnel sur cette version de PHP...

 

Il n'y aura donc pas de SSH là dedans, juste un besoins de mettre le script en tant qu'admin. Bref, je vous ferais un petit topo d'ici quelques minutes ;)

 

Edit :

La fonction escapeshellcmd pose également des soucis...

par exemple, j'ai mis un "à" dans le nom d'un fichier, et ce caractère disparait.

 

Edit :

Bon, en fait, j'avais du loucher, parce que mon code de tout à l'heure avait créé le répertoire avec le compte httpdusr, et donc, il peut modifier les droits, évidemment...

 

Sinon, j'ai pu faire une fonction pour échapper correctement les caractères spéciaux, car les fonctions de PHP ne conviennent pas...

 

Voici le code :

 

<?php

	// fonction pour échaper les caractères spéciaux
	function echapement_carateres($chaine) {

		$tableau_caracteres = array('@', '\'', '#', '&', ';', '`', '|', '*', '?', '~', '<', '>', '^', '(', ')', '[', ']', '{', '}', '$', '\\', ',', ' ', '\x0A', '\xFF');

		$chaine_echape	= '';

		// On echaphe les caractères spéciaux du SHELL
		// La réalisation de cette opération se fait avant le découpage et la construction
		// de la chaine étant donné que la fonction va rajouter slash avant un @ et autres caractères spécifiques

		// Découpage du mot lettre par lettre (en gros, la fonction refait le str_replace, non fonctionnel sur le NAS pour l'instant)
		$str_len			= mb_strlen($chaine, 'UTF-8');

		// Construction de la chaine échapée
		for($i = 0; $i <= $str_len; $i++) {

			// Découpage lettre par lettre
			$lettre = mb_substr($chaine, $i, 1, 'UTF-8');

			// Echapement des caractères spécifiques
			if(in_array($lettre, $tableau_caracteres)) {
				$chaine_echape .= '\\'.$lettre;
			} else {
				$chaine_echape .= $lettre;
			}

		}

		// La fonction retourne la valeur lorsque le traitement est terminé
		return $chaine_echape;
	}

// test
$rep = '../Public/truc muche/';
$fichier = "totoér'$@à.txt";

echo echapement_carateres($rep.$fichier),'<br /><br />';
?>

 

Bon, par contre, il est à noté que le fichier PHP utilise l'encodage UTF-8 sans Bom, et qu'il y a la meta en HTTP pour afficher l'UTF-8 dans le navigateur : "<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />"

 

Jusque là, pas de problème ;) Et cela pourra vous servir.

 

Toute fois, si un caractère manque, vous pouvez l'ajouter au tableau "$tableau_caracteres" ;)

Share this post


Link to post
Share on other sites
  • 0

Pour le code permettant de créer un dossier, je ne comprends pas car chez moi, rien n'y fait.
Impossible d'obtenir le dossier /truc aussi bien dans /Public que dans /Web/Mon_Site
En revanche, la commande cd fonctionne ainsi que la commande ls...
Petite précision, je ne suis pas chez moi mais à distance et je déclenche donc le script depuis le WAN... et j'utilise SFTP pour me connecter au serveur et écrire les scripts!
Y aurait-il un lien?!...
D'ailleurs, à y regarder de plus près, la commande mkdir en php est, elle aussi, inopérante...

<?php
mkdir ("../Dossier/".nomMachin);
?>

Je devrais pourtant avoir création d'un dossier avec droits 755 portant le nom de nomMachin dans le dossier Dossier?!...

De même avec ce code:

<?php
$b='vrai';
if((chmod('mon_fichier.txt', 0640))==false){
	$b='faux';
}
echo $b;
?>

J'obtiens systématiquement 'faux', donc le chmod est refusé par le serveur php!!!

Du coup, y-a-t'il un réglage à faire dans le php.ini du NAS?

 

 
Merci pour le code avec échappement.
Je viens de le tester, et cela semble fonctionner.

 

Concernant l'affichage, j'utilise ceci:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
    </head>
</html>

Et là, je récupère bien une écriture correcte du nom de fichier.

Share this post


Link to post
Share on other sites
  • 0

Bon, je viens de comprendre un truc qui m'avait totalement échappé...

Dans mon dossier /Web du NAS, TOUS les fichiers sont own=admin et grp=administ

Or depuis le début, on parle de droits sur les fichiers.

Ce que je ne m'explique pas, c'est pourquoi le propriétaire n'est pas httpdusr qui est censé être l'utilisateur privilégié des fichiers .html et .php puisqu'il représente le serveur Web!!!

Du coup, en modifiant via la console le propriétaire avec un ' chown httpdusr mon_fichier.txt ', le code chmod fonctionne correctement.

<?php
    shell_exec('chmod 640 ../Dossier/mon_fichier.txt');
?>

Question induite: Faut-il modifier en own=httpdusr tous les fichiers du dossier /Web sur le QNAP?!...

Share this post


Link to post
Share on other sites
  • 0

Bonjour M@ttew,

 

Pour revenir à la fonction qui permet d'échapper les caractères, je tien à préciser que si un caractère spécifique à Linux n'est pas présent dans la liste, il se peut que les modifications que vous souhaitez apporter sur un fichier ne fonctionne.

Je tiens à le préciser, car à l'avenir, dans le cas du utilisation intensive, il se peut que cela se produise. Et qu'il vous faille regarder en détail l'arborescence et le nom du fichier, pour y vérifier les caractères qui y sont présent, pour rajouter celui ou ceux qui poserons problèmes dans le tableau PHP "$tableau_caracteres".

 

Concernant mon test de création du répertoire "truc/", cela ne fonctionne que si le script est avec l'utilisateur "admin" et le groupe "administrators". Mais cela créer un répertoire avec l'utilisateur et groupe httpdusr:everyone.

 

J'ai hésité à vous proposer la solution de changer tout les propriétaires et groupes de vos fichiers. Mais je trouve que cela n'est pas meilleure solution (encore un problème de sécurité ?!). Et puis, lorsque vous ajouterez un nouveau fichier, il faudra penser à changer l'utilisateur, cela peut être contraignant...

 

Mais cela, je pense qu'un personne ayant plus de connaissances devrait intervenir (father_mande, cris, GlaceNot, etc.) :)

 

J'ai fais un tour sur le site qui propose une solution plus sécurisé pour exécuter  des commandes en root. Cela est intéressant, mais contraignant à mettre en place. Ma fois, je suis tout aussi embêtez que vous ^^.

Par contre, je ne trouve pas forcement sa solution plus sécurisé, elle est juste plus canaliser sur une tâche et évite de passer des commandes qui pourrait endommager le système. Par ailleurs, il faut que votre script soit le plus sécurisé possible (inclusion sécurisé si nécessaire, sécurisation des paramètres GET/POST (htmlspecialchars, htmlentities), vérifier que ce sont bien des noms de répertoire/fichier, en testant par exemple sont existence avant d'exécuter la commande).

Et juste pour finir sur ce petit paragraphe, dès lors qu'un système peut exécuter des tâches en tant qu'administrateur, cela devient forcement peut sécurisant et d'autant plus quand ces tâches et les scripts qui les exécutes sont potentiellement accessibles depuis l'extérieurs (Internet). Il ne faut pas être devin là dessus, juste réaliste. Maintenant, aux développeurs de faire en sorte que le système soit le plus sécurisé possible afin que lorsqu'il y est un problème (pirate), qu'il y ai de moins ou pas d'impact du tout.

 

Maintenant, vous seul peut déterminer si vous souhaitez utiliser une méthode moyennement sécurisé, ou une la plus sécurisé possible.

 

La cration de fichier par SFTP n'influe en rien sur leurs executions, car il sont créé avec le compte admin si je ne me trompe pas. Et concernant leurs exécutions, les fichiers sont interprétés en local grâce au moteur PHP et au serveur Web, qui ont les droits httpdusr.

 

Je trouve que votre problème très intéressant, car il faut pouvoir exécuter des commandes systèmes, en tant qu'admin (car lui seul peut le faire), mais essayer que cela soit le plus sécurisé possible. C'est dur, mais c'est certainement réalisable.

 

A vous de me dire si vous préférez une solutions plutôt qu'une autre, je pourrais plancher dessus ;)

Share this post


Link to post
Share on other sites
  • 0

Bonjour archimede333,

 

Pour la fonction d'échappement, j'ai bien noté qu'il fallait tenir à jour la liste "$tableau_caracteres".

Dans le cas présent, elle est largement suffisante, mais j'ai commenté la ligne dans le script en cas d'une future utilisation plus pointue...

 

Au niveau des droits, on est donc bien d'accord: il ne faut surtout pas les modifier et sur les fichiers contenus dans /Web, les garder en admin/administrators.

Au final, mon problème est indépendant du fait d'avoir le partage de fichiers ET le site web sur le NAS.

Le but de la manipulation reste celui-ci:

A partir d'un site web sur un serveur A, comment à l'aide d'un formulaire php/html modifier les droits (chmod 640 ou chmod 644) de fichiers situés sur un AUTRE serveur B uniquement accessible en ssh?!...

 

Hier soir, je suis tombé sur ce post:

http://www.developpez.net/forums/d205742/general-developpement/programmation-systeme/linux/commandes-ssh-page-php/

 

Je pense que la problématique correspond bien à ma demande mais c'est déjà d'un niveau élevé pour moi, donc si vous pouvez m'aider _ d'une part à vérifier que c'est jouable pour ma situation et _ d'autre part m'aider à la mettre en oeuvre, ce serait vraiment bien!

 

Pour l'heure donc, je suis juste capable de coder le chemin complet du fichier à 'chmoder' en php grâce à votre script . Cela dit, pour éviter toute dérive, j'envisage carrément de stocker le nom dans la table sql lors de la création de la fiche! Ainsi, lorsqu'on clique sur le bouton de la fiche, on identifie sans risque le chemin/fichier ce qui règle le problème.

 

Au delà, c'est le flou, mais je suis convaincu de l'utilisation de ssh pour effectuer le chmod _ je ne vois pas comment faire autrement.

Donc, il faut à mon sens se concentrer sur le portage de cette commande en la scriptant en php.

ssh -p 49157 admin@machin.no-ip.org /share/external/sdz1/Dossier/Dossier\ n/fichier.jpg'

 

L'usage des clés RSA évitant alors de fournir le log/pass à chaque connexion, et passer '/Dossier/Dossier\ n/fichier.jpg' dans une variable php $fichier.

Share this post


Link to post
Share on other sites
  • 0

Bonjour M@ttew,


Avant de parcourir le lien que vous avez mis dans votre message, je voudrais éclaircir ce point, car je pense que je n'avais pas compris cela auparavant ^^


Est-ce bien d'une utilisation en local donc nous parlons, c’est-à-dire que l'application PHP est exécuté sur le serveur Web du Qnap (serveurs A et B sont donc identiques), ou est-ce que l'application est véritablement exécutée sur un serveur Web différent de celui du Qnap (sur un autre hébergeur) ? (serveurs A et B différents)

 

Parce que jusque là, j'ai pensé (surement à tord) que l'application PHP qui gère les fiche est en local sur le NAS, et donc tout est exécuter sur une même machine. Dans le cas contraire deux solutions :

  • Passer par RSA, mais ça, on connait déjà ^^
  • Sinon, passé par une commande GET/POST comme j'ai déjà pu le réaliser pour passer des requêtes entre un serveur PHP A vers un serveur PHP B pour sauvegarder les données du serveur A sur la base de données du serveur B. Cette option serait peut être plus sécurisé. Mais le problème d'exécution en droit d'admin se posera inévitablement pour le chmod. Toutefois, au lieu d'avoir le port 22 ou autre pour le service SSH d'ouvert depuis l'extérieur, cela sera un port pour le serveur Web 80 ou autre. Cela serait plus complexe à mettre en œuvre, réalisable (mais il faudra quand même passer par une commande SSH en local pour le chmod).

 

Concernant les clés RSA, j'ai mis en place se système pour le logiciel Unison, mais cela est forcement différent, mais mon expérience m'aidera peut être ^^

Share this post


Link to post
Share on other sites
  • 0

Effectivement, l'application php est exécutée sur le serveur Web du QNAP et les fichiers sont bien hébergés sur le QNAP.

Le serveur Web est sur le disque interne dans /share/HDA_DATA/Web et les fichiers sont sur un disque eSATA connecté au QNAP dans /share/external/sdz1/Medias

Il s'agit donc bien de la même machine physique et du même Linux qui tourne!

 

Mais bizarrement, je ne vois pas ce que ça change, çar là où se trouvent les fichiers médias, le serveur web et le compte httpdusr n'ont aucuns droits, non?!...

Share this post


Link to post
Share on other sites
  • 0

Si, il ont les droits d'accès et de modifications.

 

Vous pouvez faire un test avec la petite commande création et de modification du répertoire "truc" sur l'emplacement du disque dur externe. Je doute fortement que cela ne fonctionne pas. Mais j'avoue que je n'ai pas testé ;)

 

Donc en faite, le serveur A est le serveur B :D

 

Je regarderai peut être la solution présente sur le site developpez.com ce soir ou demain dans la matinée.

 

Essayez de votre côté, c'est vrai que la solution est bien orientée vers l'utilisation de SSH ;)

Share this post


Link to post
Share on other sites
  • 0

Exact, on peut dire serveur A = serveur B.

Ok, donc on reste sur le ssh!

Maintenant, je n'arrive pas à formuler ma requête ssh en php, je ne maitrise pas la syntaxe en php...

Share this post


Link to post
Share on other sites
  • 0

Personnellement, je considère que comme le serveur Web est exécuté sur le NAS où est connecté le disque dur externe que A = B. Mais si vous faite la différenciation, il doit y avoir une raison ;).

 

Pour le SSH, il faudrait installer SSH2 : http://forum.qnap.com/viewtopic.php?p=229597 (attention, ce post date de 2009).

 

Je continuer de chercher de mon côté ;)

Share this post


Link to post
Share on other sites
  • 0

Je viens de parcourir le post SSH2, et malheureusement, personne n'a réussi à venir à bout de l'installation.

Sans compter qu'il faut maitriser la ligne de commande sous Linux ce qui n'est pas mon cas!

On y évoque aussi l'alternative suivante _ http://phpseclib.sourceforge.net/ _ mais là encore aucune explication sur l'installation sur un NAS QNAP...

Du coup, je crains de ne pouvoir utiliser cette dernière méthode ssh2 dans le cadre de mon application Web!

 

Bref, je suis de plus en plus sceptique sur l'issue via ssh!

 

Du coup, je vais peut-être me tourner vers la solution évoquée en 5/ par Father_Mande dans son premier message avec l'utilisation des fichiers Pipe nommés, mais là, je n'y connais vraiment rien!!!

Share this post


Link to post
Share on other sites
  • 0

Bonjour,

 

Désolé de ma faible participation , car je suis en déplacement, en plus de mon incompétence en PHP :icon_lol:  ...

 

1 pour lancer la commande ssh en automatique ... il faut

... vérifiez que la "home directory" (dans /etc/passwd) est réelle et pas dans /tmp

... ... un moyen simple est de cocher dans le menu gestion des utilisateurs l'onglet dossiers d’accueil ... cela crée /share/homes et change le home dans /etc/passwd ... ... ou changer à la main ... vers une home qui dure après reboot

... il faut créer une clef rsa pour httpdusr,pour cela, il faut utiliser su (Optware ipkg) seul outil pour changer d'utilisateur sur Qnap, copier la clef publique, et faire une connexion pour remplir le fichier "known_hots" dans le répertoire .ssh de cet utilisateur (c'est le yes que vous faites UNE fois avec ssh lors de la première connexion ... )

donc dans la "home" de httpdusr vous aurez un répertoire .ssh avec 2 fichiers à minima la clef privée et le fichier known_hosts ATTENTION ce fichier et valable pour un nom DNS ou une I.P. et pour un port ... donc si vous utilisez une I.P. une fois et le nom une autre fois ou changez de port ... l faudra se reconnecter en manuel ... pour remplir le fichier known_hosts ... idem si les clefs du QNAP change (réinitialisation (pas update) du firmware)

 

... une fois cela fait ... l'appel a la commande ssh devient possible ... si PHP permet d’exécuter une commande, personnellement je ferrai plutôt appel a un shell pour être sur que l'environnement est complet ... ou en lançant la commande via un appel a /bin/sh ...

 

2 pour les pipes, je peux (je suis loin ... ) vous envoyer un simple shell pour test ... sans contrôle (il vaudrait mieux éviter de lui laisser TOUT faire ... il sera admin) si cela fonctionne ... je vous dirai comment le lancer comme un service au boot du QNAP et qu'il se relance tout seul en cas de crash ...

 

d'ici la fin de journée pour l'exemple ...

 

Philippe.

Share this post


Link to post
Share on other sites
  • 0

Bonjour Father_Mande,

 

Content de vous retrouver!

Une fois encore, un gros morceau à digérer, je vais donc reprendre votre post point par point.

 

Pour le 1/ la manipulation m'intéresse dans tous les cas, je trouve intéressant de pouvoir se 'logger' ssh sans être root/admin sur le QNAP afin d'éviter toute erreur regrettable...

 

Pour le 2/ sans rien y connaitre au sujet, il sera peut-être plus logique d'utiliser cette option dans le cadre de mon application. En effet, si je réussi à la mettre en oeuvre pour un simple chmod, alors tout est permis et cela me donne des idées pour la suite.

Donc, je souhaite effectivement creuser dans cette voie, mais là, votre soutien me sera indispensable!!!

 

Encore merci pour votre patience.

 

@+, M@ttew

 

P.S: pour le shell, pouvez-vous le poster sur le forum ou faut-il l'envoyer par mail?

P.S: j'ai sollicité par MP l'aide de Cris, sans réponse pour le moment... mais j'imagine qu'il est très souvent importuné par des gens comme moi...

Share this post


Link to post
Share on other sites
  • 0

Bonjour,

 

  • Voici les solutions que j'ai pu tester de mon côté depuis hier, aucune ne fonctionne, mais j'ai peut loupé quelque chose... A vous de voir ;)Utilisation de la commande "shell_exec", "system",
  • Exécution de la commande en local ou en utilisant un script shell externe (chmod 770 ou 777) : shell_exec("./ssh.sh");
  • Utilisation des commandes suivante :

$var = shell_exec("ssh -v");

var_dump($var);

  • J'ai également mis la clé publique RSA dans le fichier authorized_keys : cat id_rsa.pub >> authorized_keys (depuis la fenêtre de PuTTY, si je fais "ssh admin@127.0.0.1", cela fonctionne très bien, et sans demander le mot de passe)

 

Mais voila, tout ça ne fonctionne pas, ni même lorsque je fais la commande "ssh -v" depuis le script PHP ou le script externe. C'est comme-ci "httpdusr" ne pouvais pas exécuter "SSH", alors que les droits semble correcte dans le répertoire ("-rwxr-xr-x    1 admin    administ   276.9k Dec  4 23:34 ssh*").

 

Maintenant, il faudrait l'intervention d'une personne pouvant aider à l’exécution pour SSH ;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×