Sécuriser son serveur dédié proxmox avec iptables

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

[pastacode lang= »bash » manual= »%23%20Vider%20les%20tables%20actuelles%0Aiptables%20-t%20filter%20-F%0A%0A%23%20Vider%20les%20r%C3%B4les%20personnelles%0Aiptables%20-t%20filter%20-X%0A%0A%23%20Interdire%20toute%20connexion%20entrante%20et%20sortante%0Aiptables%20-t%20filter%20-P%20INPUT%20DROP%0Aiptables%20-t%20filter%20-P%20FORWARD%20DROP%0Aiptables%20-t%20filter%20-P%20OUTPUT%20DROP%0A%0A%23%20—%0A%0A%23%20Ne%20pas%20casser%20les%20connexions%20etablies%0Aiptables%20-A%20INPUT%20-m%20state%20–state%20RELATED%2CESTABLISHED%20-j%20ACCEPT%0Aiptables%20-A%20OUTPUT%20-m%20state%20–state%20RELATED%2CESTABLISHED%20-j%20ACCEPT%0A%0A%23%20Autoriser%20loopback%0Aiptables%20-t%20filter%20-A%20INPUT%20-i%20lo%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-o%20lo%20-j%20ACCEPT%0A%0A%23%20ICMP%20(Ping)%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20icmp%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20icmp%20-j%20ACCEPT%0A%0A%23%20—%0A%0A%23%20Autoriser%20les%20connexion%20ssh%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20tcp%20–dport%2022%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20tcp%20–dport%2022%20-j%20ACCEPT%0A%0A%23%20DNS%20In%2FOut%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20tcp%20–dport%2053%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20udp%20–dport%2053%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20tcp%20–dport%2053%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20udp%20–dport%2053%20-j%20ACCEPT%0A%0A%23%20NTP%20Out%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20udp%20–dport%20123%20-j%20ACCEPT%0A%0A%23%20Autoriser%20les%20connexions%20HTTP%20%2B%20HTTPS%20%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20tcp%20–dport%2080%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20tcp%20–dport%20443%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20tcp%20–dport%2080%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20tcp%20–dport%20443%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20tcp%20–dport%208443%20-j%20ACCEPT%0A%0A%23%20Autoriser%20les%20connexions%20%C3%A0%20l’interface%20Proxmox%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20tcp%20–dport%208006%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20tcp%20–dport%208006%20-j%20ACCEPT%0A%0A%23%20Autoriser%20les%20connexions%20FTP%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20tcp%20–dport%2020%3A21%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20tcp%20–dport%2020%3A21%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20INPUT%20-m%20state%20–state%20ESTABLISHED%2CRELATED%20-j%20ACCEPT%0A%0A%23%20Autoriser%20les%20connexions%20au%20serveur%20Mail%20SMTP%3A25%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20tcp%20–dport%2025%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20tcp%20–dport%2025%20-j%20ACCEPT%0A%0A%23%20Autoriser%20les%20connexions%20au%20serveur%20Mail%20POP3%3A110%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20tcp%20–dport%20110%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20tcp%20–dport%20110%20-j%20ACCEPT%0A%0A%23%20Autoriser%20les%20connexions%20au%20serveur%20Mail%20IMAP%3A143%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20tcp%20–dport%20143%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20tcp%20–dport%20143%20-j%20ACCEPT%0A%0A%23%20Autoriser%20les%20connexions%20au%20serveur%20Mail%20POP3S%3A995%0Aiptables%20-t%20filter%20-A%20INPUT%20-p%20tcp%20–dport%20995%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20OUTPUT%20-p%20tcp%20–dport%20995%20-j%20ACCEPT%0A%0A%23%20Protection%20contre%20les%20flood%0Aiptables%20-A%20FORWARD%20-p%20tcp%20–syn%20-m%20limit%20–limit%201%2Fsecond%20-j%20ACCEPT » message= » » highlight= » » provider= »manual »/]

 

Installation des outils complémentaires

iptables-persistent

