jblog: news e appunti per webmaster
 

apachesecurity bouncer Autenticazione HTTP basic su server Apache

Ogni applicazione viene progettata e sviluppata con uno o più sistemi di autenticazione e sicurezza. Pensiamo al login di un sito web, al controllo degli utenti o alla gestione dei permessi.

L’autenticazione HTTP permette di implementare un controllo degli accessi basato su username e password, semplice da realizzare, stabile e sicuro.

PRO. Questo tipo di autenticazione offre un più rigido controllo sugli utenti e una maggiore stabilità rispetto al classico login. Il controllo degli utenti è molto rigido in quanto è l’amministratore a inserire nuove coppie di username e password, al contrario della procedura di registrazione durante la quale sono gli utenti a inserire i dati. Riguardo la stabilità, il discorso è molto simile a quello che si fa con i cms: un modulo Apache scritto e controllato da centinaia di sviluppatori è assai meno probabile che fallisca rispetto alle procedure di login scritte da un team ristretto di programmatori.

CONTRO. Il primo limite sta proprio nel fatto che per inserire un nuovo utente bisogna andare a scrivere “a mano” i dati per l’autenticazione, problema comunque risolvibile con uno script che accede al file dei dati per l’autenticazione, nel caso si voglia una procedura di registrazione automatizzata. Un altro limite è la difficoltà di gestire l’utente connesso, ad esempio, per avere un’area personale o per memorizzare i prodotti del carrello, tutte cose facilmente realizzabili nel caso di un login con database.

AUTENTICAZIONE HTTP con PHP » http://php.net/manual/en/features.http-auth.php

ATTENZIONE. Potrebbe succedere che in locale l’autenticazione HTTP non funzioni. Invece di perdere tempo inutilmente provala direttamente sul tuo spazio web, magari in una directory di test. A me è successo così! Per saperne di più segui questa discussione sul forum di html.it che, tutt’ora non ha risposte :( .

SOMMARIO

Un buon motivo per l’autenticazione HTTP
Una delle tante situazioni che ti dovrebbe far capire il senso dell’autenticazione HTTP.
Le diverse autenticazioni HTTP
La differenza fra le diverse autenticazioni.
Un esempio veloce
Esempio facile da capire per introdurre l’argomento.
Le direttive Apache
Una panoramica sulle direttive Apache che servono per implementare l’autenticazione HTTP, in modo da comprendere meglio cosa stiamo facendo.
Ottenere il percorso assoluto
Conoscere il percorso assoluto del server è necessario per impostare correttamente il file .htaccess.
Il file delle password: .htpasswd
Il file che contiene le coppie “username:password”.
Il file dei gruppi di utenti: .htgroup
Il file (opzionale) in cui impostare i gruppi di utenti.
Autenticazione HTTP in pratica
Personalizza la pagina di errore “401 Authorization Required”
Come personalizzare la pagina di errore che appare quando non si inseriscono i dati corretti.
Note sull’articolo

Data la complessità degli argomenti trattati cerco di dare il giusto supporto anche agli sviluppatori che si sono avvicinati da poco all’uso del server Apache. Infatti per buona parte dell’articolo vengono fornite tutte quelle conoscenze di base richieste per una buona comprensione dell’autenticazione HTTP al fine di evitare un semplice copia-incolla che difficilmente porterà ai risultati sperati.

Se le direttive e il funzionamento del server Apache ti sono familiari puoi benissimo andare direttamente a vedere come implementare l’autenticazione HTTP iniziando a leggere dal paragrafo “Autenticazione HTTP in pratica“.

Un buon motivo per l’autenticazione HTTP

Pensa a un grosso sito ecommerce. Questo sarà diviso almeno in 4 aree: publica, utenti, gestione, amministrazione.

Nell’area pubblica potranno accedervi tutti, nell’area utenti solo gli utenti registrati, nell’area gestione solo gli addetti alle normali mansioni, come la moderazione dei commenti sui prodotti, e nell’area amministrazione solo pochi amministratori che, tra gli altri, avranno il compito di aggiungere nuovi amministratori e gestirne i permessi. Data la delicatezza dell’area amministrazione è necessario proteggerla il più possibile.

Ed è qui che entra in gioco l’autenticazione HTTP, che verrà implementata per creare una ulteriore barriera prima di accedere alla pagina login. In questo modo per accedere all’area amministrazione sarà necessario inserire due diverse coppie di username e password, con il conseguente rafforzamento della sicurezza.

example http sitemap Autenticazione HTTP basic su server Apache

Naturalmente, questo è solo uno dei tanti motivi per sfruttare l’autenticazione HTTP per rendere più sicuro il proprio sito.

Le diverse autenticazioni HTTP

Su un server Apache si possono implementare almeno 3 tipi di autenticazione HTTP.

Base. Utilizza dei file di testo per l’autenticazione. Il modulo necessario è mod_auth.c, ed è considerato uno dei moduli di base. In ogni caso dai un’occhiata ai servizi del tuo provider oppure alle informazioni php, con la funzione phpinfo().

DBM. Utilizza dei file di tipo DBM per l’elenco di username e password. Il modulo necessario è mod_auth_dbm.c.

Digest. Basata sull’algoritmo di hashing md5. Il modulo necessario è mod_auth_digest.c. Questo modulo è ancora in fase di test e alcune funzioni non sono ancora correttamente implementate.

Un esempio veloce

Per darti l’idea di quello che dobbiamo fare ti faccio un esempio veloce.

File .htaccess
AuthType Basic
AuthName "Restricted Files" #messaggio personalizzato
AuthUserFile /percorso-assoluto/.htpasswd
Require valid-user

N.B. non ho scritto il vero percorso assoluto per questioni di sicurezza. Credo che il mio provider non vorrebbe che lo sventolassi in giro! :)

