allow / deny / auth_basic în Nginx

SSL/TLS și securitate Toate versiunile Nginx

Restricționează accesul la o zonă după adresa IP (allow/deny) sau cu utilizator și parolă HTTP Basic (auth_basic).

Sintaxă
allow adresă | CIDR | all;
deny  adresă | CIDR | all;
auth_basic "Mesaj";
auth_basic_user_file /cale/htpasswd;

Ce face allow / deny / auth_basic

Nginx oferă două mecanisme simple și foarte rapide pentru a proteja o zonă de administrare, un site de staging sau un endpoint intern: filtrarea după IP (directivele allow și deny) și autentificarea cu parolă HTTP Basic (directivele auth_basic și auth_basic_user_file).

Regulile allow și deny sunt evaluate în ordinea în care sunt scrise, iar prima regulă care se potrivește câștigă. Astfel, pentru o listă albă (whitelist) scrii mai întâi liniile allow cu IP-urile tale și la sfârșit deny all;.

Cu directiva satisfy any; poți combina cele două metode într-o regulă foarte comodă: vizitatorii care vin de pe IP-ul biroului intră direct (fără parolă), iar cei care vin din altă rețea primesc fereastra de autentificare cu utilizator și parolă.

Opțiuni și argumente

Opțiune / Parametru Descriere
Context: http, server, location, limit_except Se aplică de obicei pe un bloc location /admin/ sau pe un întreg subdomeniu de staging.
allow IP / CIDR / all Permite accesul pentru adresa sau subrețeaua indicată (de exemplu allow 203.0.113.50; sau allow 10.0.0.0/8;).
deny IP / CIDR / all Respinge accesul cu codul 403 Forbidden.
auth_basic "Realm" Activează autentificarea HTTP Basic; pune auth_basic off; într-un sub-location public pentru a o dezactiva acolo.
auth_basic_user_file Calea către fișierul cu perechi utilizator:hash_parolă generat cu htpasswd (din pachetul apache2-utils).
satisfy all | any Cu all (implicit) clientul trebuie să treacă și de IP, și de parolă; cu any este suficientă oricare dintre ele.

Exemple

Exemplul 1: Crearea fișierului de parole cu htpasswd

Opțiunea -c creează fișierul (folosește-o doar la primul utilizator, altfel îl suprascrie!):

sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd admin
sudo chmod 640 /etc/nginx/.htpasswd
sudo chown root:www-data /etc/nginx/.htpasswd

Ieșire în terminal

New password: 
Re-type new password: 
Adding password for user admin

Exemplul 2: Zonă /admin/ accesibilă direct de la birou sau cu parolă de oriunde

satisfy any; cere fie IP permis, fie parolă validă:

location ^~ /admin/ {
    satisfy any;

    allow 203.0.113.10;
    allow 10.8.0.0/24;
    deny  all;

    auth_basic           "Zona de administrare";
    auth_basic_user_file /etc/nginx/.htpasswd;

    try_files $uri $uri/ /admin/index.php?$args;
}

Greșeli frecvente

  • Punerea deny all; pe prima linie, înainte de allow 203.0.113.10;: cum prima regulă potrivită câștigă, deny all blochează pe toată lumea, iar liniile allow de sub el nu mai sunt atinse niciodată.
  • Protejarea location /admin/ într-un site PHP fără ^~: o cerere la /admin/login.php va fi preluată de blocul regex location ~ \.php$ și va ocoli complet restricția din location /admin/! Folosește location ^~ /admin/ (cu procesarea PHP înăuntru) sau pune restricția la nivel de server.

Comenzi înrudite

  • location: Potrivește calea URI a cererii (exact, cu prefix sau cu expresie regulată) și aplică regulile corespunzătoare.
  • limit_req: Limitează rata cererilor (rate limiting) pe adresă IP pentru a proteja formularele de login și API-urile.
  • ssl_certificate și HTTPS: Configurează certificatul, cheia privată, versiunile TLS (1.2/1.3) și cache-ul de sesiuni pentru HTTPS.