Prenderemo ora come riferimento una possibile e minimale configurazione di virtual host (avendo modificato quello di default, la cui definizione è contenuta in /etc/apache2/sites-enabled/000-default
) al fine di elencare alcune tra le direttive più importanti nei termini della sicurezza.
NameVirtualHost * <VirtualHost *> ServerAdmin webmaster@mio_server.com DocumentRoot /var/www/ <Directory /> Options None AllowOverride None </Directory> <Directory /var/www/> Options -Indexes -FollowSymLinks -ExecCGI -Includes AllowOverride None Order allow,deny allow from all RedirectMatch ^/$ /apache2-default/ </Directory> ServerSignature Off </VirtualHost>
La direttiva Options definisce alcuni comportamenti che la directory alla quale si applica dovrà avere. Può esser usata, inoltre, in apache2.conf
ed .htaccess
.
Per ciò che concerne la directory /var/www
, cioè la DocumentRoot del nostro unico virtual host di esempio, le impostazioni dati impongono:
- Indexes: inibisce sempre la generazione della lista dei file contenuti qui ed in ogni sotto-directory. Consigliatissimo, evita di esporre all'Internet la lista dei file facenti parte di un programma Web e/o la lista delle risorse (se il file
index
fosse assente); - FollowSymLinks: evita che risorse WWW vengano reperite, tramite link, esternamente dalla directory
www
(non disabilitare se si usa mod_rewrite); - ExecCGI: evita di eseguire script CGI (che, preciso, nulla hanno a che fare con PHP). Si è anche disabilitato mod_cgi (a2dismod cgi);
- Include: evita inclusioni server-side, possibile veicolo di exploit.
La configurazione proposta (Options -Indexes -FollowSymLinks -ExecCGI -Includes
) è altrimenti sostituibile con Options None
che contiene anche altri tipi di protezioni:
Tramite l'utilizzo di un file particolare, nominato di default .htaccess
(e ridefinibile tramite direttiva AccessFileName
), è possibile definire configurazioni per ogni singola (sotto)directory. È un sistema molto utile e spesso utilizzato ma anche, come si può comprendere, possibilmente pericoloso. Nel caso si ritenga che le direttive incluse nel file apache2.conf
non debbano esser modificate da alcuno e per nessuno script si può disabilitare l'utilizzo di .htaccess
tramite la direttiva AllowOverride
con parametro None
, come riportato nell'esempio. Esistono tuttavia opzioni meno restrittive (e più consigliate) che la completa disabilitazione e si rimanda alla documentazione di Apache se interessati.
Le righe:
Order allow,deny allow from all
definiscono che il contenuto di Directory
sia "servibile" da Apache all'Internet (o Intranet) senza restrizione alcuna (mod_authz_host
).
La riga contenente RedirectMatch
evita il directory-listing a livello / (file nella directory www o lista dei programmi Web), rindirizzando l'utente alla directory specificata.
Se supponiamo quindi che nel nostro virtual host facente capo a www.mio_server.com
vi siano due sotto-directory contenenti rispettivamente prog_1
e prog_2
:
- se da browser digitiamo www.mio_server.com, verrà visualizzato quanto in /www/apache2-default/index.html;
- se digitiamo www.mio_server.com/prog_1, verrà visualizzato, se esiste, il default index di /www/prog_1/ (cioè con ogni probabilità: /www/prog_1/index.php), altrimenti nulla;
analogamente per prog_2.
Ho qui inoltre eliminato rispetto alla configurazione predefinita ogni direttiva di tipo Alias
(la quale, come FollowSymLinks
, abilita le risorse WWW ad esser memorizzate sul filesystem in directory diverse dalla DocumentRoot
). Ciò potrebbe portare, in particolari casi, a visualizzare un contenuto non voluto.
Per la regola secondo cui "meno informazioni si danno di sé ad un possibile aggressore meno rischi di exploit su bug noti si incontreranno", la direttiva ServerSignature Off
elimina, dalle pagine generate da Apache (pagine contenenti messaggi di errore o simili), ogni riferimento alla versione del software utilizzata e ad ogni suo modulo.
Purtroppo Apache è "megalomane" e non elimina mai ogni traccia di sé. Principalmente, informazioni su di esso rimangono negli header di ogni messaggio di risposta HTTP, come da esempio seguente.
HTTP/1.1 200 OK Server: Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 proxy_html/2.5 mod_ssl/2.2.3 OpenSSL/0.9.8c [...]
Ciò che è possibile fare, a meno di non intervenire nel codice del programma o usare metodi avanzati (mod_security
), è giungere al compromesso seguente che comunque è più che sufficiente per i nostri fini:
HTTP/1.1 200 OK Server: Apache [...]
Ciò si ottiene tramite l'imposizione di ServerTokens Prod
in apache2.conf
.
Configurazione: altro
Si può disabilitare o configurare adeguatamente, al fine di prevenire l'accesso pubblico ad informazioni "delicate", mod_info
e mod_status
, i quali consentono al richiedente remoto di visualizzare da browser ogni aspetto della configurazione di Apache e del suo stato attuale. Se non necessario, disabilitare anche mod_userdir
, il quale modulo abilita gli utenti ad avere una propria web-site area con alias /~username
, cosa che potrebbe portare ad identificare username validi di account sul server.