Proteggiamo l’accesso ad una directory del nostro sito tramite Basic Authentication in Apache. I file .htpasswd .htaccess e la configurazione dei Virtual Host.
Quando si configura un Web Server Apache, capita di dover limitare l'accesso a determinate sezioni di un sito web.
E' possibile ricorrere ad autenticazioni basate su login, con inserimento di username e password, tramite l'utilizzo di strumenti di programmazione come ad esempio PHP abbinato a MySql per verificare le credenziali di un utente. Questo sistema di autenticazione è utile, e forse l'unica strada percorribile, nel caso accesso ad una area riservata di un sito web con un numero elevato di utenti, che magari si registrano direttamente dalle pagine del sito web stesso.
Apache tuttavia, tramite apposite sue direttive, consente di proteggere particolari directory dall'accesso indesiderato ad utenti di sistema, cioè creati all'interno del nostro server linux con i noti comandi "adduser" o "useradd".
Per proteggere particoli directories si ricorre all'utilizzo dei file .htpasswd e .htaccess
In questo articolo come configurazione Apache per blindare l'accesso ad una determinata direcorty, in un sistema operativo Centos 7.
L'ambiente di lavoro che utilizzerò in questo articolo è il seguente:
- Il sistema operativo utilizzato è Centos 7 (che per comodità abbiamo installato su una Virtual Box) a cui dovete avere accesso come utenti root e dovete aver accesso alla rete.
- Apache è configurato, e il nostro sito è creato sotto la directory "/var/www/html/ilmiosito"
- Il dominio del nostro sito è www.ilmiosito.it ed abbiamo configurato Apache con questo Virtual Host (ma vedremo anche come operare se non abbiamo un dominio)
Creiamo una directory da progettere nel nostro sito
Ipotizziamo che il nostro sito web sia localizzato sotto questa directory: "/var/www/html/miosito".
Spostiamoci in questa directory
# cd /var/www/html/miosito
In questo sito vogliamo creare un directory accessibile solo tramite autenticazione, ad esempio la directory "area_riservata".
Creiamo la directory da proteggere
# mkdir area_riservata
Accediamo alla directory creata
# cd area_riservata
Al suo interno creiamo un file chiamato "index.html" (che sappiamo essere il file che di default viene visualizzato quando apriamo da browser un sito o una sua cartella senza indicare uno specifico file), e al suo interno scriviamo un testo qualunque
// creo il file index
# touch index.html
// assegnamo il file all'utente e al gruppo Apache
# chown apache.apache index.html
// scrivo al suo interno la frase "benvenuto in questa area riservata"
echo "benvenuto in questa area riservata > index.html
Verifichiamo che la pagina si apra correttamente da browser web digitandone la url completa "http://192.168.1.10/miosito/area_riservata" (oppure http://192.168.1.10/miosito/area_riservata/index.html").
In questo momento questa directory è accessibile liberamente, e la index.html visibile da tutti.
Vogliamo che alla index.html e in generale a tutto quello che c'è all'interno di questa directory "area_riservata" (quindi anche altri files o altre sotto directory in essa presenti) non si possa accedere liberamente, ma che ci si debba autenticare con l'inserimento username e password. Ricorriamo ad una autenticazione fornita da Apache, tramite l'utilizzo di file ".htpasswd" e ".htaccess"
Creiamo un utente di sistema
Come accennato, possiamo utilizzare l'autenticazione di Apache su utenti di sistema, cioè creati all'interno del nostro server linux con i noti comandi "adduser" o "useradd".
Vediamo rapidamente, perchè la creazione di un utente non è oggetto di questo articolo, come creare un utente di nome "pippo" usando il comando "adduser"
# adduser pippo
Fatto!
Creiamo la password di autenticazione
Adesso che abbiamo l'utente "pippo", vediamo come blindare la cartella "area_riservata" al solo utente "pippo".
Utilizziamo il comando "htpasswd" fornito da Apache per creare un file contentente la password, criptata, necessaria per accedere alla directory "area_riservata".
Il file della password, che dovrà chiamarsi ".htpasswd" con il punto davanti, può essere creato ovunque sul tuo disco rigido del server.
Possiamo creare una directory, ad esempio, "/etc/htpasswd" e mettere dentro il file, oppure possiamo salvarlo direttamente all'interno della directory che vogliamo proteggere "/var/www/html/ilmiosito/area_riservata". Dove voi tu.
Nel nostro esempio, per semplicità, lo localizziamo direttamente nella directory che vogliamo proteggere.
Il comando "htpasswd" va seguito da "-c" e dal path al file che stiamo creato, e infine dall'utente "pippo" da abbinare a questo file, cioè che potrà accedere alla directory riservata
# htpasswd -c /var/www/html/miosito/area_riservata/.htpasswd pippo
Verrà chiesto l'inserimento di una password, e di ripeterne poi l'inserimento
New password:
Re-type new password:
Adding password for user pippo
Il file ".htpasswd" è stato creato.
Attenzione: utilizziamo il flag "-c" solo quando dobbiamo creare il file. Se dovessimo consentire ad altri utenti di accedere alla area_riservata, dovrò ripetere la stessa procedura SENZA usare "-c"
# htpasswd /var/www/html/miosito/area_riservata/.htpasswd pluto
Spostatevi nella directory "area_riservata"
cd /var/www/html/miosito/area_riservata
e verifichiamo con il comando "ls" cosa c'è al suo interno e vedremo che ...
# ls -l
-rw-r---r-- 1 apache apache 0 5 mar 09.14 index.html
.. ma dov'è il file appena creato? C'è. c'è!! E' solo nascosto da occhi indiscreti. Tutti i file precedenti dal punto, come il nostro ".htpasswd" sono file nascosti.
Per vedere i file nascosti usate l'opzione "a"
# ls -la
-rw-r---r-- 1 root root 44 5 mar 09.16 .htpasswd
-rw-r---r-- 1 apache apache 0 5 mar 09.14 index.html
Abbiamo generato la password per consentire all'utente pippo, e pluto, di accedere alla area_riservata
Se vogliamo guardare come è stata salvata la password all'iterno del file creato, leggiamo il file usando il comando "cat"
# cat /var/www/html/miosito/area_riservata/.htpasswd
pippo:$apr1$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.
pluto:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.
Troveremo i nostri due utenti non le relative password criptate
Il nostro lavoro non è ancora finito, occorre ancora configurare Apache affinchè sappia che quella directory "area_riservata" va protetta con il file .htpasswd generato
Abbiamo due modi per operare: creando un file ".htaccess" oppure modificando la configurazione del Virtual Host in Apache associato al sito
Configurazione con VIrtual Host
Se hai accesso come utente root al server, questa via è preferibile.
Il vostro sito ha un dominio, e su Apache è configurato il relativo VirtualHost. Apri il file di configurazione del VirtualHost in Apache.
Questa configurazione può essere inserita al fondo del file di configurazione principale di Apache "/etc/httpd/conf/httpd.conf" ma è preferibile nel file dedicato "/etc/httpd/conf/conf.d/vhost.conf"
Per il tuo sito avrai, ad esempio, questa configurazione
<VirtualHost *:80>
ServerName www.ilmiosito.it
ServerAlias ilmiosito.it ilmiosito.com www.ilmiosito.com www.pippo.it pippo.it
DocumentRoot /var/www/html/miosito
ErrorLog logs/ilmiosito_error_log
CustomLog logs/ilmiosito_access_log
</VirtualHost>
Al suo interno occorre definire la directory da proteggere, in questo modo
<VirtualHost *:80>
ServerName www.ilmiosito.it
ServerAlias ilmiosito.it ilmiosito.com www.ilmiosito.com www.pippo.it pippo.it
DocumentRoot /var/www/html/miosito
ErrorLog logs/ilmiosito_error_log
CustomLog logs/ilmiosito_access_log
<Directory "/var/www/html/miosito/area_riservata">
AuthType Basic
AuthName "Accesso ad area riservata"
AuthUserFile /var/var/www/html/miosito/area_riservata/.htpasswd
Require valid-user pippo,pluto
</Directory>
</VirtualHost>
Vediamo nel dettagio cosa abbiamo aggiunto alla configurazione del Virtual Host
-
<Directory>: contiene il path alla cartella che stiamo proteggendo: "/var/www/html/miosito/area_riservata". Tra la sua apertura e chiusura indichiamo quanto segue.
-
AuthType: indica il tipo di autenticazione da utilizzare. Esistono infatti vari di di autenticazione. Noi utilizziamo l'autenticazione di tipo "Basic"
-
AuthName: qui indichiamo la frase che apparirà quando tenteremo di accedere, senza essere ancora autenticati, all'area riservata. Potete indicare quello che volete.
-
AuthUserFile: qui indichiamo dove è localizzato il file contenente la password dell'utente autorizzato (o degli utenti) ad accedere all'area riservata. Nel nostro caso "/var/var/www/html/miosito/area_riservata/.htpasswd"
-
Require: con il valore "valid-user" diciamo ad Apache quali sono gli utenti che possono accedere all'area riservata, nel nostro caso pippo e pluto. E' anche possibile indicare solo "Require valid-user" senza i nomi degli utenti, tanto sono già indicati nel file .htpasswd
La configurazione è completata, dobbiamo riavviare o ricaricare le configurazioni di Apache
# service httpd reload
Adesso proviamo ad accedere all'area riservata con il nostro browser web digitando la sua url "http://www.ilmiosito.it/area_riservata"
Come vediamo apparirà un prompt con la frase indicata nel file di configurazione del VirtualHost, e la richiesta di user e password. Se inserite correttamente avrete accesso all'area riservata.
Configurazione senza Virtual Host
Se state testando il vostro sito senza un dominio ma semplicemente in lan usando l'ip locale, quindi tramite la url "http://192.168.1.10/miosito/area_riservata".
In questo caso, l'istruzione <Directory> dovete inserirla direttamente nel file di configrazione di Apache e non nel blocco VirtualHost
<Directory "/var/www/html/miosito/area_riservata">
AuthType Basic
AuthName "Accesso ad area riservata"
AuthUserFile /var/var/www/html/miosito/area_riservata/.htpasswd
Require valid-user
</Directory>
Creazione di un file .htaccess
In alternativa alla procedura, quindi senza inserire quella direttiva nel file di configurazione di Apache, possiamo ottenere lo stesso risultato attraverso la creazione un file ".htaccess".
Questo file va inserito nella directory da proteggere: Apache, all'apertura della directory, leggerà il suo contenuto e saprà che quella directory è protetta.
Il contenuto del file ".htaccess" è identico al contenuto dell'istruzione <Directory> e cioè
AuthType Basic
AuthName "Accesso ad area riservata"
AuthUserFile /var/var/www/html/miosito/area_riservata/.htpasswd
Require valid-user
L'unica avvertenza è che in Apache l'istruzione <Directory> presente nella sua configurazione, e relativa al sito che stiamo esaminando, o se presente all'interno del suo specifico VirtualHost, sia indicato "AllowOverride All" al posto di "AllowOverride None".
<Directory "/var/www/html/miosito">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Se "AllowOverride" fosse settata su None, tutti i files .htaccess sotto la directory in questione saranno ignorati e quindi la directory sarà accessibile liberamente.
Se avete modificato questa configurazione riavviate Apache altrimenti aprite direttamente la pagina web da browser.
Sicurezza dei file .htaccess e .htpasswd
Questi due file, come abbiamo capito, sono molto delicati e non devono essere accessibili via browser ma solo da Apache.
Scorrendo il file di configurazione di Apache troviamo una direttiva che serve proprio a proteggere l'apertura dei file che iniziano con ".ht"
<Files ".ht*">
Require all denied
</Files>
Con questa istruzione nessuno potrà aprire questi file da browser web.
Siti web in hosting
Se il vostro sito è localizzato in uno spazio web in hosting, non avete accesso come utenti root al server, tuttavia i provider normalmente forniscono un pannello di controllo del vostro sito web, e tra i vari strumenti che vi mettono a disposizione vi è anche la creazione di aree riservata. In questo caso tutta la procedura indicata in precedenza risulterà semplificata: vi verrà chiesta la directory da proteggere e la password da utilizzare per blindare la directory. Pochi istanti e il pannello di controllo vi creerà i file .htaccess e .htpasswd all'interno della directory da proteggere.