Forum Linux.debian/ubuntu iptables demande de conseils

Posté par  .
Étiquettes : aucune
0
8
déc.
2009
Bonjour,

j'aimerai votre avis sur mes configs iptables. C'est mon premier script alors désolé pour les imbécilités...

Les scripts sont destinées à un serveur web. J'ai fais 2 scripts parce qu'il y en a un pour tout les jours (plutôt restrictif) et un autre qui ouvre le dns/le web/"solr" (port 8983) quand j'en ai besoin, mise à jour des fichier php, des packages, etc... Solr c'est un moteur de recherche qui tourne sur jetty qui n'est écouté que sur le localhost en temps normal et quand je travaille dessus il doit écouter sur le réseau. Il n'y a pas de ftp je compte utiliser sftp qui passe par le 22 je crois.

Déjà première question, est ce une bonne idée 2 scripts ? Est ce que cela coupe les connexions quand on change de script ? J'aurais tendance à dire oui à cause de "iptables -P INPUT/OUTPUT DROP". Est ce grave ?

Bon je continue :
1er script :
Ssh et http (côté serveur uniquement) autorisé.
Le reste refusé et en log.
Le ssh est en log aussi, je veux savoir qui vient sur ma machine, normalement que moi.

2eme script
ssh http https dns solr (port 8983)
Je ne log pas car ce script ne sera pas souvent actif

Voici le 1er script :
#!/bin/sh

#####################################################################
#
# Shell Script for configuration of Itables
# Server web Pomelojob powered by Gandi.net
#
# only web and ssh available used in webserver mode
#
# author: Charles Bourasseau
# date: 2009
#####################################################################


## On active quelques modules utiles
modprobe ip_tables
modprobe ip_conntrack
modprobe iptable_filter

## On vide les règles
iptables -F
iptables -X

## On log tout
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix '[IPTABLES DROP] : '
iptables -A LOG_DROP -j DROP

iptables -N LOG_ACCEPT
iptables -A LOG_ACCEPT -j LOG --log-prefix '[IPTABLES ACCEPT] : '
iptables -A LOG_ACCEPT -j ACCEPT

## On interdit tout

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

## On autorise la boucle local

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

## SSH
iptables -A INPUT -p tcp -i eth0 --dport 22 --sport 1024:65535 -m state --state NEW,ESTABLISHED -j LOG_ACCEPT
iptables -A OUTPUT -p tcp -o eth0 --dport 1024:65535 --sport 22 -m state --state ESTABLISHED -j LOG_ACCEPT

## web
iptables -A INPUT -p tcp -i eth0 --dport 80 --sport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -o eth0 --dport 1024:65535 --sport 80 -m state --state ESTABLISHED -j ACCEPT

iptables -A FORWARD -j LOG_DROP
iptables -A INPUT -j LOG_DROP
iptables -A OUTPUT -j LOG_DROP

Voici le 2eme script :
#!/bin/sh

#####################################################################
#
# Shell Script for configuration of Itables
# Server web Pomelojob powered by Gandi.net
#
# http htpps ssh solr dns available : more possibilities to work
#
# author: Charles Bourasseau
# date: 2009
#####################################################################


## On active quelques modules utiles
modprobe ip_tables
modprobe ip_conntrack
modprobe iptable_filter

## On vide les règles
iptables -F
iptables -X

## On interdit tout
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

## On autorise la boucle local
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

## ssh (server)
iptables -A INPUT -i eth0 -p tcp --dport 22 --sport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 1024:65535 --sport 22 -m state --state ESTABLISHED -j ACCEPT

## http (server)
iptables -A INPUT -i eth0 -p tcp --dport 80 --sport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 1024:65535 --sport 80 -m state --state ESTABLISHED -j ACCEPT

## http (client)
iptables -A INPUT -i eth0 -p tcp --dport 1024:65535 --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 80 --sport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT

