Comment puis-je avoir un script PHP d'exécuter un script shell en tant que root?
L'exécution de Fedora 9/10, Apache 2, PHP 5...
Puis-je exécuter un script shell en tant que root, à partir d'un script PHP via exec()?
Faire je viens de donner Apache privilèges root, puis ajouter "sudo" devant eux de commande?
Plus précisément, je suis en train de démarrer et d'arrêter un fond de script.
Actuellement, j'ai un script shell qui n'exécute l'application, start.sh:
#!/bin/bash
/path/to/my/app/appname
Et un script qui tue l'application, stop.sh:
#!/bin/bash
killall appname
Serait je viens de faire:
<?php
exec("sudo start.sh");
?>
Merci d'avance.
OriginalL'auteur John Bubriski | 2009-04-06
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas simplement sudo comme ça, vous devez configurer sudo sans mot de passe en premier dans le fichier /etc/sudoers. Cela peut être fait avec la commande visudo par exemple. Assurez-vous de configurer les privilèges dans les sudoers, de telle façon à contraindre l'utilisateur apache pour que la seule commande que vous souhaitez exécuter (c'est à dire votre script shell).
Même alors, il pose un risque pour la sécurité, parce que n'importe qui peut créer un script PHP et exécuter votre script shell à son tour. Donc, assurez-vous que shell script lui-même est à l'abri de la modification par l'utilisateur Apache.
La deuxième partie, killall, est encore plus problématique. Vous ne devriez pas permettre à Apache pour exécuter la commande killall avec les privilèges de root. Vous devez envelopper la commande killall dans un autre shell script et accorder l'accès que dans sudoers.
À la fin: ne pas faire fonctionner Apache avec le compte root et ne pas utiliser setuid. À la fois ouvert une boîte de pandore, et puisque vous êtes un débutant (compte tenu de la question), vous êtes très susceptibles de manquer quelques petits détails qui pourraient créer des problèmes potentiels.
OriginalL'auteur Milan Babuškov
Ne pas exécuter Apache en tant que
root
. Apache a été conçu pour faire face très bien avec départ commeroot
puis l'abandon de ses privilèges juste dès qu'il le peutNe pas utiliser
sudo
au sein de votre script soit - il va être trop facile à retrouver avecsudo
mal configuré de telle sorte que tout script qui s'exécute sur votre serveur arrive à exécuter n'importe quel programme il aime avecroot
privilègesFaire votre propre programme à exécuter "setuid", de sorte qu'il obtient les privilèges de root, mais tombe alors entre eux (comme Apache) quand il n'a pas besoin de plus
Assurez-vous que votre "setuid" exécutable ne peut pas être exécuté par une personne qui n'est pas censé être capable de l'exécuter.
OriginalL'auteur Alnitak
Je ne suis pas professionnel dans ce domaine, mais il semble que vous avez besoin SUID drapeau.
Lire ici pour exemples ou google
Autant que je sache, le plus moderne des distributions Linux ignorer SUID drapeau sur shell-scripts, ils ne fonctionnent que sur des fichiers exécutables (je n'ai pas de voter quand même)
OriginalL'auteur Sergej Andrejev
Vous avez besoin d'une couche d'abstraction permettant de fournir un peu de sécurité, au moins!...
Ma façon de faire c'est d'écrire une simple UDP serveur* avec la racine privs en Python qui:
montres pour la réception des paquets UDP sur un port donné
il les compare à une liste blanche
si elles correspondent à effectuer l'opération
Vous avez alors un peu de PHP pour que les messages que le Python serveur avec des messages pré-définis...
Le python serveur de montres pour les paquets sur le port 12345 mais ignore tout et qui ne sont pas "Script de Démarrage" ou "Arrêter le Script", comme il s'exécute en tant que root, il peut être heureux de commencer votre script bash. Vous DEVEZ ABSOLUMENT utiliser de liste blanche, c'est VRAIMENT PAS SÛR d'envoyer une entrée à partir d'un socket UDP à la ligne de commande directement!
Ne remarque que UDP peut être usurpée donc, si votre pare-feu autorise l'usurpation de trafic entrant (il vraiment ne devrait pas!) quelqu'un pourrait envoyer des paquets forgés à votre Python serveur et arrêt/démarrage de votre service. Cela est peu être un problème, mais si vous ne pouvez pas réparer votre pare-feu et que vous voulez vous prémunir contre elle, vous pouvez retravailler le dessus à l'aide de TCP/IP qui ne peut pas être falsifié.
Roger Heathcote.
*C'est vraiment trivial serveur à écrire ( ~20 lignes ), mais si vous ne savez pas comment puis juste moi un message et je vais vous l'envoyer ou de le poster ici.
OK... va le post ci-dessous.
OriginalL'auteur user84643
Vous ne voulez pas donner Apache racine.
Il y a une autre solution à votre problème. Le problème est que Apache ne peut pas tuer le processus, car il est la propriété de la racine. Ce que vous pouvez faire est de changer le propriétaire de 'www-data' qui est ce que Apache est identifié comme.
Si le processus est un service et démarre au démarrage vous pouvez ajouter la
de sorte que www-data serait le propriétaire de ce processus et, partant, de l'exécution de l'arrêt du script devrait fonctionner.
OriginalL'auteur s.nguyen
Comme demandé, voici le python serveur...
Le fichier de config "actions.txt" utilise le format "action-nom:-commande shell" c'est à dire
Ce code ne vérifie pas l'IP d'origine des paquets UDP entrants que j'ai en cours d'exécution sur localhost, je suis derrière un pare-feu de la part d'autrui et de la vérification n'apporte pas de protection contre l'usurpation de toute façon.
Je n'ai pas le temps de le réécrire pour l'utilisation de TCP/IP mais Python est un langage qui vaut la peine d'apprendre à connaître si vous voulez vraiment que la fonctionnalité que je vais le laisser à vous de google pour "Python" et "SOCK_STREAM'. Il n'est sans doute pas utile de votre difficulté à bien, il est plus facile de configurer votre pare-feu de sorte qu'aucun usurpée localhost paquets peuvent passer à travers et de modifier le code pour s'assurer qu'il n'écoute que pour les paquets provenant de l'bouclage.
OriginalL'auteur user84643
Vous pourriez envisager d'utiliser une connexion ssh localhost avec keepair d'authentification d'un compte qui dispose des autorisations root. Dans une telle configuration, vous n'aurez pas accès à la racine de votre serveur web.
OriginalL'auteur Sven van de Scheur