🔒 Pourquoi un Bastion Host est-il essentiel dans vos architectures rĂ©seau (Cas AWS VPC)

Orbit TurnerOrbit Turner
11 min read

La sécurité est une priorité pour toute architecture cloud moderne. Une des pratiques fortement recommandées pour renforcer la sécurité de vos ressources cloud est l'utilisation d'un Bastion Host, particuliÚrement lorsque vous travaillez avec une approche VPC avec des sous-réseaux publics (DMZ) et privés.

Dans cet article, nous allons comprendre en détail :

  1. Qu'est-ce qu'un Bastion Host ?

  2. Pourquoi un Bastion Host est-il indispensable ?

  3. Mise en place détaillée d'un Bastion Host sur AWS

  4. Exemple pratique d'utilisation d'un Bastion Host

  5. Bonnes pratiques et recommandations

  6. Alternatives possibles au Bastion Host traditionnel


1ïžâƒŁ Qu'est-ce qu'un Bastion Host ?

Un Bastion Host (ou "Jump Server") est une instance dédiée placée dans un réseau public, servant de point unique d'accÚs sécurisé pour gérer les serveurs ou services hébergés dans un sous-réseau privé.

Le Bastion agit comme une "porte d'entrée" vers vos ressources privées, permettant aux administrateurs d'accéder à ces ressources sans les exposer directement à l'Internet public.

How to set up an AWS Bastion host or a Jump server | Adaptive

2ïžâƒŁ Pourquoi un Bastion Host est-il indispensable ?

🔐 SĂ©curitĂ© renforcĂ©e

  • RĂ©duction des points d'entrĂ©e exposĂ©s Ă  Internet (surface d'attaque rĂ©duite).

  • ContrĂŽle des accĂšs et journalisation centralisĂ©e.

🚧 SĂ©paration claire des responsabilitĂ©s rĂ©seau

  • Les sous-rĂ©seaux privĂ©s ne nĂ©cessitent pas d’IP publiques.

  • Respect du principe de moindre privilĂšge et meilleure gestion des politiques de sĂ©curitĂ©.

🔍 TraçabilitĂ© et ConformitĂ©

  • Facilite la mise en place d'audit de sĂ©curitĂ©.

  • TraçabilitĂ© amĂ©liorĂ©e des sessions SSH ou RDP grĂące aux logs centralisĂ©s.

3ïžâƒŁ Mise en place dĂ©taillĂ©e d'un Bastion Host sur AWS

đŸ–„ïž Architecture typique :

Une configuration typique comprend :

  • VPC avec au moins :

    • Un sous-rĂ©seau public ou DMZ (avec IP publique).

    • Un ou plusieurs sous-rĂ©seaux privĂ©s (sans accĂšs direct Ă  Internet).

  • Bastion Host placĂ© dans le sous-rĂ©seau public.

  • Instances privĂ©es dans les sous-rĂ©seaux privĂ©s.

A. 🔧 Étapes concrùtes cote AWS :

  • Étape 1 : CrĂ©ez votre VPC avec sous-rĂ©seaux publics et privĂ©s.

  • Étape 2 : Configurez une instance EC2 (Bastion Host) dans un sous-rĂ©seau public.

  • Étape 3 : Configurez les Security Groups :

    • Bastion Host : Autorisez seulement les connexions SSH (port 22) depuis des IP spĂ©cifiques ou un VPN.

    • Instances privĂ©es : Autorisez uniquement l'accĂšs SSH depuis le Bastion Host (adresse IP privĂ©e du Bastion).

  • Étape 4 : Utilisez AWS Systems Manager Session Manager (ou EC2 Instance Connect) ou une solution SSH pour sĂ©curiser l’accĂšs vers le Bastion.

B. 🔧 Configurer une instance EC2 en Bastion Host :

Voici comment je procĂšde pour configurer une instance EC2 en Bastion Host sĂ©curisĂ© sur AWS. Je partage toutes les Ă©tapes, de la prĂ©paration initiale Ă  l’automatisation complĂšte avec un script.

