Je veux exécuter une commande en tant que root avec shell_exec. Maintenant, je sais que c'est dangereux, mais croyez-moi, vous devez vous connecter avec mod_auth et avoir les bons privilèges à venir sur cette page. C'est sécurisé. Comment puis-je obtenir cela fait? P>
6 Réponses :
définitivement non conseillé. Cependant, vous voudrez examiner la modification du fichier code> sudoers cod> et ajouter l'utilisateur php est en cours d'exécution sous forme de Si vous avez besoin de plus de commandes en ajoutant d'autres. Configuration sudoers Je sais que le forum / la poste est basé sur Debian, mais sudo n'est pas strictement debian et que devrait vous aider avec les valeurs de configuration sudo que vous devez le mettre. p> NOPASSWD code> pour la commande que vous devez exécuter. Cela ne lui permettra que
SUDO CODE> que une commande sans entrer un mot de passe. p>
Le problème n'est pas que votre page em> est ou n'est pas sécurisé, le problème est que donner une page PHP la possibilité d'exécuter une commande sudo le donnerait à tous EM> pages, y compris tout code injecté sur toute page d'insécurité sur tout site sur le serveur. Cela dit, il serait peut-être préférable de faire un script wrapper qui ne fait qu'un travail à faire, puis donnez à l'accès à l'utilisateur HTTP à juste cette commande comme sudo p>
J'ai oublié de mentionner une enveloppe qui ne prend pas d'arguments! Faire un script wrapper qui accepte aucun argument ne réduit la surface d'attaque. Certains programmes seraient en mesure d'être manipulés pour faire de mauvaises choses si elles sont exécutées avec certains arguments. L'utilisation d'une enveloppe vous permet de permettre un programme d'être lancé de manière plus contrôlée.
Tous les fichiers nécessitant un accès racine sont situés dans / var / privé-www /, uniquement disponibles par accès root. Est-il possible de les laisser utiliser sudo? J'ai essayé http all = (tout) NOPASSWD: / var / privé-www / code>, mais cela n'a pas fonctionné.
Ou il suffit de mentionner en utilisant: PHP.net/manual/fr/funcunction.escapeshellcmd.php A> sur tous les arguments que vous passez à travers.
Non, cardez-les comme cela, comme cela introduirait davantage de problèmes de sécurité. Énumérez-les un par un. De plus, si vous avez vraiment plus d'un d'entre eux, je pense que vous devez reconsidérer toute votre architecture. Cela ressemble à vous là-bas, il devrait y avoir une meilleure façon de le faire, mais que nous ne connaissons pas votre situation, nous ne pouvons pas le suggérer un. Le seul piratage qui me vient à l'esprit serait de faire en sorte que votre script wrapper déciderait de décider quoi exécuter en fonction d'un argument, mais encore une fois, vous introduisez des problèmes de sécurité par la douzaine.
@kevin, assurez-vous également de modifier http code> à l'utilisateur réel qui l'exécute (en cas d'incase n'est pas
http code>) juste un fyi.
OK, essayé www-data code>, mais cela n'a pas fonctionné non plus. Mais tous les scripts PHP peuvent-ils accéder à
/ var / privé-www / code> dans ce cas? Le système est plus sécurisé que c'était. Au début, tous les utilisateurs ont eu accès à SSH. Maintenant, il existe une plate-forme Web où les utilisateurs peuvent faire des trucs SVN et obtenir un accès FTP. Donc, ils peuvent tester notre serveur et s'engager quand ils sont satisfaits. Pour ce trucs SVN, j'ai besoin d'un accès root, mais aussi pour les trucs liés à MySQL. C'est le cas.
@kevin je pense que vous devez changer de vitesse ici. Vous ne devriez pas avoir besoin de root pour cela. Vous pouvez configurer vos référentiels pour être détenus par www-Data (ou votre utilisateur HTTP) afin que cela puisse être traitée via le démon HTTP sans privilèges escaladés. De quoi pensez-vous avoir besoin de privilèges pour MySQL?
Pour créer / supprimer des utilisateurs de la base de données. Je vais utiliser la plate-forme pour des choses que j'ai faites dans Shell. Ce sera plus facile. Ou est-ce vraiment si mauvais?
@kevin, oui c'est vraiment si mal. Ne le faites pas de cette façon. Vous n'avez pas assez d'expérience pour corriger un système après avoir soufflé de trous avec votre conception proposée. Vous pouvez créer et supprimer des utilisateurs MySQL à partir d'une interface Web sans avoir besoin de privilèges root. Donnez simplement à l'utilisateur que votre application Web se connecte à la base de données avec des droits de subvention sur ces tables.
D'accord. Est-il possible d'exécuter des tâches comme un autre utilisateur? Non, j'ai essayé cela, mais la sortie était vide: $ sortie = shell_exec ('echo "nivek" | sudo -u kevin -s whoami'); code>. Pourquoi? Comment puis-je réparer cela?
Oui, mais encore pourquoi voudriez-vous? Et pourquoi l'écho a conduit à Sudo? Pourquoi n'exprimez-vous pas avec Sudo d'un compte Shell au lieu de PHP, il serait plus facile de déterminer ce qui est un problème PHP et de ce qui est un problème de configuration sudo.
La chose est que cela a fonctionné dans la coquille, mais pas en PHP. :( Pourquoi ?? Je n'ai pas d'erreur.
i Google'd pour http://www.php.net/manual/fr/function.shell-exec.php#101440 p> Ilya à Linemedia Dot ru 16-déc-2010 04:36 php sudo shell_exec code> et ceci est venu comme la correspondance n ° 1:
sudo peut être exécuté sans stocker passer dans un fichier p>
blockQuote>
Merci, mais j'ai trouvé que cela ne fonctionnait pas? J'ai essayé système ('echo "myPass" | sudo -u racine -s -s mkdir / testdir'); code>, mais
/ testdir code> n'existait pas après avoir exécuté le script.
@Kevin: Vous devrez peut-être avoir à envelopper code> code> dans des guillemets ou (si j'ai raison avec mes connaissances * NIX), vous ne pouvez pas créer de dossier dans / code>.
Vous ne pouvez pas et ne devrait jamais ne jamais pouvoir piper une chaîne dans une invite de mot de passe interactive
Cela m'a aidé mais j'ai besoin de le changer comme: System ('Echo "Pass" | echo sudo -u root -s commande "); code>
Vous pouvez utiliser la dernière version SVN de Phpseclib, une implémentation pure PHP SSH , pour le faire. par exemple.
<?php include('Net/SSH2.php'); $ssh = new Net_SSH2('www.domain.tld'); $ssh->login('username', 'password'); $ssh->read('[prompt]'); $ssh->write("sudo command\n"); $ssh->read('Password:'); $ssh->write("Password\n"); echo $ssh->read('[prompt]'); ?>
Comme cette solution :), j'utiliserai celui-là.
$aux=echo "admin-pass" | sudo -u root -S perl /path-to-the-script/my-perl-script.pl; echo $aux;
meilleure façon de le faire: Il utilise à nouveau la même commande, avec sudo préfixé. p> p>
Peu importe ce que vous faites, ce n'est jamais
sécurisé code> ..