Chiunque realizzi per diletto o per lavoro siti web presto o tardi si troverà di fronte al problema di non rendere pubblicamente disponibili alcuni contenuti, ovvero creare una cosiddetta area riservata.
La soluzione più completa e flessibile consiste nell'implementare il meccanismo di autenticazione ed autorizzazione ricorrendo ad un linguaggio di programmazione lato server. Non sempre però questo approccio risulta sufficientemente rapido o adatto al particolare frangente. Per fortuna il Web Server Apache, grazie ai numerosi moduli di cui è dotato, ci consente di risolvere in maniera relativamente semplice il problema. Con quest'articolo iniziamo una panoramica dei principali metodi per limitare l'accesso al nostro sito o a parte di esso.
Prima di entrare nel vivo una premessa: spesso, in ambito Apache, viene fatta l'equazione "richiesta di autenticazione" = ".htaccess". In realtà la funzione di questo file è molto più ampia, anche se nella maggior parte dei casi viene utilizzato per proteggere una directory. Molte direttive di Apache, oltre che nel file di configurazione principale, possono essere inserite in un semplice file di testo memorizzato in una particolare posizione del nostro sito. In questo caso si parla di configurazione per-directory. Quando viene fatta una richiesta per una risorsa collocata dove risiede un file denominato .htaccess (o in una sottodirectory), Apache per prima cosa lo legge ed agisce di conseguenza.
Attenzione: le istruzioni utilizzabili sono definite dalla direttiva AllowOverride
nel file di configurazione principale. Se l'override è valorizzato a None le impostazioni per-directory verranno ignorate. Infine è bene menzionare la possibilità di modificare il nome predefinito, .htaccess, agendo sulla direttiva AccessFilename
.
Mod_auth_basic e l'autenticazione di base HTTP
Il metodo più agevole per proteggere i contenuti di un sito consiste nell'autenticazione di base HTTP. Apache 2.2 la gestisce tramite il modulo mod_auth_basic, memorizzando ad esempio nomi utente, password e gruppi in file di testo.
I principali vantaggi sono la semplicità ed il largo supporto da parte dei browser web. Il grosso svantaggio consiste nella trasmissione delle credenziali in chiaro. La codifica di username e password in Base64 serve solo a garantire la corretta comunicazione di caratteri non HTTP compatibili, infatti possono essere facilmente decodificati. Questo approccio, per sua natura, deve limitarsi a proteggere informazioni non certo segretissime, a meno che non rendiamo sicura la connessione tra client e server ad esempio con il protocollo SSL/TLS.
Altro elemento negativo è la mancanza di un meccanismo di logout, tanto che la maggior parte dei browser mantengono in cache le informazioni di autenticazione fino alla loro chiusura.
Fatte le dovute premesse vediamo come utilizzare mod_auth_basic per proteggere il contenuto di una directory. Tenete presente che il modulo è compilato e caricato di default quindi non richiede particolari operazioni preliminari. Se avete il pieno controllo del server risulta più efficiente inserire le direttive di protezione nel file di configurazione principale, in un contenitore <Directory>. Diversamente potete ricorrere ad un file .htaccess posizionato nella directory in questione. In questo caso verificate che tra le opzioni di override vi sia AuthConfig
:
AllowOverride AuthConfig
Le opzioni potrebbero anche essere più di una, separate da spazi, l'importante è che compaia la precedente o, al limite, All che le comprende tutte.
Passiamo subito un esempio che poi commenteremo in dettaglio:
AuthName "AREA DOWNLOAD" AuthType Basic AuthBasicProvider file AuthUserFile /percorso_del_file/password Require valid-user
AuthName: questa direttiva imposta un'etichetta per l'area protetta. Quando tenteremo di accedere il browser presenterà una finestra di dialogo per l'inserimento di nome utente e password che riporterà tale dicitura. Lo scopo principale è rendere evidente al navigatore che tipo di informazioni riservate stia richiedendo. Le virgolette doppie si rendono necessarie nel caso l'etichetta, come nell'esempio, si componga di più parole separate da spazi.
AuthType: con questa direttiva si definisce il tipo di autenticazione, nel nostro caso Basic, ma potrebbe anche essere Digest.
AuthBasicProvider: stabilisce il metodo utilizzato per autenticare gli utenti, nel nostro caso è pleonastico infatti il valore di default è file.
AuthUserFile: specifica il percorso ed il nome del file di testo utilizzato per memorizzare i nomi degli utenti e le relative password. È buona norma che il file si trovi all'esterno della DocumentRoot per non essere in alcun modo accessibile dal web, in questo caso il percorso indicato deve essere assoluto. Per la creazione di questo file viene fornita l'utility da riga di comando htpasswd che prenderemo in considerazione in seguito.
Require: prevede le opzioni valid-user, user, group. Nel primo caso richiediamo che l'utente per accedere debba semplicemente essere definito nel file contenente utenti e password. Ovviamente previo inserimento delle corrette credenziali.
Nel secondo caso saranno autorizzati solo alcuni specifici utenti elencati:
Require user ermanno francesco
La terza opzione, del tutto analoga, si riferisce a gruppi di utenti. Per chiarire meglio il concetto vediamo un esempio:
AuthName "AREA AMMINISTRATORI" AuthType Basic AuthUserFile /percorso_del_file/password AuthGroupFile /percorso_del_file/gruppi Require group amministratori
Abbiamo introdotto la direttiva AuthGroupFile che specifica il percorso ed il nome del file di testo usato per definire i gruppi. Il file ha una struttura molto semplice basta inserire il nome del gruppo, poi due punti e gli utenti che ne fanno parte separati da spazi:
Amministratori: francesco ermanno admin Utenti: user1 user2
Anche in questo caso è consigliabile per ragioni di sicurezza che il file si trovi all'esterno della DocumentRoot
.
Creiamo il file delle password
Vediamo ora nel dettaglio come possiamo generare il file di testo contenente nomi utente e password. Insieme ad Apache viene fornito il programma htpasswd che utilizzeremo allo scopo:
$ htpasswd -c /percorso_del_file/password ermanno
L'opzione -c permette la creazione del file il cui percorso e nome vengono specificati subito dopo. L'ultimo argomento passato al comando è lo username del primo utente. A questo punto ci verrà richiesto di digitare una password e ripeterla per conferma:
New password: Re-type new password: Adding password for user ermanno
Aprendo con un editor di testi il file password appena creato, troveremo il contenuto seguente:
ermanno:cDWFxV6xFwLyE
Per ogni utente viene creata una riga contenente lo username separato dalla password mediante due punti. Come impostazione predefinita la password viene memorizzata cifrata. In Linux sarà utilizzato l'algoritmo CRYPT, mentre in Windows MD5.
Per aggiungere i successivi utenti procediamo in maniera analoga omettendo l'opzione -c:
$ htpasswd /percorso_del_file/password francesco
Per eliminare un utente digitiamo:
$ htpasswd -D /percorso_del_file/password ermanno
L'elenco completo delle opzioni può essere visualizzato digitando htpasswd seguito da -h.
Alcune puntualizzazioni
Fino alla versione 2.1 di Apache il modulo che svolgeva la funzione di limitare gli accessi, utilizzando file di testo per memorizzare utenti, password e gruppi, era mod_auth. In caso si utilizzi una versione datata del Web server è necessario fare riferimento ad esso.
In queste pagine abbiamo introdotto l'utilizzo dell'autenticazione di base HTTP in modo molto pratico e così sarà anche per gli altri metodi di limitazione degli accessi analizzati nei prossimi articoli. Vale la pena però soffermarsi brevemente, almeno in questa prima trattazione, sullo schema di autorizzazione ed autenticazione adottato da Apache. Nell'evoluzione del Web Server tale meccanismo è andato strutturatosi in modo da coinvolgere tre tipi di moduli:
- Moduli di autenticazione.
- Moduli provider di autenticazione.
- Moduli di autorizzazione.
Facendo riferimento al nostro primo esempio i moduli coinvolti, appartenenti alle diverse categorie, sono mod_auth_basic, mod_authn_file e mod_authz_user. Il primo gestisce l'autenticazione di base, il secondo permette l'utilizzo dei file di testo per le credenziali, il terzo autorizza l'accesso alle risorse protette attraverso le opzioni valid-user o user.
In conclusione, pur consentendo la creazione di un'area riservata in pochi minuti, ribadisco i limiti della soluzione mostrata, sia in termini di sicurezza che di efficienza. In particolare segnalo che le credenziali vengono verificate ad ogni richiesta, il che vorrebbe dire per ogni immagine contenuta nella pagina se si trova anch'essa nella directory protetta. Inoltre, non appena si gestiscano un centinaio di account, l'apertura del file di testo e la sua lettura alla ricerca dell'utente penalizzano le prestazioni del web server. Senza contare che risultano piuttosto macchinose anche le operazioni di gestione da parte dell'amministratore del sito.
Per ovviare alle pecche evidenziate, Apache mette a disposizione altri moduli che garantiscono una maggiore sicurezza o rendono più efficiente il sistema di memorizzazione degli utenti....ma questi saranno argomento dei prossimi articoli.