Proteggere directory web su Apache con htaccess

Se hai un sito che contiene dei dati sensibili, come informazioni sui tuoi utenti, indirizzi email, documenti interni etc. ti sari sicuramente posto il problema di dove conservare questi file, in modo da escludere l'accesso a persone non autorizzate. Se il tuo sito è in hosting, è molto probabile che il server usi Apache
Il modo più rapido per proteggere una directory tramite Apache consiste nell'implementare un'autenticazione via web. Htaccess è il metodo più comune, e verrà spiegato in questa guida.

Requisiti
Prima di continuare, assicurati di rispettare queste condizioni:
* il tuo webserver è Apache;
* puoi connetterti al server via FTP e telnet/ssh;
* conosci i comandi base per navigare all'interno delle directory del tuo server;
* riesci a stabilire il percorso assoluto delle directory;

Il file .htaccess
Htaccess è uno schema di autenticazione username/password che entra in gioco quando una determinata directory o un file vengono richiesti. Htaccess è un metodo di autenticazione "plain-text", il che vuol dire che username e password vengono inviati in semplice formato testo, non criptato. Sebbene ci siano molte poche possibilità che qualcuno intercetti i tuoi dati, l'autenticazione tramite htaccess è sicura quanto una connessione telnet o ftp.
Per proteggere una directory del tuo webserver usando .htaccess, devi creare due file:
.htaccess: questo file contiene le preferenze ed i dettagli riguardo ai metodi di autenticazione e i permessi per la directory.
.htpasswd: questo file contiene una lista criptata di combinazioni di username e password che viene usata da Apache insieme al file .htaccess per concedere o negare l'accesso
Se volete proteggere anche delle sottodirectory all'interno di una cartella protetta sarà necessario inserire lo stesso file .htaccess (e solo quello) in tutte le sottodirectory.
Il file .htaccess funziona come uno script di configurazione, e fornisce ad Apache alcuni dettagli ed opzioni quando un utente viene autenticato. Con un editor di testi crea un nuovo file chiamato ".htaccess" (le virgolette potrebbero essere necessarie se usassi, ad esempio, blocknotes, per evitare che venga aggiunta l'estensione .txt). Inserisci il seguente testo nel file .htaccess:
AuthUserFile /www/htdocs/secure/.htpasswd
AuthGroupFile /dev/null
AuthName "Directory Protetta"
AuthType Basic

require valid-user

Come avrai notato, il file .htaccess è diviso in due sezioni, la prima parte per i dettagli di autentificazione e la seconda parte con i permessi per l'utente. Entriamo in dettaglio.
AuthUserFile /www/htdocs/secure/.htpasswd
Nella prima linea è indicato il percorso assoluto al file .htpasswd. Questo file contiene una lista di combinazioni di username e password che Apache userà per verificare tutti i tentativi di login (maggiori dettagli di seguito).
Nell'esempio il file .htpasswd è localizzato nella directory /www/htdocs/secure. Devi cambiare questo percorso con quello della directory che vuoi proteggere. Per conoscere il percorso assoluto devi portarti via telnet/ssh nella cartella e dare il comando "pwd".
AuthGroupFile /dev/null
La seconda linea fa riferimento ad un file per l'autentificazione di gruppi. Questo potrebbe essere utile per separare gli utenti in gruppi distinti, come studenti e professori o staff e visitatori ad esempio. Siccome non ne faremo uso, indichiamo /dev/null, in modo tale da "avvisare" Apache che il file non esiste.
AuthName "Directory Protetta"
Nella terza linea, indichiamo quella che Explorer chiama "Area Autenticazione".:
Immagine della maschera per l'inserimento di username e password
Ovviamente puoi scegliere qualsiasi cosa. E' molto importante racchiudere il testo tra due virgolette (" e ").
AuthType Basic
La variabile AuthType imposta il tipo di autentificazione per la richiesta. Dato che stiamo usando una semplice autentificazione via web, la impostiamo su Basic. Altri valori possibili sono PGP e Digest.
La seconda sezione del nostro file .htaccess, contiene le richieste e i metodi di risposta a cui gli utenti autenticati hanno accesso:

...

Nel nostro file .htaccess consentiamo agli utenti autorizzati l'accesso a tutte le parti del sito in cui il metodo GET è permesso (in poche parole, gli utenti possono vedere una pagina, ma non possono compilare form etc). Altri limiti includono PUT e POST. Per ampliare le possibilità degli utenti, basta aggiungere PUT e/o POST nel primo tag, in questo modo:


require valid-user

Tra i tag e , possiamo inserire una lista di utenti a cui intendiamo concedere l'accesso alle cartelle protette, precendendo l'username con “require user”, ad esempio:
require user giovanni
require user pino
require user mafalda
In alternativa, (come ho fatto nel mio file .htaccess) si può garantire l'accesso a tutti gli utenti con l'esatta accoppiata username/password:
require valid-user
Questo è tutto quello che riguarda una semplice spiegazione del file .htaccess. Quando un utente non autenticato tenta di visitare la directory protetta, il file .htaccess viene caricato ed elaborato da Apache, che fa visualizzare la maschera per l'inserimento di username e password.
E' possibile inoltre proteggere l'intera directory proteggendo tutti i files in essa contenuti

Order allow,deny
Deny from all
Satisfy All

Chi tenterà di accedere leggerà
"Forbidden
You don't have permission to access /nome_directory/ on this server."
La direttiva è molto versatile, puoi proteggere i singoli files e persino impostare la password soltanto per alcuni file come qui sotto
AuthUserFile /percorso_htpasswd
AuthName "Utente Registrato"
AuthType Basic

require valid-user

Gli script eseguiti da Apache avranno pieno accesso alla directory mentre le richieste provenienti dall'esterno verranno bloccate*
Arrivati a questo punto non resta che aggiungere utenti alla lista delle persone autorizzate. Questo viene fatto tramite il programma htpasswd.

Il file .htpasswd
Il file .htpasswd è molto più semplice del file .htaccess, dato che può essere composto anche da una sola linea. In realtà è composto da una lista di coppie nome/valore, che rappresentano le combinazioni di username/password. Ogni combinazione di username/password è separata da un ritorno a capo e viene usata da Apache per determinare se un utente che tenta di accedere alla directory protetta esiste, e se la password che ha fornito è valida.
Prima di creare il file .htpasswd, devi caricare sul server il file .htaccess (che abbiamo appena creato), nella directory che intendi proteggere. Questo può essere fatto con un qualsiasi client ftp. L'importante che l'upload avvenga in modalità ASCII.
Per creare il file .htpasswd, dovrai connetterti al tuo server usando telnet/ssh.
Una volta collegato, dovrai portarti nella directory che intendi proteggere, usando quindi il comando:
cd /www/htdocs/secure
Ovviamente /www/htdocs/secure varierà in base alla cartella che intendi proteggere.
Ora dobbiamo eseguire il programma htpasswd. Questo è un semplice programma che accetta 3 parametri:
htpasswd [opzioni] [file .htpasswd] [nuovo username]
Per il primo parametro, useremo “-c”. Questo informa il programma che stiamo creando un nuovo utente. Per il secondo parametro, digiteremo “/www/htdocs/secure/.htpasswd” (oppure ".htaccess solamente, a patto di trovarci nella cartella /www/htdocs/secure). Per l'ultimo parametro, indicheremo il nome dell'utente che vogliamo creare, ad esempio "giovanni". Riassumendo, il comando per creare il nuovo utente giovanni, sarà il seguente:
htpasswd –c /www/htdocs/secure/.htpasswd giovanni
Dando il comando come indicato nella riga precedente (ovviamente sostituendo il percorso del file .htpasswd) ti verrà chiesto di digitare due volte la password che vuoi associare all'utente giovanni.
Per aggiungere un altro utente, non sarà più necessario usare il parametro "-c" (che serve a creare il file .htpasswd). Il comando sarà quindi:
htpasswd /www/htdocs/secure/.htpasswd mario
Ovviamente si dovrà inserire due volte la password
Questo è tutto il necessario per proteggere le directory! Possiamo controllare se il sistema funziona, aprendo il browser e collegandoci all'indirizzo corrispondente alla directory protetta. Si dovrebbe aprire un box in cui è possibile inserire username e password.
Inserendo giovanni e la password che avevate digitato, e cliccando su ok, dovreste avere accesso alla directory /secure. Inserendo 3 o più volte un'accoppiata username/password volutamente errata, dovrebbe esservi impedito l'accesso, con un errore 401.

Non posso usare telnet/ssh
C'e un metodo un po' più laborioso, ma altrettanto valido
1. vai all'indirizzo http://www.htaccesstools.com/htpasswd-generator/
2. inserisci username e password che vuoi creare (nel mio caso dario/dario)
3. premi encrypt e nella parte destra della schermata viene fuori l'output (nel mio caso, per dario/dario: "dario:gUHi3YRfa5aeI"
4. apri blocknote, ed incolli l'accoppiata username&password che sono stati generati (nel mio caso l'unica riga e' dario:gUHi3YRfa5aeI)
5. salvi come ".htpasswd"
6. carichi sul server in modalita' ASCII nella directory che vuoi proteggere, e che coincide con quella indicata nel file .htaccess
7. ti colleghi via browser alla directory protetta, apparira' la finestrella in cui inserirai lo username e la password (dario e dario nel mio caso)
8. dovresti aver accesso alla cartella.

Svantaggi di questo metodo:
* Ogni volta che vuoi aggiungere un utente, devi ripetere la procedura da capo, inserendo il nuovo utente e la password criptata nella riga sottostante.
* Per modificare la password, devi ri-criptare username e password e sostituire la nuova stringa alla precedente.
* Per rimuovere un utente, cancelli la riga ad esso associata.
* Via telnet/ssh e' piu' facile, visto che le modifiche vengono fatte direttamente al file .htpasswd, e non devi stare ogni volta a scaricarlo, modificarlo, e ricaricarlo

Conclusioni
Htaccess è uno dei metodi più popolari usato su server Apache perché è semplice e veloce da attivare e non richiede modifiche sostanziali ad Apache stesso.
Inoltre la particolarità dell'autenticazione http è proprio il fatto che il browser se la "ricorda" anche senza cookie. Quindi con il 99% dei browser non sarai costretto a ri-autenticarti se non dopo aver chiuso e riaperto la finestra.*
Come scritto precedentemente, le informazioni però vengono inviate al server in formato testo. Questo potrebbe andare bene se proteggi un sito personale. Tuttavia, se cerchi una protezione per un sito aziendale, dovresti cercare metodi più avanzati.

.htaccess
Imposta il file .htaccess per limitare l'accesso a cartelle del tuo spazio web
Per configurare un gruppo chiuso sul tuo spazio web, cioè accessibile attraverso l'inserimento di user-id e password devi utilizzare il file .htaccess
.htaccess ti permette di specificare l'accesso a una directory del tuo spazio subordinato all' inserimento di user id e password.
Questa operazione è sconsigliata agli utenti meno esperti, in quanto presume una conoscenza di base dei protocolli di comunicazione.
Vediamo un esempio di file .htaccess per restringere l'accesso alla directory del mio dominio (miodominio.it) chiamata "privato".
Se creaiamo una cartella web col nome privato (www.miodominio.it/privato) e carichiamo dei contenuti, questi naturalmente sono visibili a tutti.
Ma se vogliamo subordinare la visualizzazione dei contenuti di questa cartella all' inserimento di un nome utente e password dobbiamo creare un file .htaccess e .htpassword.
Questi file possono essere creati attraverso un semplice blocco note e devono essere poi caricati all' interno della directory che intendiamo proteggere, nel nostro caso "privato".
Un esempio di .htaccess

AuthType Basic
AuthUserFile /var/www/www.miodominio.it/httpdocs/privato/.htpasswd
AuthName "Area protetta"
require valid-user

Salviamo il file.

Contenuto di .htpasswd

nomeutente:password

Salviamo il file
Se caricate ora i due file nella cartella specificata noterete che tentando di connettersi a questa cartella verrà richiesto l'inserimento di un nome utente e di una password.

9 commenti:

Gentaro ha detto...

La tua guida è molto interessante e ben fatta. Premetto che non sono un esperto, ma dovendo proteggere una cartella ho seguito le tue indicazioni. Tuttavia il browser riporta:
“Il server ha generato un errore interno e non è in grado di soddisfare la richiesta. Il server potrebbe essere sovraccarico oppure si è verificato un errore in uno script CGI.

Se pensi che questo sia un errore del server, per favore contatta il webmaster.

Codice Errore HTTP: 500”

Versione server: Apache/2.0.54
Ho caricato nella cartella i due file ASCII .htaccess e .htpasswd.

Non capisco cosa sbaglio.
Grazie

Paolo ha detto...

probabilmente c'è un errore in uno dei due files. Qual'è il loro contenuto?

Paolo ha detto...

... dimenticavo ... prova a guardare nel log del server se hai la possibilità di farlo, dovresti trovare delle indicazioni utili se ci sono errori di sintassi o se stai utlizzando comandi non consentiti dal tuo server.

Unknown ha detto...

ciao io non ne capisco ancora niente di queste cose, vorrei sapere se questo che hai spiegato permette di proteggere le nostre cartelle web, nel senso che nessuno deve scaricare le nostre cartelle dai browser.

Paolo ha detto...

Giovanna,il metodo descritto serve a creare una forma di autenticazione per le cartelle sul web ma non può impedire agli utenti che vi accedono (utilizzando username e password) di scaricare i contenuti che vengono visualizzati tramite browser.

walter ha detto...

il seguente collegamento è errato:

http://webxtractions.com/cgi-bin/password.cgi

??
posso avere il nuovo
grazie

walter ha detto...

Questo link non è corretto:

http://webxtractions.com/cgi-bin/password.cgi

Sono interessato a questa soluzione

grazie

Paolo ha detto...

Questo link funziona se sei interessato:
http://www.kxs.net/support/htaccess_pw.html

walter ha detto...

Questi link è meglio. molto! verifica
http://www.htaccesstools.com/htpasswd-generator/