Installation de iptables-persistent

[pastacode lang= »bash » manual= »apt-get%20install%20iptables-persistent » message= » » highlight= » » provider= »manual »/]

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

[pastacode lang= »bash » manual= »service%20netfilter-persistent%20start%0A » message= » » highlight= » » provider= »manual »/]

Sauvegarde des règles iptables de base

[pastacode lang= »bash » manual= »iptables-save%20%3E%20%2Fetc%2Fiptables%2Frules.v4%0Aservice%20netfilter-persistent%20restart%0A » message= » » highlight= » » provider= »manual »/]

 

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 :

[pastacode lang= »bash » manual= »vmbr0%20%20%20%20%20Link%20encap%3AEthernet%20%20HWaddr%2014%3A18%3A77%3A5f%3A0c%3Ad2%0A%20%20%20%20%20%20%20%20%20%20inet%20addr%3AWWW.XXX.YYY.ZZZ%20%20Bcast%3AWWW.XXX.YYY.255%20%20Mask%3A255.255.255.0%0A%20%20%20%20%20%20%20%20%20%20inet6%20addr%3A%20%0A%20Scope%3ALink%0A%20%20%20%20%20%20%20%20%20%20UP%20BROADCAST%20RUNNING%20MULTICAST%20%20MTU%3A1500%20%20Metric%3A1%0A%20%20%20%20%20%20%20%20%20%20RX%20packets%3A17080091%20errors%3A0%20dropped%3A4173%20overruns%3A0%20frame%3A0%0A%20%20%20%20%20%20%20%20%20%20TX%20packets%3A3969016%20errors%3A0%20dropped%3A0%20overruns%3A0%20carrier%3A0%0A%20%20%20%20%20%20%20%20%20%20collisions%3A0%20txqueuelen%3A1000%0A%20%20%20%20%20%20%20%20%20%20RX%20bytes%3A3780244041%20(3.5%20GiB)%20%20TX%20bytes%3A3224313133%20(3.0%20GiB)%0A » message= » » highlight= » » provider= »manual »/]

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.

[pastacode lang= »bash » manual= »auto%20vmbr1%0Aiface%20vmbr1%20inet%20static%0A%20%20%20%20%20%20%20%20address%20%20192.168.122.1%0A%20%20%20%20%20%20%20%20netmask%20%20255.255.255.0%0A%20%20%20%20%20%20%20%20bridge_ports%20none%0A%20%20%20%20%20%20%20%20bridge_stp%20off%0A%20%20%20%20%20%20%20%20bridge_fd%200%0A » message= » » highlight= » » provider= »manual »/]

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.

[pastacode lang= »bash » manual= »ifup%20vmbr1%0A%0AWaiting%20for%20vmbr1%20to%20get%20ready%20(MAXWAIT%20is%202%20seconds).%0A » message= » » highlight= » » provider= »manual »/]

Comme nous avons autorisé ICMP dans iptables, nous pouvons donc faire un ping sur notre nouvelle interface pour en vérifier son bon fonctionnement

[pastacode lang= »bash » manual= »ping%20192.168.122.1%0APING%20192.168.122.1%20(192.168.122.1)%2056(84)%20bytes%20of%20data.%0A64%20bytes%20from%20192.168.122.1%3A%20icmp_seq%3D1%20ttl%3D64%20time%3D0.031%20ms%0A64%20bytes%20from%20192.168.122.1%3A%20icmp_seq%3D2%20ttl%3D64%20time%3D0.039%20ms%0A64%20bytes%20from%20192.168.122.1%3A%20icmp_seq%3D3%20ttl%3D64%20time%3D0.045%20ms%0A%5EC%0A—%20192.168.122.1%20ping%20statistics%20—%0A3%20packets%20transmitted%2C%203%20received%2C%200%25%20packet%20loss%2C%20time%201998ms%0Artt%20min%2Favg%2Fmax%2Fmdev%20%3D%200.031%2F0.038%2F0.045%2F0.007%20ms%0A » message= » » highlight= » » provider= »manual »/]

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

