Le filtrage réseau du cloud repose sur deux objets qui se ressemblent et ne fonctionnent pas pareil : le groupe de sécurité, attaché aux machines, et la liste de contrôle réseau, attachée au sous-réseau. Confondre les deux fait perdre des heures, parce qu'une règle écrite au mauvais endroit ne produit aucune erreur, seulement un silence. Cette page explique la différence, la politique par défaut à adopter, et l'erreur qui expose encore aujourd'hui des milliers de serveurs. Le lab se rejoue sans compte cloud.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Distinguer un filtrage à état d'un filtrage sans état, et savoir lequel vous utilisez.
- Écrire des règles qui n'ouvrent que ce qui doit l'être.
- Référencer un groupe depuis un autre, la technique qui remplace les listes d'adresses.
- Reconnaître la règle SSH ouverte au monde, et ce qu'elle coûte réellement.
- Diagnostiquer un blocage sans passer une heure sur le mauvais objet.
Prérequis
Section intitulée « Prérequis »Les leçons sur le réseau privé et ses sous-réseaux et sur les tables de routage.
Deux objets, deux comportements
Section intitulée « Deux objets, deux comportements »Le groupe de sécurité se souvient des connexions, la liste de contrôle réseau ne se souvient de rien. Cette phrase résume la seule différence qui compte au quotidien, et elle a des conséquences très concrètes.
| Groupe de sécurité | Liste de contrôle réseau | |
|---|---|---|
| S'attache à | l'interface d'une machine | un sous-réseau entier |
| Mémoire des connexions | oui, il est à état | non, il est sans état |
| Règles de refus explicites | non, tout ce qui n'est pas autorisé est refusé | oui, l'ordre des règles compte |
| Portée | quelques machines | tout ce qui entre et sort du sous-réseau |
Ce que « à état » change en pratique : quand vous autorisez le trafic entrant sur le port 443, le groupe de sécurité laisse automatiquement repartir la réponse. Vous n'écrivez qu'une règle. Avec une liste de contrôle réseau, il faut deux règles, une pour l'aller et une pour le retour, sur les ports éphémères que le client a choisis. C'est la source classique du « ça marche dans un sens seulement ».
Lequel utiliser ? Le groupe de sécurité, dans la quasi-totalité des cas. La liste de contrôle réseau sert à poser un garde-fou large à l'échelle d'un sous-réseau, par exemple bloquer une plage d'adresses malveillantes pour tout le monde d'un coup. Commencez par les groupes, ajoutez des listes seulement quand vous avez un besoin qu'ils ne couvrent pas.
Refuser par défaut, autoriser par exception
Section intitulée « Refuser par défaut, autoriser par exception »La politique par défaut du trafic entrant doit être « refuser ». C'est le réglage qui décide si votre sécurité repose sur ce que vous avez pensé à interdire, ou sur ce que vous avez explicitement autorisé. Seule la seconde approche tient dans la durée.
La raison est simple à formuler : vous ne pouvez pas énumérer tout ce qui est dangereux, alors que vous pouvez énumérer ce dont votre application a besoin. Un serveur web a besoin des ports 443 et éventuellement 80. Tout le reste, y compris le port d'administration de la base de données qu'un collègue installera dans six mois, doit être refusé sans que personne ait à y penser.
Pour le trafic sortant, l'arbitrage est différent. Le refus par défaut en sortie est plus sûr, et considérablement plus pénible : chaque mise à jour de paquets, chaque appel d'API externe, chaque résolution DNS demande une règle. Commencez par autoriser la sortie, et durcissez-la sur les machines qui traitent des données sensibles, une fois que vous savez précisément ce qu'elles contactent.
Référencer un groupe plutôt qu'une plage
Section intitulée « Référencer un groupe plutôt qu'une plage »La technique la plus utile de tout ce chapitre : une règle peut autoriser un autre groupe de sécurité, au lieu d'une plage d'adresses. Elle est peu connue des débutants et change la façon de concevoir.
Prenons trois étages, un répartiteur de charge, des serveurs applicatifs, une
base de données. La version naïve consiste à autoriser, sur la base, la plage
10.20.2.0/24 du sous-réseau applicatif. Elle fonctionne, et elle a deux
défauts : elle autorise toute machine du sous-réseau, y compris celles qui
n'ont rien à voir, et elle casse le jour où l'on ajoute un sous-réseau.
La version par référence dit : « la base accepte le port 5432 depuis le groupe de sécurité applicatif ». Une machine qui rejoint ce groupe obtient l'accès, une machine qui le quitte le perd, quelle que soit son adresse. La règle décrit un rôle, pas une topologie, et elle survit aux réorganisations d'adressage.
| Approche | Règle sur la base | Ce qui se passe si l'on ajoute un sous-réseau |
|---|---|---|
| Par plage | autoriser 10.20.2.0/24 sur 5432 | il faut penser à ajouter la nouvelle plage |
| Par référence | autoriser le groupe app sur 5432 | rien à faire, l'appartenance suffit |
Lab : écrire des règles, sans compte cloud
Section intitulée « Lab : écrire des règles, sans compte cloud »-
Préparer l'environnement
Fenêtre de terminal feint servePuis, dans un second terminal :
Fenêtre de terminal eval "$(feint env scaleway)" -
Créer un groupe qui refuse tout en entrée
Fenêtre de terminal scw instance security-group create name=lab-web description="front web" \inbound-default-policy=drop outbound-default-policy=acceptID adb022cd-c024-42f8-97a3-305f9ec0ac44Name lab-webInboundDefaultPolicy dropOutboundDefaultPolicy acceptLes deux politiques par défaut sont posées dès la création : refus en entrée, autorisation en sortie. C'est le réglage recommandé plus haut.
-
Ouvrir uniquement HTTPS
Fenêtre de terminal scw instance security-group create-rule security-group-id=<ID_DU_GROUPE> \protocol=TCP direction=inbound action=accept ip-range=0.0.0.0/0 dest-port-from=443Protocol TCPDirection inboundAction acceptIPRange 0.0.0.0/0DestPortFrom 443Position 1Ici,
0.0.0.0/0est légitime : un site web public doit être joignable de partout. C'est sur le port 22 que la même plage devient un problème. -
Restreindre l'administration à un réseau connu
Fenêtre de terminal scw instance security-group create-rule security-group-id=<ID_DU_GROUPE> \protocol=TCP direction=inbound action=accept ip-range=10.20.1.0/24 dest-port-from=22IPRange 10.20.1.0/24DestPortFrom 22Position 2Comparez les deux champs
IPRange. La différence entre une bonne et une mauvaise configuration tient dans cette seule valeur. -
Relire l'ordre des règles
Fenêtre de terminal scw instance security-group list-rules <ID_DU_GROUPE>Le champ
Positiondonne l'ordre d'évaluation. Il compte dès qu'une règle de refus explicite entre en jeu.
Diagnostiquer un blocage
Section intitulée « Diagnostiquer un blocage »Quand un flux ne passe pas, testez dans l'ordre du chemin, pas dans l'ordre de vos soupçons. Le chemin va de la route au filtrage, puis à l'application.
-
La route existe-t-elle ? Sans route, aucun filtrage n'entre en jeu. Voir la leçon précédente.
-
Le port écoute-t-il vraiment ? Sur la machine cible :
Fenêtre de terminal ss -tlnpUn service qui n'écoute que sur
127.0.0.1ne répondra jamais à personne, et aucune règle de pare-feu n'y changera rien. C'est une cause bien plus fréquente qu'on ne le croit. -
Le filtrage laisse-t-il passer ? Depuis une machine autorisée :
Fenêtre de terminal nc -zv 10.20.2.10 5432Une réponse immédiate de refus signale généralement que rien n'écoute ; un silence qui dure jusqu'au délai d'attente signale plutôt un filtrage.
Cette distinction entre refus immédiat et silence est le meilleur indice dont vous disposez. Un pare-feu qui jette les paquets ne répond rien, là où une machine sans service écoute répond tout de suite qu'il n'y a personne.
À retenir
Section intitulée « À retenir »- Le groupe de sécurité est à état : une règle entrante suffit, la réponse repart seule. La liste de contrôle réseau demande les deux sens.
- Le groupe s'attache à la machine, la liste au sous-réseau. Une règle écrite au mauvais endroit ne produit aucune erreur, juste un silence.
- Refusez tout en entrée par défaut, et n'ouvrez que ce dont l'application a besoin.
- Autorisez la sortie au départ, durcissez-la ensuite sur ce qui traite des données sensibles.
0.0.0.0/0sur le port 22 est la règle la plus dangereuse du cloud. Un rebond, un accès par le fournisseur ou une plage restreinte font mieux.- Référencez un groupe plutôt qu'une plage : la règle décrit alors un rôle, et survit aux changements d'adressage.
- Refus immédiat ou silence : cet indice sépare une panne de service d'un blocage de pare-feu.