File .htpasswd
admin:86dGPOHvD26i2
admin2:165491czyZTp2
admin3:29p7hc19vPpm6

dove username e password della prima riga sono “admin”.

Demo

Se non ti basta lo screenshot puoi provarlo andando su http://test.jblog.it/http_auth_base/ (username e password sono entrambe “admin”).

screenshot httpauth Autenticazione HTTP basic su server Apache

Le direttive Apache

Le direttive principali per implementare l’autenticazione HTTP.

AuthType. Imposta il tipo di autenticazione: basic o digest.

AuthName. Messaggio o descrizione personalizzata; utile per dare indicazioni.

AuthUserFile. File degli username e delle password, generalmente chiamato .htpasswd.

AuthGroupFile. File dei gruppi di utenti.

Require. Filtra gli utenti abilitati all’accesso. Generalmente si utilizza valid-user per indicare che l’accesso è permesso a tutti gli utenti validi, ad esempio quelli che inseriscono credenziali valide. Alternativamente si possono utilizzare user e group seguiti rispettivamente da una lista di utenti o di gruppi, separati da spazi.

Satisfy. Gestisce la politica degli accessi. Funziona solo se sono utilizzate contemporaneamente le direttive Allow e Require. Con All fa in modo che entrambe le condizioni siano verificate per convalidare l’accesso, invece con Any basta che sia verificata solo una delle condizioni.

Ottenere il percorso assoluto

Per collegare il file delle password (.htpasswd) e dei gruppi al file .htaccess non ci si può limitare al percorso relativo, ma è necessario il percorso assoluto. Per internderci, il percorso assoluto è quello che sul nostro pc inizia con “C:/…”.

Uno dei modi per ottenere il percorso assoluto del server è quello di creare ed eseguire il seguente script php:

<?php
   echo $_SERVER['DOCUMENT_ROOT'];
?>

dove la variabile $_SERVER['DOCUMENT_ROOT'] contiene il percorso assoluto della directory in cui si trovano i file del tuo sito.

