Préambule
But de cet article
Dans cette article nous allons mettre en place une solution basée sur iptables-persistent et fail2ban afin de sécuriser notre serveur.
A la fin de l’article :
- Notre serveur hôte :
- Bloquera les différentes attaques du grand internet. Il faut le reconnaître qu’elles viennent souvent de Chine, de Russie ou d’Inde.
- Fera du NAT pour permettre de se connecter aux VM via internet.
- Permettra aux VM de se connecter à internet pour les mises à jour.
- Permettra aux VM de communiquer entre elles.
- Les VM :
- Auront accès à internet.
- Accepteront les connexion SSH sur un pour dédié pour l’administration
Architecture mise en place
Nous avons besoin :
- D’un serveur avec
- Une IP publique
- Une ip locale (dans notre cas ce sera 192.168.122.1)
- Plusieurs VM avec :
- Une interface réseau pour le réseau local
- Une interface réseau pour l’accès internet
Plan d’adressage :
- Chaque vm aura 2 IP.
- Le port ssh sera défini par l’ip local de la VM . L’ip 192.168.122.XXX donnera le port SSH XXX22
Première configuration
Configuration de base iptables
# Vider les tables actuelles
iptables -t filter -F
# Vider les rôles 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
# ---
# Ne pas casser les connexions etablies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
# ICMP (Ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
# ---
# Autoriser les connexion ssh
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
# DNS In/Out
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
# NTP Out
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
# Autoriser les connexions HTTP + HTTPS
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT
# Autoriser les connexions à l'interface Proxmox
iptables -t filter -A INPUT -p tcp --dport 8006 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 8006 -j ACCEPT
# Autoriser les connexions FTP
iptables -t filter -A OUTPUT -p tcp --dport 20:21 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Autoriser les connexions au serveur Mail SMTP:25
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
# Autoriser les connexions au serveur Mail POP3:110
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
# Autoriser les connexions au serveur Mail IMAP:143
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
# Autoriser les connexions au serveur Mail POP3S:995
iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT
# Protection contre les flood
iptables -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT
Installation des outils complémentaires
iptables-persistent
Installation de iptables-persistent
apt-get install iptables-persistent
A l’installation on vous demande d’activer ou pas IP V6.
ATTENTION : Depuis debian 8, les services sont gérés via systemctl et le nom du service change également.
Démarrage du service iptables-persistent
service netfilter-persistent start
Sauvegarde des règles iptables de base
iptables-save > /etc/iptables/rules.v4
service netfilter-persistent restart
Autoriser les VM à accéder à internet
Présentation de la configuration Réseau
Afin de permettre aux VM de pouvoir communiquer avec le grand internet tout puissant :), Une interface virtuelle « bridgée » sur l’interface principale est créée, comme le montre la capture ci-dessous :
vmbr0 Link encap:Ethernet HWaddr 14:18:77:5f:0c:d2
inet addr:WWW.XXX.YYY.ZZZ Bcast:WWW.XXX.YYY.255 Mask:255.255.255.0
inet6 addr:
Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:17080091 errors:0 dropped:4173 overruns:0 frame:0
TX packets:3969016 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3780244041 (3.5 GiB) TX bytes:3224313133 (3.0 GiB)
Comme indiqué en préambule de cet article nous souhaitons avoir un sous réseau pour nos VM. Pour ce faire nous allons créer une deuxieme interface virtuelle.
Création d’une interface virtuelle
Nous allons donc ajouter dans le fichier /etc/network/interfaces l’interface vmbr1 qui permettra aux VM de communiquer avec notre serveur proxmox via le sous réseau.
auto vmbr1
iface vmbr1 inet static
address 192.168.122.1
netmask 255.255.255.0
bridge_ports none
bridge_stp off
bridge_fd 0
Une fois le fichier à jour il faut démarrer notre interface nouvellement créer. Notre réseau local aura donc une plage de 192.168.122.0/32.
ifup vmbr1
Waiting for vmbr1 to get ready (MAXWAIT is 2 seconds).
Comme nous avons autorisé ICMP dans iptables, nous pouvons donc faire un ping sur notre nouvelle interface pour en vérifier son bon fonctionnement
ping 192.168.122.1
PING 192.168.122.1 (192.168.122.1) 56(84) bytes of data.
64 bytes from 192.168.122.1: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 192.168.122.1: icmp_seq=2 ttl=64 time=0.039 ms
64 bytes from 192.168.122.1: icmp_seq=3 ttl=64 time=0.045 ms
^C
--- 192.168.122.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.031/0.038/0.045/0.007 ms
Autoriser nos VM à se connecter à internet
Comme expliqué plus haut :
- L’ip publique, dont l’accès à internet se fait via l’interface réseau vmbr0
- L’ip locale de notre serveur est sur l’interface vmbr1
il faut donc autoriser notre plage d’ip locale à accéder à internet.
Etape 1 : on autorise les entrées et le transfert des paquets depuis l’interface vmbr0
iptables -t filter -A INPUT -i vmbr0 -j ACCEPT
iptables -t filter -A FORWARD -i vmbr0 -j ACCEPT
Etape 2 : on fait du masquerade sur les interfaces et la plage d’adresse locale :
iptables -t nat -A POSTROUTING -o vmbr0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o vmbr1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.122.0/32 -o vmbr0 -j MASQUERADE
A partir de la nous pouvons tester un update sur une de nos VM pour contrôler que les paquets se mettent bien à jour.
Permettre les connexions ssh sur les VM depuis internet
Les règles à mettre en place
- Nous devons avoir un port ssh dédié pour chaque VM
- Le port dédié sera redirigé vers le port ssh de la VM
- Le port ssh de la VM devra répondre sur le port dédié du serveur hôte
- L’ip publique devra être « natée » vers l’ip locale de la VM
- Pour des raisons de commodité la plage réelle des VM commencera à 100 (La raison principale est ci-dessous).
- Le dernier digit de l’ip de la VM détermine le port ssh publique de la VM
- Donc la VM ayant l’adresse IP locale 192.168.122.100 aura comme port ssh publique 10022
Mise en place des règles
Etape 1 : Autoriser la redirection sur le port ssh de la VM.
iptables -t filter -A FORWARD -d 192.168.122.100/32 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
Etape 2 : on redirige le port ssh et l’ip public vers le port ssh et l’ip locale de la VM
iptables -t nat -A PREROUTING -d XXX.XXX.XXX.XXX/32 -p tcp -m tcp --dport 10022 -j DNAT --to-destination 192.168.122.100:22
Etape 4 : On sauve les règles dans iptables-persistent
iptables-save > /etc/iptables/rules.v4
service netfilter-persistent restart
Etape 5 : On configure les interfaces réseau de la VM
Si vous n’avais pas configurer les 2 interfaces de votre VM vous devrais le faire manuellement
- interface eth0 en DHCP (nat vers vmbr0)
- interface eth1 en ipfixe (Bridge vers vmbr1)
Etape 6 : On configure putty pour se connecter au serveur
Les champs nécessaires :
- IP du serveur hôte
- port ssh publique
- identifiant de connexion
- mot de passe de connexion
Une fois la connexion établie la commande ifconfig nous confirmeras que l’interface avec l’ip locale est bien active
ifconfig eth1
eth1 Link encap:Ethernet HWaddr 22:72:12:40:BE:E0
inet addr:192.168.122.100 Bcast:192.168.122.255 Mask:255.255.255.0
inet6 addr: fe80::2072:12ff:fe40:bee0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:326 errors:7 dropped:0 overruns:0 frame:7
TX packets:320 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:36856 (35.9 KiB) TX bytes:37628 (36.7 KiB)
Pour aller plus loin
Nous venons de configurer les accès à notre serveur et à ses VM.
Nous pouvons aller plus loin en se protégeant des attaques du grand internet grace à fail2ban