Prends ce que tu veux, ajuste selon tes besoins, et en avant ! 😉

✅ Les prĂ©requis :

  • Disposer d’une instance EC2 sous Ubuntu ou Amazon Linux.

  • Avoir dĂ©jĂ  configurĂ© et tĂ©lĂ©chargĂ© sa clĂ© SSH privĂ©e (.pem).

🚧 Étape 1 : La prĂ©paration initiale

Je me connecte d’abord à mon EC2 via SSH (je remplace les infos avec celles de mon propre setup) :

ssh -i ma-cle.pem ubuntu@mon-adresse-ip

Ensuite, je mets Ă  jour le systĂšme :

sudo apt update && sudo apt upgrade -y

đŸ›Ąïž Étape 2 : SĂ©curiser l’accĂšs SSH

J’édite le fichier /etc/ssh/sshd_config :

sudo nano /etc/ssh/sshd_config

Et j’applique les configurations suivantes :

# Interdire la connexion SSH en tant que root
PermitRootLogin no

# Désactiver l'authentification par mot de passe (connexion uniquement par clé)
PasswordAuthentication no

# Modifier le port SSH par défaut (optionnel, mais je le recommande)
Port 22022

# Restreindre l'accĂšs SSH Ă  certains utilisateurs
AllowUsers ubuntu

Je redémarre ensuite le service SSH :

sudo systemctl restart sshd

🚧 Étape 3 : Installer et configurer Fail2ban (anti brute-force)

J’installe Fail2ban :

sudo apt install fail2ban -y

Je le configure en Ă©ditant le fichier :

sudo nano /etc/fail2ban/jail.local

J’y ajoute :

[sshd]
enabled = true
port = 22022
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600

Ensuite, je redémarre Fail2ban :

sudo systemctl restart fail2ban

Pour vérifier le statut :

sudo fail2ban-client status sshd

🌐 Étape 4 : Activer et configurer le firewall UFW

J’installe UFW :

sudo apt install ufw -y

Puis je configure le firewall :

# Autoriser SSH (sur le port que j'ai personnalisé)
sudo ufw allow 22022/tcp

# Activer UFW
sudo ufw enable

# VĂ©rifier l'Ă©tat et les rĂšgles
sudo ufw status verbose

🔑 Étape 5 : CrĂ©er un utilisateur dĂ©diĂ© pour l’accĂšs SSH (optionnel, mais je le recommande)

Je crée un nouvel utilisateur :

sudo adduser bastionuser

Si je veux lui donner des privilĂšges sudo :

sudo usermod -aG sudo bastionuser

J’ajoute ensuite ma clĂ© publique Ă  ce nouvel utilisateur :

sudo mkdir -p /home/bastionuser/.ssh
sudo nano /home/bastionuser/.ssh/authorized_keys

J’y colle ma clĂ© publique, puis je fixe les permissions :

sudo chmod 700 /home/bastionuser/.ssh
sudo chmod 600 /home/bastionuser/.ssh/authorized_keys
sudo chown -R bastionuser:bastionuser /home/bastionuser/.ssh

Je retourne dans /etc/ssh/sshd_config pour autoriser ce nouvel utilisateur :

AllowUsers ubuntu bastionuser

Et je redémarre le service SSH :

sudo systemctl restart sshd

🚀 Étape 6 : Installer une solution de Logging/Audit des sessions (Optionnel mais trùs utile)

Pour mieux tracer qui fait quoi sur mon Bastion, j’utilise par exemple auditd (vous pouvez essayer de trouver mieux je penseđŸ€”):

sudo apt install auditd -y
sudo auditctl -a always,exit -F arch=b64 -S execve -k command_executions

Pour consulter les logs :

sudo ausearch -k command_executions

🔗 Étape 7 : Automatiser toute la configuration avec un script

