Un server Nginx expus direct la internet fără măsuri de securizare este scanat automat în câteva secunde de la pornire de sute de roboți care caută vulnerabilități cunoscute în panouri de administrare, fișiere de mediu .env scăpate public sau scripturi vechi de backup. Securizarea riguroasă (Server Hardening) presupune minimizarea suprafeței de atac, atenuarea atacurilor volumetrice de tip Denial of Service (DoS) și filtrarea cererilor malițioase.
1. Ascunderea Amprentei Digitale (Information Leakage)
# În contextul http:
# Dezactivează afișarea versiunii Nginx în paginile de eroare și în antetul 'Server':
server_tokens off;
# Previne atacurile de tip Clickjacking:
add_header X-Frame-Options "SAMEORIGIN" always;
# Previne detectarea automată eronată a tipurilor MIME (MIME-sniffing):
add_header X-Content-Type-Options "nosniff" always;
# Impune navigarea exclusivă prin HTTPS pentru următorii 2 ani (HSTS):
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# Politica de referință securizată:
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
2. Blocarea Accesului la Fișiere Sensibile și Ascunse
# 1. Blochează accesul la toate fișierele și folderele ascunse (.git, .env, .htaccess, .ssh):
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# 2. Blochează accesul la backup-uri, baze de date comprimate și jurnale:
location ~* \.(sql|bak|backup|config|env|log|tar|gz|zip)$ {
deny all;
access_log off;
}
# 3. Blochează execuția PHP în folderele de fișiere încărcate de utilizatori:
location ~* /(?:uploads|files|media)/.*\.php$ {
deny all;
}
3. Protecția la Atacuri Brute-Force prin Două Zone de Rate Limiting
Separăm traficul normal de navigare de punctele sensibile (autentificare, formulare de contact, API de plăți):
# În contextul http:
# Zona 1: Trafic general (permite 20 cereri / secundă per IP):
limit_req_zone $binary_remote_addr zone=general_req:10m rate=20r/s;
# Zona 2: Formular de login / autentificare (permite strict 1 cerere / secundă):
limit_req_zone $binary_remote_addr zone=login_req:10m rate=1r/s;
server {
# Returnăm codul corect 429 Too Many Requests:
limit_req_status 429;
# Protecție login împotriva atacurilor de ghicire a parolelor:
location /login {
# Permite o mică rafală de 3 cereri, apoi blochează instantaneu (nodelay):
limit_req zone=login_req burst=3 nodelay;
proxy_pass http://backend;
}
location / {
limit_req zone=general_req burst=40 nodelay;
proxy_pass http://backend;
}
}
4. Atenuarea Atacurilor de Tip Slowloris
Atacatorii încearcă să mențină mii de conexiuni deschise trimițând date la fiecare 5-10 secunde. Reducerea agresivă a timpilor limită forțează Nginx să deconecteze clienții lenți:
# Închide conexiunea dacă clientul nu transmite un nou fragment de date în 10 secunde:
client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 10s;