Outils pour utilisateurs

Outils du site


fr:security:iptables

Iptables

Une des règles d'or en sécurité est: d'abord on ferme tout puis on ouvre les services un par un en n'autorisant que des IP identifiées.

C'est exactement ce que nous allons voir avec l'exemple du protocole SSH.

Firewall

Au niveau du pare-feu, on reste avec le classique Iptables. Il peut s'avérer compliqué et c'est même pourquoi ufw a été créé mais pour moi, iptables reste un incontournable. :-)

SSH

Notre approche va être de créer une règle qui log les paquets qu'on lui envoie avant de les supprimer. On va autoriser seulement les IP qu'on souhaite autoriser à faire du SSH avec nous et le reste on l'envoie vers notre règle.

iptables -N SSH # rule name
iptables -A SSH -j LOG --log-prefix "SSH DROP: " # log with prefix
iptables -A SSH -j DROP # drop packets sent to this rule
iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT # allow one IP
iptables -A INPUT -p tcp -s 127.0.0.1 --dport 22 -j ACCEPT # allow localhost
iptables -A INPUT -p tcp --dport 22 -j SSH # send everything else to the drop rule

On peut vérifier que la configuration de notre pare-feu est bien celle que nous voulons:

iptables -L
 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              anywhere             tcp dpt:ssh
ACCEPT     tcp  --  localhost            anywhere             tcp dpt:ssh
SSH        tcp  --  anywhere             anywhere             tcp dpt:ssh
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
 
Chain SSH (1 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             LOG level warning prefix "SSH DROP: "
DROP       all  --  anywhere             anywhere

We can have a look to system logs and verify it is working well.

Regardons les logs du système pour avoir des traces de notre règle (si vous êtes sur un serveur publique, alors il n'y aura pas longtemps à attendre).

dmesg -T -w
 
[Mon May  3 03:18:38 2021] SSH DROP: IN=eno1 OUT= MAC=ab:cd:ef:f1:85:82:1c:e6:c7:52:07:40:08:33 SRC=46.101.18.4 DST=x.x.x.x LEN=60 TOS=0x00 PREC=0x00 TTL=52 ID=26716 DF PROTO=TCP SPT=55360 DPT=22 WINDOW=29200 RES=0x00 SYN URGP=0

Configuration persistente

Une fois que tout nous plait et fonctionne comme prévu, rien de tel qu'un petit reboot du serveur. Et là stupéfaction, après le reboot notre règle a disparu. 8-0 Pourquoi ? Et bien par défaut notre règle personnalisée n'est pas rechargée après un reboot. Un paquet dédié à cet effet a été créé: iptables-persistent. Installez-le et le tour sera joué.

dpkg --list | grep iptables
ii  iptables                          1.8.2-4                           amd64        administration tools for packet filtering and NAT
ii  iptables-persistent               1.0.11+deb10u1                    all          boot-time loader for netfilter rules, iptables plugin
fr/security/iptables.txt · Dernière modification : 2021/05/02 23:48 de lonclegr