Apache em chroot + MySQL + PHP + mod_security + mod_evasive + vsftpd + Fail2ban + Debian Squeeze
Aqui abordarei a implementação de um Apache trabalhando em modo chroot, dando suporte a PHP 5, MySQL, Fail2ban, mod_security, mod_evasive e vsftpd.
Preparando o ambiente
Prepare o seu sistema com o seguinte script:
Para que não falte nenhum pacote ou configuração.
Vamos primeiro fazer um update de nossos repositórios e a atualização de todo o sistema:
# aptitude update && aptitude dist-upgrade -y
Agora vamos instalar o Apache, módulo de chroot e o debootstrap para montar a nossa jaula:
# aptitude install apache2 libapache2-mod-chroot debootstrap -y
Montando a nossa jaula:
# debootstrap squeeze /var/chroot http://ftp.br.debian.org/debian
Copiando a configuração do nosso sistema para a jaula:
# cp -a /etc/resolv.conf /var/chroot/etc/
# cp -a /etc/hosts /var/chroot/etc/
# cp -a /etc/mime.types /var/chroot/etc/
# cp -a /usr/share/zoneinfo/America/Sao_Paulo /var/chroot/usr/share/zoneinfo/America
# cp -a /etc/adjtime /var/chroot/etc/
Instalando o Apache dentro da jaula e o locales, pois às vezes temos problemas com idioma, daí já podemos corrigir este problema:
# chroot /var/chroot apt-get update
# chroot /var/chroot aptitude dist-upgrade -y
# chroot /var/chroot apt-get install apache2.2-common apache2-utils locales -y
Acertando o idioma da jaula:
# sed -i 's/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/' /var/chroot/etc/locale.gen
# chroot /var/chroot locale-gen
Ajustando o PID do Apache por causa de nossa jaula:
# mv /var/run/apache2.pid /var/chroot/var/run/apache2.pid
# ln -s /var/chroot/var/run/apache2.pid /var/run/apache2.pid
Configurando o Apache no arquivo /etc/apache2/httpd.conf:
# vim /etc/apache2/httpd.conf
Copiando os sites para a jaula (caso já tenha algum):
# cp -Ra /var/www/* /var/chroot/var/www/
Vamos testar o acesso à nossa jaula, vamos editar o index.html da nossa jaula e colocar um valor diferente do padrão para termos certeza que o Apache está nos mostrando os dados da jaula:
# echo "Teste de chroot no Apache " > /var/chroot/var/www/index.html
Reiniciar o Apache:
# /etc/init.d/apache2 restart
Vamos agora acessar o nosso site:
http://ip_servidor
Vai ter que aparecer a mensagem de teste que colocamos na jaula.
Podemos acompanhar os erros do Apache como exemplo abaixo:
# tail -f /var/log/apache2/error.log
A primeira parte já esta OK, o Apache está trabalhando em modo chroot, agora temos que fazer o PHP 5 e o MySQL trabalharem com ele, e vamos também configurar mais alguns módulos para a segurança de nosso Apache.
Para que não falte nenhum pacote ou configuração.
Vamos primeiro fazer um update de nossos repositórios e a atualização de todo o sistema:
# aptitude update && aptitude dist-upgrade -y
Agora vamos instalar o Apache, módulo de chroot e o debootstrap para montar a nossa jaula:
# aptitude install apache2 libapache2-mod-chroot debootstrap -y
Montando a nossa jaula:
# debootstrap squeeze /var/chroot http://ftp.br.debian.org/debian
Copiando a configuração do nosso sistema para a jaula:
# cp -a /etc/resolv.conf /var/chroot/etc/
# cp -a /etc/hosts /var/chroot/etc/
# cp -a /etc/mime.types /var/chroot/etc/
# cp -a /usr/share/zoneinfo/America/Sao_Paulo /var/chroot/usr/share/zoneinfo/America
# cp -a /etc/adjtime /var/chroot/etc/
Instalando o Apache dentro da jaula e o locales, pois às vezes temos problemas com idioma, daí já podemos corrigir este problema:
# chroot /var/chroot apt-get update
# chroot /var/chroot aptitude dist-upgrade -y
# chroot /var/chroot apt-get install apache2.2-common apache2-utils locales -y
Acertando o idioma da jaula:
# sed -i 's/# pt_BR.UTF-8 UTF-8/pt_BR.UTF-8 UTF-8/' /var/chroot/etc/locale.gen
# chroot /var/chroot locale-gen
Ajustando o PID do Apache por causa de nossa jaula:
# mv /var/run/apache2.pid /var/chroot/var/run/apache2.pid
# ln -s /var/chroot/var/run/apache2.pid /var/run/apache2.pid
Configurando o Apache no arquivo /etc/apache2/httpd.conf:
# vim /etc/apache2/httpd.conf
PidFile /var/run/apache2.pid
ChrootDir /var/chroot/
ChrootDir /var/chroot/
Copiando os sites para a jaula (caso já tenha algum):
# cp -Ra /var/www/* /var/chroot/var/www/
Vamos testar o acesso à nossa jaula, vamos editar o index.html da nossa jaula e colocar um valor diferente do padrão para termos certeza que o Apache está nos mostrando os dados da jaula:
# echo "Teste de chroot no Apache " > /var/chroot/var/www/index.html
Reiniciar o Apache:
# /etc/init.d/apache2 restart
Vamos agora acessar o nosso site:
http://ip_servidor
Vai ter que aparecer a mensagem de teste que colocamos na jaula.
Podemos acompanhar os erros do Apache como exemplo abaixo:
# tail -f /var/log/apache2/error.log
[Fri Jun 24 09:24:23 2011] [notice] Apache/2.2.16 (Debian) configured -- resuming normal operations
[Fri Jun 24 09:35:28 2011] [notice] caught SIGTERM, shutting down
[Fri Jun 24 09:35:29 2011] [notice] Apache/2.2.16 (Debian) configured -- resuming normal operations
[Fri Jun 24 09:39:09 2011] [notice] caught SIGTERM, shutting down
[Fri Jun 24 09:39:10 2011] [notice] Apache/2.2.16 (Debian) configured -- resuming normal operations
A primeira parte já esta OK, o Apache está trabalhando em modo chroot, agora temos que fazer o PHP 5 e o MySQL trabalharem com ele, e vamos também configurar mais alguns módulos para a segurança de nosso Apache.