Questa guida spiega come configurare 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 effrazione che tentano di sfruttare le vulnerabilità in Apache o nelle tue applicazioni web installate. Il modulo mod_unixd è un sostituto del modulo mod_chroot, che era usato nel vecchio apache 2.2.
1 Nota preliminare
Suppongo che tu abbia un sistema Debian 8 in esecuzione con un Apache funzionante, ad es. come mostrato in questo tutorial:tutorial del server Debian 8 Jessie LAMP con Apache 2, PHP 5 e MariaDB. In aggiunta a ciò, presumo che tu abbia uno o più siti web impostati all'interno della directory /var/www (ad esempio se usi ISPConfig).
Il server che utilizzo qui ha l'indirizzo IP 192.168.1.100 e il nome host server1.example.com . Sostituisci questi valori con l'indirizzo IP e il nome host del tuo server ovunque si trovino nel tutorial.
2 Configurazione di Apache
Il modulo apache mod_unixd che offre la funzione Chroot in Apache 2.4 fa parte dei moduli core di Apache ed è compilato staticamente nel binario Apache su Debian 8, quindi non è necessario installare software aggiuntivo per usarlo.
Voglio usare la directory /var/www come directory contenente la jail chroot. Apache di Debian utilizza il file PID /var/run/apache2.pid; quando Apache è in chroot su /var/www, /var/run/apache2.pid si traduce in /var/www/var/run/apache2.pid. Quindi creiamo quella directory ora:
mkdir -p /var/www/var/run
chown -R root:root /var/www/var/run
Ora dobbiamo dire ad Apache che vogliamo usare /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: The file in which the server should record its process # identification number when it starts. # This needs to be set in /etc/apache2/envvars # PidFile ${APACHE_PID_FILE} ChrootDir /var/www [...]
Successivamente, dobbiamo dire ai nostri vhost che la radice del documento è cambiata (ad esempio, un DocumentRoot /var/www si traduce ora in DocumentRoot /). Possiamo farlo sia modificando la direttiva DocumentRoot di ogni vhost, o più facilmente, creando un collegamento simbolico nel file system.
2.1 Primo metodo:modificare la DocumentRoot
Supponiamo di avere un vhost con DocumentRoot /var/www. Ora dobbiamo aprire la configurazione vhost di quel vhost e cambiare DocumentRoot /var/www in DocumentRoot /. Di conseguenza, DocumentRoot /var/www/web1/web verrà ora tradotto in DocumentRoot /web1/web e così via. Se vuoi usare questo metodo, devi cambiare DocumentRoot per ogni singolo vhost.
2.2 Secondo metodo:creare un collegamento simbolico nel file system
Questo metodo è più semplice, perché devi farlo una sola volta e non devi modificare alcuna configurazione di vhost. Creiamo un collegamento simbolico 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 collegamento simbolico 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.
Lo testerò ora con una pagina phpinfo(). Apri un nuovo file info.php con nano nella radice del documento del sito Web predefinito:
nano /var/www/html/info.php
e aggiungi il seguente contenuto:
<php
phpinfo();
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:
Fin qui tutto bene, ma come facciamo a sapere se Apache è davvero in chroot? Proviamo ad accedere a un file che è al di fuori del chroot, userò /etc/hosts qui per esempio.
nano /var/www/html/testchroot.php
con questo contenuto:
<?php
$var = file_get_contents('/etc/hosts');
echo 'The content of /etc/hosts is: <br />' . $var;
e apri l'URL del file di prova in un browser. Il risultato è:
Come puoi vedere, non è più possibile accedere al contenuto del file /etc/hosts da questo script PHP.
Elimina i file di prova se non ne hai più bisogno:
rm /var/www/html/testchroot.php
rm /var/www/html/info.php
Se stai usando CGI, ad es. Perl, Ruby, ecc., quindi devi copiare l'interprete (es. /usr/bin/perl, ecc.) nella chroot jail insieme a tutte le librerie necessarie all'interprete. Puoi scoprire le librerie richieste con il comando ldd, ad es.
ldd /usr/bin/perl
[email protected]:/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)
[email protected]:/var/www/html#
oppure usa gli strumenti jailkit per creare l'ambiente jail. Se hai copiato tutti i file richiesti, ma la pagina continua a non funzionare, 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
- mod_unixd:https://httpd.apache.org/docs/2.4/mod/mod_unixd.html
- Apache:http://httpd.apache.org/
- Debian:http://www.debian.org/