Cinquième partie du tutoriel sur la virtualisation « Xen et OpenVswitch sont dans une Debian« .
Dans la partie précédente, nous avons mis en place notre réseau de trois VMs et configuré le tout.
Nous allons maintenant nous occuper de mettre en place les firewalls sur les deux machines exposées au net : le Dom0 et le routeur.
Ce n’est pas un cours magistral sur Netfilter (iptable étant la ligne de commande qui permet de modifier la configuration de ce dernier). Il y a de très bon tuto trouvable à ce sujet sur le net.
Pour résumer brièvement, on va principalement utiliser les table FILTER (qui sert à … filtrer) et NAT qui sert elle à faire de la translation d’adresse.
Ensuite, au niveau des chaines, on trouvera surtout INPUT et OUTPUT qui sont liés au process du system sur lequel netfilter tourne. FORWARD elle, concerne les paquets qui transitent d’une interface à une autre.
Ensuite, je vais détailler un maximum les commandes, et je pense qu’avec cela, vous devriez comprendre le fonctionnement.
I – DOM0
Au niveau de l’hyperviseur, on veut simplement tout bloquer, puis ensuite, autoriser le ssh et quelques autres requêtes.
On va créer un fichier /root/scripts/firewall, et le remplir de la sorte :
Tout d’abord, on purge tout dans les tables filter et nat :
#!/bin/bash # PURGE iptables -t filter -F iptables -t filter -X iptables -t nat -F iptables -t nat -X
Ensuite, on interdit tout. En effet, par défaut, la politique est de tout autoriser, ce qui n’est, vous en conviendrez, pas forcement très sécurisant.
# ON BLOQUE TOUT iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD DROP iptables -t filter -P OUTPUT DROP
A ce niveau, plus rien ne passe. On va donc commencer par autoriser ce qu’on désire. A savoir le loopback (le fameux 127.0.0.1; les pings sortants et entrant ainsi que les connexions déjà établies et les retours (Netfilter interprétant les règles dans l’ordre, plus tôt sont ces règles, mieux c’est pour la rapidité de traitement.)
# LOOPBACK OK iptables -t filter -A INPUT -i lo -j ACCEPT iptables -t filter -A OUTPUT -o lo -j ACCEPT # PING IN ET OUT OK iptables -t filter -A INPUT -p icmp -j ACCEPT iptables -t filter -A OUTPUT -p icmp -j ACCEPT # Autoriser les connexions déjà effectuées et les retours. iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Ensuite, on va autoriser en entré le port 23 (notre port SSH), puis en sortie les ports DNS, HTTPS, HTTPS et NTP :
# Autoriser le port 23 en entrée iptables -t filter -A INPUT -p tcp --dport 23 -j ACCEPT # Autoriser le dom0 a faire des requêtes DNS, HTTP, NTP 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 OUTPUT -p tcp --dport 53 -j ACCEPT iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 123 -j ACCEPT
On va également autoriser en entrée le port ntp, uniquement depuis les VMs (-s 10.99.1.0/24, ce qui veut dire, qui a pour source ce réseau) afin qu’elles puissent se mettre à l’heure et également le port ssh en sortie uniquement vers les VMs (-d 10.99.1.0/24, ce qui veut dire, qui a pour destination ce réseau) :
# Autoriser les Domus a demander le ntp iptables -t filter -A INPUT -p udp -s 10.99.1.0/24 --dport 123 -j ACCEPT iptables -t filter -A INPUT -p tcp -s 10.99.1.0/24 --dport 123 -j ACCEPT # Autoriser le ssh depuis le dom0 vers les domus iptables -t filter -A OUTPUT -d 10.99.1.0/24 -p tcp --dport 22 -j ACCEPT echo - OK
Puis on le rend exécutable :
dom0# chmod +x /root/scripts/firewall
Et nous allons en faire un service :
Créez un fichier /etc/systemd/system/firewall.service et mettez ce qui suit :
[Unit] Description=Route After=network-online.target [Service] Type=oneshot ExecStart=/root/scripts/firewall [Install] WantedBy=multi-user.target
Puis :
dom0# systemctl enable firewall.service
Pour l’activer de suite :
dom0# systemctl start firewall
On peut vérifier le bon déroulement avec :
dom0# : systemctl status firewall
Ce qui doit retourner :
● firewall.service - Firewall Loaded: loaded (/etc/systemd/system/firewall.service; enabled; vendor preset: enabled) Active: inactive (dead) since Mon 2018-04-09 13:22:11 CEST; 1min 57s ago Process: 31758 ExecStart=/root/scripts/firewall (code=exited, status=0/SUCCESS) Main PID: 31758 (code=exited, status=0/SUCCESS) Apr 09 13:22:11 d systemd[1]: Starting Firewall... Apr 09 13:22:11 d systemd[1]: Started Firewall.
Ici, c’est le SUCCESS qui nous indique que tout s’est déroulé sans accrocs.
II – VM Routeur
Sur le routeur, on va trouver la même base, mais on va y rajouter également les premières règles de NAT. Ce fichier sera régulièrement retouché durant le tutoriel en fonction des services que l’on met en place, etc…
dom0# ssh 10.99.1.2
Dans un fichier /root/scripts/firewall, mettez cela :
#!/bin/bash # On purge iptables -t filter -F iptables -t filter -X iptables -t nat -F iptables -t nat -X # Interdire toute connexion entrante, sortante ou forwardée iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD DROP iptables -t filter -P OUTPUT DROP # Autoriser les connexions deja effectuées et les retours iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -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 # Autoriser ping iptables -t filter -A INPUT -p icmp -j ACCEPT iptables -t filter -A OUTPUT -p icmp -j ACCEPT
Maintenant, on autoriser le ssh sur le routeur depuis l’hyperviseur :
# SSH // DOM0 -> ROUTEUR iptables -t filter -A INPUT -p tcp -s 10.99.1.1 --dport 22 -j ACCEPT
On autoriser le routeur à faire du DNS, HTTP, HTTPS et NTP :
# DNS // ROUTEUR -> EXT iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT # HTTP/HTTPS // ROUTEUR -> EXT iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT # NTP // ROUTEUR -> DOM0 iptables -t filter -A OUTPUT -p udp -d 10.99.1.1 --dport 123 -j ACCEPT
Ensuite, on va passer aux règles qui concernent ce qui vient de l’extérieur vers nos VMS. Dans un premier temps, redirection du HTTP et du HTTPS vers notre reverse proxy (on modifie l’adresse de destination (Ip de la VM proxy) des paquets pour les ports 80 et 433 (PREROUTING) puis on autorise leur FORWARD.
# -> VM PROXY : HTTP ET HTTPS iptables -t nat -A PREROUTING -i eth0 -d IP_FAILOVER -p tcp --dport 80 -j DNAT --to-destination 10.10.1.10 iptables -t nat -A PREROUTING -i eth0 -d IP_FAILOVER -p tcp --dport 443 -j DNAT --to-destination 10.10.1.10 iptables -t filter -A FORWARD -p tcp -d 10.10.1.10 --dport 80 -j ACCEPT iptables -t filter -A FORWARD -p tcp -d 10.10.1.10 --dport 443 -j ACCEPT
Ensuite, les règles concernant ce qui vient des VMS et qui va vers l’extérieur (ces règles seront nettement modifiées par la suite, à la mise en place du DNS, du proxy interne, etc…)
En premier, l’IDS :
# REGLE IDS # PING iptables -t filter -A FORWARD -p icmp -s 10.2.1.3 -j ACCEPT # DNS iptables -t filter -A FORWARD -p udp -s 10.2.1.3 --dport 53 -j ACCEPT # HTTP ET HTTPS iptables -t filter -A FORWARD -p tcp -s 10.2.1.3 --dport 80 -j ACCEPT iptables -t filter -A FORWARD -p tcp -s 10.2.1.3 --dport 443 -j ACCEPT
Ensuite, le proxy :
# PROXY # PING iptables -t filter -A FORWARD -p icmp -s 10.10.1.10 -j ACCEPT # DNS iptables -t filter -A FORWARD -p udp -s 10.10.1.10 --dport 53 -j ACCEPT # HTTP ET HTTPS iptables -t filter -A FORWARD -p tcp -s 10.10.1.10 --dport 80 -j ACCEPT iptables -t filter -A FORWARD -p tcp -s 10.10.1.10 --dport 443 -j ACCEPT
Et on termine par les règles de POSTROUTING (changement de l’adresse de départ des paquets (afin qu’ils puissent revenir sans encombre vers nous)
######################################## # POSTROUTING DES IPS 10.2.1.3, 10.10.1.10, 10.10.1.11 POUR LES PAQUETS SORTANT PAR ETH0 iptables -t nat -A POSTROUTING -o eth0 -s 10.2.1.3 -j SNAT --to 212.83.179.33 iptables -t nat -A POSTROUTING -o eth0 -s 10.10.1.10 -j SNAT --to 212.83.179.33 echo - OK
Puis, comme pour le Dom0, on va créer un service :
Créez un fichier /etc/systemd/system/firewall.service et mettez ce qui suit :
[Unit] Description=Route After=network-online.target [Service] Type=oneshot ExecStart=/root/scripts/firewall [Install] WantedBy=multi-user.target
Puis :
dom0# systemctl enable firewall.service
Pour l’activer de suite :
dom0# systemctl start firewall
On pourrait s’attarder aussi sur les autres VMs, mais ce n’est pas une priorité. On va déjà mettre en place nos différents services.
De plus, ces deux Firewalls seront retouchés. On reviendra donc la dessus plus tard, mais on a déjà une protection basique en place.
Nous allons passer à la dernière étape « préparatoire », la mise en place d’un nouveau VLAN.
Dans la partie VM Routeur, il faut ajout le droit d’exécution au fichier firewall avant de créer le service
chmod +x /root/scripts/firewall