Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| eadl:bloc4:fm4:td2 [2026/06/14 16:15] – jcheron | eadl:bloc4:fm4:td2 [2026/06/14 17:07] (Version actuelle) – [6. Correction – restriction du backend] jcheron | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== TD2 – Sécurisation réseau AWS (ALB, Backend, DB) ====== | + | ====== TD2 – Sécurisation réseau AWS (VPC, Security Groups, ALB) ====== |
| ===== Objectifs ===== | ===== Objectifs ===== | ||
| - | * Comprendre la segmentation réseau dans AWS | + | * Comprendre la segmentation réseau dans AWS avec VPC et subnets |
| - | * Identifier les mauvaises pratiques réseau | + | * Identifier les mauvaises pratiques |
| - | * Introduire | + | * Mettre en place un point d'entrée |
| - | * Contrôler les flux avec les Security Groups | + | * Contrôler les flux réseau |
| - | * Appliquer le principe du moindre privilège | + | * Appliquer le principe du moindre privilège |
| ===== Contexte ===== | ===== Contexte ===== | ||
| - | Vous intervenez dans la même startup. | + | Vous intervenez |
| - | Une application backend | + | L' |
| - | Le déploiement a été fait rapidement | + | Le déploiement a été fait rapidement |
| Résultat : | Résultat : | ||
| - | * l’application fonctionne | + | * l'application fonctionne |
| - | * mais toute l’infrastructure est exposée | + | * mais toute l'infrastructure est directement |
| - | Un audit de sécurité | + | Un audit de sécurité |
| - | * suppression des accès directs aux composants internes | + | * le port applicatif du backend est ouvert à Internet |
| - | * mise en place d’une architecture sécurisée | + | * le port de la base de données est ouvert à Internet |
| - | * contrôle strict des flux réseau | + | * aucun point d' |
| - | ===== Objectif technique ===== | + | Votre mission : transformer l' |
| - | Transformer l’architecture actuelle : | + | ===== Architecture cible ===== |
| - | * Internet → Backend (actuel, non sécurisé) | + | L' |
| - | en : | + | Internet → Backend (port 80 ouvert partout) |
| + | Internet → DB (port 5432 ouvert partout) | ||
| - | * Internet → ALB → Backend → DB | + | L' |
| + | |||
| + | | ||
| ===== Contraintes ===== | ===== Contraintes ===== | ||
| - | * L’application doit rester accessible | + | * L'application doit rester accessible |
| - | * Le backend ne doit plus être exposé | + | * Le backend ne doit plus être accessible |
| - | * La base de données doit être isolée | + | * La base de données |
| - | * Utiliser | + | * Tout le code est en Terraform |
| - | ===== Infrastructure existante | + | ===== Pré-requis |
| - | Fichier : `network/ | + | * Terraform installé et configuré |
| + | * Credentials AWS valides | ||
| + | * Notions de base : VPC, subnet, Security Group | ||
| + | |||
| + | ===== Infrastructure de départ ===== | ||
| + | |||
| + | L' | ||
| + | |||
| + | Lire le code attentivement avant de l' | ||
| + | |||
| + | Fichier : `td2/network/ | ||
| <sxh js> | <sxh js> | ||
| provider " | provider " | ||
| Ligne 53: | Ligne 66: | ||
| } | } | ||
| + | # VPC principal | ||
| resource " | resource " | ||
| - | cidr_block = " | + | cidr_block |
| + | enable_dns_hostnames = true | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| } | } | ||
| - | resource "aws_subnet" "public" { | + | # Passerelle Internet |
| - | vpc_id | + | resource "aws_internet_gateway" "igw" { |
| - | | + | vpc_id = aws_vpc.main.id |
| + | |||
| + | | ||
| + | Name = "td2-igw" | ||
| + | } | ||
| } | } | ||
| + | # Subnet public – AZ a | ||
| + | resource " | ||
| + | vpc_id | ||
| + | cidr_block | ||
| + | availability_zone | ||
| + | map_public_ip_on_launch = true | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # Subnet public – AZ b (requis par l'ALB) | ||
| + | resource " | ||
| + | vpc_id | ||
| + | cidr_block | ||
| + | availability_zone | ||
| + | map_public_ip_on_launch = true | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # Subnet privé – DB | ||
| resource " | resource " | ||
| - | vpc_id | + | vpc_id |
| - | cidr_block = "10.0.2.0/24" | + | cidr_block |
| + | availability_zone = " | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| } | } | ||
| + | # Table de routage publique | ||
| + | resource " | ||
| + | vpc_id = aws_vpc.main.id | ||
| + | |||
| + | route { | ||
| + | cidr_block = " | ||
| + | gateway_id = aws_internet_gateway.igw.id | ||
| + | } | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | resource " | ||
| + | subnet_id | ||
| + | route_table_id = aws_route_table.public.id | ||
| + | } | ||
| + | |||
| + | resource " | ||
| + | subnet_id | ||
| + | route_table_id = aws_route_table.public.id | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Fichier : `td2/ | ||
| + | <sxh js> | ||
| + | # Security Group backend – PROBLEME VOLONTAIRE | ||
| + | # Ce fichier sera modifié au cours du TD | ||
| resource " | resource " | ||
| name = " | name = " | ||
| Ligne 72: | Ligne 154: | ||
| ingress { | ingress { | ||
| + | description = "HTTP depuis Internet" | ||
| from_port | from_port | ||
| to_port | to_port | ||
| protocol | protocol | ||
| cidr_blocks = [" | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | egress { | ||
| + | from_port | ||
| + | to_port | ||
| + | protocol | ||
| + | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| } | } | ||
| } | } | ||
| + | # Security Group DB – PROBLEME VOLONTAIRE | ||
| resource " | resource " | ||
| name = " | name = " | ||
| Ligne 84: | Ligne 179: | ||
| ingress { | ingress { | ||
| + | description = " | ||
| from_port | from_port | ||
| to_port | to_port | ||
| protocol | protocol | ||
| cidr_blocks = [" | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | egress { | ||
| + | from_port | ||
| + | to_port | ||
| + | protocol | ||
| + | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| } | } | ||
| } | } | ||
| + | </ | ||
| + | Fichier : `td2/ | ||
| + | <sxh js> | ||
| resource " | resource " | ||
| - | ami | + | ami = "ami-0f61de2873e29e866" |
| - | instance_type = " | + | instance_type |
| - | subnet_id | + | subnet_id |
| vpc_security_group_ids = [aws_security_group.backend_sg.id] | vpc_security_group_ids = [aws_security_group.backend_sg.id] | ||
| + | |||
| + | user_data = << | ||
| + | #!/bin/bash | ||
| + | yum install -y python3 | ||
| + | python3 -m http.server 80 & | ||
| + | EOF | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| } | } | ||
| - | resource "aws_instance" " | + | resource "aws_db_instance" " |
| - | | + | |
| - | | + | |
| - | | + | engine_version |
| + | instance_class | ||
| + | | ||
| + | username | ||
| + | password | ||
| + | db_subnet_group_name | ||
| vpc_security_group_ids = [aws_security_group.db_sg.id] | vpc_security_group_ids = [aws_security_group.db_sg.id] | ||
| + | skip_final_snapshot | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | resource " | ||
| + | name = " | ||
| + | subnet_ids = [aws_subnet.private.id, | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| } | } | ||
| </ | </ | ||
| - | ===== Ressources | + | ===== Commandes Terraform |
| - | Fichier : `commandes/ | + | Fichier : `td2/commandes/ |
| <sxh bash> | <sxh bash> | ||
| + | # Initialiser le projet | ||
| terraform init | terraform init | ||
| + | |||
| + | # Vérifier le plan sans appliquer | ||
| terraform plan | terraform plan | ||
| + | |||
| + | # Appliquer la configuration | ||
| terraform apply | terraform apply | ||
| + | |||
| + | # Récupérer les outputs | ||
| + | terraform output | ||
| + | |||
| + | # Détruire l' | ||
| terraform destroy | terraform destroy | ||
| </ | </ | ||
| - | ===== 1. Compréhension de l’existant | + | ===== 1. Lecture du code ===== |
| + | |||
| + | Lire les trois fichiers avant toute manipulation. | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Quels composants sont présents ? | + | Lister les ressources présentes dans le code. |
| - | Quelle | + | Pour chaque ressource, indiquer : |
| + | * son rôle | ||
| + | * le subnet dans lequel elle est placée | ||
| + | * les ports ouverts en entrée | ||
| </ | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Pourquoi | + | Pourquoi |
| + | |||
| + | Quelle contrainte AWS cela reflète-t-il | ||
| </ | </ | ||
| - | ===== 2. Analyse | + | <WRAP round question> |
| + | La base de données est une instance RDS et non une instance EC2. | ||
| + | |||
| + | Quelle est la différence en termes de gestion et de sécurité ? | ||
| + | </ | ||
| + | |||
| + | ===== 2. Identification | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Identifier dans `security_groups.tf` les deux règles les plus dangereuses. | ||
| + | |||
| + | Pour chaque règle : | ||
| + | * expliquer ce qu' | ||
| + | * expliquer ce qu'un attaquant pourrait faire avec cet accès | ||
| + | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Identifier les problèmes : | + | Le mot de passe de la base de données est en clair dans le fichier Terraform. |
| - | * exposition du backend | + | Quel problème cela pose-t-il ? |
| - | * exposition de la base de données | + | |
| - | * placement des ressources | + | |
| + | Ce problème sera traité dans un TD ultérieur sur la gestion des secrets. | ||
| </ | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Quelle | + | La base de données RDS est placée |
| - | Pourquoi ? | + | Est-ce un problème ? Pourquoi ? |
| </ | </ | ||
| - | ===== 3. Mise en pratique – introduction d’un ALB ===== | + | ===== 3. Déploiement de l' |
| - | Objectif | + | <WRAP round todo> |
| + | Appliquer la configuration telle quelle | ||
| - | * créer un point d’entrée unique | + | |
| + | |||
| + | Relever les outputs suivants : | ||
| + | | ||
| + | * endpoint de la base RDS | ||
| + | </ | ||
| + | |||
| + | Fichier : `td2/ | ||
| + | <sxh js> | ||
| + | output " | ||
| + | value = aws_instance.backend.public_ip | ||
| + | description = "IP publique du backend" | ||
| + | } | ||
| + | |||
| + | output " | ||
| + | value = aws_db_instance.db.endpoint | ||
| + | description = " | ||
| + | } | ||
| + | </ | ||
| <WRAP round todo> | <WRAP round todo> | ||
| + | Tester l' | ||
| - | Créer | + | curl http://< |
| - | * un Application Load Balancer | + | Tenter une connexion à la base de données |
| - | * un Security Group associé | + | |
| - | * autoriser HTTP depuis | + | |
| + | psql -h < | ||
| + | |||
| + | Noter le résultat de chaque test. | ||
| + | </ | ||
| + | |||
| + | <WRAP round question> | ||
| + | Le backend répond-il ? | ||
| + | |||
| + | La connexion à la base de données est-elle possible depuis votre poste ? | ||
| + | |||
| + | Pourquoi ce comportement est-il problématique dans un contexte de production ? | ||
| + | </ | ||
| + | |||
| + | ===== 4. Mise en place de l'ALB ===== | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Créer le fichier suivant sans modifier les Security Groups existants. | ||
| </ | </ | ||
| - | Fichier : `network/ | + | Fichier : `td2/network/ |
| <sxh js> | <sxh js> | ||
| + | # Security Group de l'ALB | ||
| resource " | resource " | ||
| name = " | name = " | ||
| Ligne 168: | Ligne 373: | ||
| ingress { | ingress { | ||
| + | description = "HTTP depuis Internet" | ||
| from_port | from_port | ||
| to_port | to_port | ||
| protocol | protocol | ||
| cidr_blocks = [" | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | egress { | ||
| + | from_port | ||
| + | to_port | ||
| + | protocol | ||
| + | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| } | } | ||
| } | } | ||
| - | </ | ||
| - | ===== 4. Erreur volontaire ===== | + | # Application Load Balancer |
| + | resource " | ||
| + | name = " | ||
| + | internal | ||
| + | load_balancer_type | ||
| + | security_groups | ||
| + | subnets | ||
| - | L’ALB est ajouté. | + | tags = { |
| + | Name = " | ||
| + | } | ||
| + | } | ||
| - | Mais rien n’a été modifié sur le backend. | + | # Target Group |
| + | resource " | ||
| + | name = " | ||
| + | port = 80 | ||
| + | protocol = " | ||
| + | vpc_id | ||
| + | |||
| + | health_check { | ||
| + | path = "/" | ||
| + | healthy_threshold | ||
| + | unhealthy_threshold = 2 | ||
| + | interval | ||
| + | } | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # Attachement du backend au Target Group | ||
| + | resource " | ||
| + | target_group_arn = aws_lb_target_group.backend.arn | ||
| + | target_id | ||
| + | port = 80 | ||
| + | } | ||
| + | |||
| + | # Listener HTTP | ||
| + | resource " | ||
| + | load_balancer_arn = aws_lb.main.arn | ||
| + | port = 80 | ||
| + | protocol | ||
| + | |||
| + | default_action { | ||
| + | type = " | ||
| + | target_group_arn = aws_lb_target_group.backend.arn | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| <WRAP round todo> | <WRAP round todo> | ||
| - | Tester | + | Ajouter l' |
| - | | + | |
| - | | + | value = aws_lb.main.dns_name |
| + | description = "DNS public de l' | ||
| + | } | ||
| + | |||
| + | Appliquer : | ||
| + | |||
| + | terraform apply | ||
| + | |||
| + | Tester l'accès via l'ALB : | ||
| + | |||
| + | | ||
| + | |||
| + | Tester également l'accès direct au backend | ||
| + | |||
| + | curl http://< | ||
| </ | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Pourquoi peut-on toujours accéder directement au backend | + | Les deux accès fonctionnent-ils ? |
| - | Quel est le problème | + | Qu'est-ce que cela démontre sur l' |
| + | |||
| + | L'ALB est-il suffisant seul pour sécuriser | ||
| </ | </ | ||
| - | ===== 5. Correction | + | ===== 5. Erreur courante |
| - | <WRAP round todo> | + | L'ALB est en place mais le Security Group du backend n'a pas été modifié. |
| - | Modifier le Security Group du backend | + | Le port 80 du backend |
| - | * autoriser uniquement le trafic depuis l’ALB | + | <WRAP round question> |
| + | Pourquoi ajouter un ALB ne suffit-il pas à protéger le backend ? | ||
| + | |||
| + | Quel composant contrôle réellement les accès réseau sur une instance AWS ? | ||
| + | </ | ||
| + | |||
| + | ===== 6. Correction – restriction du backend ===== | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Modifier `security_groups.tf`. | ||
| + | Remplacer la règle ingress du Security Group `backend_sg` : | ||
| + | * supprimer l' | ||
| + | * autoriser uniquement le trafic depuis le Security Group de l'ALB | ||
| </ | </ | ||
| - | Fichier : `network/backend_sg.tf` | + | Fichier : `td2/network/security_groups.tf` |
| <sxh js> | <sxh js> | ||
| resource " | resource " | ||
| Ligne 212: | Ligne 502: | ||
| ingress { | ingress { | ||
| + | description | ||
| from_port | from_port | ||
| to_port | to_port | ||
| Ligne 217: | Ligne 508: | ||
| security_groups = [aws_security_group.alb_sg.id] | security_groups = [aws_security_group.alb_sg.id] | ||
| } | } | ||
| - | } | ||
| - | </ | ||
| - | ===== 6. Correction – sécurisation de la base ===== | + | egress { |
| + | from_port | ||
| + | to_port | ||
| + | protocol | ||
| + | cidr_blocks | ||
| + | } | ||
| - | <WRAP round todo> | + | tags = { |
| - | + | Name = " | |
| - | Modifier le Security Group de la base : | + | } |
| - | + | } | |
| - | * autoriser uniquement le backend | + | |
| - | </ | ||
| - | |||
| - | Fichier : `network/ | ||
| - | <sxh js> | ||
| resource " | resource " | ||
| name = " | name = " | ||
| Ligne 237: | Ligne 526: | ||
| ingress { | ingress { | ||
| + | description | ||
| from_port | from_port | ||
| to_port | to_port | ||
| protocol | protocol | ||
| security_groups = [aws_security_group.backend_sg.id] | security_groups = [aws_security_group.backend_sg.id] | ||
| + | } | ||
| + | |||
| + | egress { | ||
| + | from_port | ||
| + | to_port | ||
| + | protocol | ||
| + | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| } | } | ||
| } | } | ||
| </ | </ | ||
| - | ===== 7. Apparition d’un problème ===== | + | <WRAP round todo> |
| + | Appliquer les modifications : | ||
| - | Après modification : | + | terraform apply |
| - | * l’application peut ne plus répondre | + | Tester les deux accès : |
| + | |||
| + | # Via l'ALB – doit fonctionner | ||
| + | curl http://< | ||
| + | |||
| + | # Direct – doit échouer | ||
| + | curl http://< | ||
| + | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Pourquoi | + | L' |
| + | |||
| + | L' | ||
| - | Quels flux ont pu être bloqués | + | Que se passe-t-il si le Health Check de l'ALB échoue ? |
| + | Comment vérifier l' | ||
| </ | </ | ||
| - | ===== 8. Analyse | + | ===== 7. Problème potentiel – Health Check ===== |
| + | |||
| + | Après modification des Security Groups, l'ALB peut afficher le backend comme " | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Vérifier : | + | Expliquer ce qu'est un Health Check d'ALB. |
| - | * règles de Security Groups | + | Quel flux réseau le Health Check génère-t-il ? |
| - | * ports utilisés | + | |
| - | * configuration du backend | + | Depuis quelle source arrive ce flux sur le backend |
| </ | </ | ||
| - | ===== 9. Correction ===== | + | <WRAP round question> |
| + | Si le backend est " | ||
| + | |||
| + | Le service devient indisponible même si le backend fonctionne. | ||
| + | |||
| + | Quelle règle dans le Security Group du backend pourrait causer ce blocage ? | ||
| + | </ | ||
| <WRAP round todo> | <WRAP round todo> | ||
| + | Vérifier dans la console AWS : | ||
| + | * aller dans EC2 > Target Groups | ||
| + | * vérifier le statut de l' | ||
| + | * lire le message d' | ||
| + | </ | ||
| - | Corriger les règles pour : | + | ===== 8. Diagnostic et correction ===== |
| - | | + | <WRAP round todo> |
| - | * conserver | + | Si le Health Check échoue, identifier la cause : |
| + | |||
| + | * le port 80 est-il bien ouvert depuis le Security Group de l'ALB ? | ||
| + | | ||
| + | * la règle egress de l'ALB permet-elle les réponses ? | ||
| + | Corriger la règle manquante et réappliquer. | ||
| </ | </ | ||
| - | ===== 10. Extension | + | ===== 9. Vérification finale |
| <WRAP round todo> | <WRAP round todo> | ||
| + | Réaliser les tests suivants et noter les résultats dans un tableau : | ||
| - | Ajouter | + | * accès HTTP via l'ALB → attendu |
| + | * accès HTTP direct au backend → attendu : timeout ou refus | ||
| + | * connexion PostgreSQL depuis votre poste → attendu : timeout ou refus | ||
| + | * connexion PostgreSQL depuis le backend → attendu : possible | ||
| + | </ | ||
| - | * HTTPS sur l’ALB | + | <WRAP round question> |
| - | * redirection HTTP → HTTPS | + | Comment vérifier qu'un flux est bien bloqué et non juste lent ? |
| + | Quelle différence entre un timeout et un Connection refused en termes de Security Group ? | ||
| </ | </ | ||
| - | ===== Challenge final ===== | + | ===== 10. Extension – déplacement du backend en subnet privé |
| - | Objectif : | + | Le backend a une IP publique car il est dans un subnet public. |
| - | * seul l’ALB est accessible depuis Internet | + | Ce n'est pas nécessaire si l'ALB gère tout le trafic entrant. |
| - | * le backend est privé | + | |
| - | * la base est isolée | + | |
| <WRAP round todo> | <WRAP round todo> | ||
| + | Modifier `instances.tf` pour déplacer le backend dans le subnet privé : | ||
| - | Mettre en place : | + | subnet_id = aws_subnet.private.id |
| - | * 3 Security Groups | + | Supprimer également le `map_public_ip_on_launch` implicite. |
| - | * flux stricts entre chaque couche | + | |
| + | Appliquer et vérifier que l'ALB continue de fonctionner. | ||
| </ | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Dessiner les flux réseau | + | Le backend n'a plus d'IP publique. |
| + | |||
| + | Est-il encore accessible depuis Internet ? | ||
| + | |||
| + | Comment l'ALB peut-il atteindre une instance dans un subnet privé ? | ||
| + | |||
| + | Quel composant | ||
| </ | </ | ||
| - | ===== Bonus ===== | + | ===== Challenge final ===== |
| + | |||
| + | Objectif : valider l' | ||
| <WRAP round todo> | <WRAP round todo> | ||
| + | Dessiner l' | ||
| + | * les subnets (public_a, public_b, private) | ||
| + | * les composants dans chaque subnet | ||
| + | * les Security Groups et leurs règles | ||
| + | * les flux autorisés avec les ports | ||
| + | </ | ||
| - | Ajouter | + | <WRAP round todo> |
| + | Répondre aux questions suivantes par écrit | ||
| - | * une seconde instance backend | + | * Quel composant est le seul point d' |
| - | | + | * Quelles ressources ne sont plus accessibles directement depuis Internet ? |
| + | * Quel principe de sécurité est appliqué sur chaque Security Group ? | ||
| + | * Que se passe-t-il si l'ALB est supprimé ? L' | ||
| + | </ | ||
| + | |||
| + | ===== Bonus ===== | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Ajouter | ||
| + | |||
| + | | ||
| + | ami = " | ||
| + | instance_type | ||
| + | subnet_id | ||
| + | vpc_security_group_ids = [aws_security_group.backend_sg.id] | ||
| + | ... | ||
| + | } | ||
| + | Attacher cette instance au même Target Group. | ||
| </ | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Quel est l’intérêt | + | Quels sont les avantages d' |
| + | |||
| + | Répondre selon deux axes : | ||
| + | * disponibilité : que se passe-t-il si une instance tombe ? | ||
| + | * sécurité : l' | ||
| </ | </ | ||