PROFIL / INDEX© Clément Depernet / 2026

← Retour à la liste

12 août 20264 min de lecture

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.

intro#hardening#cloud#linux#ssh

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.

SEC / OPS / CD-01

Astro + Tailwind, conteneurisé, servi derrière Caddy · Source · Thème sonore : Severance (Theodore Shapiro)

PRÊT / CD-01