Apache Chroot · 4 min read · Dec 26, 2025

Chrooting Apache 2.4 con mod_unixd su Debian 8 (Jessie)

Questa guida spiega come impostare mod_unixd con Apache 2.4 su un sistema Debian Jessie. Con mod_unixd, puoi eseguire Apache in un ambiente chroot sicuro e rendere il tuo server meno vulnerabile ai tentativi di intrusione che cercano di sfruttare vulnerabilità in Apache o nelle tue applicazioni web installate. Il modulo mod_unixd è un sostituto del modulo mod_chroot, che era utilizzato nella vecchia versione di Apache 2.2.

1 Nota Preliminare

Presumo che tu abbia un sistema Debian 8 in esecuzione con un Apache funzionante, ad esempio come mostrato in questo tutorial: tutorial del server LAMP Debian 8 Jessie con Apache 2, PHP 5 e MariaDB. Inoltre, presumo che tu abbia uno o più siti web configurati all’interno della directory /var/www (ad esempio, se utilizzi ISPConfig).

Il server che utilizzo qui ha l’indirizzo IP 192.168.1.100 e il nome host server1.example.com. Si prega di sostituire questi valori con l’indirizzo IP e il nome host del proprio server ovunque si presentino nel tutorial.

2 Configurazione di Apache

Il modulo apache mod_unixd che offre la funzione Chroot in Apache 2.4 è parte dei moduli core di Apache ed è compilato staticamente nel binario di Apache su Debian 8, quindi non dobbiamo installare software aggiuntivo per utilizzarlo.

Voglio utilizzare la directory /var/www come directory contenente la prigione chroot. L’Apache di Debian utilizza il file PID /var/run/apache2.pid; quando Apache è chrooted in /var/www, /var/run/apache2.pid si traduce in /var/www/var/run/apache2.pid. Pertanto, creiamo ora quella directory:

mkdir -p /var/www/var/run  
chown -R root:root /var/www/var/run

Ora dobbiamo dire ad Apache che vogliamo utilizzare /var/www come nostra directory chroot. Apriamo /etc/apache2/apache2.conf e subito sotto la riga PidFile, aggiungiamo una riga ChrootDir:

nano /etc/apache2/apache2.conf
[...]  
#  
# PidFile: Il file in cui il server dovrebbe registrare il suo numero  
# di identificazione del processo quando si avvia.  
# Questo deve essere impostato in /etc/apache2/envvars  
#  
PidFile ${APACHE_PID_FILE}  
ChrootDir /var/www  
[...]  

Successivamente, dobbiamo dire ai nostri vhosts che la root del documento è cambiata (ad esempio, una DocumentRoot /var/www si traduce ora in DocumentRoot /). Possiamo farlo cambiando la direttiva DocumentRoot di ogni vhost, oppure più facilmente, creando un symlink nel file system.


2.1 Primo Metodo: Cambiare la DocumentRoot

Supponiamo di avere un vhost con DocumentRoot /var/www. Dobbiamo ora aprire la configurazione del vhost di quel vhost e cambiare DocumentRoot /var/www in DocumentRoot /. Di conseguenza, DocumentRoot /var/www/web1/web si tradurrebbe ora in DocumentRoot /web1/web, e così via. Se vuoi utilizzare questo metodo, devi cambiare la DocumentRoot per ogni singolo vhost.

2.2 Secondo Metodo: Creare un Symlink nel File System

Questo metodo è più semplice, perché devi farlo solo una volta e non devi modificare alcuna configurazione del vhost. Creiamo un symlink che punta da /var/www/var/www a /var/www:

mkdir -p /var/www/var  
cd /var/www/var  
ln -s ../../ www

Infine, dobbiamo fermare Apache, creare un symlink da /var/run/apache2.pid a /var/www/var/run/apache2.pid e riavviarlo:

service apache2 stop
ln -s /var/www/var/run/apache2.pid /var/run/apache2.pid  
service apache2 start

Questo è tutto. Ora puoi chiamare le tue pagine web come prima, e dovrebbero essere servite senza problemi, purché siano file HTML statici o utilizzino mod_php.

Testerò questo ora con una pagina phpinfo(). Apri un nuovo file info.php con nano nella root del documento del sito web predefinito:

nano /var/www/html/info.php

e aggiungi il seguente contenuto:

Salva il file e apri il nome host del tuo server o l’indirizzo IP nel browser, seguito da /info.php. Esempio:

http://192.168.1.100/info.php

La seguente pagina dovrebbe apparire ora quando PHP funziona correttamente:

Pagina info PHP.

Finora tutto bene, ma come facciamo a sapere se Apache è davvero chrooted? Proviamo ad accedere a un file che si trova al di fuori del chroot, userò /etc/hosts qui come esempio.

nano /var/www/html/testchroot.php

con questo contenuto:

' . $var;

e apri l’URL del file di test in un browser. Il risultato è:

Test Chroot

Come puoi vedere, il contenuto del file /etc/hosts non può più essere accessibile da questo script PHP.

Elimina i file di test se non ne hai più bisogno:

rm /var/www/html/testchroot.php  
rm /var/www/html/info.php

Se stai usando CGI, ad esempio Perl, Ruby, ecc., allora devi copiare l’interprete (ad esempio /usr/bin/perl, ecc.) nella prigione chroot insieme a tutte le librerie necessarie all’interprete. Puoi scoprire le librerie richieste con il comando ldd, ad esempio:

ldd /usr/bin/perl
root@server1:/var/www/html# ldd /usr/bin/perl  
linux-vdso.so.1 (0x00007ffe951f4000)  
libperl.so.5.20 => /usr/lib/x86_64-linux-gnu/libperl.so.5.20 (0x00007f1dafe54000)  
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1dafc50000)  
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1daf94f000)  
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1daf732000)  
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1daf387000)  
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f1daf150000)  
/lib64/ld-linux-x86-64.so.2 (0x00007f1db0214000)  
root@server1:/var/www/html#

oppure utilizzare gli strumenti jailkit per costruire l’ambiente della prigione. Se hai copiato tutti i file richiesti, ma la pagina non funziona ancora, dovresti dare un’occhiata al log degli errori di Apache /var/log/apache2/error.log. Di solito ti dice dove si trova il problema.

3 Link

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.