# TP Azure – Architecture Bastion & VM privée
> **Guide pas à pas** — Mise en place d'une architecture sécurisée avec une VM bastion (publique) et une VM privée (isolée), partage de fichiers Azure Files, et accès bureau à distance.
---
## Table des matières
1. [Créer le groupe de ressources](#1--créer-le-groupe-de-ressources)
2. [Créer le réseau virtuel (VNet)](#2--créer-le-réseau-virtuel-vnet)
3. [Créer la VM Bastion (publique)](#3--créer-la-vm-bastion-publique)
4. [Créer la VM Private (isolée)](#4--créer-la-vm-private-isolée)
5. [Se connecter à la VM privée via le bastion](#5--se-connecter-à-la-vm-privée-via-le-bastion)
6. [Transférer des fichiers entre les VMs](#6--transférer-des-fichiers-entre-les-vms)
7. [Créer un sous-réseau dédié](#7--créer-un-sous-réseau-dédié)
8. [Configurer Azure Files (partage de fichiers)](#8--configurer-azure-files-partage-de-fichiers)
9. [Monter Azure Files sur les deux VMs](#9--monter-azure-files-sur-les-deux-vms)
10. [Installer un bureau à distance (RDP + XFCE)](#10--installer-un-bureau-à-distance-rdp--xfce)
---
## 1 — Créer le groupe de ressources
Le groupe de ressources est le conteneur logique qui regroupe toutes les ressources Azure du TP.

> On crée un nouveau groupe de ressources depuis le portail Azure. Choisissez un nom explicite (ex: `rg-tp-bastion`) et la région la plus proche.
---
## 2 — Créer le réseau virtuel (VNet)
Le réseau virtuel permet aux VMs de communiquer entre elles via des adresses IP privées.

> On accède au service **Réseaux virtuels** depuis le portail Azure pour créer notre VNet.

> Remplissez le nom du réseau virtuel et sélectionnez la même région que le groupe de ressources.

> Définissez l'espace d'adressage du VNet (ex: `10.0.0.0/16`). C'est la plage d'IP disponible pour toutes les VMs du réseau.

> Azure crée automatiquement un sous-réseau par défaut (ex: `10.0.0.0/24`). Les premières VMs seront placées dans ce sous-réseau.

> Vérifiez les paramètres avant de valider la création.

> ✅ Le réseau virtuel est déployé et prêt à accueillir les VMs.
---
## 3 — Créer la VM Bastion (publique)
La VM bastion est la **seule machine accessible depuis Internet**. Elle sert de passerelle SSH pour atteindre la VM privée.
### 3.1 — Créer la clé SSH

> On génère une paire de clés SSH. Azure crée la clé et vous propose de télécharger la clé privée (fichier `.pem`). **Conservez-la précieusement.**
### 3.2 — Configurer et déployer la VM

> La VM bastion est créée avec Ubuntu Server. Elle possède une IP publique pour être accessible depuis Internet.

> Récapitulatif des informations réseau de la VM bastion.
### 3.3 — Informations de la VM Bastion
| Élément | Valeur |
|---|---|
| Nom | **vm-bastion** |
| IP publique | **98.66.160.186** |
| IP privée | 10.0.0.4 |
| OS | Ubuntu 24.04 |
| Ports ouverts | **SSH 22** |
| Accès Internet | OUI |
> C'est la **seule machine visible depuis Internet**. Elle joue le rôle de passerelle (bastion).

> Notez bien le chemin du fichier `.pem` sur votre machine locale. Vous en aurez besoin pour chaque connexion SSH.
### 3.4 — Se connecter à la VM Bastion
```bash
ssh -i tpkey.pem abder@98.66.160.186
```

> ✅ Connexion SSH établie avec la VM bastion. On est prêt à créer la VM privée.
---
## 4 — Créer la VM Private (isolée)
La VM privée n'a **aucune IP publique** et n'est accessible que depuis la VM bastion.
### 4.1 — Demander un quota si nécessaire

> Si la taille de VM souhaitée n'est pas disponible, il faut faire une demande de quota auprès d'Azure.

> Azure traite la demande. Une fois approuvée, la taille sera disponible.
### 4.2 — Configuration de base
Même processus que pour la VM bastion, avec quelques différences clés.

> On crée la VM avec le même OS (Ubuntu 24.04) mais dans le même VNet que la VM bastion.

> Sélectionnez une taille adaptée à vos besoins et votre budget.

> Utilisez la **même clé SSH** que la VM bastion pour simplifier les connexions.
### 4.3 — Configuration réseau — Point critique

> **Point crucial :** On ne crée **aucune IP publique** pour cette VM. Elle sera uniquement accessible via le réseau privé.

> Placez la VM dans le **même réseau virtuel** que la VM bastion pour qu'elles puissent communiquer.

> Vérifiez qu'aucune IP publique n'est assignée et que le VNet est correct.
### 4.4 — Informations de la VM Private

> La VM privée est déployée. Notez l'absence d'IP publique.

> L'IP privée de la VM est `10.0.0.5`, accessible uniquement depuis le réseau interne.

> ✅ La VM privée est opérationnelle.
| Élément | Valeur |
|---|---|
| Nom | **vm-private** |
| IP publique | ❌ Aucune |
| IP privée | **10.0.0.5** |
| OS | Ubuntu 24.04 |
| Accès Internet direct | ❌ |
| Accès depuis vm-bastion | ✅ |
> Elle est **invisible depuis Internet** et accessible uniquement depuis vm-bastion.
---
## 5 — Se connecter à la VM privée via le bastion
### 5.1 — Transférer la clé SSH vers le bastion
Depuis la VM bastion, on doit pouvoir se connecter à la VM privée. Il faut d'abord y transférer la clé SSH.

> On copie la clé privée `.pem` sur la VM bastion pour pouvoir rebondir vers la VM privée.

> La clé SSH est bien présente sur la VM bastion. On peut maintenant se connecter à la VM privée.
### 5.2 — Se connecter depuis le bastion vers la VM privée
```bash
ssh -i tpkey.pem abder@10.0.0.5
```

> On utilise l'adresse IP privée (`10.0.0.5`) pour se connecter, puisque la VM n'a pas d'IP publique.

> ✅ **Connexion réussie !** On est connecté à la VM privée en rebondissant via le bastion. Le flux est : PC → vm-bastion (IP publique) → vm-private (IP privée).
---
## 6 — Transférer des fichiers entre les VMs
### 6.1 — Créer un dossier partagé sur vm-private
Sur vm-private :
```bash
mkdir ~/partage
chmod 755 ~/partage
ls -l ~
```
### 6.2 — Créer un fichier test
```bash
echo "Fichier depuis vm-private" > ~/partage/secret.txt
cat ~/partage/secret.txt
```
### 6.3 — Revenir sur vm-bastion
```bash
exit
```

> On crée le dossier `partage` et un fichier `secret.txt` sur la VM privée, puis on revient sur le bastion.

> On est de retour sur `vm-bastion`. On va maintenant récupérer le fichier créé sur la VM privée.
### 6.4 — Copier un fichier depuis vm-private vers vm-bastion
Sur vm-bastion :
```bash
scp -i tpkey.pem abder@10.0.0.5:/home/abder/partage/secret.txt .
cat secret.txt
```
> Résultat attendu : `Fichier depuis vm-private`
### 6.5 — Copier un fichier depuis vm-bastion vers vm-private
```bash
echo "Fichier depuis bastion" > envoi.txt
scp -i tpkey.pem envoi.txt abder@10.0.0.5:/home/abder/partage/
```
Vérification (se reconnecter à vm-private) :
```bash
ssh -i tpkey.pem abder@10.0.0.5
ls ~/partage
cat ~/partage/envoi.txt
```

> ✅ Le transfert de fichiers fonctionne dans les deux sens via SCP en utilisant la clé SSH et l'IP privée.
---
## 7 — Créer un sous-réseau dédié
On isole la VM privée dans un sous-réseau séparé pour une meilleure segmentation réseau.
### 7.1 — Créer le sous-réseau

> Dans les paramètres du VNet, on ajoute un second sous-réseau (ex: `subnet-private` avec la plage `10.0.1.0/24`).

> Définissez le nom et la plage d'adresses du nouveau sous-réseau.
### 7.2 — Déplacer la VM privée dans le nouveau sous-réseau

> On modifie la carte réseau de vm-private pour la déplacer vers le nouveau sous-réseau.

> ✅ La VM privée est maintenant isolée dans son propre sous-réseau (`subnet-private`), renforçant la segmentation réseau.
---
## 8 — Configurer Azure Files (partage de fichiers)
Azure Files permet de créer un partage de fichiers accessible par les deux VMs simultanément.
### 8.1 — Créer le compte de stockage

> On crée un compte de stockage Azure qui hébergera le partage de fichiers.

> ✅ Le compte de stockage est déployé.

> Le dashboard du compte de stockage montre les informations principales et les services disponibles.
### 8.2 — Créer le partage de fichiers

> Dans la section **Partages de fichiers**, on crée un nouveau partage (ex: `partage`).

> ✅ Le partage de fichiers est créé et prêt à être monté sur les VMs.
### 8.3 — Récupérer le script de connexion

> Azure fournit un script de montage pour Linux. On va l'adapter pour nos VMs.
---
## 9 — Monter Azure Files sur les deux VMs
### 9.1 — Monter sur vm-bastion
#### Installer le support CIFS
```bash
sudo apt update
sudo apt install -y cifs-utils
```

> Le package `cifs-utils` permet à Linux de monter des partages de fichiers SMB/CIFS comme Azure Files.
#### Créer le dossier de montage et le fichier d'identifiants
```bash
sudo mkdir -p /media/partage
sudo mkdir -p /etc/smbcredentials
sudo nano /etc/smbcredentials/tpstorageabder.cred
```

> Le fichier `.cred` contient le nom du compte de stockage et la clé d'accès. Ces informations se trouvent dans le portail Azure.
#### Ajouter le montage automatique dans `/etc/fstab`
```bash
sudo nano /etc/fstab
```
Ajoutez cette ligne à la fin du fichier :
```
//tpstorageabder.file.core.windows.net/partage /media/partage cifs nofail,credentials=/etc/smbcredentials/tpstorageabder.cred,dir_mode=0777,file_mode=0777,serverino,nosharesock,mfsymlinks,actimeo=30
```

> La ligne dans `/etc/fstab` assure que le partage sera monté automatiquement à chaque démarrage de la VM.

> ✅ Azure Files est monté et fonctionnel sur vm-bastion. Le dossier `/media/partage` est maintenant synchronisé avec le cloud.
### 9.2 — Monter sur vm-private
On se connecte à la VM privée et on répète le même processus.

> On rebondit via le bastion pour accéder à la VM privée.

> On installe les mêmes dépendances sur la VM privée.

> On crée le fichier d'identifiants Azure Files sur la VM privée.

> On ajoute la même ligne de montage dans `/etc/fstab` de la VM privée.

> ✅ Le montage fonctionne aussi sur vm-private.

> Les fichiers créés depuis une VM apparaissent automatiquement sur l'autre grâce au partage Azure Files.

> ✅ Le partage Azure Files est fonctionnel sur les deux VMs. Les fichiers sont synchronisés en temps réel.
---
## 10 — Installer un bureau à distance (RDP + XFCE)
### 10.1 — Installer l'environnement graphique

> On installe un serveur XRDP et un environnement de bureau léger sur la VM bastion.
### 10.2 — Configurer les règles réseau pour RDP

> On ajoute une règle de sécurité entrante pour autoriser le **port 3389 (RDP)** dans le NSG de la VM bastion.

> Paramètres de la règle : autoriser le trafic TCP entrant sur le port 3389 depuis n'importe quelle source.

> ✅ La règle RDP est active. La connexion bureau à distance est maintenant autorisée.
### 10.3 — Se connecter en bureau à distance

> Ouvrez **Connexion Bureau à distance** sur Windows et entrez l'IP publique de vm-bastion.
### 10.4 — Créer un mot de passe utilisateur
```bash
sudo passwd abder
```

> RDP nécessite un mot de passe (contrairement à SSH qui utilise une clé). On en crée un pour l'utilisateur `abder`.

> Le mot de passe est défini. On peut maintenant se connecter via RDP.
### 10.5 — Installer XFCE (résolution du bug d'écran noir)
> ⚠️ **Bug courant** : l'environnement de bureau par défaut peut afficher un écran noir via RDP. **XFCE** est une alternative légère qui fonctionne correctement.
> **Note :** Si la VM est surchargée avec la taille gratuite (B2ats_v2), passez à une taille supérieure pour supporter l'interface graphique.

> On augmente la taille de la VM pour qu'elle ait assez de ressources pour l'environnement graphique.

> Installation de l'environnement de bureau XFCE via `sudo apt install xfce4`.

> ✅ XFCE est installé et configuré comme environnement de bureau par défaut pour XRDP.
### 10.6 — Résultat final — Bureau à distance fonctionnel

> L'écran de connexion XFCE s'affiche via RDP. Entrez vos identifiants (`abder` + le mot de passe créé).

> ✅ **Le bureau à distance est fonctionnel !** On accède à l'interface graphique de la VM bastion depuis notre PC via RDP.
---
## Récapitulatif de l'architecture
```
┌──────────────┐ ┌─────────────────────────────────────┐
│ Votre PC │ │ Réseau Virtuel Azure │
│ │ │ │
│ │──SSH──▶│ ┌─────────────┐ ┌─────────────┐ │
│ │──RDP──▶│ │ vm-bastion │───▶│ vm-private │ │
│ │ │ │ IP: pub+priv│ │ IP: priv │ │
│ │ │ │ Port 22,3389│ │ Aucun port │ │
└──────────────┘ │ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ └───────┬───────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Azure Files │ │
│ │ /media/partage │ │
│ └─────────────────┘ │
└─────────────────────────────────────┘
```
### Résumé des ressources
| Ressource | Rôle |
|---|---|
| **Groupe de ressources** | Conteneur logique pour toutes les ressources |
| **VNet + 2 sous-réseaux** | Réseau privé pour la communication inter-VMs |
| **vm-bastion** | Passerelle SSH/RDP accessible depuis Internet |
| **vm-private** | Machine isolée, accessible uniquement via le bastion |
| **Azure Files** | Partage de fichiers monté sur les deux VMs |
| **NSG** | Règles de pare-feu (SSH 22, RDP 3389) |
### Principes de sécurité appliqués
| Principe | Mise en œuvre |
|---|---|
| **Moindre privilège** | vm-private n'a aucune IP publique |
| **Bastion / Jump host** | Un seul point d'entrée depuis Internet |
| **Segmentation réseau** | Sous-réseaux séparés pour chaque rôle |
| **Authentification par clé** | SSH par clé `.pem`, pas de mot de passe |
| **Partage centralisé** | Azure Files évite les copies manuelles |
---
> **Guide réalisé par Abder** — TP Azure : Architecture Bastion & VM privée