Se non sei pratico/a di php segui queste istruzioni

  1. Rinomina lo script in “doc_root.php”
  2. Caricalo nella directory principale del tuo sito
  3. Eseguilo scrivendo http://www.tuosito.com/doc_root.php
  4. Copia e conserva il testo fornito in output, cioè il percorso assoluto

doc root Autenticazione HTTP basic su server Apache

ATTENZIONE. Ti accorgerai anche tu che il percorso ottenuto dallo script php non è completo. Basterà guardare alla fine per osservare l’assenza del nome della directory in cui si trova il file .htpasswd. Quasi sempre è necessario completare il percorso assoluto scrivendo manualmente la directory in cui si trova il file .htpasswd. Un po’ di pazienza e tutto funzionerà a dovere! ;)

Il file delle password: .htpasswd

Il file .htpasswd deve contenere la lista di username e password che verranno utilizzati per l’autenticazione (vedi l’esempio in basso).

Il nome del file. Il file dei dati di autenticazione puoi rinominarlo a tuo piacimento; non è obbligatorio chiamarlo “.htpasswd”. Tuttavia è consigliabile rispettare il modello “.htxxxxxx”, cioè farlo iniziare sempre con “.ht” cambiando solo il resto. Esempi validi: “.htpassword”, “.ht_dati_accesso”.

Criptare le password. Al contrario dell’username, che viene scritto “in chiaro”, la password deve essere criptata. Fortunatamente su internet si possono trovare molti siti che si occupano non solo di criptare la password ma anche di impostare il file .htpasswd.

Strumenti utili per .htpasswd

http://www.htaccesstools.com/htpasswd-generator/
http://www.wmtips.com/tools/htpasswd-generator/
http://www.4webhelp.net/us/password.php
http://www.clockwatchers.com/htaccess_tool.html
http://htmlfixit.com/cgi-bin/tools/htaccess/index.pl
http://tools.dynamicdrive.com/password/
http://www.softspecialist.com/i/htaccess-password-generator-htpasswd-encryption-tool.htm

Per iniziare. Se non ti va o non riesci a utilizzare questi tools puoi iniziare subito con questi dati: admin:86dGPOHvD26i2, dove username e password sono entrambi admin.

Scrivere il file .htpasswd. Per creare un file .htpasswd è necessario seguire solo 2 semplici regole:

  1. username e password devono essere separate dai due punti “:”
  2. inserire una coppia <username>:<password> per riga
Esempio di file .htpasswd
admin:86dGPOHvD26i2
admin2:165491czyZTp2
admin3:29p7hc19vPpm6

Per una maggior sicurezza sulla documentazione Apache viene consigliato di inserire i file .htpasswd all’esterno della directory principale del sito in modo da renderli totalmente inaccessibili dall’esterno, ad esempio tramite browser. Purtroppo non sempre è possibile inserire dei file all’esterno della directory principale, soprattutto se hai un hosting di base.

Il file dei gruppi di utenti: .htgroup

Il file dei gruppi di utenti deve contenere l’elenco dei gruppi in corrispondenza dei quali si scrive la lista di username appartenenti (vedi l’esempio in basso). Questo file è direttamente collegato al file .htpasswd in quanto gli username appartenenti a ciascun gruppo sono proprio quelli scritti nel file .htpasswd.

Il nome del file. Il file dei dati di autenticazione puoi rinominarlo a tuo piacimento. Tuttavia è consigliabile rispettare il modello “.htxxxxxx”, cioè farlo iniziare sempre con “.ht” cambiando solo il resto. Esempi validi: “.htgruppi”, “.ht_lista_gruppi”. Ho preferito chiamarlo “.htgroup” per avere una maggior chiarezza nella scrittura dell’articolo.