Voici un script shell complet (sur ubuntu), setup-bastion.sh, qui enchaüne tout :

#!/bin/bash

set -e

# Mise Ă  jour du systĂšme
sudo apt update -y && sudo apt upgrade -y

# Configuration SSH
sudo sed -i 's/#Port 22/Port 22022/' /etc/ssh/sshd_config
sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
echo "AllowUsers ubuntu" | sudo tee -a /etc/ssh/sshd_config
sudo systemctl restart sshd

# Installer Fail2ban
sudo apt install fail2ban -y
echo -e "[sshd]\nenabled = true\nport = 22022\nfilter = sshd\nlogpath = /var/log/auth.log\nmaxretry = 5\nbantime = 3600" | sudo tee /etc/fail2ban/jail.local
sudo systemctl restart fail2ban

# Activer le firewall UFW
sudo apt install ufw -y
sudo ufw allow 22022/tcp
sudo ufw --force enable

# Auditd pour le logging
sudo apt install auditd -y
sudo auditctl -a always,exit -F arch=b64 -S execve -k command_executions

echo "Configuration du Bastion terminĂ©e avec succĂšs ✅"

Pour lancer le script :

chmod +x setup-bastion.sh
sudo ./setup-bastion.sh

📌 Important : Configuration sur AWS

Je m’assure, dans les Security Groups, de n’ouvrir que le strict nĂ©cessaire :

  • Le port SSH (22022) n’est accessible que depuis mon IP publique ou un VPN.

  • Aucune autre rĂšgle superflue.


✅ Tests et validation

Pour tester, je me connecte depuis mon Bastion vers un autre serveur privé :

ssh -i ma-cle.pem -o ProxyCommand="ssh -W %h:%p -p 22022 ubuntu@ip-bastion" ubuntu@ip-serveur-prive

Cela illustre la technique du Jump Host en SSH : mon Bastion sert de passerelle pour joindre mes serveurs privĂ©s, sans exposer directement ces derniers sur Internet.


4ïžâƒŁ Exemple pratique d'utilisation d'un Bastion Host (avec ProxyJump)

Lorsqu'on utilise un Bastion Host, une des pratiques modernes les plus utilisées est le concept du ProxyJump en SSH, permettant de traverser une machine intermédiaire pour atteindre une autre ressource située dans un réseau privé inaccessible directement depuis Internet.

🚀 Qu'est-ce que ProxyJump ?

Le terme ProxyJump provient de la fonctionnalité introduite avec OpenSSH version 7.3, sortie en août 2016. L'option ProxyJump (ou -J) permet à un utilisateur d'établir une connexion SSH vers une machine distante via une ou plusieurs machines intermédiaires appelées "jump hosts" ou "bastion hosts".

ConcrÚtement, le Bastion Host sert de relais sécurisé pour atteindre une machine située dans un réseau privé.

🔗 SchĂ©ma de connexion via ProxyJump :

Utilisateur local (votre machine)
            │
            │ SSH (ProxyJump - Bastion)
            ▌
     ┌───────────────┐
     │ Bastion Host  │ (IP publique)
     └───────────────┘
            │
            │ SSH (rĂ©seau privĂ©)
            ▌
     ┌───────────────┐
     │Instance PrivĂ©e│ (IP privĂ©e uniquement)
     └───────────────┘

🎯 Comment ça marche en pratique ?

Imaginons ce scénario sur AWS :

  • Bastion Host avec une IP publique : 3.121.52.45 (Faites vous plaisir hein c’est juste une IPau PIF je sais pas Ă  qui elle appartient 🙃)

  • Instance privĂ©e dans le sous-rĂ©seau privĂ© sans IP publique : 10.0.2.10

  • Vous avez un accĂšs SSH par clĂ© privĂ©e (ma-cle.pem).

MĂ©thode ancienne (sans ProxyJump) :
Vous deviez auparavant faire deux commandes distinctes :