[pastacode lang= »bash » manual= »iptables%20-t%20filter%20-A%20INPUT%20-i%20vmbr0%20-j%20ACCEPT%0Aiptables%20-t%20filter%20-A%20FORWARD%20-i%20vmbr0%20-j%20ACCEPT » message= » » highlight= » » provider= »manual »/]

Etape 2 : on fait du masquerade sur les interfaces et la plage d’adresse locale :

[pastacode lang= »bash » manual= »iptables%20-t%20nat%20-A%20POSTROUTING%20-o%20vmbr0%20-j%20MASQUERADE%0Aiptables%20-t%20nat%20-A%20POSTROUTING%20-o%20vmbr1%20-j%20MASQUERADE%0Aiptables%20-t%20nat%20-A%20POSTROUTING%20-s%20192.168.122.0%2F32%20-o%20vmbr0%20-j%20MASQUERADE » message= » » highlight= » » provider= »manual »/]

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

  1. Nous devons avoir un port ssh dédié pour chaque VM
  2. Le port dédié sera redirigé vers le port ssh de la VM
  3. Le port ssh de la VM devra répondre sur le port dédié du serveur hôte
  4. L’ip publique devra être « natée » vers l’ip locale de la VM
  5. Pour des raisons de commodité la plage réelle des VM commencera à 100 (La raison principale est ci-dessous).
  6. 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.

[pastacode lang= »bash » manual= »iptables%20-t%20filter%20-A%20FORWARD%20-d%20192.168.122.100%2F32%20-p%20tcp%20-m%20tcp%20–dport%2022%20-m%20state%20–state%20NEW%20-j%20ACCEPT » message= » » highlight= » » provider= »manual »/]

 

Etape 2 : on redirige le port ssh et l’ip public vers le port ssh et l’ip locale de la VM

[pastacode lang= »bash » manual= »iptables%20-t%20nat%20-A%20PREROUTING%20-d%20XXX.XXX.XXX.XXX%2F32%20-p%20tcp%20-m%20tcp%20–dport%2010022%20-j%20DNAT%20–to-destination%20192.168.122.100%3A22″ message= » » highlight= » » provider= »manual »/]

Etape 4 : On sauve les règles dans iptables-persistent

[pastacode lang= »bash » manual= »iptables-save%20%3E%20%2Fetc%2Fiptables%2Frules.v4%0Aservice%20netfilter-persistent%20restart » message= » » highlight= » » provider= »manual »/]

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

[pastacode lang= »bash » manual= »ifconfig%20eth1%0Aeth1%20%20%20%20%20%20Link%20encap%3AEthernet%20%20HWaddr%2022%3A72%3A12%3A40%3ABE%3AE0%0A%20%20%20%20%20%20%20%20%20%20inet%20addr%3A192.168.122.100%20%20Bcast%3A192.168.122.255%20%20Mask%3A255.255.255.0%0A%20%20%20%20%20%20%20%20%20%20inet6%20addr%3A%20fe80%3A%3A2072%3A12ff%3Afe40%3Abee0%2F64%20Scope%3ALink%0A%20%20%20%20%20%20%20%20%20%20UP%20BROADCAST%20RUNNING%20MULTICAST%20%20MTU%3A1500%20%20Metric%3A1%0A%20%20%20%20%20%20%20%20%20%20RX%20packets%3A326%20errors%3A7%20dropped%3A0%20overruns%3A0%20frame%3A7%0A%20%20%20%20%20%20%20%20%20%20TX%20packets%3A320%20errors%3A0%20dropped%3A0%20overruns%3A0%20carrier%3A0%0A%20%20%20%20%20%20%20%20%20%20collisions%3A0%20txqueuelen%3A1000%0A%20%20%20%20%20%20%20%20%20%20RX%20bytes%3A36856%20(35.9%20KiB)%20%20TX%20bytes%3A37628%20(36.7%20KiB)%0A » message= » » highlight= » » provider= »manual »/]

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *