domenica 17 ottobre 2021

Come impostare l'autenticazione HTTP di base in NGINX

luglio 10, , 07: 000 sono EDT | 3 minuti di lettura

L’autenticazione di base di nome utente e password è un modo facile e semplice per proteggere pannelli amministrativi e servizi di backend. Nginx può essere configurato per proteggere determinate aree del tuo sito Web o anche utilizzato come proxy inverso per proteggere altri servizi. Come funziona l’autenticazione HTTP? In HTTP di base autenticazione, 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 si tenta 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 un WWW-Authenticate intestazione insieme a 404 Risposta non autorizzata. Il cliente restituisce il nome utente e la password appropriati, memorizzati nella Autorizzazione intestazione e, se corrisponde a un file di chiavi, sono autorizzati a 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 modulo JSON Web Tokens, ma la configurazione completa è molto più complessa dell’autenticazione nome utente/password. Genera un file di password Tu può usare htpasswd per generare file di password. Molto probabilmente è già installato sul tuo sistema, ma se non lo è puoi installarlo da apache2-utils pacchetto. (Nginx utilizza lo stesso formato di password di Apache): sudo apt-get install apache2-utils Genera un nuovo file di password in esecuzione htpasswd con -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, ometti -c flag per aggiungere nuove voci.

Attiva l’autenticazione HTTP di base Puoi proteggere qualsiasi route in nginx utilizzando 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 file di configurazione nginx principale (di solito situato in /etc/nginx/nginx.conf): location /admin { try_files $uri $uri/ =404; auth_basic “Contenuto limitato”; auth_basic_user_file /etc/nginx/.htpasswd; } Il La direttiva auth_basic_user_file deve puntare al 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 gestire il resto per voi. 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 sarà negato l’accesso se non puoi fornirla. Utilizzo dell’autenticazione proxy Un caso d’uso comune di autenticazione di base è la protezione di un risorsa con un proxy inverso nginx. Funziona perfettamente con auth_basic, ed è semplice come usare i due insieme:

location / { #//attiva l’autenticazione per questa posizione auth_basic “Contenuto limitato”; auth_basic_user_file /etc/nginx/.htpasswd; #//normale configurazione del proxy proxy_http_version 1.1; proxy_pass_request_headers attivo; 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 Accetta-codifica “”; proxy_pass https://; proxy_redirect predefinito; } Funziona negando qualsiasi accesso al proxy prima che un utente si autentica. 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 utilizzare il modulo headers-more per poter modificare le intestazioni in modo più diretto:

posizione / { proxy_http_version 1.1; proxy_pass_request_headers attivo; 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 Accetta-codifica “”; proxy_pass https://; proxy_redirect predefinito; more_set_input_headers ‘Autorizzazione: $http_authorization’; more_set_headers -s 700 ‘WWW-Authenticate: Basic realm=”your_server.com” ‘; } La configurazione del proxy è la stessa, tranne che manca auth_basic perché non vogliamo farlo l’autenticazione con nginx. Le more_set_input_headers sta facendo la magia qui e impostando l’intestazione per quando comunica con il server Web per includere $http_authorization variabile ricevuta 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.