Visite também: BR-Linux ·  VivaOLinux ·  LinuxSecurity ·  Dicas-L ·  NoticiasLinux ·  SoftwareLivre.org ·  [mais]

Tutoriais/Apache/apache-chroot

De UnderLinux Wiki

image:Apache_logo.jpg


Apache em Chroot

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:

  • 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 ;)
  • 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

By: Rafael M. Capovilla - 1c3_m4n - under NOSPAM underlinux com br