Aller au contenu
English
Cloud high

Sécurité réseau : Security Groups, NACL et pare-feu cloud

12 min de lecture

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.

  • 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.

Les leçons sur le réseau privé et ses sous-réseaux et sur les tables de routage.

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 machineun sous-réseau entier
Mémoire des connexionsoui, il est à étatnon, il est sans état
Règles de refus explicitesnon, tout ce qui n'est pas autorisé est refuséoui, l'ordre des règles compte
Portéequelques machinestout 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.

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.

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.

ApprocheRègle sur la baseCe qui se passe si l'on ajoute un sous-réseau
Par plageautoriser 10.20.2.0/24 sur 5432il faut penser à ajouter la nouvelle plage
Par référenceautoriser le groupe app sur 5432rien à faire, l'appartenance suffit
  1. Préparer l'environnement

    Fenêtre de terminal
    feint serve

    Puis, dans un second terminal :

    Fenêtre de terminal
    eval "$(feint env scaleway)"
  2. 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=accept
    ID adb022cd-c024-42f8-97a3-305f9ec0ac44
    Name lab-web
    InboundDefaultPolicy drop
    OutboundDefaultPolicy accept

    Les 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.

  3. 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=443
    Protocol TCP
    Direction inbound
    Action accept
    IPRange 0.0.0.0/0
    DestPortFrom 443
    Position 1

    Ici, 0.0.0.0/0 est 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.

  4. 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=22
    IPRange 10.20.1.0/24
    DestPortFrom 22
    Position 2

    Comparez les deux champs IPRange. La différence entre une bonne et une mauvaise configuration tient dans cette seule valeur.

  5. Relire l'ordre des règles

    Fenêtre de terminal
    scw instance security-group list-rules <ID_DU_GROUPE>

    Le champ Position donne l'ordre d'évaluation. Il compte dès qu'une règle de refus explicite entre en jeu.

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.

  1. La route existe-t-elle ? Sans route, aucun filtrage n'entre en jeu. Voir la leçon précédente.

  2. Le port écoute-t-il vraiment ? Sur la machine cible :

    Fenêtre de terminal
    ss -tlnp

    Un service qui n'écoute que sur 127.0.0.1 ne 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.

  3. Le filtrage laisse-t-il passer ? Depuis une machine autorisée :

    Fenêtre de terminal
    nc -zv 10.20.2.10 5432

    Une 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.

  • 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/0 sur 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.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn