Encapsulamento de Apache com chroot

Desde abril de 1996 o servidor Web Apache é o servidor web mais conhecido no mundo.

O Apache HTTP Server ("httpd ou apache2") é um projeto da Apache Software Foundation, que pode ser encontrado na URL http://httpd.apache.org/, e utilizado livremente.

E o chroot é um módulo para o apache, que possibilita a execução do apache em um ambiente encapsulado e seguro.

O módulo chroot está incluído nos repositórios das distribuições FreeBSD, DarwinPorts, PLD Linux, Gentoo Linux, Debian e NetBSD. Nas outras distribuições os fontes podem ser baixados em: http://core.segfault.pl/~hobbit/mod_chroot/dist, e a mais recente no momento da criação deste artigo foi http://core.segfault.pl/~hobbit/mod_chroot/dist/mod_chroot-0.5.tar.gz.

Criando o volume, com 100M:
mkdir -vp /mnt/vm /httpdjail;
dd if=/dev/zero of=/mnt/vm/httpdjail.img bs=1k seek=100k count=1;
mke2fs /mnt/vm/httpdjail.img;
mount -o loop,noexec,nodev,nosuid -t ext4 /mnt/vm/httpdjail.img /httpdjail;


Criando os diretórios necessários:
mkdir -vp /httpdjail/var/www/html /httpdjail/{tmp,home} /httpdjail/var/{run,www,log} /httpdjail/var/run/{apache2,httpd}; ou
mkdir -vp /httpdjail/var/{run,www};
chown -R root.root /httpdjail/var/run;
chmod 1777 /httpdjail/tmp;


Editando /etc/fstab
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
/mnt/vm/httpdjail.img /httpdjail ext4 loop,nodev,noexec,nosuid 0 0



Instalando o modulo chroot no Apache através dos fontes no Debian-Like:
aptitude install apache2-mpm-prefork apache2-threaded-dev;
wget http://core.segfault.pl/~hobbit/mod_chroot/dist/mod_chroot-0.5.tar.gz
tar -zxvf mod_chroot-0.5.tar.gz -C /tmp
apxs2 -cia /tmp/mod_chroot-0.5/mod_chroot.c


Instalação repositório Debian:
http://www.howtoforge.com/chrooting-apache2-mod-chroot-debian-etch
Instalação repositório Ubuntu:
https://wiki.ubuntu.com/ModChroot


Instalando o modulo chroot no Apache através dos fontes no RedHat-Like:
#yum install httpd-devel;
#wget http://core.segfault.pl/~hobbit/mod_chroot/dist/mod_chroot-0.5.tar.gz
#tar -zxvf mod_chroot-0.5.tar.gz -C /tmp
#apxs -cia /tmp/mod_chroot-0.5/mod_chroot.c


Configurando apache + mod_chroot:

Crie os diretórios conf.d e vhosts, no diretório do Apache, que dependendo da instalação é /etc/httpd ou /etc/apache2.
# mkdir -pv [APACHE_DIR]/{conf.d,vhosts};


Crie os arquivos de configuração para o mod_chroot:

para ambos (Debian-like e RedHat-like) em '/etc/apache2/conf.d/' ou '/etc/httpd/conf.d/'
#./conf.d/vhosts.conf
#
# Load config files from the config directory to virtual hosts.
#
Include vhosts/*.conf


para RedHat-like em '/etc/httpd/conf.d/':
#./conf.d/httpdjail.conf
LoadModule chroot_module modules/mod_chroot.so
LockFile /var/run/httpd.lock
CoreDumpDirectory /var/run
ScoreBoardFile /var/run/httpd.scoreboard
PidFile /var/run/httpd.pid
ChrootDir /httpdjail


para Debian-like em '/etc/apache2/conf.d/'
#./conf.d/httpdjail.conf
LoadModule chroot_module modules/mod_chroot.so
LockFile /var/run/apache2.lock
CoreDumpDirectory /var/run
ScoreBoardFile /var/run/apache2.scoreboard
PidFile /var/run/apache2.pid
ChrootDir /httpdjail


A partir deste ponto o Apache já funcionará dentro do envolucro protegido. Entretanto completamente isolado do sistema operacional hospedeiro. Para ter algumas funcionalidades habilitadas faz-se necessário copiar os arquivos necessário para a jaula de encapsulamento.

Segue alguns dos arquivos necessários:
idiomas:
cp -vap --parents /usr/lib/locale/{en,es,pt}* /httpdjail;
cp -vap --parents /usr/share/locale/{en,es,pt}* /httpdjail;
cp -vap --parents /etc/{mime.types,passwd} /httpdjail;


Arquivos compartilhados:
cp -vap --parents /usr/share/apache2/ /httpdjail/


Configuração final:
debian-like:
ln -vs /httpdjail/var/run/apache2.pid /var/run/apache2.pid;
cp -vap --parents /etc/apache2 /httpdjail;
mv /etc/apache2 /etc/apache2.orig
ln -vs /httpdjail/etc/apache2 /etc/apache2;
ln -vs /usr/lib/apache2/modules/ /httpdjail/etc/apache2
cd /httpdjail && ln -s . httpdjail;

redhat-like:
ln -vs /httpdjail/var/run/httpd.pid /var/run/httpd.pid;
cp -vap --parents /etc/httpd /httpdjail;
mv /etc/httpd /etc/httpd.orig
ln -fvs /var/log/httpd logs /httpdjail/etc/httpd/logs
ln -fvs /usr/lib64/httpd/modules /httpdjail/etc/httpd/modules
cd /httpdjail && ln -s . httpdjail;

e está somente para RedHat-like, no arquivo /etc/init.d/httpd, faça uma cópia de segurança:
cp -ap /etc/init.d/httpd /etc/init.d/httpd.original


No inicio do arquivo '/etc/init.d/httpd' insira:

if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi

ROOT=/httpdjail


# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}


E acrescente o link para o pid, na function stop

stop() {
[ ! -e /var/run/httpd.pid ] && /bin/ln -s $ROOT/var/run/httpd.pid /var/run/httpd.pid
echo -n $"Stopping $prog: "


E também, na function reload
reload() {
[ ! -e /var/run/httpd.pid ] && /bin/ln -s $ROOT/var/run/httpd.pid /var/run/httpd.pid
echo -n $"Reloading $prog: "


Versão PDF
;)

Referências:
http://core.segfault.pl/~hobbit/mod_chroot
http://httpd.apache.org
http://www.debian.org
https://wiki.ubuntu.com/ModChroot
http://www.howtoforge.com/chrooting-apache2-mod-chroot-debian-etch
http://www.debian.org/doc/manuals/securing-debian-howto/ap-chroot-apache-env.en.html
http://core.segfault.pl/~hobbit/mod_chroot/
http://www.cyberciti.biz/tips/chroot-apache-under-rhel-fedora-centos-linux.html

Comentários