Ordre iptables en ssh

Bonjour,

j’ai lu l’excellent tuto de Ricardo sur iptables pour les nuls, mais j’aurais cependant une première question.

En effet, je me connecte à mon serveur obligatoirement en ssh (serveur hébergé). J’ai bien suivi le tuto, mais, très intelligemment, je n’avais pas tilté que les règles étaient appliquées dès qu’elles étaient validées, aussi, au moment de faire

forcément, plus rien après.
Bon, un petit ticket d’incident auprès de mon hébergeur et hop, c’est bon, mais voilà…

Je souhaiterais donc être sûr et sûr encore que si je fais :

suivi de

je ne vais pas à nouveau bloquer mon accès ssh, et que je pourrai donc ensuite ouvrir mes ports 80, 21 etc…

Merci d’avance de votre aide !

Fabien :slightly_smiling:

En général, on utilise un script avec l’ensemble des commandes iptables (en commençant par vider les règles).
On test le script et si les règles ne conviennent pas, on redémarre le serveur.
Le script n’est intégré au démarrage que lorsqu’il est au point.

D’accord, merci de cette précision… pleine de bon sens !

Cependant, j’ai suivi le tuto “pour les nuls”, aussi, je comprends l’idée de la remarque, mais en ce qui concerne la création du script puis son exécution… Merci d’avance !

Fabien :slightly_smiling:

Je ne suis pas sur de comprendre ta remarque.

[code]#!/bin/sh

Vider les tables actuelles

iptables -t filter -F

Vider les règles personnelles

iptables -t filter -X

Interdire toute connexion entrante et sortante

iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
…[/code]
Dans une fichier sur lequel tu fais un “chmod +x nomfichier

Lorsque le script donne le résultat attendu, tu peux l’exécuter automatiquement à partir du fichier /etc/network/interfaces/ à l’activation de eth0 (preup ou up ?).

Re,

je voulais juste dire par là que je suis vraiment un débutant et que je comprends les choses simples, même si je cherche tout de même pas mal sur le net, mais faire le tris est parfois compliqué :slightly_smiling:.

En tout cas, merci de ces précisions, c’est vraiment très intéressant.

Si je comprends bien, si j’exécute le script (en gros, ça revient à mettre les commandes dans un fichier puis à appeler le fichier), ça sera pris en compte immédiatement, mais pas au prochain reboot, alors que si je tape les mêmes commande directement dans la console, c’est pris en compte et ça reste pris en compte au reboot (car après mon ânerie, j’ai bien refait un reboot mais ça n’a rien changé, plus d’accès…).

Merci pour l’aide !

Fabien :slightly_smiling:

Bonjour,

Le but du tuto de Ricardo est de rendre persistante les règles créées avec iptables (qui sans cela disparaissent à chaque arrêt de la machine).

Dans un premier temps, afin de mettre au point tes règles, il vaut mieux supprimer le fichier /etc/init.d/mon_parefeu pour pouvoir redémarrer sans pare-feu en cas de “bêtise”.

OK, merci de ces précisions, mais… il y a quand même un truc que je ne comprends pas…

A priori, tant que je n’ai pas fait cette ligne dans le tuto :
update-rc.d mon_parefeu start XX S . stop YY 0 6 .

ça ne devrait pas se lancer au démarrage, non ?

Or, voici ce qui s’est passé :
j’ai créé comme infiqué le fichier “mon_parefeu”

ensuite j’ai fait un clean
puis j’ai exécuté la commande

et là, malgré un redémarrage et le fait que je n’avais pas fait l’automatisation (enfin, je pense…) du fichier “mon_parefeu”, le tout restait bloqué…

Désolé de paraître peut être “lourd”, mais j’essaie de vraiment bien comprendre pour ne pas refaire de bêtises…

Merci.

Fabien :slightly_smiling:

Effectivement, tant que tu n’as pas exécuté update-rc.d (ou plutôt tant qu’il n’existe pas de lien vers le fichier mon_parefeu dans /etc/rcX.d), le script ne devrait pas se lancer au démarrage.

Les règles par défaut (option -P d’iptables) peuvent être créées à la fin. (alors que l’ordre des -A peut avoir une importance)

ok, donc, je reviens à mon problème de départ : comment se fait-il qu’après le reboot du serveur les ports n’aient pas été à nouveau ouverts ? Pfffiouuuu je dois louper un truc là…

Merci d’avance !

Tant que j’y suis, autant revenir à la question de base :

Est-ce que, que ce soit dans mon script ou directement en commande, l’ordre des commandes a une importance ?

Si je lui dis de tout fermer les communications entrantes, mais qu’avant je lui ai dit d’autoriser sur le port 22, est-ce que c’est bon ou pas ?

Merci.

Fabien :slightly_smiling:

Salut:

Il faut savoir que:
1.-l’ordre d’entrée des règle joue un role:
donc :
si tu fait -P INPUT DROP
Et que tu n’as fait aucune règle pour autoriser avant celle-ci, sa ferme tout. les règles comme -P INPUT DROP son effectuée en dernier

Effacer toute les règles , avant d’effectuer les nouvelles entrées son préférables.
Cela comporte un risque minime si les nouvelles règles ne son pas chargées 3 plombe plus tard.
si le nombre deviens important et que le serveur est lent sa peux devenir un problèmes.

Comprendre ce qu’on fait c’est mieux :pray:
Tutoriel presque complet ici
inetdoc.net/guides/iptables-tutorial/

Ensuite il te faut aussi savoir un peux faire de shell (script). mots clef “bash tutoriel”

[quote=“neibaf”]Tant que j’y suis, autant revenir à la question de base :

