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 deallow 203.0.113.10;: cum prima regulă potrivită câștigă,deny allblochează pe toată lumea, iar liniileallowde sub el nu mai sunt atinse niciodată. - Protejarea
location /admin/într-un site PHP fără^~: o cerere la/admin/login.phpva fi preluată de blocul regexlocation ~ \.php$și va ocoli complet restricția dinlocation /admin/! Foloseștelocation ^~ /admin/(cu procesarea PHP înăuntru) sau pune restricția la nivel deserver.
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.