J'essaie de construire un gestionnaire de pare-feu en PHP, mais lorsque j'exécute, <?php exec('iptables -L'); ?>
, le tableau de résultats est vide.
J'ai essayé, <?php echo exec('whoami'); ?>
, et la réponse est www-data
(l'utilisateur qu'Apache utilise). Que puis-je faire pour exécuter la fonction exec en tant que root? (De préférence sans changer l'utilisateur Apache.)
Ne fais pas ça! Vous vous laisserez largement ouvert à toutes sortes de piratages malveillants.
Jetez un œil à la documentation "Sudo".
Vous devriez être en mesure de configurer toutes les commandes dont vous avez besoin en tant que scripts capables "Sudo". Il est préférable d'écrire des scripts spécifiques avec des fonctions limitées que d'exposer la commande privilégiée sous-jacente.
Un péché:
exec ('Sudo getIpTables.ksh')
Vous pouvez exécuter Sudo via phpseclib, une pure PHP SSH :
<?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]');
?>
Je sais que c'est une vieille question
ajouter l'utilisateur php s'exécute sur le groupe Sudo s'il n'est pas déjà attribué
utilisez Sudo -S, vous pouvez donc passer le mot de passe via echo
$exec = "echo your_passwd | /usr/bin/Sudo -S your command";
exec($exec,$out,$rcode);
si vous avez des problèmes avec les chemins - utilisez
"bash -lc 'echo your_passwd | /usr/bin/Sudo -S your command'"
de sorte que vous obtenez un nouveau bash qui agit comme un shell de connexion et a les chemins définis
consultez les pages de manuel de Sudo
À moins d'utiliser suphp et de le configurer pour qu'il s'exécute en tant que root, vous ne pourrez exécuter aucun script PHP au nom de tout autre utilisateur du système que celui qui exécute PHP).
Juste une petite idée. Ajoutez un processus de file d'attente d'une certaine manière et exécutez un processus cron dans la crontab de la racine.
Veuillez faire très attention à ce sujet. Toute injection peut littéralement détruire le système.
C'est très dangereux et une mauvaise idée. Repensez votre design. Si vous voulez vraiment le faire, utilisez Sudo comme conseillé. Une solution alternative pourrait être d'aller de l'avant et de s'exécuter en tant que root, mais de le faire à l'intérieur d'un chroot ou d'une image vm (qui peuvent tous deux être séparés mais toujours).
Ou mieux encore, exécutez Sudo dans un chroot!
Vous pouvez placer les commandes requises dans un fichier script/exécutable séparé (sh, PHP, un vrai exécutable, peu importe), changer son propriétaire en root et lui appliquer "setuid".
Cela permettra à tout et n'importe qui d'exécuter ce script en tant que root, vous devez donc vous assurer qu'il a ses propres règles de sécurité pour voir si cela est autorisé et qu'il est très limité dans ce qu'il fait.
J'ai récemment publié un projet qui permet à PHP d'obtenir et d'interagir avec un vrai shell Bash. Téléchargez-le ici: https://github.com/merlinthemagic/MTS
Après le téléchargement, vous utiliserez simplement le code suivant:
$Shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1 = $Shell->exeCmd('iptables -L');
//the return will be a string containing the return of the command
echo $return1;
Juste une hypothèse - Est-ce une application Web PHP qui fera cela? Cela ne semble pas trop sûr. L'application qui a besoin de root - pourriez-vous la construire séparément et ensuite l'invoquer à partir de PHP? Sinon, vous pouvez peut-être lancer le processus Sudo afin qu'il puisse s'exécuter en tant que root.