Apache2: proteggere directory mediante autenticazione

Debian-swirl.png Versioni Compatibili

Tutte le versioni supportate di Debian

Introduzione

In molte situazioni i servizi HTTP sono pubblici e pensati per essere accessibili da chiunque abbia la possibilità di connettersi.
Ci sono però diversi casi in cui gli amministratori hanno bisogno di ottenere un qualche controllo sugli accessi a particolari directory o file del sito; ad esempio la pagina delle statistiche o la pagina di configurazione di Apache o PHP non dovrebbero essere raggiungibili da chiunque. In questa guida vedremo due dei possibili metodi di controllo degli accessi:

  • controllo degli accessi credential-based
  • controllo degli accessi rule-based

Controllo degli accessi Rule-Based

Questo tipo di controllo degli accessi è basato su delle regole (rules) definite all'interno del file di configurazione di Apache o, meglio, all'interno del file di configurazione del Virtual Host o del servizio che vogliamo proteggere.

Regole base

Nel file di configurazione del Virtual Host inseriamo le prime regole base:

<Directory /var/www/esempio.it/www/>
          Order deny,allow
          Deny from all
          Allow from 192.168.90.0/24
</Directory>

La direttiva:

  • Order Deny,Allow indica ad Apache di processare la regola Deny (proibisci) sempre prima della regola Allow (consenti)
  • Deny from all dice ad Apache di proibire a chiunque l'accesso alla directory
  • Allow from indica ad Apache di consentire l'accesso alla risorsa a tutte le macchine della rete 192.168.90.0/24


Da Debian Jessie (Apache 2.4.x):

<Directory /var/www/esempio.it/www/>
          Require ip 192.168.90.0/24
</Directory>

La direttiva non prevede più l'utilizzo di Order deny,allow e Deny from all In questo caso specifico basta:

  • Require ip per indicare ad Apache che l'accesso alla risorsa è consentito solo a tutte le macchine della rete 192.168.90.0/24

Regole addizionali

Le direttive Deny e Allow possono essere combinate e ripetute, come in questo esempio:

<Directory /var/www/esempio.it/www/>
          Order deny,allow
          Deny from 192.168.100.100
          Deny from 10.0.0.0/24
          Allow from 192.168.90.0/24
          Allow from 10.0.0.11
</Directory>

Da Debian Jessie (Apache 2.4.x):

<Directory /var/www/esempio.it/www/>
          Require not ip 192.168.100.100
          Require not ip 10.0.0.0/24
          Require ip 192.168.90.0/24
          Require ip 10.0.0.11
</Directory>

La direttiva non prevede più l'utilizzo di Order deny,allow, Deny from e Allow from In questo caso specifico basta:

  • Require not ip per indicare ad Apache di negare l'accesso alla risorsa a tutte le macchine delle reti 192.168.100.100 e 10.0.0.0/24
  • Require ip per indicare ad Apache che l'accesso alla risorsa è consentito solo a tutte le macchine delle reti 192.168.90.0/24 e 10.0.0.11


Apache permette anche di specificare regole di accesso basate sugli hostname e non solo sugli indirizzi IP. Ad esempio:

<Directory /var/www/esempio.it/www/>
          Order deny,allow
          Deny from 192.168.100.100
          Deny from 10.0.0.0/24
          Deny from dominio.it
          Allow from dominio.org
          Allow from 192.168.90.0/24
          Allow from 10.0.0.11
</Directory>

Da Debian Jessie (Apache 2.4.x):

<Directory /var/www/esempio.it/www/>
          Require not ip 192.168.100.100
          Require not ip 10.0.0.0/24
          Require not host dominio.it
          Require host dominio.org
          Require ip 192.168.90.0/24
          Require ip 10.0.0.11
</Directory>

La direttiva non prevede più l'utilizzo di Order deny,allow, Deny from e Allow from In questo caso specifico sono state aggiunte due regole:

  • Require not host per indicare ad Apache di negare l'accesso alla risorsa a tutti gli host del dominio "dominio.it"
  • Require host per indicare ad Apache che l'accesso alla risorsa è consentito solo a tutti gli host del dominio "dominio.org"


È anche possibile costruire delle regole di accesso basate sulle variabili della sessione HTTP: questo ci permette di creare regole leggendo ad esempio il tipo di browser (user agent) o il referrer. Ad esempio:

<Directory /var/www/esempio.it/www/>
          SetEnvIf Referer google.it search_traffic
          Order Deny,Allow
          Deny from all
          Allow from env=search_traffic
</Directory>

Questa regola lavora insieme al modulo Apache mod_setenvif, in questo modo:

  1. se il referrer del visitatore coincide con google.it viene inizializzata la variabile search_traffic
  2. viene negato a tutti l'accesso alla risorsa
  3. viene consentito l'accesso a chi ha la variabile search_traffic impostata

Controllo degli accessi Credential-based

Un altro modo per proteggere le directory del nostro web server è attraverso una richiesta di autenticazione.

Configurare la HTTP Authentication

Per proteggere tramite password una directory del web server occorre innanzitutto inserire le seguenti linee all'interno della sezione <Directory> appropriata del nostro file di configurazione di Apache o del Virtual Host:

<Directory /var/www/esempio.it/www/>
         AuthType Basic
         AuthUserFile /var/auth/.htpasswd
         AuthName "Richiedi le credenziali per entrare"
         Require valid-user
</Directory>

La direttiva:

  • AuthType specifica quale metodo di autenticazione dovrà essere utilizzato da Apache quando stabilisce una connessione con un client. Basic è il metodo più semplice, ma invia in chiaro la password di autenticazione
  • AuthUserFile specifica il percorso completo dove si trova il file delle password
  • AuthName contiene il messaggio visualizzato dal browser all'atto della richiesta di autenticazione
  • Require valid-user indica ad Apache che solo gli utenti validi possono essere autenticati

A questo punto dobbiamo creare il file delle password.

Generazione del file HTTP AUTH Passwords

Per generare questo file abbiamo bisogno di alcuni tool:

# apt-get update
# apt-get upgrade
# apt-get install apache2-utils

Procediamo poi con la creazione del file:

# htpasswd -c /var/auth/.htpasswd utente_ok
Pssword: ********
Retype Password: ********

Una volta creato il file e aggiunto l'utente utente_ok possiamo in ogni momento aggiungere altri utenti semplicemente ripetendo il comando precedente, ma omettendo l'opzione -c (create):

# htpasswd -b /srv/auth/.htpasswd ferdy 5t1ck6

L'opzione -b ci permette di specificare la password direttamente nel comando.
Il file di autenticazione sarà quindi qualcosa del genere:

# less /var/auth/.htpasswd
utente_ok:isiA3Q4djD/.Q
ferdy:{SHA}x9VvwHI6dmgk9VTE0A8o6hbCw2s=
utente2:$apr1$vVzQJxvX$6EyHww61nnZr6IdQv0pVx/

Possiamo restringere ulteriormente gli accessi alla risorsa sostituendo la linea:

Require valid-user

con:

Require utente_ok ferdy

Con queste indicazioni all'utente utente2, pur appartenendo egli al file di autenticazione, sarà impedito l'accesso alla directory.




Guida scritta da: Ferdybassi 16:09, 16 apr 2011 (CEST)   Debianized 20%
Estesa da:
Selky
Verificata da:

Verificare ed estendere la guida | Cos'è una guida Debianized