# 1. Connexion au Bastion :
ssh -i "ma-cle.pem" ec2-user@3.121.52.45

# 2. Puis connexion à l'instance privée depuis le Bastion :
ssh ec2-user@10.0.2.10

⚠ ProblĂšme : fastidieux, nĂ©cessite la prĂ©sence de clĂ©s intermĂ©diaires sur le bastion lui-mĂȘme.

MĂ©thode moderne (avec ProxyJump)
Avec ProxyJump, vous pouvez connecter votre poste directement à l'instance privée à travers le Bastion en une seule commande :

ssh -i "ma-cle.pem" -J ec2-user@3.121.52.45 ec2-user@10.0.2.10

Cette commande unique va :

  1. Établir une premiùre connexion SSH depuis votre ordinateur vers le Bastion Host.

  2. Établir une deuxiĂšme connexion SSH (Ă  travers le tunnel initial sĂ©curisĂ©) depuis le Bastion vers l'instance privĂ©e.

  3. Relayer automatiquement l'entrée/sortie entre votre machine et l'instance privée via le Bastion.

📖 Utiliser le fichier config SSH (MĂ©thode recommandĂ©e)

Pour simplifier encore plus vos connexions réguliÚres, il est fortement recommandé d'utiliser le fichier de configuration SSH (~/.ssh/config):

Exemple de configuration du fichier SSH :

Host bastion
    HostName 3.121.52.45
    User ec2-user
    IdentityFile ~/.ssh/ma-cle.pem

Host instance-privee
    HostName 10.0.2.10
    User ec2-user
    IdentityFile ~/.ssh/ma-cle.pem
    ProxyJump bastion

Avec cette configuration, la connexion devient encore plus facile :

ssh instance-privee

SSH utilise automatiquement les configurations dĂ©finies prĂ©cĂ©demment dans le fichier .ssh/config et connecte votre poste vers l’instance privĂ©e via le bastion en une seule commande ultra-simple.

🚹 Recommandations de sĂ©curitĂ© complĂ©mentaires :

  • Limiter l’accĂšs SSH du Bastion Ă  une IP ou plage IP prĂ©cise.

  • Auditer et monitorer les accĂšs SSH au Bastion (CloudWatch Logs, Prometheus/Grafana, ELK).

  • Renforcer le Bastion avec un IDS (Intrusion Detection System), Fail2Ban ou autres.


