Aller au contenu principal

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​

PortServiceQuand l'ouvrir
22SSHAccès admin (restreindre à votre IP)
80HTTPSites web publics
443HTTPSSites web sécurisés
3306MySQLBase de données (interne seulement)
5432PostgreSQLBase de données (interne seulement)
3389RDPWindows Remote Desktop
8080HTTP AltApplications, Tomcat
27017MongoDBBase 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é​

ConceptDescription
Security GroupPare-feu niveau instance
StatefulRéponses automatiquement autorisées
InboundBloqué par défaut
OutboundAutorisé par défaut
ALLOW onlyPas de règles DENY
Référence SGUtiliser un SG comme source

Quiz de Validation​

  1. Qu'est-ce que "stateful" signifie pour un Security Group ?
  2. Quelle est la politique par défaut pour le trafic entrant ?
  3. Peut-on bloquer une IP spécifique avec un Security Group ?
  4. Que signifie 0.0.0.0/0 comme source ?
  5. Pourquoi référencer un SG plutôt qu'une IP ?
  6. Quel est le port par défaut pour SSH ?

Prochaine section : Lab : Architecture EC2