A cosa serve? Dividere gli utenti per gruppi è necessario, ad esempio, nel caso in cui si hanno diverse aree alle quali devono accedere diversi gruppi di utenti. Inoltre è anche comodo per la direttiva Require perché invece di inserire tutti gli username si evita di “sporcare” eccessivamente il file .htaccess limitandosi a scrivere pochi gruppi.

http auth flow Autenticazione HTTP basic su server Apache

Esempio

Nota la “pulizia” della versione 2 del file .htaccess rispetto alla versione 1. Probabilmente non ti sembrerà niente di così rivoluzionario… Pensa in grande! Pensa a una lista di 30 username per ogni gruppo!

File .htpasswd (valido per le due versioni del file .htaccess)
admin:86dGPOHvD26i2
admin2:165491czyZTp2
admin3:29p7hc19vPpm6
admin4:86dGPOHvD26i2
admin5:165491czyZTp2
admin6:29p7hc19vPpm6
admin7:86dGPOHvD26i2
admin8:165491czyZTp2
admin9:29p7hc19vPpm6
File .htaccess [versione 1] (senza dividere gli utenti in gruppi)
<Files index_gruppo1.php>
   AuthType Basic
   AuthName "Fai parte del gruppo 1?"
   AuthUserFile /percorso_assoluto/.htpasswd
   AuthGroupFile /percorso_assoluto/.htgroup
   Require user admin admin2 admin3 admin4 admin5
</Files>

<Files index_gruppo2.php>
   AuthType Basic
   AuthName "Fai parte del gruppo 2?"
   AuthUserFile /percorso_assoluto/.htpasswd
   AuthGroupFile /percorso_assoluto/.htgroup
   Require user admin6 admin7 admin8 admin9
</Files>
File .htaccess [versione 2] (utenti suddivisi in gruppi)
<Files index_gruppo1.php>
   AuthType Basic
   AuthName "Fai parte del gruppo 1?"
   AuthUserFile /percorso_assoluto/.htpasswd
   AuthGroupFile /percorso_assoluto/.htgroup
   Require group gruppo1
</Files>

<Files index_gruppo2.php>
   AuthType Basic
   AuthName "Fai parte del gruppo 2?"
   AuthUserFile /percorso_assoluto/.htpasswd
   AuthGroupFile /percorso_assoluto/.htgroup
   Require group gruppo2
</Files>
.htgroup (per il file .htaccess versione 2)
gruppo1: admin admin2 admin3 admin4 admin5
gruppo2: admin6 admin7 admin8 admin9

Demo. Per farti capire meglio di cosa sto parlando vai su http://test.jblog.it/http_auth_group/.

Per una maggior sicurezza sulla documentazione Apache viene consigliato di inserire i file .htgroup all’esterno della directory principale del sito in modo da renderli totalmente inaccessibili dall’esterno, ad esempio tramite browser. Purtroppo non sempre è possibile inserire dei file all’esterno della directory principale, soprattutto se hai un hosting di base.

Autenticazione HTTP in pratica

Come proteggere i file

Per proteggere uno o più file si possono utilizzare le direttive <Files> o <FilesMatch>.

La seconda è da preferire quando i file da proteggere si devono riconoscere tramite regex. In pratica, la direttiva <FilesMatch> deve essere utilizzata quando si devono proteggere più file con gli stessi criteri oppure quando non si è sicuri del nome, ad esempio quando non si sa se l’estensione è scritta in minuscolo o in maiuscolo.

La direttiva <Files> è da preferire solo quando il file è uno solo e si è sicuri del nome.

Uso della direttiva <FilesMatch>
# 1) protegge i file secret1.php e secret2.php
# 2) [pP][hH][pP] perchè non si è sicuri di come è scritta l'estensione
<FilesMatch "(secret1|secret2)\.[pP][hH][pP]">
   AuthType Basic
   AuthName "Accesso alle pagine segrete..."
   AuthUserFile /percorso_assoluto/.htpasswd
   Require valid-user
