Exécuter des commandes iptables avec un script PHP

Bonsoir à tous!

Je cherche à exécuter des commandes iptables depuis un script PHP que j’écris.
Le problème est qu’Apache n’a pas le droit d’exécuter des commandes iptables.

Comment puis-je procéder pour remédier à cela de manière propre et sécurisée?
(le script PHP ne sera accessible qu’en LAN et ne pourra pas être utilisé depuis Internet)

Je me suis renseigné sur “chmod +s” à appliquer à l’exécutable iptables, mais ça ne me parait pas très sécurisé, qu’en pensez vous?
Si j’ai bien compris je met l’utilisateur “www” dans le groupe de “root”, et j’autorise l’exécution des commandes au groupe de “root”, ensuite je fais un “chmod +s” sur les exécutables intéressants pour que les commandes soient exécutées en super utilisateur?

Y a t-il d’autres méthodes?

Donc voilà, si quelqu’un peut me conseiller là dessus pour faire quelque chose de propre B)
Je cherche à remplacer l’utilisation de shorewall+webmin+module, en faisant quelque chose de plus léger et de plus adapté à notre utilisation.

Je vous remercie, bye!

[quote=“bluelambda, post:1, topic: 31788”]Bonsoir à tous!
Comment puis-je procéder pour remédier à cela de manière propre et sécurisée?
Je vous remercie, bye![/quote]

Tu peux pas test.

(donner moyen à apache de faire des choses de root, c’est antinomique avec le terme “sécurité”)

Ouais securise dans ce cas la, tu peux pas. Tu peux juste avoir du moins pire:

_passer apache dans sudo: SUPER BAD
_passer iptables en +s : SUPER BAD (aussi en fait, mais pas pour les memes raisons)

En fait je reflechie en meme temps mais j’arrive pas a trouver de solution “moins pire”

Sinon webmin et consort, c’est pas forcement super top mais tu dois t’authentifier en tant que root pour que ca marche (pam et tout ca) donc c’est un peu moins grave. Ceci dit, il me semblait que la BDD user webmin etait decorelee de la BDD unix… a voir.

Apres, je sais pas ce que tu veux faire mais un firewall, ca se configure une fois pis c’est marre.

LoneWolf
Les front end systeme en web, c’est trop fastoche B)

[quote=« LoneWolf, post:3, topic: 31788 »]Ouais securise dans ce cas la, tu peux pas. Tu peux juste avoir du moins pire:

_passer apache dans sudo: SUPER BAD[/quote]
Ben t’es pas obligé d’autoriser toute commande en root à apache, tu peux limiter à iptable et certaines options. man sudo.

Ca par contre c’est une mauvaise idée.

Au hasard, écrire un script en shell, perl ou ce que tu veux, qui fait exactement ce qu’il y a besoin de faire, et pas plus, et autoriser l’execution en root avec sudo par apache du script. Eventuellement verifier dans le script un identifiant dans une variable d’environement ou sur l’entrée standard pour pas que n’importe quel script php puisse utiliser le script (mais bon, il peut toujours aller voir dans le source de ton script php, c’est pour ca qu’il serait quand meme mieux d’avoir un apache avec suphp, suexec ou autre pour pas que tout tourne en www). Sinon, sans sudo, avec un programme compilé suid root qui va executer les bonnes commandes.

Ben oui. Faut juste faire un peu attention à pas faire n’importe quoi, mais sinon c’est tout à fait faisable.

[quote]Apres, je sais pas ce que tu veux faire mais un firewall, ca se configure une fois pis c’est marre.[/quote]En fait je souhaite juste développer une interface qui permet aux utilisateurs chez moi, non désireux de se prendre la tête, d’ouvrir/fermer des ports un à un. (sans passer par SSH et ligne de commande, et sans passer par un compte super utilisateur).

Jusqu’à présent Webmin était utilisé, mais problèmes:

  • si un utilisateur fait une erreur, le firewall ne démarre plus, et pas moyen de corriger l’erreur via l’interface web, donc obligé d’accéder directement au serveur. Dans mon interface en cas d’erreur je m’arrangerai pour que la dernière configuration valide soit utilisée.
  • Pas moyen de restreindre les accès dans l’interface de gestion du firewall. Dans mon interface je voudrais faire des règles par défaut non modifiables, voire des droits différents pour chaque utilisateur.

[quote]Sinon webmin et consort, c’est pas forcement super top mais tu dois t’authentifier en tant que root pour que ca marche (pam et tout ca) donc c’est un peu moins grave. Ceci dit, il me semblait que la BDD user webmin etait decorelee de la BDD unix… a voir.[/quote]Oui il me semble bien que les users Webmin sont différents des users UNIX. Mais comment Webmin fait-il pour exécuter des commandes en super utilisateur de manière plutôt sécurisée?

