magentix

Développeur backend indépendant Web, e-commerce, Open-Source, low-tech, indie-web, slow-web, SSG, accessibility, PHP, Python

Billets : Les règles iptables pour sécuriser au maximum un serveur Web


Les règles iptables pour sécuriser au maximum un serveur Web

Par Matthieu le 06/01/2020

Pour sécuriser un serveur Web, j'applique systèmatiquement le même comportement : bloquer l'ensemble du traffic sur tous les ports, sauf 80 (http) et 443 (https). Seuls quelques IPs sont autorisés à accéder au reste. Voici comment le mettre en place avec iptables.


Sur un serveur accessible à distance, les scans de port et les tentatives de connexion SSH sont légions. La solution la plus radicale est de tout bloquer, sauf les ports dont le serveur a besoin pour le ou les services qu'il propose.

Attention : il est indispensable pour un serveur distant (serveur dédié par exemple) d'autoriser l'accès SSH (port 22 par défaut) à plusieurs IPs fixes : la votre et des IPs de secours. Si vous ne disposez pas d'IP fixe ne bloquez pas l'accès à SSH et proposez le service sur un autre port que 22.

Configuration

On vérifie dans un premier temps qu'iptables est bien en place sur le serveur, si ce n'est pas le cas, on procède à l'installation :

sudo apt-get install iptables

Pour contrôler les règles en place, on utilise la commande suivante :

sudo iptables -L

Par défaut, le pare-feu accepte toutes les connexions.

Note : nous appliquons dans cet article uniquement des règles sur le traffic entrant (INPUT).

Règles du pare-feu

Le plus simple est d'écrire les règles souhaitées dans un fichier spécifique :

sudo nano /etc/iptables.custom.rules

Afin de bloquer le traffic sur l'ensemble des ports exceptés les 80, 443 et 22, nous utilisons les règles suivantes :

*filter

# Allow unlimited traffic on loopback
-A INPUT -i lo -j ACCEPT

# Allow ESTABLISHED and RELATED packets
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Allow traffic on specified ports (ex: web server)
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT # Comment for reject SSH connection

# Allow all for specified IPs (whitelist)
-A INPUT -s 123.123.123.123 -j ACCEPT
-A INPUT -s 456.456.456.456 -j ACCEPT

# Reject traffic other than for the rules mentioned above
-A INPUT -j DROP

COMMIT

N'oubliez pas de remplacer la whitelist par vos IPs.

# Allow all for specified IPs
-A INPUT -s 123.123.123.123 -j ACCEPT # Votre IP Fixe 1
-A INPUT -s 456.456.456.456 -j ACCEPT # Votre IP Fixe 2
# ...

Application

Une fois les règles écrites, il ne reste plus qu'à les appliquer :

sudo iptables-restore < /etc/iptables.custom.rules

On vérifie que les règles sont bien appliquées :

sudo iptables -L

Explications

Loopback

-A INPUT -i lo -j ACCEPT

Cette règle correspond au trafic loopback qui permet aux services de la machine de communiquer entre elles.

State

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

On autorise ici les connexions déjà établies.

Ports autorisés

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

On établie la liste de tous les ports pour lesquels on autorise le traffic. Vous pouvez adapter cette liste selon le type de service proposé par le serveur.

Whitelist

-A INPUT -s 123.123.123.123 -j ACCEPT
-A INPUT -s 456.456.456.456 -j ACCEPT

Liste des IPs depuis lesquels l'accès à l'ensemble du serveur est autorisé. Si vous souhaitez bloquer l'accès SSH, assurez vous que cette liste d'IPs soit valide, au risque de ne plus pouvoir accéder au serveur.

Drop

-A INPUT -j DROP

On rejette tout le reste.

Réinitialisation

Si vous souhaitez restaurer les règles par défaut (ACCEPT), utilisez la commande suivante :

sudo iptables -F

Une question ? Rejoignez-moi sur le Fédivers :
@magentix@magentix.space