Comment nous prouvons que la porte est fermée avant le go-live.
Avant le go-live, nous prouvons que la porte est fermée : nous attaquons votre vrai origin depuis une machine hors réseau que le firewall n'a jamais appris à connaître, et nous voyons ce que voit un inconnu. Une porte fermée répond connection refused, pas une page de login.
Dans cet article 7 sections
- Avant chaque go-live, et après chaque changement en edge, nous posons une seule question : que voit réellement un inconnu sur internet ? Nous y répondons depuis une machine dans un autre de nos datacenters, sur une sortie que notre propre firewall n'a jamais appris à connaître.
- Nous trouvons le vrai origin comme le trouverait un attaquant (il fuit généralement dans le DNS de messagerie du domaine lui-même), nous épinglons chaque outil sur l'origin nu plutôt que sur le CDN, et nous relançons la batterie complète.
- Nous scannons les 65 535 ports depuis ce point hors réseau, pour pouvoir dire positivement ce qui est fermé. La correction durable verrouille l'origin sur les plages publiées du CDN, avec un vrai WAF de couche 7 et des listes de blocage partagées derrière.
- Et ensuite nous ne prenons pas la correction pour acquise. Nous réattaquons l'origin nu depuis l'extérieur, et une porte fermée répond connection refused, pas une page de login. C'est une preuve, pas une promesse.
La façon la plus courante dont se termine un travail de durcissement, c'est que quelqu'un change un réglage, rafraîchit la page, voit ce qu'il attendait, et passe à autre chose. C'est corriger et espérer. Cela prouve le symptôme que vous avez regardé. Cela ne prouve rien sur la porte. Ce qui suit est la méthode que nos ingénieurs appliquent à la place, avant tout go-live et après tout changement en edge. Elle a une seule règle directrice : chaque contrôle est lancé depuis l'extérieur, depuis un point qui ne reçoit aucune confiance particulière, parce que la seule question qui compte est ce qu'un inconnu sur internet peut réellement atteindre. Vous pourriez lancer la première moitié de ceci contre votre propre site ce soir. La raison de nous la confier, c'est qui lance toute la batterie, et depuis où.
h2 (#stranger-sees): La seule question qui compte : que voit réellement un inconnu ?
Nous lançons le scan depuis une machine dédiée dans un autre de nos datacenters, avec une IP de sortie que notre propre firewall n'a jamais appris à connaître. Elle n'a aucune entrée dans une liste d'autorisation, aucune exception, aucune courtoisie. Elle voit exactement ce que voit internet.
Cela ne fonctionne que si le point d'observation est réel et hors de votre périmètre de confiance, et c'est pourquoi c'est une machine dans un autre de nos propres datacenters, sur notre propre AS, pas un scanner loué. C'est la même raison pour laquelle posséder son réseau compte tout court. Plus à ce sujet dans vous ne possédez pas votre réseau.
Depuis ce point, trois choses cessent d'être des affirmations et deviennent des mesures. Si votre CDN est vraiment devant votre origin. Si les ports que vous croyez fermés sont fermés. Et, après une correction, si la porte que vous venez de fermer l'est vraiment. Le reste de ce texte est la façon dont nous lisons chacune d'elles.
h2 (#find-origin): Trouver le vrai origin comme le trouverait un attaquant
L'origin fuit généralement dans le DNS de messagerie du domaine lui-même, parce que l'enregistrement SPF qui autorise votre courrier nomme l'hôte même qui l'envoie. Une fois le vrai origin connu, vous épinglez le hostname directement dessus, pour que chaque outil frappe l'origin nu plutôt que le CDN, et vous relancez la batterie complète contre lui.
# the origin usually leaks in the domain's own mail DNS
scanner$ dig +short TXT origin.example # the SPF record often names the sending host
scanner$ dig +short MX origin.example
# pin the hostname straight to the origin so nothing touches the CDN
scanner$ curl --resolve origin.example:443:<origin-ip> https://origin.example/
# now re-run the full battery against the naked origin, not the edge
scanner$ <scan battery> --target <origin-ip>Ce que cela prouve est simple. Si l'origin répond au scan épinglé de la même façon que le hostname public, en servant les mêmes pages, le même formulaire de login, alors le CDN et le WAF devant lui sont contournés. Chaque requête qu'un attaquant veut envoyer peut passer à côté d'eux.
h2 (#all-ports): Scanner chaque port, puis dire ce qui est fermé
Depuis le point hors réseau, nous scannons les 65 535 ports.
# from the box on an egress the firewall doesn't trust: every port, not a shortlist
scanner$ <port-scanner> -p 1-65535 <origin-ip>Un scan de toute la surface n'est pas seulement un oui ou un non pour chaque port. Ce qui répond, et comment, prend l'empreinte de la machine. Trois indices reviennent.
a mismatched TLS cert on a production subnet -> a forgotten host, fingerprinted
an absurdly low firewall hit-count -> traffic isn't flowing the way you think
a DNS server answering REFUSED -> good: you are not an open resolverh2 (#firewall-not-waf): Un firewall n'est pas un WAF
La force brute sur le login est invisible en couche 3/4, donc la défense vit en edge, en couche 7.
Limiter le débit en edge, là où sont les logins
: Comptez les échecs de login par source au niveau HTTP, le seul endroit où ils sont visibles, et bannissez une source qui franchit la limite. Le firewall n'a jamais vu l'attaque. L'edge ne voit rien d'autre.
Monter au sous-réseau après deux coups
: Une seule adresse bannie se change trivialement. Après un second coup venant du même voisinage, le bannissement s'élargit au sous-réseau fautif, pour que l'attaquant ne puisse pas simplement se décaler d'une IP.
Nous disons la partie inconfortable à voix haute : un bannissement de sous-réseau peut attraper un utilisateur légitime qui a mal tapé son mot de passe deux fois depuis une adresse partagée, un NAT d'entreprise, un campus, un café. C'est un coût réel, pas une erreur d'arrondi. C'est pourquoi la règle est livrée avec une soupape documentée pour les IP partagées, pas comme un mur permanent.
h2 (#durable-fix): La correction durable : verrouiller l'origin sur le CDN, puis le réattaquer
La correction consiste à restreindre l'origin par firewall aux plages publiées du CDN. Puis la même sonde épinglée, depuis la même machine non approuvée :
# BEFORE: pin the naked origin, it serves the login page around the CDN
scanner$ curl --resolve origin.example:443:<origin-ip> https://origin.example/login
HTTP/1.1 200 OK # the origin answered. the CDN was bypassed.
# AFTER: origin firewalled to accept only the CDN's published ranges
scanner$ curl --resolve origin.example:443:<origin-ip> https://origin.example/login
curl: (7) Failed to connect to <origin-ip> port 443: Connection refusedDerrière le verrouillage de l'origin se trouve le vrai WAF de couche 7, celui qui inspecte les requêtes que le CDN transmet effectivement, et une liste de blocage partagée : un attaquant pris à sonder un client est banni chez tous, de sorte que la reconnaissance qui cartographie un site paie un péage sur chacun des autres.
h2 (#we-fix-you-fix): Ce que nous corrigeons, et ce que nous vous rendons
Quand l'audit trouve quelque chose, le travail se divise en deux colonnes. L'une est la nôtre, et nous la faisons dans la même session : durcir à l'edge de l'infrastructure, immédiatement. L'autre est dans votre application, et nous ne touchons pas à votre code. Nous vous remettons le constat exact, et nous le protégeons entre-temps pour que vous ne soyez pas exposé pendant que vous le corrigez.
| Ce que nous corrigeons dans la même session | Ce que nous vous remettons à corriger (protégé entre-temps) |
|---|---|
| Verrouiller l'origin sur les plages publiées du CDN | Mettre à jour ou retirer le plugin, le CMS ou l'application vulnérable |
| Mettre en place la défense anti force brute de couche 7 en edge | Renouveler les identifiants partagés ou par défaut |
| Restreindre par firewall les data stores exposés au réseau privé | Activer le MFA sur les comptes qui comptent |
| Supprimer les fuites d'informations au niveau du serveur web | Corriger l'exposition au niveau applicatif dans votre propre code |
h2 (#re-attack): Puis nous réattaquons, et nous prouvons que c'est fermé
Chaque correction ci-dessus se termine de la même façon : nous retournons sur la machine que le firewall n'a jamais appris à connaître, nous relançons la batterie qui a trouvé le problème, et nous confirmons que la même mesure revient maintenant fermée. L'origin épinglé renvoie connection refused. Le port qui répondait est éteint. Le constat que nous vous avons remis, une fois que vous l'avez fermé, nous refuse aussi.
La même posture, tournée vers la question de savoir si nous contrôlons seulement le réseau sur lequel voyage votre trafic, se trouve dans vous ne possédez pas votre réseau.
Réponses directes
Comment prouvez-vous qu'une correction de sécurité a vraiment fonctionné ?+
Nous ne faisons pas confiance au correctif. Nous réattaquons le vrai origin depuis une machine sur une sortie que notre firewall n'a jamais appris à connaître, pour qu'elle voie ce que voit internet. Si la porte est fermée, un scan épinglé de l'origin nu répond connection refused, pas une page de login. Dans ce cas, c'est une preuve, pas une promesse.
Comment un attaquant peut-il contourner un CDN ou un WAF et frapper directement l'origin ?+
L'origin fuit généralement dans le DNS de messagerie du domaine lui-même, parce que l'enregistrement SPF qui autorise votre courrier nomme l'hôte qui l'envoie. Avec la vraie adresse de l'origin, vous épinglez le hostname directement dessus pour que chaque outil frappe l'origin nu plutôt que le CDN. Si l'origin répond comme le hostname public, le CDN et le WAF sont contournés : ils ne sont efficaces que si l'origin leur est verrouillé. La correction durable consiste à restreindre l'origin par firewall au seul trafic venant des plages publiées du CDN, après quoi la même sonde obtient connection refused.
Comment vérifiez-vous qu'un port est vraiment fermé depuis l'extérieur ?+
Vous scannez les 65 535 ports depuis un point hors réseau, pas les quelques habituels, pour pouvoir affirmer positivement que tout ce que vous n'aviez pas l'intention d'exposer est fermé. Un scan complet fait aussi remonter des indices : un certificat TLS qui ne correspond pas prend l'empreinte d'un hôte oublié, un nombre d'impacts firewall absurdement bas signifie que le trafic ne circule pas comme vous le pensez, et un serveur DNS qui répond REFUSED confirme que vous n'êtes pas un résolveur ouvert.
Que corrigez-vous, et que devons-nous corriger nous-mêmes ?+
Dans la même session, nous durcissons à l'edge de l'infrastructure : verrouillage de l'origin sur les plages du CDN, défense anti force brute en edge, restriction par firewall des data stores exposés au réseau privé, et suppression des fuites d'informations au niveau du serveur web. Puis nous vous remettons le constat exact et nous le protégeons entre-temps : mise à jour ou retrait du plugin, CMS ou application vulnérable, renouvellement des identifiants partagés ou par défaut, activation du MFA, et correction de l'exposition au niveau applicatif dans votre propre code.
Nous ne fermerons pas simplement le ticket. Nous prouverons que la porte est fermée.
Parlez à un ingénieur qui réattaque votre origin depuis une machine que nous n'avons jamais mise en liste d'autorisation, et qui vous montre le connection refused qui prouve que la porte est fermée.
Parler à un ingénieurSi vous voulez la posture qui se trouve sous tout cela, elle commence par posséder le réseau depuis lequel vous êtes défendu : vous ne possédez pas votre réseau.
Vous êtes arrivé à la fin.
Mettez la lecture en pratique
Que faites-vous tourner ?
Parlez-nous de la charge de travail, du trafic et des exigences de reprise. Commencez par le configurateur de serveur, ou passez en revue les détails avec un ingénieur.
Écrit par les ingénieurs qui construisent et exploitent l'infrastructure qu'il décrit.Parler à un ingénieur