</FilesMatch>
Uso della direttiva <Files>
<Files secret1.php>
   AuthType Basic
   AuthName "Accesso alla pagina segreta..."
   AuthUserFile /percorso_assoluto/.htpasswd
   Require valid-user
</Files>

<Files secret2.php>
   AuthType Basic
   AuthName "Accesso alla pagina segreta..."
   AuthUserFile /percorso_assoluto/.htpasswd
   Require valid-user
</Files>

Come proteggere una directory

Teoricamente si dovrebbe agire come per i file, utilizzando però le direttive <Directory> e <DirectoryMatch>.

Problema. A meno che tu non abbia accesso al file di configurazione del server o del virtual host, non è possibile farlo in quanto le direttive <Directory> e <DirectoryMatch> NON possono essere utilizzate nel file .htaccess. A questo proposito vorrei ringraziare Enoa del forum di html.it.

Soluzione. Inserire un file .htaccess direttamente nelle directory da proteggere. Tutto qui! ;) Ricordati di non inserire i file .htpasswd e .htgroup nella directory da proteggere.

Esempio di file .htaccess da inserire nella directory da proteggere
AuthType Basic
AuthName "Accesso alla Directory XXX..."
AuthUserFile /percorso_assoluto/.htpasswd
Require valid-user

Una nota sulle prestazioni

Per sua natura l’implementazione dell’autenticazione HTTP comporta un leggero peggioramento delle prestazioni. In pratica, ogni volta che si accede a dei file protetti direttamente o indirettamente (cioè all’interno di una directory protetta) il server controlla se la richiesta HTTP è autorizzata ad essere soddisfatta. In altre parole, ogni – e sottolineo ogni – richiesta HTTP è soggetta a un controllo da parte del server per verificare se questa possiede le autorizzazioni necessarie.

Quindi, prima di implementare un’autenticazione HTTP chiediti quanto influirà questo, seppur leggero, abbassamento di prestazioni.

Creare eccezioni

Nonostante ci si autentichi con successo potrebbero sorgere altri problemi. Gli script utilizzati con tecniche Ajax oppure i file XML richiamati da animazioni Flash potrebbero non essere letti in quanto la richiesta di questi file non proverrebbe dal browser con cui ci si è autenticati e il server Apache potrebbe considerarla come una richiesta non autorizzata.

Un’altra situazione per la quale è necessario creare delle eccezioni si ha quando ci sono dei file o sottodirectory ad accesso libero in una directory protetta.

Soluzione veloce

Se il sito è stato sviluppato completamente da te, non avrai grosse difficoltà ad applicare questa soluzione: ti basterà solo modificare qualche riga di codice.

Inserire i file ad accesso libero in una sottodirectory da “liberare” dalla protezione dell’autenticazione HTTP.

  1. Crea una sottodirectory
  2. Inserisci tutti i file e le directory da “liberare”
  3. Inserisci in questa sottodirectory un nuovo file .htaccess con il seguente codice
Allow from All
Satisfy Any

Queste due righe disattivano l’inserimento dei dati per l’autenticazione. Con Satisfy Any si stabilisce che è sufficiente verificare una delle due condizioni tra Require (che si trova nel file .htaccess della directory superiore) e Allow. Quindi, poiché con Allow from All diciamo ad server che l’accesso è “permesso a tutti” una delle due direttive è sempre verificata.

Soluzione complessa

Se il sito è basato su un CMS o comunque non è stato sviluppato da te non è possibile spostare file e directory in quanto non sapremmo dove effettuare le modifiche al codice. Questa soluzione infatti permette di “liberare” file e directory lasciandoli tutti al loro posto.

Liberare una directory. Come per la soluzione veloce, basta inserire al suo interno un nuovo file .htaccess con il seguente codice:

Allow from All
Satisfy Any

