Durcir une instance Oracle Cloud en 30 minutes
Une VM fraîchement provisionnée sur Oracle Cloud est joignable depuis le monde entier dans les secondes qui suivent sa création. Voici la séquence que j'applique systématiquement avant d'y déployer quoi que ce soit.
Une instance Oracle Cloud Always Free, c’est deux pare-feu superposés — la
Security List côté réseau virtuel et iptables côté système — et une image
Ubuntu qui, par défaut, laisse INPUT en ACCEPT pour presque tout ce que la
Security List autorise. Comprendre lequel des deux bloque quoi évite de perdre
une heure à débugger un port « ouvert » qui ne répond pas.
Modèle de menace, en trois lignes
Ce qui frappe une IP publique dans les minutes suivant sa mise en ligne :
- du bruteforce SSH automatisé, en continu, depuis des botnets ;
- du scan de ports systématique, y compris sur les ports hauts ;
- de la découverte HTTP (
/.env,/.git/config,/wp-login.php) dès qu’un service web répond.
Rien de ciblé. Juste du bruit de fond opportuniste. La bonne nouvelle : le bruit de fond se traite avec des mesures génériques.
1. Retirer l’authentification par mot de passe
C’est la mesure au meilleur rapport effort/gain. Le bruteforce ne fonctionne que s’il existe un mot de passe à trouver.
sudo install -d -m 755 /etc/ssh/sshd_config.d
sudo tee /etc/ssh/sshd_config.d/10-hardening.conf > /dev/null <<'CONF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 20
AllowUsers ubuntu
X11Forwarding no
AllowAgentForwarding no
CONF
sudo sshd -t && sudo systemctl reload ssh
Le sshd -t avant le reload n’est pas décoratif : il valide la
configuration. Sans lui, une faute de frappe dans un fichier de conf peut
laisser sshd refuser de redémarrer — et tu perds ton seul accès.
Garde toujours une seconde session SSH ouverte pendant que tu modifies
sshd_config. Si la nouvelle configuration te verrouille dehors, la session déjà établie reste ta porte de secours.
2. Comprendre les deux pare-feu
Security List (côté Oracle)
Elle vit dans la console OCI : Networking → Virtual Cloud Networks → ta VCN → Security Lists. Tant qu’un port n’y est pas autorisé en Ingress, le paquet n’atteint jamais la VM. Pour un site web, il faut deux règles :
| Source | Protocole | Port | Usage |
|---|---|---|---|
| 0.0.0.0/0 | TCP | 80 | ACME HTTP-01 + redirection |
| 0.0.0.0/0 | TCP | 443 | HTTPS / HTTP-3 (voir note) |
Le port 80 n’est pas facultatif si tu utilises Let’s Encrypt en challenge HTTP-01 : c’est par là que passe la validation.
iptables (côté image Ubuntu)
L’image Ubuntu d’Oracle arrive avec des règles iptables préinstallées, et
c’est le piège classique : la Security List autorise le port, mais iptables
le refuse encore. La règle REJECT finale de la chaîne INPUT doit rester en
dernier, donc on insère avant elle :
sudo iptables -I INPUT 6 -p tcp --dport 80 -m state --state NEW -j ACCEPT
sudo iptables -I INPUT 7 -p tcp --dport 443 -m state --state NEW -j ACCEPT
sudo netfilter-persistent save
Vérifie l’ordre avant et après avec sudo iptables -L INPUT -n --line-numbers.
Si tu vois ta règle ACCEPT après le REJECT all, elle ne sert à rien.
3. Réduire la surface exposée
# Ce qui écoute, et sur quelle interface
sudo ss -tulpn | grep LISTEN
Tout ce qui écoute sur 0.0.0.0 sans raison doit être ramené sur 127.0.0.1
ou arrêté. Le cas le plus fréquent sur une image cloud : un résolveur DNS local
ou un agent de supervision qui n’a pas besoin d’être joignable de l’extérieur.
Pour les conteneurs Docker, attention : -p 8080:80 publie sur toutes les
interfaces et contourne iptables en écrivant dans la chaîne DOCKER.
Publie explicitement sur la loopback quand le service n’a pas à être public :
ports:
- "127.0.0.1:8080:80" # et non "8080:80"
4. Mises à jour automatiques et fail2ban
sudo apt-get update
sudo apt-get install -y unattended-upgrades fail2ban
sudo dpkg-reconfigure -plow unattended-upgrades
Une configuration fail2ban minimale mais utile :
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 4
backend = systemd
[sshd]
enabled = true
mode = aggressive
fail2ban n’apporte pas grand-chose en sécurité pure quand
PasswordAuthentication est déjà à no — il n’y a plus rien à bruteforcer.
Son intérêt réel est ailleurs : il assèche les journaux, ce qui rend les
événements intéressants visibles au milieu du bruit.
5. Vérifier, pas supposer
Depuis une machine extérieure :
nmap -Pn -p- --min-rate 1000 <IP_PUBLIQUE> # tout le range TCP
nmap -Pn -sU --top-ports 50 <IP_PUBLIQUE> # UDP, souvent oublié
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no ubuntu@<IP>
La dernière commande doit échouer immédiatement. Si elle demande un mot de passe, ta configuration SSH n’a pas été rechargée.
Ce que ça ne couvre pas
Ce durcissement traite l’exposition réseau et l’accès système. Il ne dit rien de la sécurité applicative : une injection dans ton application passera par le 443 que tu viens d’ouvrir légitimement. Les en-têtes HTTP, la CSP et la validation des entrées sont un chantier distinct — et c’est là que se trouvent la majorité des vulnérabilités réellement exploitées.