Chapitre 715 minIntermédiaire
Créer une VM Linux sur Azure et la protéger avec un NSG
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- choisir une taille, une image et un disque pour une VM ;
- créer une VM Linux avec l'Azure CLI et cloud-init ;
- filtrer les flux avec les règles d'un NSG ;
- arrêter vraiment une VM pour ne plus payer le calcul.
3 exercices corrigés1 schéma
Une machine virtuelle Azure est le service IaaS de base : un serveur virtuel dont tu choisis la taille, le système et le réseau, et dont tu administres tout ce qui tourne à l'intérieur. Elle se protège avec un groupe de sécurité réseau (NSG, Network Security Group), une liste de règles de filtrage à états qui décide quels flux peuvent l'atteindre. Ce chapitre présente les composants d'une VM, le fonctionnement d'un NSG, puis un lab complet : une VM Ubuntu qui sert une page web, accessible en SSH depuis ta seule adresse IP, arrêtée et supprimée proprement.
Les composants d'une VM Azure
Une VM n'est pas une ressource unique : c'est un assemblage. az vm create crée automatiquement ce qui manque.
| Composant | Rôle | Choix dans ce lab |
|---|---|---|
| Taille | Nombre de processeurs virtuels et mémoire. La série B est dite burstable : elle accumule des crédits de processeur au repos et les dépense lors des pics, idéale pour un petit serveur ; la série D est généraliste | Standard_B1s : 1 vCPU, 1 Gio, comprise dans les services gratuits pendant 12 mois |
| Image | Le système installé, désigné par un URN éditeur:offre:référence:version | Canonical:ubuntu-24_04-lts:server:latest, Ubuntu 24.04 LTS |
| Disque du système | Un disque managé : HDD Standard, SSD Standard ou SSD Premium | Celui par défaut |
| Réseau virtuel et sous-réseau | Le réseau privé de la VM | Créés par la commande : 10.0.0.0/16, sous-réseau 10.0.0.0/24 |
| Carte réseau | Relie la VM au sous-réseau, porte son adresse privée | Adresse 10.0.0.4 : Azure réserve les premières adresses de chaque sous-réseau |
| Adresse IP publique | Rend la VM joignable depuis Internet | SKU Standard, fermée par défaut tant qu'aucune règle ne l'ouvre |
| Groupe de sécurité réseau | Filtre les flux entrants et sortants | Créé vide, puis deux règles ajoutées à la main |
Ubuntu 26.04 LTS est aussi disponible (Canonical:ubuntu-26_04-lts:server:latest). Pour trouver une image, az vm image list-offers --location francecentral --publisher Canonical --output table liste les offres de l'éditeur, az vm image list --location francecentral --publisher Canonical --offer ubuntu-26_04-lts --all --output table les versions d'une offre, et az vm list-skus --location francecentral --size Standard_B --output table vérifie qu'une taille existe dans ta région.
Le groupe de sécurité réseau (NSG)
Un NSG est une liste de règles, associée à un sous-réseau ou à une carte réseau. Chaque règle porte une priorité (de 100 à 4096), un sens (entrant ou sortant), une source et une destination (adresse, plage CIDR ou étiquette de service), un port, un protocole et une action (autoriser ou refuser).
- Les règles sont examinées par priorité croissante : la plus petite d'abord. La première qui correspond s'applique, et l'examen s'arrête.
- Le NSG est à états : si un flux entrant est autorisé, la réponse repart sans règle sortante, comme sur pfSense (cours pfSense).
- Les étiquettes de service remplacent des listes d'adresses tenues à jour par Microsoft :
Internet,VirtualNetwork,AzureLoadBalancer,Storage… - Quand un NSG est associé au sous-réseau et un autre à la carte réseau, un flux entrant doit être autorisé par les deux : celui du sous-réseau d'abord, puis celui de la carte.
Tout NSG contient six règles par défaut, impossibles à supprimer, avec les priorités les plus basses :
| Sens | Nom | Priorité | Source | Destination | Action |
|---|---|---|---|---|---|
| Entrant | AllowVNetInBound | 65000 | VirtualNetwork | VirtualNetwork | Autoriser |
| Entrant | AllowAzureLoadBalancerInBound | 65001 | AzureLoadBalancer | Toutes | Autoriser |
| Entrant | DenyAllInbound | 65500 | Toutes | Toutes | Refuser |
| Sortant | AllowVnetOutBound | 65000 | VirtualNetwork | VirtualNetwork | Autoriser |
| Sortant | AllowInternetOutBound | 65001 | Toutes | Internet | Autoriser |
| Sortant | DenyAllOutBound | 65500 | Toutes | Toutes | Refuser |
Résultat : tout ce qui vient d'Internet est refusé tant qu'une règle de priorité plus forte ne l'autorise pas, et la VM peut sortir vers Internet (pour ses mises à jour, par exemple).
Lab : une VM web Ubuntu protégée par un NSG
Ce lab coûte quelques centimes s'il dure une heure, et la VM B1s entre dans les services gratuits la première année. Supprime tout à la fin.
1. Prépare le groupe de ressources et repère ton adresse publique.
az group create --name rg-cloud-lab --location francecentral --tags cours=cloud
# Ton adresse IP publique, telle qu'Azure la verra
MON_IP=$(curl -s https://api.ipify.org)
echo "$MON_IP"
2. Écris un fichier cloud-init. Au premier démarrage, cloud-init installe Nginx et écrit une page d'accueil, sans que tu te connectes (cours Virtualisation).
cat > cloud-init.yaml <<'EOF'
#cloud-config
package_update: true
packages:
- nginx
runcmd:
- echo '<meta charset="utf-8"><h1>vm-web01 répond, Sorbier Logistique</h1>' > /var/www/html/index.html
EOF
3. Crée la VM, sans aucune règle d'accès (--nsg-rule NONE) : tu ouvriras ensuite exactement ce qu'il faut.
az vm create \
--resource-group rg-cloud-lab \
--name vm-web01 \
--image Canonical:ubuntu-24_04-lts:server:latest \
--size Standard_B1s \
--admin-username sioadmin \
--generate-ssh-keys \
--public-ip-sku Standard \
--nsg-rule NONE \
--custom-data cloud-init.yaml
--generate-ssh-keys utilise ta clé de ~/.ssh ou en crée une : la VM n'accepte alors que l'authentification par clé, sans mot de passe (cours Linux). Au bout d'une à deux minutes, la commande affiche un résumé :
{
"powerState": "VM running",
"privateIpAddress": "10.0.0.4",
"publicIpAddress": "192.0.2.50",
"resourceGroup": "rg-cloud-lab"
}
Ici, 192.0.2.50 est une adresse d'exemple : Azure t'en attribue une de ses plages publiques, différente à chaque lab. Utilise la tienne. Le NSG a été nommé vm-web01NSG, l'adresse publique vm-web01PublicIP.
4. Ouvre le SSH pour toi seul, et le HTTP pour tout le monde.
az network nsg rule create \
--resource-group rg-cloud-lab \
--nsg-name vm-web01NSG \
--name autoriser-ssh-admin \
--priority 100 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--source-address-prefixes "$MON_IP/32" \
--destination-port-ranges 22
az network nsg rule create \
--resource-group rg-cloud-lab \
--nsg-name vm-web01NSG \
--name autoriser-http \
--priority 110 \
--direction Inbound \
--access Allow \
--protocol Tcp \
--source-address-prefixes Internet \
--destination-port-ranges 80
# Les règles du NSG, avec les règles par défaut
az network nsg rule list --resource-group rg-cloud-lab --nsg-name vm-web01NSG --include-default --output table
5. Teste.
IP_VM=$(az vm show --show-details --resource-group rg-cloud-lab --name vm-web01 --query publicIps --output tsv)
curl "http://$IP_VM"
ssh sioadmin@"$IP_VM"
curl doit afficher <meta charset="utf-8"><h1>vm-web01 répond, Sorbier Logistique</h1>. Si tu obtiens la page par défaut de Nginx, cloud-init n'a pas fini : dans la session SSH, cloud-init status --wait attend la fin et affiche status: done. Essaie aussi le SSH depuis une autre connexion (le partage de connexion de ton téléphone, par exemple) : il doit échouer, faute de règle.
6. Arrête la VM pour de bon, puis supprime tout.
# Désallouer : le calcul n'est plus facturé (le disque et l'IP publique le restent)
az vm deallocate --resource-group rg-cloud-lab --name vm-web01
# Ou programmer un arrêt automatique chaque jour à 18 h UTC
az vm auto-shutdown --resource-group rg-cloud-lab --name vm-web01 --time 1800
# Fin du lab
az group delete --name rg-cloud-lab --yes --no-wait
| État de la VM | Comment on y arrive | Calcul facturé | Disque et IP publique facturés |
|---|---|---|---|
| En cours d'exécution | az vm start, démarrage | Oui | Oui |
| Arrêtée (allouée) | sudo shutdown dans la VM, az vm stop | Oui | Oui |
| Arrêtée (désallouée) | az vm deallocate, bouton Arrêter du portail, arrêt automatique | Non | Oui |
| Supprimée | az vm delete, az group delete | Non | Non, si on supprime aussi le disque et l'IP |
Sécuriser l'administration d'une VM
- N'ouvre jamais le SSH ni le RDP à tout Internet. Des robots balaient en permanence toutes les adresses publiques et testent des mots de passe sur les ports 22 et 3389. Limite la source à une adresse connue, comme dans le lab.
- Pour se passer d'adresse publique d'administration, Azure propose Azure Bastion, un bastion managé qui donne une session SSH ou RDP dans le navigateur, et l'accès juste-à-temps (just-in-time) de Microsoft Defender for Cloud, une option payante qui n'ouvre le port que pour une durée limitée après une demande. Chez Sorbier, on passe plutôt par le VPN du siège : l'administration se fait depuis le VLAN 99 ADMIN, comme pour les serveurs locaux (cours Authentification).
- Applique les mises à jour. Les images Ubuntu installent automatiquement les correctifs de sécurité avec
unattended-upgrades; Azure Update Manager permet de suivre et planifier les mises à jour de tout un parc de VM, dans Azure ou sur site. - Sauvegarde la VM avec Azure Backup (chapitre 13) : en IaaS, c'est à toi de le faire.
Exercices
Exercice 1 sur 3 Lire un NSG Réussi À revoir
Le NSG d'une VM web de Sorbier contient ces règles entrantes, en plus des règles par défaut :
| Priorité | Nom | Source | Port | Protocole | Action |
|---|---|---|---|---|---|
| 100 | ssh-siege | 203.0.113.17/32 | 22 | TCP | Autoriser |
| 110 | web | Internet | 80, 443 | TCP | Autoriser |
| 120 | bloquer-ssh | Toutes | 22 | TCP | Refuser |
| 200 | rdp | Toutes | 3389 | TCP | Autoriser |
Pour chaque flux, dis s'il passe et quelle règle décide.
- Une connexion SSH depuis le pare-feu du siège,
203.0.113.17. - Une connexion SSH depuis le pare-feu de Mâcon,
198.51.100.40. - Un client qui consulte le site en HTTPS.
- Un robot qui tente une connexion RDP depuis l'étranger.
- Un
pingdepuis Internet. - La réponse du serveur à la requête HTTPS du client.
- La VM qui télécharge ses mises à jour sur les dépôts Ubuntu.
Voir la réponseMasquer la réponse de l'exercice 1
- Passe, règle 100.
- Bloqué, règle 120 : la règle 100 ne correspond pas (autre source), la 110 non plus (autre port).
- Passe, règle 110.
- Passe, règle 200 : c'est une faille. Une VM Linux n'a pas besoin du port 3389, et aucun service d'administration ne doit être ouvert à toutes les sources. Supprime cette règle.
- Bloqué par la règle par défaut DenyAllInbound (65500) : aucune règle n'autorise l'ICMP.
- Passe sans règle : le NSG est à états, la réponse d'un flux autorisé repart automatiquement.
- Passe, règle sortante par défaut AllowInternetOutBound (65001).
Tu avais trouvé ?
Exercice 2 sur 3 Trouver l'erreur Réussi À revoir
Une étudiante veut « tout bloquer sauf le SSH depuis son adresse ». Elle crée deux règles entrantes : priorité 300, autoriser le TCP 22 depuis Toutes les sources ; priorité 4000, refuser tout depuis Toutes les sources. Elle pense que la règle 4000 limite la 300. Qu'en est-il, et comment corriger ?
Voir la réponseMasquer la réponse de l'exercice 2
La règle 300 est examinée avant la 4000 (priorité plus forte) et elle correspond à toute tentative de SSH : le port 22 est ouvert au monde entier. Pour le trafic venu d'Internet, la règle 4000 n'ajoute rien : DenyAllInbound le refuse déjà. Elle a même un effet de bord : examinée avant AllowVNetInBound (65000) et AllowAzureLoadBalancerInBound (65001), elle bloque aussi les autres VM du réseau virtuel et les sondes d'un équilibreur de charge. Correction : une seule règle d'autorisation du TCP 22 dont la source est son adresse IP en /32. Le refus du reste est assuré par les règles par défaut.
Tu avais trouvé ?
Exercice 3 sur 3 Combien ça coûte encore ? Réussi À revoir
Pour chaque situation, dis ce qui est encore facturé.
- Le soir, l'étudiant tape
sudo poweroffdans sa VM. - Il clique sur Arrêter dans le portail.
- Il supprime la VM avec
az vm delete. - Il supprime le groupe de ressources.
Voir la réponseMasquer la réponse de l'exercice 3
- Tout : la VM est arrêtée mais allouée, son calcul est facturé, comme son disque et son adresse IP.
- Le disque et l'adresse IP publique : le bouton Arrêter du portail désalloue la VM, le calcul n'est plus facturé.
- Ça dépend des options de suppression fixées à la création de la VM. Si elles ne prévoient pas de supprimer les ressources liées, le disque du système et l'adresse IP publique restent, et sont facturés ; la carte réseau, le NSG et le réseau virtuel restent aussi, sans coût, mais encombrent l'abonnement. Vérifie avec
az resource list --resource-group rg-cloud-lab --output table. - Rien : toutes les ressources du groupe sont supprimées.
Tu avais trouvé ?