Question

J'ai besoin d'une application à courir dans le fond sur mon serveur web, mais je dois être en mesure de démarrer / arrêter l'application avec les privilèges root.

Pour ce faire, je veux avoir un fonctionnement de service qui a des privilèges root, afin qu'il puisse tuer l'application, et le démarrer à nouveau le cas échéant.

Enfin, je dois pouvoir envoyer le début et de tuer des commandes au service via Apache / PHP, afin qu'il puisse être contrôlé indirectement par le web.

Comment puis-je créer un service Linux?
Comment puis-je communiquer avec un service Linux de cette manière?

Merci d'avance!

Était-ce utile?

La solution

Utilisez la commande exec dans votre script PHP pour appeler les fichiers shell. Les fichiers shell peuvent être configurés avec le bit « setuser » il fonctionnera en tant que propriétaire (au lieu de courir avec les autorisations du serveur Web).

Bien sûr, vous aurez besoin d'être très prudent -. Beaucoup de tests, de surveillance, etc

Enfin, pensez à le service en cours d'exécution en tant qu'utilisateur dédié, et non en tant que root. Par exemple, comme apache et la plupart des autres services bien fait faire.

Ajout: Re: l'exécution d'un service dans Linux. Cela dépend de votre goût de Linux. Si vous voulez être sûr que votre service de l'application sera redémarrée automatiquement si elle échoue, plus l'exploitation forestière, la caisse Runit:

https: //web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/opensource/?p=202

http://smarden.org/runit

Ajout: Au lieu de bit setuid, je pense que la suggestion de Frank (en commentaire) de l'utilisation du système de sudo est meilleur

.

Autres conseils

Alors, vous avez trois pièces ici:

  • Votre serveur web sans privilèges root
  • Une application
  • Un démon qui surveille l'application

Votre problème ne se lance pas le démon, il est en train d'écrire, et de communiquer avec elle à partir du serveur web, sans avoir besoin des privilèges root.

Un démon peut être aussi simple que d'une application non interactive lancée en arrière-plan:

# my_dameon &

Je ne suis pas du PHP, mais la recherche de la file d'attente de messages et php, j'ai découvert beanstalkd
 En regardant l'exemple sur la première page, il semble que vous pouvez l'utiliser pour effectuer les opérations suivantes:

  • Le apache / php envoie un certain message à beanstalkd
  • Votre démon lit le message de beanstalkd. Sur la base de la commande, il commence ou tuer ou recharger l'application de fond.

Vous pouvez écrire votre démon en php, car il y a client dans de nombreuses langues
Vous pouvez également consulter cette question

Vous pouvez créer un démon qui accepte les commandes suivantes:

  • daemon_name start
  • daemon_name stop
  • daemon_name restart
  • deamon_name reload

Démarrage du démon ne doit pas être difficile. Il suffit d'exécuter daemon_name start à partir d'un script PHP doit exécuter. Après le démarrage, vous pouvez écrire le PID du processus dans un fichier de verrouillage (pour arrêter, redémarrer ou recharger plus tard). Le démon doit gérer des signaux.

Dans un script PHP, vous pouvez alors invoquer daemon_name stop. Cela devrait tirer un nouveau démon qui vérifie le fichier de verrouillage et d'obtenir le PID du démon en cours d'exécution et envoyer un signal qui serait géré par le démon en cours d'exécution. Le fichier de verrouillage doit être retiré / effacé, puis le lancement stop démon / processus peut quitter.

Je pense que vous devriez regarder inetd, qui peut être configuré pour exécuter toutes sortes de services, et il fonctionne en tant que root. Vous pouvez alors écrire un programme relativement simple qui n'est pas lui-même privilégié la racine, mais qui lorsqu'il est exécuté par root exécute les tâches que vous devez faire.

En ce qui concerne la communication avec le service que vous ne dites pas ce type de service, il est cependant en supposant que vous êtes en train d'écrire vous-même les méthodes les plus courantes serait de comuniquer avec les sockets Unix ou MMAP. Cela dépend de vos besoins vraiment.

Ah oui, tiens à souligner qu'il existe déjà des applications de gestion Web des systèmes Linux. Webmin est un très bon qui peut être configuré pour permettre autant ou aussi peu de contrôle que vous avez besoin.

Comme @shodanex suggère, en utilisant beanstalkd serait un excellent moyen de déconnecter un Web frontal d'un travailleur de la ligne de commande de rodage comme racine. Il pourrait trivialement être configuré pour fonctionner seulement exactement ce qui était nécessaire.

Pour exécuter le travailleur, System_Daemon de poire peut générer et exécuter un script en cours d'exécution démon, avec démarrage / arrêt / redémarrage.

Quand vous faites cela être très très prudent. Ne jamais utiliser les données soumises utilisateur à partir du Web dans la commande exec. cela pourrait permettre à une personne d'exécuter arbitrairement des commandes sur votre machine.

Aussi je seconde Frank utilise une règle de sudo afin que vous puissiez exécuter cette commande spécifique avec les autorisations dont vous avez besoin, mais rien d'autre. Il sera plus sûr de cette façon.

Bien sûr, avec

sudo apt-get install openbsd-inetd

vous pouvez créer un service que vous voulez

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top