J'ai une boîte Linux avec web serverthe dispose de 2 services en cours d'exécution:Comment manipuler les règles iptables à partir du script web
- proxy web (Ecoutes ports 80, 443)
- apache (écoute le port 8080)
Les utilisateurs du proxy peuvent s'inscrire via l'interface Web. Je dois donner accès à proxy uniquement aux clients enregistrés avec certaines adresses IP. Le proxy est un script manuscrit, et je dois utiliser iptables pour bloquer l'accès. J'ai écrit les règles suivantes:
iptables -A INPUT -p tcp -m multiport --dports 80,443 -s <valid IP 1> -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 -s <valid IP 2> -j ACCEPT
...
iptables -A INPUT -p tcp -m multiport --dports 80,443 -s <valid IP n> -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j DROP
Cela fonctionne. Mais lorsqu'un nouvel utilisateur est ajouté via l'interface Web, Apache lance un script en tant qu'utilisateur non-root. Et je dois exécuter iptables
en tant que root.
I can't set suid bit for a program, written in a scripting language, donc je créé un programme C updater.c
:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int result = system("iptables -L");
printf("\nresult=%i", result);
return 0;
}
Je compilé:
# gcc -o updater ./updater.c
# chmod +s ./updater
Lorsque je l'exécute en tant qu'utilisateur non privilégié en shell fonctionne correctement: impressions toutes les règles iptables. Lorsque je l'exécute à partir du Web, en appelant le programme à l'intérieur d'un script shell, il n'imprime rien.
Malgré le fait que lorsque j'ai essayé de créer un fichier dans ce programme C, il a été créé avec owner = root. system("ls -l");
fonctionne également - il imprime la liste du répertoire. Comment puis-je manipuler les règles d'iptables à partir du script Web? Comment faire pour manipuler les règles iptables?
Peut-être que le problème est que 'iptables' est pas sur la' path' donné à votre processus lancé-serveur Web. La bonne solution consisterait à ne pas utiliser 'system()' du tout mais au minimum, fournir le chemin complet de l'exécutable, pas seulement le nom de celui-ci. – mah
@mah Ouais, c'était le chemin vers iptables. Après l'avoir changé en '/ sbin/iptables', cela a fonctionné. Pouvez-vous le mettre comme une réponse? – user4035
heureux que cela a aidé. Réponse postée – mah