Forum général.général Amadouer iptables, ou comment ne pas s'interdire l'accès à son propre serveur !

Posté par  (site web personnel) .
Étiquettes : aucune
0
25
oct.
2004
Salut tout le monde,

je vous écris parce que hier soir j'ai fait exactement ce qu'il ne fallait pas faire. En modifiant un script fait-maison avec les règles d'iptables, j'ai malencontreusement décommenté un commentaire qui était placé entre le moment où le script interdit l'accès à toutes les chaines ("policies" à DROP) et le moment où les règles ouvrent explicitement certains ports (80, 22, 21, 25, 53, ...)

Bref, la catastrophe a été de taille quand j'ai lancé le script et il s'est lamentablement vautré sur le commentaire décommenté. Les facteurs aggravants étaient nombreux :

- serveur à 2h30 de chez moi
- c'est arrivé exactement 20 minutes après l'avoir passé en prod et y avoir installé quelques sites. Les proprietaires de ces sites (qui payent!) venaient à peine de recevoir un mail en confirmant la bonne mise en route de leurs sites !
- c'était un dimanche soir, donc pas de technicien sur place avant lundi matin
- pas de prise electrique controllable à distance pour faire un reboot

J'en viens enfin à ma question : existe-t-il un moyen, une astuce, une formule magique, un mantra à se répéter 15 fois par jour,... pour éviter que ce genre de choses n'arrive ?

Mes réponses personnelles :

