web-dev-qa-db-fra.com

Comment exécuter PHP exec () en tant que root?

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.)

30
user145447

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')
34
James Anderson

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]');
?>
13
user580858

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

9
lumos0815

À 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).

Éditer:

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.

3
Gabriel Sosa

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!

3
Collin

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.

1
Bart van Heukelom

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;
1
MerlinTheMagic

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.