← Retour aux tutoriels

Nginx — TLS 1.3, en-têtes de sécurité et rate limiting

Durcissement d'un reverse proxy Nginx : TLS 1.3 et suites modernes, OCSP stapling, HSTS/CSP/Referrer-Policy et limitation de débit par zone.

Durcissement d’un reverse proxy Nginx : configuration TLS moderne, en-têtes de sécurité transverses et limitation de débit.

Contexte

Le reverse proxy est le point d’application centralisé des politiques TLS et des en-têtes de sécurité pour les applications en aval. Une configuration TLS obsolète (protocoles < 1.2, suites RC4/CBC, renégociation) expose à des attaques de déchiffrement et de downgrade ; l’absence de rate limiting laisse les endpoints d’authentification ouverts à la force brute.

Détection

Protocoles et suites actuellement acceptés :

nmap --script ssl-enum-ciphers -p 443 reverse.exemple.fr | grep -E 'TLSv1|cipher|least strength'
openssl s_client -connect reverse.exemple.fr:443 -tls1_1 </dev/null 2>&1 | grep -i 'protocol\|handshake failure'

Vérification de l’OCSP stapling et de la chaîne de certificats :

echo | openssl s_client -connect reverse.exemple.fr:443 -status 2>/dev/null | grep -A2 'OCSP Response Status'

Audit des en-têtes de sécurité :

curl -sI https://reverse.exemple.fr/ | grep -iE 'strict-transport|content-security|referrer-policy|x-content-type'

Durcissement

Bloc TLS moderne (TLS 1.2 minimum, 1.3 préféré, suites AEAD uniquement, OCSP stapling) :

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
ssl_ecdh_curve X25519:secp384r1;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 192.0.2.53 valid=300s;
resolver_timeout 5s;

En-têtes de sécurité transverses dans le bloc serveur :

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src 'self'; frame-ancestors 'self'; base-uri 'self'" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
server_tokens off;

Limitation de débit par zone, appliquée aux endpoints d’authentification et à l’API :

limit_req_zone $binary_remote_addr zone=auth:10m rate=10r/m;
limit_req_zone $binary_remote_addr zone=api:10m rate=30r/s;
limit_conn_zone $binary_remote_addr zone=perip:10m;

location /login {
    limit_req zone=auth burst=5 nodelay;
    limit_req_status 429;
    limit_conn perip 10;
    proxy_pass http://backend;
}

Vérification

Confirmation que les protocoles obsolètes sont refusés et que TLS 1.3 est négocié :

openssl s_client -connect reverse.exemple.fr:443 -tls1_1 </dev/null 2>&1 | grep -i 'handshake failure' && echo "TLS1.1 refuse"
openssl s_client -connect reverse.exemple.fr:443 -tls1_3 </dev/null 2>&1 | grep -i 'TLSv1.3'

Test du rate limiting sur l’endpoint d’authentification (apparition de 429) :

for i in $(seq 1 12); do curl -s -o /dev/null -w '%{http_code} ' https://reverse.exemple.fr/login; done; echo

L’OCSP stapling doit renvoyer successful, TLS 1.1 être refusé, et les codes 429 apparaître au-delà du burst.

Vous avez un projet sur ces sujets ?

Nous contacter →