Nginx permette di implementare un semplice meccanismo di autenticazione basato su nome utente e password per restringere l'accesso ad un sito web o ad alcune sue parti. Il sistema di autenticazione adottato è il noto HTTP Basic Authentication, che si basa sull'utilizzo di particolari headers HTTP per permettere al client di trasmettere le credenziali di autenticazione al server.
Poichè le credenziali di accesso sono semplicemente codificate in base64, un attaccante in grado di intercettare il traffico può facilmente entrarne in possesso. Ecco perché l'utilizzo di HTTP Basic Authentication è sconsigliato. Ove comunque fosse necessario utilizzare questo schema di autenticazione, si raccomanda di cifrare il traffico utilizzando HTTPS.
Creazione del file delle password
Le credenziali di accesso sono memorizzate in un file leggibile dal server web. Il file di password contiene una riga per ogni utente accreditato all'accesso, nella forma nome_utente:password_hash.
Poiché questo formato è utilizzato anche dal web server Apache, si può utilizzare il programma di utilità htpasswd per gestire il file delle password. Questo programma può essere installato senza dover necessariamente installare il server Apache stesso. Le distribuzioni più comuni hanno dei pacchetti separati per i programmi di utilità di Apache. Ad esempio, le distribuzioni Debian (e le sue derivate, tra cui Ubuntu), forniscono htpasswd con il pacchetto apache2-utils. Le distribuzioni basate su Red-Hat (RHEL, CentOS, Fedora, ecc) installano htpasswd con il pacchetto httpd-tools.
Per creare il file delle password è sufficiente invocare htpasswd con il flag -c
, seguito dal percorso del file di output. Ad esempio:
# sudo htpasswd -c /etc/nginx/.passwd user1
Il programma richiederà di digitare e confermare la password da associare all'utente user1.
Per aggiungere degli utenti ad un file delle password esistenti basterà invocare htpasswd senza il flag -c
(create). Ad esempio, per aggiungere l'utente user2, basta digitare:
# sudo htpasswd /etc/nginx/.passwd user2
Il file delle password è un semplice file di testo e pertanto può essere modificato con un editor di testo. Per cancellare un utente è sufficiente rimuovere la riga corrispondente dal file. Ricordiamo tuttavia che non è possibile modificare direttamente le password con un editor di testo, dato che esse non vengono memorizzate in chiaro.
Il contenuto di un tipico file delle password è riportato nell'esempio sottostante:
user1:$apr1$/woC1jnP$KAh0SsVn5qeSMjTtn0E9Q0
user2:$apr1$QdR8fNLT$vbCEEzDj7LyqCMyNpSoBh/
user3:$apr1$Mr5A0e.U$0j39Hp5FfxRkneklXaMrr/
Configurazione di Nginx per l'autenticazione HTTP
L'autenticazione HTTP Basic può essere attivata per uno specifico percorso, nel blocco location, oppure a livello globale, nel blocco server. Ad esempio, supponiamo che il sito www.miosito.com servito da Nginx abbia una parte che si vuole proteggere con autenticazione, raggiungibile all'indirizzo http://www.miosito.com/areaprivata. Per attivare l'autenticazione su /areaprivata, basta ricorrere alle direttive auth_basic e auth_basic_user_file, inserendole in un blocco location. Ad esempio:
# ...
location /areaprivata {
auth_basic “Area privata di miosito.com”;
auth_basic_user_file /etc/nginx/.passwd;
}
# ...
Come si evince dall'esempio stesso, la direttiva auth_basic
permette di specificare un messaggio di benvenuto, che verrà mostrato dal client nella finestra di login. La direttiva auth_basic_user_file
invece serve per indicare il percorso del file delle password creato in precedenza.
Come già detto, è possibile attivare l'autenticazione basic per qualunque pagina del sito, inserendo le direttive auth_basic
e auth_basic_user_file
nel blocco server corrispondente. In questo caso, ogni richiesta HTTP dovrà essere autenticata, indipendentemente dall'URL. Ad esempio:
# ...
server {
auth_basic "Sito privato";
auth_basic_user_file /etc/nginx/.passwd;
# ...
}
Analogamente, può rendersi necessario dover disattivare l'autenticazione basic per una determinata location e lasciarla attiva per il resto del sito, ad esempio nel caso di una sezione pubblica. Per far ciò, è sufficiente inserire la direttiva auth_basic
nella location pubblica assegnandole il valore "off". Ad esempio:
# ...
server {
# ...
auth_basic "Sito privato";
auth_basic_user_file /etc/nginx/.passwd;
location /public/ {
auth_basic off;
}
}