|
|||||||
| Wiki | Classificados | Galeria | Reviews | Jogos | Comunidades | RSS Feeds | FAQ | Termos de Uso | Sobre |
| Cadastre-se | Fotos | Blogs | Lista de Membros | Calendário | Pesquisar | Mensagens de Hoje | Marcar Fóruns Como Lidos |
FerramentasPublicidade |
From UnderLinux WikiApache 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:
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 |