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
:
Le opzioni potrebbero anche essere più di una, separate da spazi, l'importante è che compaia la precedente o, al limite, All
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
AuthType
AuthBasicProvider
AuthUserFile htpasswd
Require
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
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:
L'opzione -c
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 MD5
Per aggiungere i successivi utenti procediamo in maniera analoga omettendo l'opzione -c
Per eliminare un utente digitiamo:
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 mod_authz_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
Per ovviare alle pecche evidenziate,