Est-ce que, que ce soit dans mon script ou directement en commande, l’ordre des commandes a une importance ?
[/quote]
Oui !

[quote]
Si je lui dis de tout fermer les communications entrantes, mais qu’avant je lui ai dit d’autoriser sur le port 22, est-ce que c’est bon ou pas ?

Merci.

Fabien :slightly_smiling:[/quote]
C’est une solution…

Personnellement, je préfère celle qui ferme tout, et ensuite qui ouvre le nécessaire :007
(la doc de Christian Caleca explique bien les tenants et aboutissants !!! un must to have !)

    echo "########## Iptables flushing ##########"
    iptables -F
    iptables -X
    iptables -t nat -F
    iptables -t nat -X
    iptables -t mangle -F
    iptables -t mangle -X

    # DROP All by default
    echo "########## Iptables Filter Drop ##########"
    iptables -P INPUT   DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT  DROP

    echo "########## Iptables NAT Accept ##########"
    iptables -t nat -P PREROUTING  ACCEPT
    iptables -t nat -P POSTROUTING ACCEPT
    iptables -t nat -P OUTPUT      ACCEPT

    echo "########## Iptables MANGLE Accept ##########"
    iptables -t mangle -P PREROUTING  ACCEPT
    iptables -t mangle -P INPUT       ACCEPT
    iptables -t mangle -P OUTPUT      ACCEPT
    iptables -t mangle -P FORWARD     ACCEPT
    iptables -t mangle -P POSTROUTING ACCEPT
    
    echo "########## Iptables : connexion en etat établie, ou relative sont autorisées #########"
    iptables -A INPUT -p tcp ! --syn -m conntrack --ctstate ESTABLISHED -j ACCEPT
    iptables -A INPUT -p tcp -m conntrack --ctstate RELATED -j ACCEPT

    iptables -A OUTPUT -p tcp ! --syn -m conntrack --ctstate ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -p tcp -m conntrack --ctstate RELATED -j ACCEPT
 

Pour SSH :

    echo "########## Iptables : autorise SSH ###########"
    iptables -A INPUT -p tcp -m tcp --dport 22 -m limit --limit 1/s -m conntrack --ctstate NEW -j ACCEPT

Mieux est de cibler aussi, ton interface d’entrée, et son adresse ip …

    echo "########## Iptables : autorise SSH ###########"
    iptables -A INPUT -i eth0 -d 192.168.0.1 -p tcp -m tcp --dport 22 -m limit --limit 1/s -m conntrack --ctstate NEW -j ACCEPT

(remplace 192.168.0.1 par l’adresse ip correcte … et mieux, de cibler aussi l’adresse ip de destination, utile si tu as une ip static publique … pour cela utilise le drapeau ‘-s’…)

Pense à autoriser le flux sur l’interface kernel, dite locale … ‘lo’ …

Ensuite, tu te rendras compte qu’il te faut à minima, autoriser la sortie vers le service DNS, sinon tu vas être aveugle, vers ICMP (et plus précisément, Ping et sa réponse), pour ne pas être sourd…
sans parler de l’utilité du port HTTP, en sortie.

Bref, “bon tricot” 8)

Oui, mais il faut bien distinguer l’ordre des commandes dans un script ou saisies à la main et l’ordre des règles dans une chaîne.

La commande -A ajoute une règle dans une chaîne à la suite des règles existantes. Lorsqu’un paquet traverse une chaîne, les règles de celle-ci sont parcourues dans l’ordre visible avec iptables -nvL ou iptables-save. Si on ajoute une règle qui bloque un certain type de paquet puis une règle qui l’accepte (et vice versa), alors cette dernière sera sans effet sur ce type de paquet.

La commande -P ne crée pas de règle ; elle définit la politique par défaut d’une chaîne, c’est-à-dire le sort d’un paquet (ACCEPT, DROP) qui traverse la chaîne s’il ne correspond à aucune règle. Sa position dans l’ordre des commandes n’a pas d’influence sur le résultat final mais seulement de façon transitoire.

Pour illustrer l’effet transitoire, si on saisit les commandes à la main à distance et qu’on définit la politique par défaut de la chaîne INPUT ou OUTPUT vide à DROP, alors on se bloque l’accès. En revanche si dans un script on ne définit la politique par défaut à DROP qu’après avoir créé les règles, alors on risque de laisser passer quelques paquets indésirables dans le court intervalle.

PengouinPdt :
Poser une limite sur les connexions SSH a un effet pervers : il est très facile pour un attaquant d’en abuser et de provoquer un déni de service. Même pas besoin d’établir une connexion complète, il suffit d’envoyer quelques paquets SYN par seconde et cela n’apparaîtra même pas dans les logs de sshd.

Quant au filtrage par interface d’entrée ou adresse de destination, il n’est pertinent que si le comportement doit être différent selon l’interface d’entrée ou l’adresse de destination.

Merci de toutes ces précisions !
Bon, je vais m’occuper de paramétrer le reste, et ensuite je m’occuperai du parefeu, en passant par toute les infos que vous m’avez donné.

Merci :slightly_smiling:.

Fabien :slightly_smiling:

[quote=“PascalHambourg”]
(…)
PengouinPdt :
Poser une limite sur les connexions SSH a un effet pervers : il est très facile pour un attaquant d’en abuser et de provoquer un déni de service. Même pas besoin d’établir une connexion complète, il suffit d’envoyer quelques paquets SYN par seconde et cela n’apparaîtra même pas dans les logs de sshd.

(…)[/quote]

Intéressant ! Et, ça craint …

Et, donc, tu préconises quoi ?