Chargement de Smiley Hoster
Aller au contenu

Administrer vos serveurs en Zero Trust sans exposer SSH sur Internet

Équipe Smiley Hoster · · 6 min de lecture
Deux panneaux opposent un port 22 public barré et un accès validé par une identité.

Le déploiement NetBird présenté par Vultr illustre l'intérêt des réseaux privés pilotés par identité. Pour un serveur existant, le résultat à prouver reste concret : un administrateur autorisé entre, un compte révoqué échoue et Internet ne peut plus joindre directement SSH.

1. Choisir le chemin et préparer le secours

ApprocheIntérêtPoint à contrôler
VPNRéseau privé pour plusieurs protocolesNe pas donner accès à tout le réseau
BastionPoint d'entrée SSH centralDurcissement, disponibilité et comptes du bastion
Tunnel sortantPas de port entrant requis sur l'origineDisponibilité du connecteur et du fournisseur
Accès Zero TrustDécision par identité et politiqueMFA, portée des droits et révocation effective

Un VPN ou un bastion peut participer à une architecture Zero Trust ; son installation seule ne la constitue pas. Ici, le flux retenu est client SSH → Cloudflare Access et fournisseur d'identité → tunnel sortant → cloudflared local → sshd. L'identité Access et le compte Unix restent deux contrôles distincts.

Prérequis : domaine administré dans Cloudflare, droits de configuration Access/Tunnel, cloudflared installé sur client et serveur, clés SSH nominatives, sudo et console hors bande testée. Le serveur de l'exemple utilise UFW déjà actif. N'appliquez pas sa partie pare-feu à une autre pile sans adaptation.

Exemple
sudo ss -lntpsudo sshd -tsudo ufw status verbosesudo ufw status numberedsudo systemctl status ssh --no-pager

Repérez toutes les ouvertures de 22, y compris profils OpenSSH, groupes cloud, NAT, IPv6 et règles générales. Notez l'adresse publique réelle et le chemin de secours. Gardez la session actuelle ouverte ; une session existante ne prouve pas qu'une nouvelle connexion fonctionnera.

2. Tester le tunnel avant de retirer l'entrée publique

  1. Créez d'abord une application Access pour le nom choisi, par exemple ssh.example.com. Autorisez uniquement le groupe d'administration prévu. Configurez le SSO et imposez MFA dans la politique ou l'IdP selon les capacités de votre offre ; n'ajoutez pas de règle Bypass générale.
  2. Créez le tunnel depuis le tableau de bord et installez son connecteur comme service sur le serveur. Le jeton d'installation est un secret : ne le mettez ni dans Git ni dans une capture d'écran.
  3. Ajoutez une route d'application publiée de type SSH vers localhost:22. Cette destination suppose que cloudflared et sshd résident sur le même hôte. Maintenez les sorties réseau nécessaires au connecteur.
  4. Vérifiez que la protection Access couvre exactement ce nom. Côté client, ajoutez à votre configuration SSH :
Exemple
Host shop-admin HostName ssh.example.com User deploy IdentityFile ~/.ssh/id_ed25519 IdentitiesOnly yes ProxyCommand cloudflared access ssh --hostname %h

Vérifiez que cloudflared est dans le PATH du client. Remplacez le domaine et le compte, puis ouvrez une nouvelle session :

Exemple
ssh shop-admin

Le navigateur demande l'authentification auprès de l'IdP. Vérifiez ensuite la clé hôte SSH par un canal indépendant et l'accès sudo attendu. Testez un utilisateur non autorisé ; il doit échouer avant d'atteindre sshd.

Pour un serveur où les seuls accès 22 publics proviennent exactement de la règle UFW allow 22/tcp, après validation du tunnel et de la console :

Exemple
sudo ufw delete allow 22/tcpsudo ufw status numbered

Cette commande retire cette règle précise, pas les autres autorisations. La politique entrante doit déjà refuser les connexions non autorisées. Retirez séparément les règles équivalentes identifiées et l'ouverture du pare-feu cloud, en IPv4 comme en IPv6. Ne réinitialisez pas le pare-feu et n'activez pas UFW à l'aveugle.

3. Vérifier fermeture, révocation et disponibilité

Depuis une machine externe autorisée à effectuer le test, remplacez l'adresse d'exemple :

Exemple
nc -vz -w 5 203.0.113.10 22ssh shop-adminsudo journalctl -u cloudflared --since '-15 min'sudo journalctl -u ssh --since '-15 min'

La connexion directe doit échouer, celle via Access réussir. Testez aussi l'adresse IPv6 réelle. Ces contrôles doivent utiliser de nouvelles connexions.

Corrélez identité Access, authentification Unix et événements sudo dans votre collecteur. Les journaux de connexion ne sont pas un enregistrement complet des commandes ; ajoutez une solution dédiée si cet audit est requis. Contrôlez également comptes retirés du groupe, échecs MFA, connecteurs indisponibles et latence de connexion.

Retirer un utilisateur d'un groupe ne garantit pas l'arrêt immédiat d'une session SSH déjà ouverte. Testez le délai de révocation, invalidez les sessions Access concernées et terminez les sessions Unix lorsque votre procédure l'exige.

Le tunnel ajoute des dépendances à l'IdP, au DNS et au fournisseur ; mesurez reconnexions et transfert sous charge. Pour la production, prévoyez la redondance des connecteurs selon la topologie et exercez une panne du fournisseur.

Le secours repose sur une console hors bande avec compte nominatif, MFA si disponible et credentials conservés hors du même IdP. Un opérateur autorisé peut y restaurer temporairement une règle 22 limitée à son IP d'administration, puis la retirer après réparation. Documentez motif, durée, responsable et logs. Ne restaurez pas une ouverture mondiale permanente comme rollback.

Sources : Vultr, réseau privé NetBird, Cloudflare, SSH avec cloudflared côté client.

Cet article a-t-il répondu à votre question ?
Vos retours orientent ce qu'on écrit ensuite.

Votre site en ligne aujourd'hui

Migration gratuite* · remboursé 30 jours

Commencer* Un site de moins de 30 Go, offres cPanel, WordPress et VPS.