## https (server)
iptables -A INPUT -i eth0 -p tcp --dport 443 --sport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 1024:65535 --sport 443 -m state --state ESTABLISHED -j ACCEPT

## https (client)
iptables -A INPUT -i eth0 -p tcp --dport 1024:65535 --sport 443 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 443 --sport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT

## solr
iptables -A INPUT -i eth0 -p tcp --dport 8983 --sport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 1024:65535 --sport 8983 -m state --state ESTABLISHED -j ACCEPT

## dns (client)
iptables -A INPUT -i eth0 -p udp --dport 1024:65535 --sport 53 -j ACCEPT
iptables -A OUTPUT -o eth0 -p udp --dport 53 --sport 1024:65535 -j ACCEPT

## Voila merci d'avance pour toutes les réponses :)
  • # man iptables

    Posté par  . Évalué à 0.

    time
    This matches if the packet arrival time/date is within a given range. All options are optional, but are ANDed when specified.

    --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

    --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

    Only match during the given time, which must be in ISO 8601 "T" notation. The possible time range is 1970-01-01T00:00:00 to 2038-01-19T04:17:07.

    If --datestart or --datestop are not specified, it will default to 1970-01-01 and 2038-01-19, respectively.

    --timestart hh:mm[:ss]

    --timestop hh:mm[:ss]

    Only match during the given daytime. The possible time range is 00:00:00 to 23:59:59. Leading zeroes are allowed (e.g. "06:03") and correctly interpreted as base-10.

    [!] --monthdays day[,day...]

    Only match on the given days of the month. Possible values are 1 to 31. Note that specifying 31 will of course not match on months which do not have a 31st day; the same goes for 28- or 29-day
    February.

    [!] --weekdays day[,day...]

    Only match on the given weekdays. Possible values are Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7, respectively. You may also use two-character variants (Mo, Tu, etc.).

    --utc

    Interpret the times given for --datestart, --datestop, --timestart and --timestop to be UTC.

    --localtz

    Interpret the times given for --datestart, --datestop, --timestart and --timestop to be local kernel time. (Default)

    EXAMPLES. To match on weekends, use:

    -m time --weekdays Sa,Su

    Or, to match (once) on a national holiday block:

    -m time --datestart 2007-12-24 --datestop 2007-12-27

    Since the stop time is actually inclusive, you would need the following stop time to not match the first second of the new day:

    -m time --datestart 2007-01-01T17:00 --datestop 2007-01-01T23:59:59

    During lunch hour:

    -m time --timestart 12:30 --timestop 13:30

    The fourth Friday in the month:

    -m time --weekdays Fr --monthdays 22,23,24,25,26,27,28


    ca devrait simplifier grandement ton code en ajoutant les contraintes de jours/heures sur les regles qui varient au cours de la journée
    • [^] # Re: man iptables

      Posté par  . Évalué à 2.

      Désolé je ne vois pas pourquoi tu me propose cela ?

      Si c'est pour le switch entre script 1 et 2, je ne peux pour le moment pas prévoir car mon travail sur le serveur est très irrégulier. C'est un projet personnel, que je réalise suivant mes disponibilités.
      • [^] # Re: man iptables

        Posté par  . Évalué à 1.

        pour les regles qui ouvrent les ports le soir

        tu ajoute --m time --timestart 20:30 --timestop 23:30
        pour cette regle soit valide uniquement entre 20h30 et 23h30

        ## solr
        iptables -A INPUT -i eth0 -p tcp --dport 8983 --sport 1024:65535 -m state --state NEW,ESTABLISHED -j ACCEPT
        iptables -A OUTPUT -o eth0 -p tcp --dport 1024:65535 --sport 8983 -m state --state ESTABLISHED -j ACCEPT


        devient alors

        ## solr
        iptables -A INPUT -i eth0 -p tcp --dport 8983 --sport 1024:65535 --m time --timestart 20:30 --timestop 23:30 -m state --state NEW,ESTABLISHED -j ACCEPT
        iptables -A OUTPUT -o eth0 -p tcp --dport 1024:65535 --sport 8983 --m time --timestart 20:30 --timestop 23:30 -m state --state ESTABLISHED -j ACCEPT
        • [^] # Re: man iptables

          Posté par  . Évalué à 1.

          désolé mais je ne comprend toujours pas pourquoi j'aurais besoin d'indiquer une plage horaire dans mes scripts.

          Comme je l'ai dis je fais ce projet quand j'ai du temps et c'est très irrégulier, il est possible que je travaille n'importe quand.

          Je préfère donc changer mes tables quand je commence à travailler et les remodifier quand j'arrête, d'où l'idée dans 2 scripts.
          • [^] # Re: man iptables

            Posté par  . Évalué à 3.

            J'ai l'impression qu'ils ont lu _soir_ dans ton post, au lieu de Solr. :+)
          • [^] # Re: man iptables

            Posté par  . Évalué à 3.

            je viens de relire l'enoncé ce n'etait pas precisé que tu pouvais en avoir besoin sur des periodes aleatoires

            donc oui il te faut 2 scripts pour chacune des situations

            mais tu pourrais tres bien juste faire les ouvertures/fermetures necessaires dans le deuxieme
            à coup de -A (ajout) et -D (delete) pour les services occasionnels

            ca eviterait de repasser par le flush/drop du debut de script
            • [^] # Re: man iptables

              Posté par  . Évalué à 1.

              oops désolé j'avais oublié de le préciser.

              Oui c'est pas faux mais j'aimai bien l'idée que tout est remis à 0 quand on change de script comme ça je suis certains qu'il n'y a pas de problème dans la configuration. Genre un port qui a été ouvert à la main sans être refermé.

              Pour des soucis de perf et de simplicité on m'a conseillé d'utiliser iptables-save iptables-restore. C'est peut être plus adapté à ma situation ?
              • [^] # Re: man iptables

                Posté par  . Évalué à 2.

                à ma connaissance, iptable-save/restore fera comme ton script
                avec comme inconvenient de ne pas pouvoir scripter certains passages (boucle sur une liste de machine à autoriser par exemple)


                et les connexions en cours risque quand meme d'etre coupées
  • # fail2ban

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

    Pour proteger la machine connectée à internet contre les attaques par dictionnaire sur ssh, fail2ban est une option.

    Système - Réseau - Sécurité Open Source

    • [^] # Re: fail2ban

      Posté par  . Évalué à 1.

      fail2ban déjà en place :p

      D'ailleurs c'est un des premiers truc à mettre en place, j'ai filé l ip à personnes et mes sites sont pas référencé que j'ai déjà eu pleins de tentatives et beaucoup de ban c'est dingue...
      • [^] # Re: fail2ban

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

        Pour éviter le "flooding"

        un "match limit" sur l'état NEW peut etre utile, que ce soit en entrée ou en sortie.

        Système - Réseau - Sécurité Open Source

      • [^] # Re: fail2ban

        Posté par  . Évalué à 1.

        Pour être un peu plus tranquille au niveau du ssh, tu peux aussi changer de port
  • # limit

    Posté par  . Évalué à 1.

    sur les conseils de nono14 j'ai modifié mes règles :

    ## On log tout
    iptables -N LOG_DROP
    iptables -A LOG_DROP -j DROP
    iptables -A LOG_DROP --limit 1/s --limit-burst 1 -m state -j LOG --log-prefix '[IPTABLES DROP] : '


    J'ai lu ici : http://groups.google.com/group/fr.comp.securite/browse_threa(...)

    que l'ordre était important, d'abord drop puis log.

    Si je comprends bien et si ce que j'ai écris est correcte, iptables va bloquer puis maximum 1 fois par seconde va loger.

    J'ai bon ?

Suivre le flux des commentaires

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