5ïžâƒŁ Bonnes pratiques et recommandations :

  • ✅ Durcissement du Bastion Host :

    • Mettre Ă  jour rĂ©guliĂšrement.

    • Installation minimale des paquets.

    • Mise en place d'outils de dĂ©tection d'intrusion (IDS/IPS).

    • Mettre en place Fail2Ban et autres mesures de prĂ©vention.

    • Appliquer les Server Hardening Automation type Dev-Sec (https://github.com/dev-sec/ansible-collection-hardening)

  • ✅ Authentification sĂ©curisĂ©e :

    • ClĂ©s SSH obligatoires, dĂ©sactiver l’authentification par mot de passe.

    • MFA pour se connecter au Bastion.

  • ✅ Logging et monitoring :

    • Envoyez les logs vers CloudWatch Logs ou une solution centralisĂ©e (ELK, Graylog, Datadog, etc.).

    • Configurez des alertes sur les tentatives d’accĂšs non autorisĂ©es.

6ïžâƒŁ Alternatives au Bastion Host traditionnel :

Bien que les Bastion Hosts soient trĂšs populaires, d'autres alternatives ou approches existent :

😉 La Meilleure selon moi et qui nĂ©cessite un autre Article tellement je l’adore c’est Teleport 🎉:

    • 🚀 Teleport en quelques points clĂ©s :

      * 🔐 SĂ©curitĂ© des accĂšs :

      * Gestion centralisée des accÚs SSH et Kubernetes.

      * Authentification forte via certificats SSH dynamiques.

      * MFA intégré pour une sécurité renforcée.

      * 🌍 Accùs universel :

      * Compatible avec infrastructures Cloud, On-premise et hybrides.

      * AccÚs sécurisé aux ressources (VMs, Clusters K8s, Applications Web, Bases de données).

      * 📈 ScalabilitĂ© :

      * Hautement évolutif avec support natif des grands déploiements.

      * Gestion facile des environnements multi-régions et multi-cloud.

      * 📝 Audit et conformitĂ© :

      * Traçabilité complÚte avec enregistrement des sessions SSH et Kubernetes.

      * Logs centralisés et visibilité totale sur les activités utilisateur.

      * Conformité simplifiée avec normes PCI-DSS, HIPAA, ISO27001, etc.

      * ⚙ FacilitĂ© d'utilisation :

      * Web UI intuitive pour gérer et monitorer les accÚs.

      * Interface en ligne de commande (tsh) pour une expérience utilisateur simplifiée.

      * Configuration centralisée et automatisation facile.

      * đŸ€– Automation et IntĂ©grations :

      * API robuste permettant une intégration simple aux outils CI/CD et de monitoring existants.

      * Compatible avec Terraform, Ansible et autres outils d’automatisation.

      * 📡 ConnectivitĂ© Zero Trust :

      * AccÚs basé sur les rÎles (RBAC), appliquant le principe du moindre privilÚge.

      * Proxy inversé intégré pour accéder sans exposer directement les services à Internet.

      * 🔑 Certificats dynamiques :

      * Génération et rotation automatique des certificats SSH pour éliminer les risques liés aux clés statiques.

      * đŸ“± Multi-plateformes :

      * Disponible pour Linux, macOS et Windows.

      * đŸ› ïž Open Source :

      * Code source ouvert et auditable avec une communauté active.

Puis nous avons:

  • ☁ AWS Systems Manager Session Manager :

    • AccĂšs direct via la console AWS.

    • Pas besoin d'ouvrir des ports spĂ©cifiques.

  • 🔑 VPN PrivĂ© :

    • Tunnel sĂ©curisĂ© vers votre rĂ©seau VPC.

    • Peut remplacer partiellement ou complĂštement un Bastion Host.

  • 🔄 Zero Trust Network Access (ZTNA) :

    • Approche moderne avec des solutions telles que Cloudflare Access, Tailscale, ou WireGuard.

📌 RĂ©sumĂ© rapide :

🔑 ProblĂšme adressĂ©âœ… Solution (Bastion)💡 Alternative
AccÚs sécurisé SSHPoint d'entrée unique sécuriséAWS Systems Manager, VPN
Exposition IP publiqueRĂ©duit fortement l’expositionZTNA, PrivateLink, Teleport, Overlay VPN
Logging et auditsLogs centralisés simplesCloudWatch Logs, ELK, etc
DNS Protection (En cas d’IP Publique)CloudFlare + Proxy sur IP BastionUn RP avec WAF SelfHosted sur un Provider

Si vous avez compris comment tout ceci marche alors passez Ă  l’étape suivante et faites-en un Playbook Ansible 😉.


🚹 Conclusion :

Mettre en place un Bastion Host dans une architecture réseau AWS avec des sous-réseaux privés et publics est une pratique de sécurité éprouvée qui permet de protéger efficacement vos ressources critiques tout en assurant la traçabilité nécessaire pour les audits et la conformité. Bien maßtrisé, un Bastion Host peut devenir un pilier essentiel de votre stratégie cloud sécurisée.

📖 Ressources supplĂ©mentaires :


đŸ‘šđŸŸâ€đŸš€More About Me:

2
Subscribe to my newsletter

Read articles from Orbit Turner directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Orbit Turner
Orbit Turner

A Creative Dreamer who has always loved going out of the box to innovate. 🚀 I am Mohamed Gueye, better known by the pseudonym Orbit Turner, a technology, science, and art enthusiast since my early days. My journey is an exciting blend of autonomy, curiosity, and continuous learning.