Un bastion SSH est un serveur qui nous permet d’accéder à d’autres serveurs.

Voici un schéma pour expliquer son fonctionnement :

graph TD %% Styles %% Réseau 192.168.1.0/24 subgraph Réseau1["192.168.1.0/24"] direction TB P1[PC 192.168.1.218] B1[Bastion SSH] end %% Réseau 192.168.58.0/24 subgraph Réseau2["192.168.58.0/24"] direction TB S1[Serveur B 192.168.58.11] S2[Serveur C 192.168.58.12] S3[Serveur D 192.168.58.13] S4[Serveur E 192.168.58.14] end %% Connexions P1 -->|Connexion au Réseau 1| B1 B1 -->|Accès au Réseau 2| S1 B1 -->|Accès au Réseau 2| S2 B1 -->|Accès au Réseau 2| S3 B1 -->|Accès au Réseau 2| S4 %% Définir les styles class P1 pc; class B1 bastion; class S1,S2,S3,S4 server; class Réseau1,Réseau2 network;

On m’a demandé de mettre en place ce bastion dans la bulle business de la plateforme OSS pour pouvoir accéder aux équipements réseaux. Cependant, cela m’impose de modifier la plateforme. Car pour des raisons de logiques, on sépare le chemin qu’emprunte les utilisateurs de celui des administrateurs. A l’heure actuelle, si on veut aller sur une VM dans OSS, on utilise la VM lan-proxy-02 pour y accéder, puis le pare-feu globale à tous les VLAN d’OSS. Voici un second schéma qui explique cela :

graph TD %% Réseau subgraph LAN["LAN"] direction TB EFF_LAN[EFF-LAN] FW_LAN[FW-LAN-02] end subgraph Bastion["Bastion"] direction TB LAN_PROXY[LAN-PROXY-02] MGMT_GATEWAY[MGMT-GATEWAY-02] end subgraph OSS_Networks["Autres réseaux OSS"] direction TB VLAN[VLAN] end %% Connexions EFF_LAN -->|Accès au pare-feu| FW_LAN FW_LAN -->|Accès au bastion| LAN_PROXY LAN_PROXY -->|Accès au pare-feu| MGMT_GATEWAY MGMT_GATEWAY -->|Accès aux VLAN OSS| VLAN %% Définir les styles class EFF_LAN,FW_LAN component; class LAN_PROXY,MGMT_GATEWAY proxy; class VLAN vlan;

Pour que les administrateurs et les utilisateurs puissent accéder aux équipements réseaux depuis OSS, il faudra faire ceci :

graph TD %% Réseau subgraph LAN["LAN"] direction TB EFF_LAN[EFF-LAN] FW_LAN[FW-LAN-02] end subgraph Bastion["Bastion"] direction TB LAN_PROXY[LAN-PROXY-03] MGMT_GATEWAY[MGMT-GATEWAY-02] end subgraph Business["Business"] direction TB BUSINESS_VLAN[BUSINESS-VLAN] BUSINESS_PROXY[BUSINESS-PROXY-01] end %% Connexions EFF_LAN -->|Accès au pare-feu| FW_LAN FW_LAN -->|Accès au bastion| LAN_PROXY LAN_PROXY -->|Accès au pare-feu| MGMT_GATEWAY MGMT_GATEWAY -->|Accès au VLAN| BUSINESS_VLAN BUSINESS_VLAN -->|Accès au proxy| BUSINESS_PROXY %% Définir les styles class EFF_LAN,FW_LAN component; class LAN_PROXY,MGMT_GATEWAY proxy; class BUSINESS_VLAN vlan; class BUSINESS_PROXY vm;

Compétence mise en oeuvre

Allez vous référez au Tableaux des compétences

Installation et configuration

L’installation des VM n’a toujours pas changé.

Ressources des VM

Première VM : LAN-PROXY-03

  • 2Go de RAM
  • 4vCPU
  • 20Go de stockage
  • Hostname : lan-proxy-04
  • VLAN : lan et private

Seconde VM : BUSINESS-PROXY-01

  • 2Go de RAM
  • 4vCPU
  • 20Go de stockage
  • Hostname : business-proxy-01
  • VLAN : business

Configuration d’OpenSSH

OpenSSH est installé par défaut sur tous les serveurs, donc on a pas besoin de l’installer.

La configuration d’OpenSSH est la même sur les deux VM.

J’ai fait un fichier .sh pour aller plus vite sur le déploiement (./bastion_ssh/sshd.sh sur le dépôt Git). Ce script permet de configurer la partie serveur d’OpenSSH ainsi que la partie client pour les utilisateurs quand ils se connectent au serveur.

Configuration utilisateur

Chaque utilisateur sur sa machine doit rajouter cette configuration :

Host *.device.ef-fr.net
    IdentityFile ~/.ssh/id_ed25519
    ForwardAgent yes
    ProxyJump business-proxy-01

Host business-proxy-01
    HostName business-proxy-01.business.31tls00.ef-fr.net
    IdentityFile ~/.ssh/id_ed25519
    ForwardAgent yes
    ProxyJump lan-proxy-03

Host lan-proxy-03
    HostName lan-proxy-03.lan.31tls00.ef-fr.net
    IdentityFile ~/.ssh/id_ed25519
    ForwardAgent yes

Configuration firewall sur MGMT-GATEWAY-02

Sur cette machine, on utilise nftables pour la configuration du firewall. Voici un exemple de configuration à rajouter dans nftables (Les IP ne sont pas les bonnes, et ce n’est pas exactement la même configuration qu’en production):

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        # Permettre les connexions établies et les connexions liées
        ct state established,related accept
        # Accepter les connexions SSH en provenance de lan-proxy-03 vers business-proxy-01
        ip saddr 192.168.1.10 tcp dport 22 ip daddr 192.168.2.10 accept
        # Accepter les paquets locaux
        iif lo accept
        # Rejeter les autres paquets
        drop
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
        # Permettre le forwarding des paquets
        ip saddr 192.168.1.10 ip daddr 192.168.2.10 accept
        # Rejeter les autres paquets
        drop
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}