# CARTE MENTALE โ€” SSH Proxy Transparent ## ๐ŸŒณ Arborescence conceptuelle ``` SSH PROXY TRANSPARENT โ”‚ โ”œโ”€ ARCHITECTURE โ”‚ โ”œโ”€ 3 Conteneurs โ”‚ โ”‚ โ”œโ”€ Gateway (proxy) โ”‚ โ”‚ โ”œโ”€ Dest1 (machine) โ”‚ โ”‚ โ””โ”€ Dest2 (machine) โ”‚ โ”‚ โ”‚ โ”œโ”€ Rรฉseau Docker โ”‚ โ”‚ โ””โ”€ 172.30.0.0/24 (privรฉ) โ”‚ โ”‚ โ”‚ โ””โ”€ 2 Niveaux Auth โ”‚ โ”œโ”€ Windows โ†’ Gateway (lab_rsa) โ”‚ โ””โ”€ Gateway โ†’ Dest (gateway_rsa) โ”‚ โ”œโ”€ CONFIGURATION โ”‚ โ”œโ”€ Gateway (4 fichiers) โ”‚ โ”‚ โ”œโ”€ Dockerfile โ”‚ โ”‚ โ”‚ โ”œโ”€ Stage builder: Compile sshproxy Go โ”‚ โ”‚ โ”‚ โ””โ”€ Stage final: sshd + config โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€ sshd_config โ”‚ โ”‚ โ”‚ โ””โ”€ ForceCommand: sshproxy-wrapper โญ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”œโ”€ sshproxy.yaml โ”‚ โ”‚ โ”‚ โ”œโ”€ Destinations: [dest1, dest2] โ”‚ โ”‚ โ”‚ โ”œโ”€ Selection: random โ”‚ โ”‚ โ”‚ โ””โ”€ Args: "-tt" โญ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€ sshproxy-wrapper.sh โ”‚ โ”‚ โ””โ”€ Lance sshproxy โ”‚ โ”‚ โ”‚ โ”œโ”€ Destinations (2 fichiers ร— 2) โ”‚ โ”‚ โ”œโ”€ Dockerfile (SSH normal) โ”‚ โ”‚ โ””โ”€ sshd_config (SSH normal) โ”‚ โ”‚ โ”‚ โ”œโ”€ Orchestration (1 fichier) โ”‚ โ”‚ โ””โ”€ docker-compose.yaml โ”‚ โ”‚ โ”‚ โ””โ”€ Authentification (4 fichiers) โ”‚ โ”œโ”€ lab_rsa (privรฉe) โ”‚ โ”œโ”€ lab_rsa.pub (publique) โ”‚ โ”œโ”€ gateway_rsa (privรฉe) โ”‚ โ””โ”€ gateway_rsa.pub (publique) โ”‚ โ”œโ”€ FLUX D'UNE CONNEXION โ”‚ โ”œโ”€ Client Windows โ”‚ โ”‚ โ””โ”€ ssh -i lab_rsa -p 2222 localhost โ”‚ โ”‚ โ”‚ โ”œโ”€ Gateway sshd โ”‚ โ”‚ โ”œโ”€ Vรฉrifie: lab_rsa.pub en authorized_keys โœ“ โ”‚ โ”‚ โ””โ”€ Exรฉcute: ForceCommand โ”‚ โ”‚ โ”‚ โ”œโ”€ sshproxy-wrapper โ”‚ โ”‚ โ””โ”€ Lance: /usr/sbin/sshproxy โ”‚ โ”‚ โ”‚ โ”œโ”€ sshproxy โ”‚ โ”‚ โ”œโ”€ Lit: sshproxy.yaml โ”‚ โ”‚ โ”œโ”€ Choisit: random (dest1 ou dest2) โ”‚ โ”‚ โ””โ”€ Exรฉcute: ssh -tt -i gateway_rsa testuser@DEST โ”‚ โ”‚ โ”‚ โ”œโ”€ Destination sshd โ”‚ โ”‚ โ”œโ”€ Vรฉrifie: gateway_rsa.pub en authorized_keys โœ“ โ”‚ โ”‚ โ””โ”€ Exรฉcute: shell/commande โ”‚ โ”‚ โ”‚ โ””โ”€ Rรฉsultat retournรฉ ร  Windows โ”‚ โ”œโ”€ LES 3 "MAGIES" โ”‚ โ”œโ”€ Magie 1: ForceCommand โ”‚ โ”‚ โ”œโ”€ Intercepts: Toute connexion SSH โ”‚ โ”‚ โ”œโ”€ Lance: sshproxy-wrapper โ”‚ โ”‚ โ””โ”€ Effect: Transparence du proxy โ”‚ โ”‚ โ”‚ โ”œโ”€ Magie 2: -tt flag โ”‚ โ”‚ โ”œโ”€ Alloue: Pseudo-terminal โ”‚ โ”‚ โ”œโ”€ Permet: Shell interactif sur dest โ”‚ โ”‚ โ””โ”€ Critรจre: Sans = exit 255 ou freeze โ”‚ โ”‚ โ”‚ โ””โ”€ Magie 3: 2 Clรฉs SSH โ”‚ โ”œโ”€ Layer 1: Windows โ†’ Gateway โ”‚ โ”œโ”€ Layer 2: Gateway โ†’ Dest โ”‚ โ””โ”€ Effect: Authentification multi-couches โ”‚ โ”œโ”€ PIรˆGES ร‰VITร‰S โ”‚ โ”œโ”€ Permission denied โ”‚ โ”‚ โ”œโ”€ Cause: gateway_rsa propriรฉtรฉ root โ”‚ โ”‚ โ””โ”€ Fix: chown testuser /etc/sshproxy/gateway_rsa โ”‚ โ”‚ โ”‚ โ”œโ”€ Exit status 255 โ”‚ โ”‚ โ”œโ”€ Cause: PTY non allouรฉ โ”‚ โ”‚ โ””โ”€ Fix: -tt dans sshproxy.yaml โ”‚ โ”‚ โ”‚ โ”œโ”€ Shell freeze โ”‚ โ”‚ โ”œโ”€ Cause: Pas de wrapper โ”‚ โ”‚ โ””โ”€ Fix: sshproxy-wrapper.sh โ”‚ โ”‚ โ”‚ โ””โ”€ IPs qui changent โ”‚ โ”œโ”€ Cause: Rรฉseau recrรฉรฉ ร  chaque up โ”‚ โ””โ”€ Fix: subnet fixe + ipv4_address โ”‚ โ”œโ”€ DOCUMENTATION โ”‚ โ”œโ”€ PLAN_DE_LECTURE.md โ”‚ โ”‚ โ””โ”€ Par oรน commencer? โ”‚ โ”‚ โ”‚ โ”œโ”€ SYNTHESE_COMPLETE.md โ”‚ โ”‚ โ””โ”€ Vue d'ensemble โ”‚ โ”‚ โ”‚ โ”œโ”€ ELI5_EXPLICATION.md โ”‚ โ”‚ โ””โ”€ Simplifiรฉe โ”‚ โ”‚ โ”‚ โ”œโ”€ QUICK_REFERENCE.md โ”‚ โ”‚ โ””โ”€ Diagrammes + checklist โ”‚ โ”‚ โ”‚ โ”œโ”€ DOCUMENTATION_COMPLETE.md โ”‚ โ”‚ โ””โ”€ Ligne par ligne โ”‚ โ”‚ โ”‚ โ”œโ”€ RESOLUTION_RAPPORT.md โ”‚ โ”‚ โ””โ”€ Debugging โ”‚ โ”‚ โ”‚ โ”œโ”€ INDEX_FICHIERS.md โ”‚ โ”‚ โ””โ”€ Rรฉfรฉrence fichiers โ”‚ โ”‚ โ”‚ โ”œโ”€ INVENTAIRE.md โ”‚ โ”‚ โ””โ”€ Tous les fichiers โ”‚ โ”‚ โ”‚ โ”œโ”€ README.md โ”‚ โ”‚ โ””โ”€ Point d'entrรฉe principal โ”‚ โ”‚ โ”‚ โ””โ”€ CARTE_MENTALE.md (ce fichier) โ”‚ โ””โ”€ Structures et relations โ”‚ โ””โ”€ COMMANDES CLร‰S โ”œโ”€ Dรฉmarrage โ”‚ โ”œโ”€ docker compose up -d โ”‚ โ””โ”€ Attend 2-3 secondes โ”‚ โ”œโ”€ Tests โ”‚ โ”œโ”€ ssh -p 2222 testuser@localhost 'hostname' โ”‚ โ”œโ”€ echo "hostname" | ssh -p 2222 testuser@localhost โ”‚ โ””โ”€ for i in {1..5}; do ssh -p 2222 testuser@localhost hostname; done โ”‚ โ”œโ”€ Debugging โ”‚ โ”œโ”€ docker exec sshproxy-gateway tail -f /tmp/sshproxy-testuser.log โ”‚ โ”œโ”€ docker compose logs -f gateway โ”‚ โ””โ”€ docker ps โ”‚ โ””โ”€ Arrรชt โ””โ”€ docker compose down -v ``` --- ## ๐Ÿ”„ Relation entre fichiers ``` docker-compose.yaml โ”œโ”€โ†’ gateway/Dockerfile โ”€โ”€โ†’ Installe gateway/sshd_config โ”œโ”€โ†’ gateway/sshd_config โ”€โ”€โ†’ ForceCommand โ”€โ”€โ†’ gateway/sshproxy-wrapper โ”œโ”€โ†’ gateway/sshproxy-wrapper โ”€โ”€โ†’ Exรฉcute โ”€โ”€โ†’ sshproxy โ”œโ”€โ†’ sshproxy โ”€โ”€โ†’ Lit โ”€โ”€โ†’ gateway/sshproxy.yaml โ”œโ”€โ†’ gateway/sshproxy.yaml โ”€โ”€โ†’ Utilise โ”€โ”€โ†’ keys/gateway_rsa (privรฉe) โ”‚ โ”œโ”€โ†’ dest/Dockerfile โ”€โ”€โ†’ Installe dest/sshd_config โ””โ”€โ†’ dest/sshd_config โ”€โ”€โ†’ Accepte โ”€โ”€โ†’ keys/gateway_rsa.pub โ”€โ”€โ†’ Accepte โ”€โ”€โ†’ keys/lab_rsa.pub Authentification: gateway/sshd_config โ”€โ”€โ†’ Vรฉrifie โ”€โ”€โ†’ keys/lab_rsa.pub โ”€โ”€โ†’ Pour โ”€โ”€โ†’ Connexion Windows ``` --- ## ๐Ÿ“Š Dรฉpendances critiques ``` Pour fonctionner, vous DEVEZ avoir: 1. docker-compose.yaml โ””โ”€ Sans: pas de conteneurs 2. gateway/Dockerfile โ””โ”€ Sans: pas de gateway 3. gateway/sshd_config + ForceCommand โ””โ”€ Sans: pas d'interception 4. gateway/sshproxy.yaml + "-tt" โ””โ”€ Sans: pas d'interactivitรฉ 5. keys/lab_rsa + lab_rsa.pub โ””โ”€ Sans: Windows ne peut pas s'authentifier 6. keys/gateway_rsa + gateway_rsa.pub โ””โ”€ Sans: Gateway ne peut pas s'authentifier auprรจs des dest ``` --- ## ๐ŸŽฏ Ordre d'apprentissage recommandรฉ ``` Semaine 1 (Day 1 - 30 min): โ”œโ”€ Lire: PLAN_DE_LECTURE.md (5 min) โ”œโ”€ Lire: SYNTHESE_COMPLETE.md (10 min) โ”œโ”€ Lire: QUICK_REFERENCE.md (10 min) โ”œโ”€ Faire: docker compose up -d โ”œโ”€ Faire: ssh test (5 min) โ””โ”€ Result: "ร‡a marche!" Semaine 1 (Day 2-3 - 1-2 heures): โ”œโ”€ Lire: DOCUMENTATION_COMPLETE.md (30 min) โ”œโ”€ Lire: gateway/sshd_config + explications โ”œโ”€ Lire: gateway/sshproxy.yaml + explications โ”œโ”€ Lire: Dockerfiles + explications โ”œโ”€ Faire: Modifier une config (test) โ””โ”€ Result: "Je comprends!" Semaine 2 (Maintenance): โ”œโ”€ Consulter: INDEX_FICHIERS.md (au besoin) โ”œโ”€ Dรฉboguer: RESOLUTION_RAPPORT.md โ”œโ”€ Auditer: logs sshproxy โ””โ”€ Result: "Je maรฎtrise!" ``` --- ## ๐Ÿ’ก Patterns clรฉs ### Pattern 1: ForceCommand Interception ``` sshd_config: ForceCommand /path/to/script โ†“ /path/to/script: Dรฉtecte SSH_ORIGINAL_COMMAND โ†“ Script: Exรฉcute sshproxy โ†“ sshproxy: Proxifie la commande โ†“ Result: Transparent au client ``` ### Pattern 2: Multi-layer Auth ``` Layer 1 (Client โ†’ Gateway): Client: lab_rsa (privรฉe) Gateway: lab_rsa.pub (authorized_keys) Layer 2 (Gateway โ†’ Dest): Gateway: gateway_rsa (privรฉe) Dest: gateway_rsa.pub (authorized_keys) ``` ### Pattern 3: Multi-stage Docker ``` Stage 1 (Builder): - Gros (avec compilateur) - Compile sshproxy - Gรฉnรจre binaires Stage 2 (Final): - Petit (Debian slim) - Copie juste les binaires - Installe runtime deps ``` --- ## ๐ŸŽฌ Cas d'usage simples ### Cas 1: Commande simple ``` Input: ssh gateway 'ls -la' Flow: gateway โ†’ sshproxy โ†’ random_dest โ†’ ls -la Output: /home/testuser contents ``` ### Cas 2: Shell interactif ``` Input: ssh gateway Flow: gateway โ†’ sshproxy โ†’ random_dest โ†’ bash Output: testuser@dest1:~$ (prompt interactif) ``` ### Cas 3: Scripts ``` Input: ssh gateway 'for i in 1..3; do date; done' Flow: gateway โ†’ sshproxy โ†’ random_dest โ†’ script Output: 3 timestamps ``` --- ## โœ… Checklist complรจte ``` Infrastructure: โ˜ docker-compose.yaml crรฉรฉ โ˜ gateway/ directory + 4 fichiers โ˜ dest/ directory + 2 fichiers โ˜ keys/ directory + 4 fichiers Validation: โ˜ Clรฉs SSH gรฉnรฉrรฉes โ˜ docker compose build rรฉussit โ˜ docker compose up -d rรฉussit โ˜ docker ps affiche 3 conteneurs Fonctionnalitรฉ: โ˜ ssh -p 2222 'hostname' retourne dest1 ou dest2 โ˜ Shell interactif fonctionne โ˜ Round-robin testรฉ (5 tests) โ˜ Logs sshproxy lisibles Comprรฉhension: โ˜ Vous comprendre ForceCommand โ˜ Vous comprenez -tt flag โ˜ Vous pouvez modifier une config โ˜ Vous pouvez dรฉbugger un problรจme ```