Come impostare l’autenticazione HTTP di base in NGINX

Logo Nginx.

L’autenticazione di base di nome utente e password è un modo facile e semplice per proteggere i pannelli amministrativi e i servizi di backend. Nginx può essere configurato per proteggere determinate aree del tuo sito Web o persino utilizzato come proxy inverso per proteggere altri servizi.

Come funziona l’autenticazione HTTP?

Nell’autenticazione HTTP di base, alcuni percorsi sul server sono bloccati e richiedono un nome utente e una password per accedervi. Ad esempio, i pannelli di amministrazione della maggior parte dei router domestici sono protetti in questo modo; quando tenti di accedervi, il browser apre una finestra di dialogo che richiede le credenziali.

Quando un utente tenta di accedere a una risorsa protetta, il server invia all’utente una WWW-Authenticate intestazione insieme a a 401 Unauthorized risposta. Il cliente restituisce il nome utente e la password appropriati, memorizzati nel Authorization header e, se corrisponde a un file di chiavi, possono connettersi.

Poiché l’autenticazione HTTP di base richiede l’invio di password in rete, è necessario disporre di HTTPS/TLS configurato sul server, altrimenti chiunque nel mezzo potrebbe fiutare la password in chiaro. HTTPS crittograferà la connessione, rendendone sicura la trasmissione. Puoi impostare un certificato gratuito con LetsEncrypt, o se stai cercando di proteggere un server privato, creane e firmane uno tu stesso.

L’autenticazione di base del nome utente/password è solo uno dei tanti schemi di autenticazione; un altro schema comune sono i token al portatore, utilizzati per i flussi OAuth 2.0. Puoi usare questo schema con Nginx usando il Token Web JSON modulo, ma la configurazione completa è molto più complessa dell’autenticazione nome utente/password.

Genera un file di password

Puoi usare il htpasswd per generare file di password. Molto probabilmente è già installato sul tuo sistema, ma se non lo è puoi installarlo dal apache2-utils pacchetto. (Nginx utilizza lo stesso formato di password di Apache):

sudo apt-get install apache2-utils

Genera un nuovo file di password eseguendo htpasswd con il -c flag, in questo caso, per l’utente “admin”:

sudo htpasswd -c /etc/nginx/.htpasswd admin

Ti verrà chiesto di inserire una password, che verrà sottoposta ad hashing e memorizzata in /etc/nginx/.htpasswd. Se vuoi aggiungere più utenti, tralascia il -c flag per aggiungere nuove voci.

Attiva l’autenticazione HTTP di base

Puoi proteggere qualsiasi percorso in nginx usando il auth_basic direttiva all’interno di una posizione. Ad esempio, per proteggere con password /admin, inseriresti questo blocco di posizione all’interno del blocco del server nel tuo file di configurazione nginx principale (di solito situato in /etc/nginx/nginx.conf):

location /admin {
  try_files $uri $uri/ =404;
  auth_basic "Restricted Content";
  auth_basic_user_file /etc/nginx/.htpasswd;
}

Il auth_basic_user_file La direttiva deve puntare verso il file di password creato nel primo passaggio. Questo non deve essere chiamato in modo speciale, quindi puoi creare file di password diversi per percorsi diversi.

Nginx dovrebbe occuparsi del resto per te. Riavvia per applicare le modifiche:

sudo service nginx restart

E controlla il percorso protetto nel tuo browser. Ti dovrebbe essere chiesta una password e ti verrà negato l’accesso se non puoi fornirla.

Utilizzo dell’autenticazione proxy

Un caso di utilizzo comune dell’autenticazione di base è la protezione di una risorsa esterna con un proxy inverso nginx. Funziona perfettamente con auth_basic, ed è semplice come usare i due insieme:

location / {
  #//turn on auth for this location
  auth_basic "Restricted Content";
  auth_basic_user_file /etc/nginx/.htpasswd;

  #//normal proxy configuration
  proxy_http_version 1.1;
  proxy_pass_request_headers on;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Accept-Encoding "";

  proxy_pass https://;
  proxy_redirect default;
}

Funziona negando qualsiasi accesso al proxy prima che un utente si autentichi. Una volta autenticati, nginx funziona normalmente.

Tuttavia, se si desidera eseguire l’autenticazione sul server dietro il proxy inverso, la configurazione è più complicata. Dovrai invece che nginx inoltri il tuo input al server web, che potrebbe, ad esempio, interrogare un database o eseguire controlli più complessi di un semplice file di password.

Dovrai usare il intestazioni-più modulo per poter modificare più direttamente le intestazioni:

location / {
  proxy_http_version 1.1;
  proxy_pass_request_headers on;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Accept-Encoding "";

  proxy_pass https://;
  proxy_redirect default;

  more_set_input_headers 'Authorization: $http_authorization';
  more_set_headers -s 401 'WWW-Authenticate: Basic realm="your_server.com"';
}

La configurazione del proxy è la stessa, tranne che manca auth_basic perché non vogliamo eseguire l’autenticazione con nginx. Il more_set_input_headers La direttiva sta facendo la magia qui e imposta l’intestazione per quando comunica con il server web per includere il $http_authorization variabile ottenuta dal client. In questo modo il nome utente e la password vengono passati attraverso nginx al backend.

La riga successiva è più complicata; il modo normale di impostare le intestazioni sovrascriverà il realm variabile quando è proxy tramite nginx, il che non è l’ideale. Usando more_set_headers lo conserverà e mostrerà al cliente le informazioni corrette.