em Sem categoria

Configurando Apache em ambiente chroot

Este artigo foi extraido do site Underlinux.com.br:

Rodando o Apache em Chroot
Enviado em Domingo, 27 de mar?o 2005 as 11:32:21
Rodar o Apache em Chroot ? uma outra forma de melhorar a seguran?a de sua m?quina. Porque? Imagine que de ultima hora descubram um bug remoto no Apache, e esse bug pode ser explorado e com isso o atacante obtenha acesso privilegiado no sistema (root)! Com toda certeza algum dano ele vai causar na m?quina, mas se ele estiver rodando dentro de uma “jaula” chroot, na pior das hipoteses ele vai conseguir destruir apenas as p?ginas, e nao vai comprometer o servidor inteiro.

Isso ? ?timo n?o ? mesmo? Sim, mas como tudo, tamb?m tem sua desvantagem, configurar o Apache para rodar assim ? bem complicado.
Por isso estou fazendo essa “receita de bolo” para voc?s.

Antes de mais nada existem dois pontos a serem salientados:
1 – N?o vou ensinar a compilar o apache, j? existem milhares de tutoriais para isso, e pode ser que meu m?todo de compila??o n?o agrade a todos 😉
2 – Vou usar como base o meu sistema, ent?o pode ser que no seu caso, ao inv?s dos arquivos estarem em /etc/httpd/ eles estejam em /etc/apache.

Agora vamos por a mao na massa:

Caso seu apache j? n?o tenha usu?rio e grupo pr?prios, crie da seguinte maneira:
# groupadd apache
# useradd -c “Apache Server” -d /dev/null -g apache -s /bin/false apache

Vamos criar a estrutura de diret?rio necess?ria. Se voc? tiver uma parti??o separada para rodar o chroot, melhor ainda.
# mkdir /chroot/httpd
# mkdir /chroot/httpd/dev
# mkdir /chroot/httpd/lib
# mkdir /chroot/httpd/etc
# mkdir /chroot/httpd/usr
# mkdir /chroot/httpd/usr/sbin
# mkdir /chroot/httpd/usr/lib
# mkdir /chroot/httpd/usr/libexec
# mkdir -p /chroot/httpd/var/run
# mkdir /chroot/httpd/var/www/
# mkdir -p /chroot/httpd/var/log/httpd
# mkdir -p /chroot/httpd/home/httpd

Agora vamos acertar as permiss?es:
# chown -R root /chroot/httpd
# chmod -R 0755 /chroot/httpd
# chmod 750 /chroot/httpd/var/log/httpd/
# chmod 750 /chroot/httpd/home/httpd/

Agora alguns devices necess?rios para o Apache:
# mknod /chroot/httpd/dev/null c 1 3
# chown root.sys /chroot/httpd/dev/null
# chmod 666 /chroot/httpd/dev/null

O device null ? necess?rio porque dentro da jaula chroot, o Apache ir? entender o /chroot/httpd como sendo a raiz do sistema /. Ou seja, ele n?o teria acesso ao /dev/null normal do sistema.

Agora vem a parte mais complicada, vamos copiar os arquivos necess?rios
Primeiro pare o apache, como falei anteriormente pode ser que alguns diret?rios na minha m?quina sejam diferente dos da sua, ent?o n?o use CTRL+C CTRL+V, LEIA!
Primeiro copiamos os arquivos de configura??o:
# cp -r /etc/httpd/ /chroot/httpd/etc/

Agora as paginas e os scripts cgi:
# cp -r /var/www/html/ /chroot/httpd/var/www/
# cp -r /var/www/cgi-bin/ /chroot/httpd/var/www/

Agora os bin?rios do Apache e seus scripts
# cp /usr/sbin/httpd /chroot/httpd/usr/sbin/
# cp /usr/sbin/apache* /chroot/httpd/usr/sbin/

Se voc? utiliza o mod_ssl, copie este diret?rio tamb?m:
# cp -a /etc/ssl /chroot/httpd/etc/

Copie os modulos da sua instala??o original:
# cp -r /usr/lib/apache/ /chroot/httpd/usr/lib/
ATEN??O, pode ser que na sua m?quina esses arquivos estejam em /usr/libexec/apache, edite seu httpd.conf e veja onde ficam as libs.

Depois de ter copiado todos os arquivos do apache, precisamos descobrir quais s?o as libs externas que o apache necessita, para isso execute:
# ldd /chroot/httpd/usr/sbin/httpd
No meu caso ele retornou isso:

libssl.so.0.9.7 => /usr/lib/libssl.so.0.9.7 (0xb7fae000)
libcrypto.so.0.9.7 => /usr/lib/libcrypto.so.0.9.7 (0xb7ea7000)
libaprutil-0.so.0 => /usr/lib/libaprutil-0.so.0 (0xb7e93000)
libexpat.so.0 => /usr/lib/libexpat.so.0 (0xb7e74000)
libapr-0.so.0 => /usr/lib/libapr-0.so.0 (0xb7e53000)
librt.so.1 => /lib/librt.so.1 (0xb7e4a000)
libm.so.6 => /lib/libm.so.6 (0xb7e27000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7df8000)
libnsl.so.1 => /lib/libnsl.so.1 (0xb7de3000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7dd1000)
libdl.so.2 => /lib/libdl.so.2 (0xb7dcd000)
libc.so.6 => /lib/libc.so.6 (0xb7cb7000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7fe9000)

Agora temos que copiar todas essas libs que ele retornou do comando ldd:
# cp /usr/lib/libssl* /chroot/httpd/lib/
# cp /usr/lib/libcrypt* /chroot/httpd/lib/
# cp /usr/lib/libapr* /chroot/httpd/lib/
# cp /lib/librt* /chroot/httpd/lib/
# cp /lib/libm* /chroot/httpd/lib/
# cp /lib/libnsl* /chroot/httpd/lib/
# cp /lib/libpthread* /chroot/httpd/lib/
# cp /lib/libdl* /chroot/httpd/lib/
# cp /lib/libc.so.6 /chroot/httpd/lib/
# cp /usr/lib/libexpat* /chroot/httpd/lib/
Tamb?m s?o necess?rias algumas libs para funcionalidades de rede:
# cp /lib/libnss_compat* /chroot/httpd/lib/
# cp /lib/libnss_dns* /chroot/httpd/lib/
# cp /lib/libnss_files* /chroot/httpd/lib/

Para que o Apache execute normalmente, s?o necess?rios varios arquivos do /etc, primeiro vamos mexer nos arquivos de senha e grupo, elas devem conter apenas os valores para o usu?rio apache, por exemplo:
# cp /etc/passwd /chroot/httpd/etc/
# cp /etc/group /chroot/httpd/etc
Edite esses arquivos e remova tudo que n?o for do apache, deve ficar algo parecido com isso:
/chroot/httpd/etc/passwd:
apache:x:1005:105:Apache Server:/dev/null:/bin/false
/chroot/httpd/etc/group:
apache:x:105:
Depois copie os arquivos de rede:
# cp /etc/hosts /chroot/httpd/etc/
# cp /etc/resolv.conf /chroot/httpd/etc/
# cp /etc/nsswitch.conf /chroot/httpd/etc/

Se voc? utiliza sistema de arquivos ext2 ou ext3 voc? aumentar ainda mais a seguran?a com o chattr, se quiser saber mais detalhes sobre o chattr, leia meu outro artigo: Protegendo Arquivos Contra Desastres
# chattr +i /chroot/httpd/etc/hosts
# chattr +i /chroot/httpd/etc/resolv.conf
# chattr +i /chroot/httpd/etc/nsswitch.conf
# chattr +i /chroot/httpd/etc/passwd
# chattr +i /chroot/httpd/etc/group

Para que os arquivos de log sejam gravados com a data correta, voc? precisa do arquivo /etc/localtime.
# cp /etc/localtime /chroot/httpd/etc

Crie os arquivos de log necess?rios:
# touch /chroot/httpd/var/log/httpd/access_log
# touch /chroot/httpd/var/log/httpd/error_log
# chmod 600 /chroot/httpd/var/log/httpd/*

Altera tamb?m o syslog para gravar o que acontece dentro do chroot tb, no meu script de inicializacao do syslog estava assim:
loadproc syslogd $SYSLOGD_OPTIONS
mudei para isso:
loadproc syslogd $SYSLOGD_OPTIONS -a /chroot/httpd/dev/log

E para finalizar, altere o script de inicializa??o do apache para executar dentro do chroot. Dependendo da sua ditro fica em /etc/rc.d/rc.apache ou /etc/rc.d/init.d/apache. Altere o comando para executar o /usr/sbin/chroot /chroot/httpd/ /usr/sbin/apache ou inv?s de /usr/sbin/apachectl.

Testando o servidor
Para testar se todas as libs necess?rias foram copiadas, execute:
/usr/sbin/chroot /chroot/httpd/ /usr/sbin/apachectl -k restart
Se tiver faltando alguma ele vai mostrar, ai basta voc? copiar a lib para dentro do chroot
Para ter certeza que o apache est? rodando dentro do chroot e nao fora pegue o PID do apache com o ps ax | grep apache e execute:
ls -la /proc/PID/root/
Isso deve mostrar a estrutura de diret?rios do chroot:
dev
etc
home
lib
usr
var