xsshend 0.5.2

Simple CLI tool for uploading files to multiple SSH servers
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
# Guide Complet du Lab xsshend

**Version** : v0.4.1  
**Date** : 18 octobre 2025

---

## 📋 Table des Matières

1. [Vue d'ensemble]#vue-densemble
2. [Installation Rapide]#installation-rapide
3. [Architecture]#architecture
4. [Tests]#tests
5. [Dépannage]#dépannage
6. [Sécurité]#sécurité
7. [FAQ]#faq

---

## 🎯 Vue d'ensemble

Le lab xsshend est un **environnement de test Docker complet** pour valider xsshend en conditions réelles avant déploiement production.

### Caractéristiques

- **3 conteneurs** ArchLinux (1 master + 2 targets)
-**Réseau isolé** Docker bridge
-**Clés SSH pré-configurées** (RSA 4096 + Ed25519)
-**40+ tests automatisés** avec scripts de diagnostic
-**Documentation complète** intégrée

### Prérequis

- Docker 20.10+
- Docker Compose 1.29+
- ~2GB d'espace disque
- 10 minutes de setup

---

## 🚀 Installation Rapide

### Étape 1 : Cloner et Configurer

```bash
# Cloner le repository
git clone https://github.com/WillIsback/xsshend.git
cd xsshend

# Exécuter le setup
./scripts/lab-setup.sh
```

**Le script crée** :
- Clés SSH (RSA + Ed25519)
- Configuration `hosts.json`
- Dockerfiles pour master et targets
- `docker-compose.yml`

### Étape 2 : Démarrer l'Environnement

```bash
cd lab/
docker-compose up -d --build

# Attendre le démarrage
sleep 10

# Vérifier
docker-compose ps
# Devrait afficher 3 conteneurs "Up"
```

### Étape 3 : Vérifier l'Installation

```bash
cd ..

# Diagnostic rapide
./scripts/lab-diagnostic.sh

# Tests automatisés
./scripts/test-lab.sh
```

**Si tous les tests passent** : ✅ Environnement prêt !

### Étape 4 : Premier Test Manuel

```bash
# Accéder au conteneur master
docker exec -it xsshend_master bash

# Lister les serveurs
xsshend list

# Créer un fichier de test
echo "Hello xsshend!" > test.txt

# Upload (dry-run)
xsshend upload test.txt --env Test --dry-run

# Upload réel
xsshend upload test.txt --env Test --server-type RSA-Targets

# Vérifier
exit
docker exec xsshend_target1 cat /tmp/test.txt
docker exec xsshend_target2 cat /tmp/test.txt
```

---

## 🏗️ Architecture

### Schéma

```
┌─────────────────────────────────────────────────────────────┐
│                Docker Network: xsshend_net                   │
│                                                              │
│  ┌──────────────┐          ┌──────────────┐  ┌──────────────┐│
│  │   master     │          │   target1    │  │   target2    ││
│  │              │   SSH    │              │  │              ││
│  │  xsshend     │─────────▶│  testuser    │  │  testuser    ││
│  │  (Arch)      │          │  (Arch)      │  │  (Arch)      ││
│  │              │          │              │  │              ││
│  │ RSA+ED25519  │          │  RSA only    │  │  RSA only    ││
│  └──────────────┘          └──────────────┘  └──────────────┘│
│       │                         :22               :22         │
└───────┼─────────────────────────┴────────────────┴───────────┘
   localhost:2221          localhost:2222
```

### Composants

#### Master (xsshend_master)
- **OS** : ArchLinux
- **User** : master
- **Rôle** : Exécute xsshend
- **Clés SSH** : RSA + Ed25519
- **Config** : hosts.json avec 3 serveurs

#### Target1 & Target2 (xsshend_target1/2)
- **OS** : ArchLinux
- **User** : testuser
- **Rôle** : Serveurs SSH cibles
- **Clés autorisées** : RSA uniquement
- **SSH** : PubkeyAuth=yes, PasswordAuth=no
- **Ports hôte** : 2221 (target1), 2222 (target2)

### Clés SSH

| Clé | Type | Bits | Passphrase | Enregistrée | Usage |
|-----|------|------|------------|-------------|-------|
| `id_rsa` | RSA | 4096 | ❌ Non | target1, target2 | Tests réussis |
| `id_ed25519` | Ed25519 | 256 | ✅ Oui (`testpassphrase`) | ❌ Aucune | Tests d'échec |

### Configuration hosts.json

```json
{
  "Test": {
    "Lab": {
      "RSA-Targets": {
        "TARGET1": { "alias": "testuser@target1", "env": "TEST" },
        "TARGET2": { "alias": "testuser@target2", "env": "TEST" }
      },
      "ED25519-Targets": {
        "TARGET1_ED25519": { "alias": "testuser@target1", "env": "TEST" }
      }
    }
  }
}
```

---

## 🧪 Tests

### Tests Automatisés (test-lab.sh)

**Suite complète** : 40+ tests en 12 phases

```bash
./scripts/test-lab.sh
```

**Phases testées** :
1. ✅ Conteneurs Docker actifs
2. ✅ Installation xsshend
3. ✅ Clés SSH et permissions
4. ✅ Démons SSH actifs
5. ✅ Connectivité réseau (ping)
6. ✅ Connectivité SSH manuelle
7. ✅ Commande `xsshend list`
8. ✅ Upload dry-run
9. ✅ Upload réel (RSA-Targets)
10. ✅ Vérification fichiers uploadés
11. ✅ Upload multi-fichiers
12. ✅ Logs SSH

**Sortie** : Rapport coloré avec compteurs (✓ PASSED / ✗ FAILED)

### Tests Manuels Essentiels

#### Test 1 : Liste des Serveurs
```bash
docker exec xsshend_master xsshend list
# Attendu : 3 serveurs (TARGET1, TARGET2, TARGET1_ED25519)
```

#### Test 2 : Upload Simple
```bash
docker exec xsshend_master bash -c "echo 'Test' > /tmp/test.txt"
docker exec xsshend_master xsshend upload /tmp/test.txt --env Test --server-type RSA-Targets
# Attendu : Upload réussi vers target1 et target2
```

#### Test 3 : Vérification
```bash
docker exec xsshend_target1 cat /tmp/test.txt
docker exec xsshend_target2 cat /tmp/test.txt
# Attendu : "Test" affiché
```

#### Test 4 : Multi-fichiers
```bash
docker exec xsshend_master bash -c "for i in {1..3}; do echo 'File \$i' > /tmp/file\$i.txt; done"
docker exec xsshend_master xsshend upload /tmp/file{1..3}.txt --server-type RSA-Targets
docker exec xsshend_target1 ls /tmp/file*.txt
# Attendu : 3 fichiers listés
```

#### Test 5 : Filtres
```bash
# Par environnement
docker exec xsshend_master xsshend upload test.txt --env Test --dry-run

# Par type de serveur
docker exec xsshend_master xsshend upload test.txt --server-type RSA-Targets --dry-run

# Par région
docker exec xsshend_master xsshend upload test.txt --region Lab --dry-run
```

#### Test 6 : Gestion d'Erreurs
```bash
# Fichier inexistant
docker exec xsshend_master xsshend upload /tmp/nonexistent.txt --env Test
# Attendu : Erreur claire

# Clé non autorisée (Ed25519)
docker exec xsshend_master bash -c "mv ~/.ssh/id_rsa ~/.ssh/id_rsa.bak"
docker exec xsshend_master xsshend upload test.txt --server-type ED25519-Targets
docker exec xsshend_master bash -c "mv ~/.ssh/id_rsa.bak ~/.ssh/id_rsa"
# Attendu : Échec d'authentification

# Serveur down
docker stop xsshend_target2
docker exec xsshend_master xsshend upload test.txt --server-type RSA-Targets
docker start xsshend_target2
# Attendu : Succès target1, échec target2
```

### Scénarios Avancés

#### Performance (fichier 10MB)
```bash
docker exec xsshend_master dd if=/dev/urandom of=/tmp/large.bin bs=1M count=10
time docker exec xsshend_master xsshend upload /tmp/large.bin --server-type RSA-Targets
docker exec xsshend_target1 ls -lh /tmp/large.bin
# Vérifier : 10M uploadé
```

#### Destination Personnalisée
```bash
docker exec xsshend_target1 mkdir -p /home/testuser/custom
docker exec xsshend_master xsshend upload test.txt --server-type RSA-Targets --dest /home/testuser/custom/
docker exec xsshend_target1 ls /home/testuser/custom/
```

---

## 🔧 Dépannage

### Diagnostic Rapide

```bash
# Script de diagnostic complet
./scripts/lab-diagnostic.sh

# Sauvegarder le rapport
./scripts/lab-diagnostic.sh > diagnostic_$(date +%Y%m%d_%H%M%S).txt
```

### Problèmes Courants

#### 1. Conteneurs ne démarrent pas

**Symptôme** :
```bash
docker-compose ps
# Montre : Exit 1 ou Exited
```

**Solution** :
```bash
# Voir les logs
docker-compose logs master
docker-compose logs target1

# Reconstruire
docker-compose down -v
docker-compose up -d --build --force-recreate
```

#### 2. SSH ne fonctionne pas

**Diagnostic** :
```bash
# Vérifier sshd
docker exec xsshend_target1 pgrep sshd
# Si vide, redémarrer :
docker restart xsshend_target1
sleep 5

# Tester connectivité
docker exec xsshend_master ping -c 2 target1

# Tester SSH avec verbose
docker exec xsshend_master ssh -vvv -i ~/.ssh/id_rsa testuser@target1
```

**Solutions** :
```bash
# Régénérer host keys
docker exec xsshend_target1 ssh-keygen -A
docker restart xsshend_target1

# Corriger permissions
docker exec xsshend_target1 chown -R testuser:testuser /home/testuser/.ssh
docker exec xsshend_target1 chmod 700 /home/testuser/.ssh
docker exec xsshend_target1 chmod 600 /home/testuser/.ssh/authorized_keys
```

#### 3. xsshend ne trouve pas les clés

**Solution** :
```bash
# Vérifier permissions
docker exec xsshend_master ls -la ~/.ssh/
docker exec xsshend_master stat -c '%a' ~/.ssh/id_rsa

# Corriger
docker exec xsshend_master chmod 600 ~/.ssh/id_rsa ~/.ssh/id_ed25519
docker exec xsshend_master chmod 644 ~/.ssh/*.pub ~/.ssh/hosts.json
```

#### 4. Upload échoue

**Diagnostic** :
```bash
# Vérifier destination
docker exec xsshend_target1 ls -ld /tmp
# Attendu : drwxrwxrwt

# Tester écriture manuelle
docker exec xsshend_master ssh -i ~/.ssh/id_rsa testuser@target1 "echo 'test' > /tmp/manual.txt"
```

#### 5. Logs SSH absents

**Solution** :
```bash
# Utiliser journalctl
docker exec xsshend_target1 journalctl -u sshd -n 50 --no-pager

# Ou dmesg
docker exec xsshend_target1 dmesg | grep -i ssh

# Ou logs Docker
docker logs xsshend_target1 -f
```

### Nettoyage Complet

```bash
# Arrêter et supprimer tout
docker-compose down -v
docker rmi $(docker images | grep xsshend-lab | awk '{print $3}')
docker network prune -f

# Recommencer depuis zéro
./scripts/lab-setup.sh
cd lab/
docker-compose up -d --build
```

### Commandes Utiles

```bash
# Statut des conteneurs
docker-compose ps
docker stats xsshend_master xsshend_target1 xsshend_target2

# Logs en temps réel
docker-compose logs -f
docker-compose logs -f master

# Accès shell
docker exec -it xsshend_master bash
docker exec -it xsshend_target1 bash

# Nettoyer fichiers de test
docker exec xsshend_master rm -f /tmp/test*.txt /tmp/file*.txt
docker exec xsshend_target1 rm -f /tmp/test*.txt /tmp/file*.txt
docker exec xsshend_target2 rm -f /tmp/test*.txt /tmp/file*.txt

# Redémarrage rapide
docker-compose restart
```

---

## 🔒 Sécurité

### ⚠️ Environnement de TEST Uniquement

**NE PAS utiliser en production** :
- ❌ Clés SSH générées localement (non sécurisées)
- ❌ Mots de passe en clair dans Dockerfiles
- ❌ Configuration SSH permissive
- ❌ Réseau partagé entre conteneurs

### Limitation RUSTSEC-2023-0071

xsshend v0.4.1 a une **limitation de sécurité connue** :
- **Vulnérabilité** : Marvin Attack dans `rsa 0.9.8`
- **Origine** : Dépendance transitive (xsshend → russh → rsa)
- **Correction** : ❌ Pas disponible (RustCrypto travaille sur v0.10)

**Dans le lab** :
- **Aucun impact** (réseau Docker isolé, localhost)
- ✅ Pas d'attaquant potentiel
- ✅ Données de test uniquement

**En production** :
- ⚠️ **Utiliser clés Ed25519** (recommandé, non affectées)
- ⚠️ Déployer sur réseaux de confiance uniquement
- ⚠️ Éviter WiFi public, réseaux non sécurisés

**Documentation complète** : [SECURITY.md](../SECURITY.md)

### Bonnes Pratiques

#### Dans le Lab
```bash
# ✅ OK : Tests avec RSA
xsshend upload test.txt --env Test

# ✅ OK : Générer Ed25519 pour production
ssh-keygen -t ed25519 -C "prod@example.com"
```

#### Pour Production
```bash
# ✅ Utiliser Ed25519
ssh-keygen -t ed25519 -C "user@production"

# ✅ Réseaux de confiance
# - VPN d'entreprise
# - Réseau interne
# - Connexions chiffrées point-à-point

# ❌ Éviter
# - WiFi public
# - Réseaux non sécurisés
# - Environnements compromis
```

---

## ❓ FAQ

### Questions Générales

**Q: Combien de temps prend le setup ?**  
A: ~10 minutes (5 min build Docker + 5 min installation xsshend)

**Q: Peut-on réutiliser les clés existantes ?**  
A: Le script écrase les clés existantes. Sauvegardez-les avant si nécessaire.

**Q: Fonctionne sur Windows/Mac ?**  
A: Oui, avec Docker Desktop. Scripts testés sur Linux/macOS.

**Q: Peut-on tester une version locale de xsshend ?**  
A: Oui :
```bash
# Compiler localement
cargo build --release

# Copier dans le conteneur
docker cp target/release/xsshend xsshend_master:/home/master/.cargo/bin/

# Tester
docker exec xsshend_master xsshend --version
```

### Problèmes Fréquents

**Q: "Permission denied (publickey)"**  
A: Vérifier :
```bash
# Clés présentes ?
docker exec xsshend_master ls -la ~/.ssh/

# Permissions correctes ?
docker exec xsshend_master stat -c '%a' ~/.ssh/id_rsa
# Attendu : 600

# authorized_keys sur target ?
docker exec xsshend_target1 cat /home/testuser/.ssh/authorized_keys
```

**Q: "xsshend: command not found"**  
A: Vérifier :
```bash
# Installé ?
docker exec xsshend_master which xsshend

# Si absent, réinstaller
docker exec -u master xsshend_master cargo install xsshend
```

**Q: "Cannot connect to Docker daemon"**  
A: Démarrer Docker :
```bash
# Linux
sudo systemctl start docker

# macOS/Windows
# Ouvrir Docker Desktop
```

**Q: Les tests échouent après redémarrage**  
A: Attendre que SSH démarre :
```bash
docker-compose restart
sleep 10
./scripts/test-lab.sh
```

### Personnalisation

**Q: Changer les noms de conteneurs ?**  
A: Modifier `scripts/lab-setup.sh` et `docker-compose.yml`

**Q: Ajouter un 3ème target ?**  
A: Dans `docker-compose.yml` :
```yaml
target3:
  build:
    context: .
    dockerfile: Dockerfile.target
  container_name: xsshend_target3
  hostname: target3
  networks:
    - xsshend_net
  volumes:
    - ./authorized_keys:/home/testuser/.ssh/authorized_keys:ro
  ports:
    - "2223:22"
```

**Q: Utiliser une autre distribution ?**  
A: Modifier `Dockerfile.master` et `Dockerfile.target` (Ubuntu, Debian, etc.)

### Performance

**Q: Upload est lent**  
A: Normal pour gros fichiers. Vérifier :
```bash
# Ressources Docker
docker stats

# Vitesse réseau conteneurs
docker exec xsshend_master sh -c "dd if=/dev/zero bs=1M count=100 | ssh -i ~/.ssh/id_rsa testuser@target1 'cat > /dev/null'"
```

**Q: Build Docker est long**  
A: Normal (compilation Rust). Accélérer :
```bash
# Utiliser cache
docker-compose build

# Build parallèle
docker-compose build --parallel
```

---

## 📚 Ressources

### Documentation

- **README Principal** : [../README.md]../README.md
- **Sécurité** : [SECURITY.md]../SECURITY.md
- **Configuration** : [configuration.md]configuration.md
- **Clés SSH** : [ssh-keys.md]ssh-keys.md

### Scripts

- **Setup** : `scripts/lab-setup.sh` - Configuration initiale
- **Tests** : `scripts/test-lab.sh` - Suite automatisée (40+ tests)
- **Diagnostic** : `scripts/lab-diagnostic.sh` - Vérification environnement
- **Fonctions communes** : `scripts/lab-common.sh` - Utilitaires réutilisables

### Support

- **Issues** : https://github.com/WillIsback/xsshend/issues
- **Discussions** : https://github.com/WillIsback/xsshend/discussions
- **Site web** : https://willisback.github.io/xsshend/

---

## ✅ Checklist Avant Production

Avant d'utiliser xsshend en production, valider :

- [ ] **Tous les tests lab passent** (40/40)
- [ ] **SECURITY.md lu et compris**
- [ ] **Décision sur type de clés** (Ed25519 recommandé)
- [ ] **Clés production générées** (différentes du lab)
- [ ] **hosts.json production préparé**
- [ ] **Réseau de confiance identifié** (VPN, interne)
- [ ] **Tests sur échantillon de serveurs** (non prod)
- [ ] **Plan de rollback défini**
- [ ] **Équipe formée**
- [ ] **Monitoring en place**

---

**Version du guide** : 1.0  
**Dernière mise à jour** : 18 octobre 2025  
**Compatible avec** : xsshend v0.4.1+

---

**Documentation créée par** : @WillIsback  
**Support** : [GitHub Issues](https://github.com/WillIsback/xsshend/issues)