Liberare uno o più file. Utilizzando le direttive <Files> o <FilesMatch> è possibile liberare rispettivamente uno o più files. Utilizzare <Files> per liberare dei file in base al nome esatto mentre <FilesMatch> per liberare dei file riconoscendoli tramite espressioni regolari.

Il file index.php. Generalmente se si accede a una directory senza specificare un file verremo portati sul file index.php o index.html. Se liberiamo il file index.php della directory contenente il file .htaccess principale (con le varie istruzioni per l’autenticazione HTTP) questo è soggetto a un doppio comportamento. Se accediamo alla directory (senza specificare nessun file), cioè scrivendo nel browser “http://miosito.com/directory_protetta/” ci verranno chiesti i dati per l’autenticazione. Invece se accediamo al file index.php (specificandolo nell’indirizzo), cioè scrivendo nel browser “http://miosito.com/directory_protetta/index.php” non ci vengono chiesti i dati per l’autenticazione. Non credo sia possibile risolvere questo problema.

Demo. Prova le eccezioni create per index.php e free_access.php con questo script: http://test.jblog.it/http_auth_exception/index.php. Prova anche ad accedere a http://test.jblog.it/http_auth_exception/ in cui, a differenza del primo indirizzo, ti verranno chiesti i dati per l’autenticazione.

Esempio
AuthType Basic
AuthName "Accesso alla Directory..."
AuthUserFile /percorso_assoluto/.htpasswd
Require valid-user

# Libera il file index.php
<Files index.php>
   Allow from All
   Satisfy Any
</Files>

# Libera il file free_access.php
<Files free_access.php>
   Allow from All
   Satisfy Any
</Files>
# Libera tutti i file .xml, .css e .js
<FilesMatch "\.(xml|css|js)$">
   Allow from All
   Satisfy Any
</FilesMatch>

# Libera i file "page1.php" e "page2.php"
<FilesMatch "^(page1\.php|page2\.php)$">
   Allow from All
   Satisfy Any
</FilesMatch>

Personalizza la pagina di errore “401 Authorization Required”

Come ciliegina sulla torta :) impostiamo una pagina personalizzata per l’errore 401 che si verifica quando non si inseriscono dei dati di autenticazione corretti.

Pagina 401 di default

http auth 401default Autenticazione HTTP basic su server Apache

Codice da inserire nel file .htaccess principale
ErrorDocument 401 /my_401.html
La mia pagina 401 personalizzata

http auth 401custom Autenticazione HTTP basic su server Apache

Demo. Prova la pagina personalizzata su http://test.jblog.it/http_auth_errordoc/ (clicca su “annulla”).

Suggerimenti? Bisogno d’aiuto?

Sto imparando a mie spese che su Apache anche le cose più semplici non sono così immediate, ma bisogna sempre sbatterci un po’ la testa!

Se hai dei suggerimenti per una miglior comprensione dell’articolo, ti serve qualche chiarimento o non riesci a venire a capo di un particolare problema non esitare a contattarmi. Sarà l’occasione per imparare qualcosa di nuovo!

Crediti

Apache HTTP Server – Core » http://httpd.apache.org/docs/2.0/mod/core.html

Apache HTTP Server – mod_auth » http://httpd.apache.org/docs/2.0/mod/mod_auth.html

Apache HTTP Server – Authentication, Authorization and Access Control » http://httpd.apache.org/docs/2.0/howto/auth.html

Foto | NYkette » http://newyorkette.com/2006/03/08/a-bouncer-on-bouncers/

Articoli correlati
Articoli casuali (stesse categorie)
Commenti
Trackbacks
.1

[...] la lettura con la fonte di questo articolo: Autenticazione HTTP “basic” su server Apache Articoli correlati: Webservice e autenticazione – [...]

Puoi usare questi tag:   <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

ATTENZIONE. Se inserisci più di 2 link il commento verrà messo in coda, quindi non sarà visibile subito.

jblog: news e appunti per webmaster