Sinon, fais en sorte qu’apache écrive dans un fichier (là, pas de souci) les règles à ajouter / enlever, puis script en crontab qui parse et applique.
Surtout, qui parse propre. Parce que ça reste un appeau à trous.

Il doit faire comme beaucoup de logiciels sous Unix : un daemon root qui écoute sur un port avec une authentification.

[quote=« Coldorak, post:6, topic: 31788 »]Sinon, fais en sorte qu’apache écrive dans un fichier (là, pas de souci) les règles à ajouter / enlever, puis script en crontab qui parse et applique.
Surtout, qui parse propre. Parce que ça reste un appeau à trous.[/quote]

Tiens, j’aurais proposé un truc dans le même style B) Frontend/backend rulez ! B)

[quote]Sinon, fais en sorte qu’apache écrive dans un fichier (là, pas de souci) les règles à ajouter / enlever, puis script en crontab qui parse et applique.
Surtout, qui parse propre. Parce que ça reste un appeau à trous.[/quote]Ah oui c’est pas une mauvaise l’idée! Cependant les règles ne seraient pas immédiatement appliquées… De toutes façons c’est pas catastrophique, je peux faire un cron qui vérifie toutes les minutes si il y a quelque chose à appliquer.

Ou alors tu fais tourner un daemon qui attend un signal pour relire le fichier ?

Un signal genre ceux qu’envoie la commande kill?
A priori je n’ai pas le droit d’envoyer des signaux à un processus exécuté par un autre utilisateur. D’ailleurs c’est même certain, car si j’envoie un signal inattendu à un processus exécuté par root, je le tue.

Avec un démon je peux faire comme dit unreal, utiliser les sockets.
A moins qu’il y ait moyen de permettre à “www” d’envoyer des signaux à un processus donné exécuté par root.
Je vais chercher si c’est possible, mais je n’en ai jamais entendu parler.
EDIT: rien trouvé d’intéressant, je verrai demain.

Ou sinon, comme dit plus haut, tu crées un script qui prend un numero de port en parametre, et qui permet de filtrer/ne plus filtrer le port sélectionné, et ensuite tu modifies la config de sudo pour donner le droit à www d’executer ce script en tant que root. Plus simple que faire un demon juste pour ca à mon avis (meme si ca marche aussi).

ok, je pense que c’est la solution que je vais utiliser B) c’est le plus simple pour ce que je veux faire.

Je vous remercie pour vos conseils.

Dans la boite où je travaille j’ai eu ça à faire, j’ai opté pour un binaire setuidbité (chmod u+s), user root groupe apache.

Le php appele ce binaire avec des paramètres prédéfinis, et JAMAIS avec la ligne de commande complête a executer. Le binaire check totu et si c’est valide, alors il l’execute. A la moindre erreur, ou paramètres qui n’est pas pile au format, je quitte.

Dans le binaire la commande iptables finale est en DUR, avec juste les champs pour les paramètres, protégés (je ne lui file pas les parametres directement mais un identifiant qu’il remplacera lui même pas la commande si ça existe)

(binaire codé en C au passage, avec un getopt ça se fait vraiment tout seul)

Je sais pas si c’est le plus sécure top mega moumoutte, mais en tout cas je suis sur et certain que je n’ai jamais de commande iptables foireuse de lancée, et surtout je suis sur de ne jamais lancer autre chose que du iptables.

(et ainsi de suites hein, il n’y a pas d’identifiant pour flush donc je sais que je ne flush jamais tout, etc etc)

Pour ma part, c’était l’attribution des droits sur des streams vidéos (pour une durée limitée donc, un cron se charge de virer les règles qui n’ont plus lieu d’être, je me sers du module comment pour les identifier proprement)

Oui, mais le problème reste toujours le même: si quelqu’un arrive à accéder à ton interface web (faille dans ton script PHP) ou si quelqu’un exploite une faille Apache, il pourra exécuter ton binaire, et donc ouvrir des ports (par exemple).

J’ai vu que sudo acceptait le paramètre -S, qui lui demande de lire le password sur l’entrée standard.
On pourrait donc, à priori, exécuter sudo -S sur le binaire, puis transmettre le password via le script PHP en l’écrivant sur l’entrée standard. Je ne sais pas précisément comment faire mais ce doit être assez simple je pense.
Un utilisateur UNIX serait habilité à exécuter notre binaire en root.
Cependant avec cette méthode il faudrait utiliser un cryptage SSL des données, pour ne pas transmettre le mot de passe en clair. Et ça, je ne sais pas faire du tout.