Security Groups
Qu'est-ce qu'un Security Group ?
Un Security Group (SG) est un pare-feu virtuel qui contrôle le trafic entrant et sortant de vos instances EC2. C'est la première ligne de défense pour sécuriser vos ressources AWS.
┌─────────────────────────────────────────────────────────────┐
│ SECURITY GROUP │
├─────────────────────────────────────────────────────────────┤
│ │
│ Internet │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ SECURITY GROUP │ │
│ │ (Pare-feu au niveau instance) │ │
│ │ │ │
│ │ RÈGLES ENTRANTES (Inbound) │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ Port 22 (SSH) ← Admin uniquement │ │ │
│ │ │ Port 80 (HTTP) ← Tout le monde │ │ │
│ │ │ Port 443 (HTTPS) ← Tout le monde │ │ │
│ │ └─────────────────────────────────────────┘ │ │
│ │ │ │
│ │ RÈGLES SORTANTES (Outbound) │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ Tout le trafic → Autorisé par défaut │ │ │
│ │ └─────────────────────────────────────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ Instance EC2 │ │
│ └───────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Caractéristiques Clés
1. Stateful (État conservé)
┌─────────────────────────────────────────────────────────────┐
│ STATEFUL │
├─────────────────────────────────────────────────────────────┤
│ │
│ Si une connexion ENTRANTE est autorisée, │
│ la réponse SORTANTE est automatiquement autorisée. │
│ │
│ Exemple : │
│ ┌─────────┐ ┌─────────────┐ │
│ │ Client │ ──── Requête HTTP ────► │ EC2 │ │
│ │ │ (Port 80) │ (SG) │ │
│ │ │ ◄─── Réponse ──────── │ │ │
│ └─────────┘ (Automatique) └─────────────┘ │
│ │
│ Vous n'avez PAS besoin de créer une règle sortante │
│ pour la réponse ! │
│ │
└─────────────────────────────────────────────────────────────┘
2. Deny par Défaut (Inbound)
Par défaut :
• INBOUND : Tout est BLOQUÉ ❌
• OUTBOUND : Tout est AUTORISÉ ✅
Vous devez explicitement autoriser le trafic entrant.
3. Règles ALLOW Uniquement
Security Groups = Règles ALLOW seulement
✅ Vous POUVEZ : Autoriser SSH depuis 10.0.0.0/8
❌ Vous ne POUVEZ PAS : Bloquer une IP spécifique
Pour bloquer des IP → Utilisez les NACLs (niveau VPC)
Structure d'une Règle
┌─────────────────────────────────────────────────────────────┐
│ STRUCTURE D'UNE RÈGLE │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────┬───────────┬─────────────┬───────────────┐ │
│ │ Type │ Protocole │ Port │ Source │ │
│ ├────────────┼───────────┼─────────────┼───────────────┤ │
│ │ SSH │ TCP │ 22 │ 203.0.113.0/24│ │
│ │ HTTP │ TCP │ 80 │ 0.0.0.0/0 │ │
│ │ HTTPS │ TCP │ 443 │ 0.0.0.0/0 │ │
│ │ Custom │ TCP │ 3306 │ sg-xxxxx │ │
│ │ All ICMP │ ICMP │ All │ 10.0.0.0/16 │ │
│ └────────────┴───────────┴─────────────┴───────────────┘ │
│ │
│ Source peut être : │
│ • CIDR : 0.0.0.0/0 (tout), 10.0.0.0/8 (privé) │
│ • Security Group : sg-xxxxxxxx │
│ • Prefix List : pl-xxxxxxxx │
│ │
└─────────────────────────────────────────────────────────────┘
Sources Courantes
Notation CIDR
┌─────────────────────────────────────────────────────────────┐
│ NOTATION CIDR │
├─────────────────────────────────────────────────────────────┤
│ │
│ 0.0.0.0/0 = Tout Internet (ATTENTION !) │
│ ::/0 = Tout IPv6 │
│ │
│ 10.0.0.0/8 = Réseau privé classe A │
│ 172.16.0.0/12 = Réseau privé classe B │
│ 192.168.0.0/16 = Réseau privé classe C │
│ │
│ 203.0.113.25/32 = Une seule IP (votre bureau) │
│ 10.0.1.0/24 = 256 adresses (un subnet) │
│ │
│ Le /XX indique combien de bits sont fixes : │
│ /32 = 1 IP, /24 = 256 IPs, /16 = 65536 IPs, /0 = tout │
│ │
└─────────────────────────────────────────────────────────────┘
Référencer un Autre Security Group
┌─────────────────────────────────────────────────────────────┐
│ RÉFÉRENCE ENTRE SECURITY GROUPS │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ sg-web │ │ sg-database │ │
│ │ │ │ │ │
│ │ Inbound: │ │ Inbound: │ │
│ │ HTTP 80 0.0.0.0/0 │ MySQL 3306 │ │
│ │ │ │ Source: sg-web │◄─────┐ │
│ │ │ │ │ │ │
│ │ ┌──────────┐ │ │ ┌──────────┐ │ │ │
│ │ │ Web App │──┼─────────┼─►│ MySQL │ │ │ │
│ │ └──────────┘ │ │ └──────────┘ │ │ │
│ │ │ │ │ │ │
│ └─────────────────┘ └─────────────────┘ │ │
│ │ │
│ Seules les instances dans sg-web peuvent accéder ─────┘ │
│ à MySQL. Pas besoin de gérer les IPs ! │
│ │
└─────────────────────────────────────────────────────────────┘
Bonne Pratique
Référencez les Security Groups plutôt que les IPs quand possible. C'est plus dynamique et plus sécurisé !
Ports Courants
| Port | Service | Quand l'ouvrir |
|---|---|---|
| 22 | SSH | Accès admin (restreindre à votre IP) |
| 80 | HTTP | Sites web publics |
| 443 | HTTPS | Sites web sécurisés |
| 3306 | MySQL | Base de données (interne seulement) |
| 5432 | PostgreSQL | Base de données (interne seulement) |
| 3389 | RDP | Windows Remote Desktop |
| 8080 | HTTP Alt | Applications, Tomcat |
| 27017 | MongoDB | Base de données (interne seulement) |
Exemples de Configuration
Serveur Web Public
┌─────────────────────────────────────────────────────────────┐
│ SG : sg-webserver-public │
├─────────────────────────────────────────────────────────────┤
│ │
│ INBOUND RULES : │
│ ┌──────────┬──────────┬──────────┬─────────────────────┐ │
│ │ Type │ Protocol │ Port │ Source │ │
│ ├──────────┼──────────┼──────────┼─────────────────────┤ │
│ │ HTTP │ TCP │ 80 │ 0.0.0.0/0 │ │
│ │ HTTPS │ TCP │ 443 │ 0.0.0.0/0 │ │
│ │ SSH │ TCP │ 22 │ 203.0.113.50/32 │ │
│ └──────────┴──────────┴──────────┴─────────────────────┘ │
│ │
│ OUTBOUND RULES : │
│ ┌──────────┬──────────┬──────────┬─────────────────────┐ │
│ │ All │ All │ All │ 0.0.0.0/0 │ │
│ └──────────┴──────────┴──────────┴─────────────────────┘ │
│ │
│ ⚠️ SSH restreint à l'IP du bureau (203.0.113.50) │
│ │
└─────────────────────────────────────────────────────────────┘
Base de Données (Interne)
┌─────────────────────────────────────────────────────────────┐
│ SG : sg-database-private │
├─────────────────────────────────────────────────────────────┤
│ │
│ INBOUND RULES : │
│ ┌──────────┬──────────┬──────────┬─────────────────────┐ │
│ │ Type │ Protocol │ Port │ Source │ │
│ ├──────────┼──────────┼──────────┼─────────────────────┤ │
│ │ MySQL │ TCP │ 3306 │ sg-webserver │ │
│ └──────────┴──────────┴──────────┴─────────────────────┘ │
│ │
│ OUTBOUND RULES : │
│ ┌──────────┬──────────┬──────────┬─────────────────────┐ │
│ │ All │ All │ All │ 0.0.0.0/0 │ │
│ └──────────┴──────────┴──────────┴─────────────────────┘ │
│ │
│ ✅ Seulement accessible depuis le SG des serveurs web │
│ ❌ Pas d'accès direct depuis Internet │
│ │
└─────────────────────────────────────────────────────────────┘
Erreurs Courantes
1. SSH Ouvert à Tout le Monde ❌
MAUVAIS :
SSH (22) - Source: 0.0.0.0/0
↓
⚠️ N'importe qui peut tenter de se connecter !
Attaques brute-force garanties.
BON :
SSH (22) - Source: 203.0.113.50/32 (votre IP)
ou
SSH (22) - Source: 10.0.0.0/8 (réseau privé + VPN)
2. Base de Données Exposée ❌
MAUVAIS :
MySQL (3306) - Source: 0.0.0.0/0
↓
⚠️ Base de données accessible publiquement !
Risque majeur de sécurité.
BON :
MySQL (3306) - Source: sg-application
↓
✅ Seulement accessible depuis les serveurs d'application
3. Trop de Règles ❌
MAUVAIS :
Un SG avec 50 règles différentes
↓
⚠️ Difficile à auditer et maintenir
Risque d'erreurs
BON :
Plusieurs SG avec des rôles clairs :
- sg-web-public (HTTP/HTTPS)
- sg-admin (SSH/RDP)
- sg-database (MySQL interne)
Bonnes Pratiques
1. Principe du Moindre Privilège
N'autorisez QUE ce qui est nécessaire.
✅ Bon : Port 443 depuis 0.0.0.0/0 (HTTPS public requis)
❌ Mauvais : Tous les ports depuis 0.0.0.0/0
2. Utilisez des Noms Descriptifs
Noms recommandés :
• sg-web-public-prod
• sg-database-internal-prod
• sg-admin-ssh-restricted
• sg-loadbalancer-public
3. Documentez vos Règles
Ajoutez des descriptions à chaque règle :
Port 443 - "HTTPS public pour le site web"
Port 22 - "SSH admin depuis bureau Paris uniquement"
Port 3306 - "MySQL pour backend uniquement"
4. Auditez Régulièrement
Questions à se poser :
• Y a-t-il des règles avec 0.0.0.0/0 non nécessaires ?
• Des ports de BDD sont-ils exposés publiquement ?
• Les règles SSH sont-elles trop permissives ?
• Y a-t-il des règles obsolètes ?
Security Group vs NACL
┌─────────────────────────────────────────────────────────────┐
│ SECURITY GROUP vs NACL │
├─────────────────────────────────────────────────────────────┤
│ │
│ Critère Security Group NACL │
│ ────────────────────────────────────────────────────── │
│ Niveau Instance Subnet │
│ État Stateful Stateless │
│ Règles ALLOW seulement ALLOW et DENY │
│ Évaluation Toutes les règles Ordre de priorité │
│ Défaut Deny entrant Allow tout │
│ Changement Immédiat Immédiat │
│ │
│ Utilisez SG pour : Contrôle fin par instance │
│ Utilisez NACL pour : Bloquer des IPs, défense en profondeur│
│ │
└─────────────────────────────────────────────────────────────┘
Résumé
| Concept | Description |
|---|---|
| Security Group | Pare-feu niveau instance |
| Stateful | Réponses automatiquement autorisées |
| Inbound | Bloqué par défaut |
| Outbound | Autorisé par défaut |
| ALLOW only | Pas de règles DENY |
| Référence SG | Utiliser un SG comme source |
Quiz de Validation
- Qu'est-ce que "stateful" signifie pour un Security Group ?
- Quelle est la politique par défaut pour le trafic entrant ?
- Peut-on bloquer une IP spécifique avec un Security Group ?
- Que signifie 0.0.0.0/0 comme source ?
- Pourquoi référencer un SG plutôt qu'une IP ?
- Quel est le port par défaut pour SSH ?
Prochaine section : Lab : Architecture EC2