Servidor Apache · 4 min read · Dec 26, 2025

Chrooting Apache 2.4 com mod_unixd no Debian 8 (Jessie)

Este guia explica como configurar o mod_unixd com o Apache 2.4 em um sistema Debian Jessie. Com o mod_unixd, você pode executar o Apache em um ambiente chroot seguro e tornar seu servidor menos vulnerável a tentativas de invasão que tentam explorar vulnerabilidades no Apache ou em suas aplicações web instaladas. O módulo mod_unixd é um substituto para o módulo mod_chroot, que era usado no antigo apache 2.2.

1 Nota Preliminar

Estou assumindo que você tem um sistema Debian 8 em funcionamento com um Apache funcionando, por exemplo, conforme mostrado neste tutorial: Tutorial do servidor LAMP Debian 8 Jessie com Apache 2, PHP 5 e MariaDB. Além disso, assumo que você tem um ou mais sites configurados dentro do diretório /var/www (por exemplo, se você usar o ISPConfig).

O servidor que estou usando aqui tem o endereço IP 192.168.1.100 e o nome do host server1.example.com. Por favor, substitua esses valores pelo endereço IP e nome do host do seu servidor sempre que eles ocorrerem no tutorial.

2 Configurando o Apache

O módulo apache mod_unixd que oferece a função Chroot no Apache 2.4 é parte dos módulos principais do Apache e é compilado estaticamente no binário do Apache no Debian 8, então não precisamos instalar software adicional para usá-lo.

Quero usar o diretório /var/www como o diretório que contém a prisão chroot. O Apache do Debian usa o arquivo PID /var/run/apache2.pid; quando o Apache é chrooted para /var/www, /var/run/apache2.pid se traduz em /var/www/var/run/apache2.pid. Portanto, criamos esse diretório agora:

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

Agora devemos informar ao Apache que queremos usar /var/www como nosso diretório chroot. Abrimos /etc/apache2/apache2.conf e logo abaixo da linha PidFile, adicionamos uma linha ChrootDir:

nano /etc/apache2/apache2.conf
[...]  
#  
# PidFile: O arquivo no qual o servidor deve registrar seu número  
# de identificação do processo quando inicia.  
# Isso precisa ser definido em /etc/apache2/envvars  
#  
PidFile ${APACHE_PID_FILE}  
ChrootDir /var/www  
[...]  

Em seguida, devemos informar nossos vhosts que a raiz do documento mudou (por exemplo, um DocumentRoot /var/www se traduz agora em DocumentRoot /). Podemos fazer isso alterando a diretiva DocumentRoot de cada vhost, ou mais facilmente, criando um symlink no sistema de arquivos.


2.1 Primeiro Método: Alterando o DocumentRoot

Vamos supor que temos um vhost com DocumentRoot /var/www. Agora devemos abrir a configuração do vhost desse vhost e mudar DocumentRoot /var/www para DocumentRoot /. Consequentemente, DocumentRoot /var/www/web1/web agora se traduz em DocumentRoot /web1/web, e assim por diante. Se você quiser usar este método, deve alterar o DocumentRoot para cada vhost individualmente.

2.2 Segundo Método: Criando Um Symlink No Sistema de Arquivos

Este método é mais fácil, porque você só precisa fazê-lo uma vez e não precisa modificar nenhuma configuração de vhost. Criamos um symlink apontando de /var/www/var/www para /var/www:

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

Finalmente, precisamos parar o Apache, criar um symlink de /var/run/apache2.pid para /var/www/var/run/apache2.pid e iniciá-lo novamente:

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

É isso. Agora você pode acessar suas páginas web como antes, e elas devem ser servidas sem problemas, desde que sejam arquivos HTML estáticos ou usando mod_php.

Vou testar isso agora com uma página phpinfo(). Abra um novo arquivo info.php com nano na raiz do documento do site padrão:

nano /var/www/html/info.php

e adicione o seguinte conteúdo:

Salve o arquivo e abra o nome do host do seu servidor ou endereço IP no navegador, seguido de /info.php. Exemplo:

http://192.168.1.100/info.php

A seguinte página deve aparecer agora quando o PHP estiver funcionando corretamente:

Página de informações do PHP.

Até agora tudo bem, mas como sabemos se o Apache está realmente chrooted? Vamos tentar acessar um arquivo que está fora do chroot, eu usarei /etc/hosts aqui como exemplo.

nano /var/www/html/testchroot.php

com este conteúdo:

' . $var;

e abra a URL para o arquivo de teste em um navegador. O resultado é:

Teste Chroot

Como você pode ver, o conteúdo do arquivo /etc/hosts não pode ser acessado a partir deste script PHP.

Exclua os arquivos de teste se você não precisar mais deles:

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

Se você estiver usando CGI, por exemplo, Perl, Ruby, etc., então você deve copiar o interpretador (por exemplo, /usr/bin/perl, etc.) para a prisão chroot junto com todas as bibliotecas necessárias pelo interpretador. Você pode descobrir sobre as bibliotecas necessárias com o comando ldd, por exemplo:

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#

ou use as ferramentas jailkit para construir o ambiente da prisão. Se você copiou todos os arquivos necessários, mas a página ainda não está funcionando, você deve dar uma olhada no log de erro do Apache /var/log/apache2/error.log. Normalmente, ele informa onde está o problema.

3 Links

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.