- pendant le test du firewall (quand il n'était pas en prod), j'avais mis dans la crontab un script qui se lançait toutes les 15 minutes et réinitialisait les règles du firewall en acceptant tous les paquets
- prise electrique controllable à distance et pas de lancement automatique au démarrage du firewall

Idées personnelles :

- Quelqu'un aurait-il par exemple songé à un petit script qui monitore le trafic entrant/sortant et qui soit capable de detecter une panne au niveau du firewall si le trafic s'arrete subitement pendant un temps prédeterminé ?

- Et qu'en diriez-vous d'un script sur le serveur qui vérifie la présence d'un certain fichier sur un compte ftp et qui réinitialise le firewall en présence de ce fichier ? Evidemment ça serait une atteinte à la sécurité et il faudrait que le firewall autorise au moins, par défaut, les paquets sortants et ceux entrants qui ont un rapport avec ceux sortants ("state filter", established/related). Mais le jeu en vaut peut-être la chandelle ?

Voilà, en attendant que les techniciens s'activent, je fais appel à vos experiences ! :)
  • # Et pourquoi pas ...

    Posté par  . Évalué à 4.

    ... un script qui vérifie régilièrement la présence de règles minimales avant toutes les autres dans ta config. Ca veut dire que le jour où tu mets le truc en place, tu décides une bonne fois pour toute de la règle necessaire pour t'empecher d'etre dans la mouise ( genre ssh ). Apres pour planter le truc, il faut que tu fasses 2 fois une connerie : changer la config et la config de secours. Ca laisse plus de chance.

    Ou alors tant qu'on est dans le trip solution-tordue, je te propose un cron qui interroge une boite pop régulierement pour en tirer eventuellement un nouveau fichier de config du firewall et qui le met en place si il est correctement signé electroniquement par toi.
    • [^] # Re: Et pourquoi pas ...

      Posté par  (site web personnel) . Évalué à 2.

      Deux bons conseils, merci :)

      Effectivement le coup du mail signé est alambiqué mais devrait fonctionner et reste secure...
      • [^] # Re: Et pourquoi pas ...

        Posté par  (site web personnel) . Évalué à 5.

        Oui mais non...

        Dans ton cas, tu touches à IPTables... Donc, tu ne peux en aucun cas faire confiance à un quelconque mécanisme mettant en oeuvre le réseau...

        Que se passe-t-il si ta machine est bloquée et ne laisse plus passer aucun type de trafic (entrant, sortant, ...) ? Adieux le POP3 (et le FTP aussi d'ailleurs)...

        A mon avis, le mieux reste encore une sauvegarde du script avant modification puis, avec at ou cron tu programmes l'exécution de l'ancien script dans X minutes. Tu testes tes nouvelles règles et, si tout est bloqué, tu sais que at ou cron va débloquer la situation en exécutant l'ancien script d'ici X mins.

        Là au moins, ça ne fait pas appel au réseau et ça à plus de chances d'aboutir :).
        • [^] # Re: Et pourquoi pas ...

          Posté par  (site web personnel) . Évalué à 2.

          Ca c'est ce que je faisais en phase de test, mais si en prod tu dois faire des modifs il ne faudrait pas qu'elles soient annulées par un cron toutes les 15 minutes. A un moment donné il faut bien faire une modif sur le fichier sans que le cron puisse l'annuler...

          Mais ça me fait penser à une procédure relativement infaillible :

          - avant toute modification (même en prod) du le script du firewall, je remets en place le script cron de secours
          - je fais ma modif
          - si tout se passe bien je désactive le script cron
          - sinon j'attends les 15 minutes et je recommence...

          C'est simple, non ? Quels seraient les inconvénients ?

          Remarque, c'était peut-être ce que tu proposais FixXxeR :) Loin de moi l'idée de vouloir t'enlever le merite !
          • [^] # Re: Et pourquoi pas ...

            Posté par  . Évalué à 1.

            Sinon, tu peux dire a cron de lancer un script iptables ttes les 30 minutes par exemples. Au début ce script est minimal (il te laisse acces à ssh etc...).

            Le jour où tu testes un nouveau script iptables, si ca se passe mal, cron remettra les regles par defaut.
            Si ca se passe bien, tu remplace les regles par défaut par le nouveau script que tu a testé avec succès.

            En fait, cron serais utillisé pour mettre en place toutes les 30 minutes, la dernière version stable de ton script. Dès qu'un script de "test" est jugé "stable", tu dis a cron que désormais, c'est ce script qu'il faut lancer toutes les 30 minutes.

            Le seul problème, c'est que meme sit tu ne touche pas a ton script pendant 6 mois, cron continuera de le lancer toutes les 30 minutes. mais est ce vraiment un problème.

            C'est ce que je fais depuis un moment, et ca se passe très bien...
  • # Pourquoi "amadouer iptables" ? le problème ne vient pas de là ;-)

    Posté par  . Évalué à 2.

    > J'en viens enfin à ma question : existe-t-il un moyen, une astuce, une formule magique, un mantra à se répéter 15 fois par jour,... pour éviter que ce genre de choses n'arrive ?
    > Mes réponses personnelles :
    > - pendant le test du firewall (quand il n'était pas en prod), j'avais mis dans la crontab un script qui se lançait toutes les 15 minutes et réinitialisait les règles du firewall en acceptant tous les paquets

    oui.
    mais question bête.
    si cela t'es arrivé, c'est que tu relances le script à chaque fois.
    pourquoi ne travailles-tu pas à coups d'insert et de delete ?
    le risque de planter ton firewall son quand même moindre dans ce cas...

    > - prise electrique controllable à distance et pas de lancement automatique au démarrage du firewall

    heu... c'est pas un peu bourrin ?
    franchement, je préfère le coup d'un script qui t'ouvres l'accès ssh :-)



    > Idées personnelles :
    > - Quelqu'un aurait-il par exemple songé à un petit script qui monitore le trafic entrant/sortant et qui soit capable de detecter une panne au niveau du firewall si le trafic s'arrete subitement pendant un temps prédeterminé ?

    donc ça c'est pour un plantage de quoi ? des régles ? de la machine ? c'est pas vraiment clair là...



    > - Et qu'en diriez-vous d'un script sur le serveur qui vérifie la présence d'un certain fichier sur un compte ftp et qui réinitialise le firewall en présence de ce fichier ? Evidemment ça serait une atteinte à la sécurité et il faudrait que le firewall autorise au moins, par défaut, les paquets sortants et ceux entrants qui ont un rapport avec ceux sortants ("state filter", established/related). Mais le jeu en vaut peut-être la chandelle ?

    je comprends pas là....
    en gros, tu plantes tes règles, donc t'envoies un fichier par ftp, et si le cron détecte le fichier il réinitialise les règles ?
    heu... question bête... si ton plantage de règles équivaut à un DROP ALL ;-) tu fais comment pour l'envoyer ton fichier ??


    > Voilà, en attendant que les techniciens s'activent, je fais appel à vos experiences ! :)

    par expérience : le script en cron quand on bosse sur le firewall et bosser à coups d'insert et de delete plutôt que de travailler directement sur le script et être obliger de le relancer en entier à chaque fois...
    • [^] # Re: Pourquoi "amadouer iptables" ? le problème ne vient pas de là ;-)

      Posté par  (site web personnel) . Évalué à 1.

      > oui.
      > mais question bête.
      > si cela t'es arrivé, c'est que tu relances le script à chaque fois.
      > pourquoi ne travailles-tu pas à coups d'insert et de delete ?
      > le risque de planter ton firewall son quand même moindre dans ce cas...

      Parce que là je n'étais plus en test, j'étais en prod, je savais exactement ce que je devais faire : ouvrir le port 53 suite à l'installation d'un serveur DNS. Bon évidemment, il y en aura toujours pour dire qu'on ne fait pas ça sur un serveur en prod, mais je n'avais pas le choix ! Donc tout ça pour dire que j'étais sur de ma manip, il fallait que je fasse copier-coller de la derniere ligne et que je modifie le numero du port...

      Ce que tu me proposes toi est une bonne idée pour faire des tests... Genre, voir si cette règle fonctionne, je l'ajoute à la main et les dégats sont limités si ça marche pas. Quoique, dans ces cas là je prefere encore la technique du firewall réinitialisé automatiquement toutes les 15 minutes.

      Mais tu ne veux tout de même pas que je me tape une trentaine de commandes iptables à la main à chaque lancement de la machine, si ? Même si elle doit être redemarrée une fois tous les 3 mois, ça me parait long et d'autres erreurs peuvent être commises de cette façon...

      > - prise electrique controllable à distance et pas de lancement automatique au démarrage du firewall

      Oui c'est très bourrin, mais je ne devrais pas m'en servir tous les jours... Mais au moins je sais que la solution est là ! :)

      > donc ça c'est pour un plantage de quoi ? des régles ? de la machine ? c'est pas vraiment clair là...

      Oui, ça c'était pour surveiller un plantage des règles... Parce qu'en gros je me dis, si le serveur était un minimum doué d'intelligence (!) il devrait se poser des questions en voyant qu'il a toujours parfaitement accès au net (paquets sortants autorisés) mais que tout à coup plus personne ne vient chez lui...

      > heu... question bête... si ton plantage de règles équivaut à un DROP ALL ;-) tu > fais comment pour l'envoyer ton fichier ??

      Je pensais à un serveur ftp externe...

      Même si je n'ai pas trouvé une réponse à mon problème, je te remercie de tes conseils, ça aide à réfléchir et à trouver des solutions :)
      • [^] # Re: Pourquoi "amadouer iptables" ? le problème ne vient pas de là ;-)

        Posté par  . Évalué à 2.

        > Parce que là je n'étais plus en test, j'étais en prod,

        en tests, c'est pas grave de planter la machine.
        la situation que j'évoque ici est pour un serveur en prod.


        > Donc tout ça pour dire que j'étais sur de ma manip, il fallait que je fasse copier-coller de la derniere ligne et que je modifie le numero du port...

        vi mais tu t'es pris les pieds dans la tapis ;-)

        avec un insert, tu testes.
        Si ça fonctionne, tu rajoute ta ligne dans le script.
        Si ça fonctionne pas, un delete, et hop, t'essayes autre chose...

        > Mais tu ne veux tout de même pas que je me tape une trentaine de commandes iptables à la main à chaque lancement de la machine, si ?

        non :-)
        l'insert c'est pour tester.
        si ça marche, tu rajoutes tes lignes dans le script.
        • [^] # Re: Pourquoi "amadouer iptables" ? le problème ne vient pas de là ;-)

          Posté par  (site web personnel) . Évalué à 1.

          Ok, admettons que je suive ton exemple.

          Je teste ma ligne à la main... Ca marche nickel. J'ouvre le script, j'insere ma ligne, mais comme j'ai les doigts lourds je fais une erreur de syntaxe bash... Paf, le script se vautre exactement comme ça m'est arrivé...

          Ok c'est de ma faute, je suis un gros nul, tout ce que tu veux... Mais moi je cherche justement une solution à preuve de gros nuls parce que l'erreur est humaine et si on ne laisse pas de place à l'erreur on va droit dans un mur :) Le risque zéro est une invention des hommes en costard cravate qui n'a rien à voir avec la vie réelle...
          • [^] # Re: Pourquoi "amadouer iptables" ? le problème ne vient pas de là ;-)

            Posté par  . Évalué à 2.

            > Ok, admettons que je suive ton exemple.

            ok :-)

            > Je teste ma ligne à la main...

            d'accord

            > Ca marche nickel.

            là, t'es content :-)

            > J'ouvre le script,

            ah non.
            avant, tu as fait un copie du script : cp /etc/init.d/firewall /etc/cron.hourly/firewall
            comme ça, si t'as les doigts lourds, tu récupères la situation précédente 1 heure après.
            c'est un petit détail qui t'évites de perdre la main.
            faut toujours faire une copie quand on bosse sur un fichier ;-)

            > j'insere ma ligne,

            ok

            > mais comme j'ai les doigts lourds je fais une erreur de syntaxe bash... Paf, le script se vautre exactement comme ça m'est arrivé...

            oui mais tu as fait une copie dans /etc/cron.hourly, donc 1 heure après tu récupères la situation précédente.
            héhé ;-)

            > Ok c'est de ma faute,

            un peu :-p

            > je suis un gros nul,

            meuh non !

            > tout ce que tu veux... Mais moi je cherche justement une solution à preuve de gros nuls parce que l'erreur est humaine et si on ne laisse pas de place à l'erreur on va droit dans un mur :) Le risque zéro est une invention des hommes en costard cravate qui n'a rien à voir avec la vie réelle...

            :-)))

            1. tu fais un script qui regarde dans cron.hourly si le script firewall est présent.
            si ce script est présent, il l'active toutes les heures,
            s'il n'est pas présent, c'est que tu n'es pas en train de bosser sur le firewall.
            2. avant quelque modif que ce soit, tu copies le script de règles qui fonctionne dans :
            /etc/cron.hourly
            3. tu fais tes modifs à coups d'insert ou de delete.
            j'ai un terminal avec cat > /dev/null ouvert en permanence pour les copier/coller
            ça marche plutôt bien
            4. tu modifies ton script de règles si tes insert fonctionnent.
            5. tu relances
            6. ça marche ? tu vires /etc/cron.hourly/firewall

            voilou :-)
          • [^] # Re: Pourquoi "amadouer iptables" ? le problème ne vient pas de là ;-)

            Posté par  (site web personnel) . Évalué à 0.

            Ué mais apres un script shell a la main pour iptables fo etre fou ;)
            Tu fais ton iptables insert a la main
            apres iptables-save > iptables
            et apre a chaque reboot iptables-restore < iptables
            Et roule ma poule :p
  • # Shorewall

    Posté par  (site web personnel) . Évalué à 3.

    Je sais bien que tu bosses avec un script "fait maison" mais, juste pour info ;), des softs tels que ShoreWall (www.shorewall.net) permettent de faire quelques petits tests , en principe, sans qu'il t'arrive ce genre de choses.

    => http://shorewall.net/starting_and_stopping_shorewall.htm(...)

    La commande "shorewall try" permet de tester diverses configuration avec un mécanisme de "fallback" vers la dernière configuration fonctionnelle connue.
    • [^] # Re: Shorewall

      Posté par  (site web personnel) . Évalué à 1.

      Oui c'est vrai que ça a l'air pas mal... Mais j'ai toujours évité ce genre de logiciels parce qu'ils me paraissent trop compliqués par rapport à la tache à accomplir. Maintenant, je peux me tromper, je n'ai d'ailleurs jamais testé celui dont tu parles.

      Je me dis que la configuration d'un firewall, quand on connait le fonctionnement d'iptables, est une chose très facile et très délicate. Ce qui me pousse à mettre en place des solutions simples (30 lignes en bash), facilement verifiables si quelque chose ne fonctionne pas comme il devrait et entièrement sous mon controle...

      Il faut toujours, par contre, prévoir une solution de fallback car l'erreur est humaine !
      • [^] # Re: Shorewall

        Posté par  . Évalué à 2.

        L'avantage de Shorewall est justement de générer des règles complètes à partir de fichiers de conf' élégants tout en prévoyant l'erreur humaine.

        Connaitre iptables c'est à la portée de tout le monde.
        Construire des règles cohérentes et efficaces c'est autre chose.

        (Je ne dis pas que les tiennes ne le sont pas)

        M
  • # Un réseau privé d'admin

    Posté par  . Évalué à 2.

    Ce que je fais en général, c'est un réseau d'admin en RFC1918 sur une des interfaces physiques secondaires du serveur, et je laisse cet accès complètement ouvert.

    De cette facon, en cas de plantage sur les règles de FW, ou de tout autre bricolage sur l'interface primaire, j'ai toujours une route de secours par une interface secondaire (en rebondissant sur une autre machine).

    Ca aide (mais pas toujours).

    Olivier


    P.S on peut aussi jouer avec des cables série sur le port console, c'est pas cher et ça marche même si la couche IP du serveur est HS
    • [^] # Re: Un réseau privé d'admin

      Posté par  (site web personnel) . Évalué à 1.

      Mon serveur est actuellement le seul sous ma responsabilité dans un datacenter à 2h30 de chez moi. Alors pas de rebondissement possible depuis une autre machine, et encore moins d'accès par port série :)

      Merci en tout cas, quand j'aurai plus d'un serveur, je le ferai surement :)
  • # Sleep

    Posté par  . Évalué à 1.

    Je test avec ça :

    iptables-restore < fichierdetest ; sleep 20 ; iptables-restore < fichierminimal

    (ne pas remplacer les ";" par des "&&" s'il y a une erreur dans les règles, gros problèmes)

    De cette facon, j'ai 20 secondes maximum de coupure si je fait une connerie.
    • [^] # Re: Sleep

      Posté par  . Évalué à 1.

      et une commande "at " c'est pas fait pour ça ?

      at now + 1 minutes -c "iptables-restore < fichierminimal"

      Je suis plus sur de la syntaxe, mais ça doit marcher

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.