[ anterior ] [ Conteúdo ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ] [ H ] [ próximo ]
chroot para Apache
O utilitário chroot é muitas vezes usado para enjaular um daemon
dentro de uma estrutura restrita. Voce pode usá-lo para isolar um serviço do
outro, desta forma um problema de segurança em um pacote de software específico
não interfere em todo o servidor. A utilização do script makejail
torna a configuração e atualização da árvore enjaulada muito mais fácil.
FIXME: Apache também pode ser enjaulado usando http://www.modsecurity.org que
está disponível em libapache-mod-security (para Apache 1.x) e
libapache2-mod-security (para Apache 2.x).
This document is copyright 2002 Alexandre Ratti. It has been dual-licensed and
released under the GPL version 2 (GNU Public License) the GNU-FDL 1.2 (GNU Free
Documentation Licence) and is included in this manual with his explicit
permission. (from the original
document)
Este procedimento foi testado no Debian GNU/Linux 3.0 (Woody) com
makejail 0.0.4-1 (em Debian/testing).
Efetue o login como root e crie um novo diretório para jaula:
$ mkdir -p /var/chroot/apache
Crie um novo usuário e novo grupo. O servidor Apache enjaulado irá executar
com este usuário/grupo, que não é utilizado para mais nada no sistema. Neste
exemplo, ambos usuário e grupo são chamados de chrapach.
$ adduser --home /var/chroot/apache --shell /bin/false \
--no-create-home --system --group chrapach
FIXME: é preciso um novo usuário? (Apache já executa como usuário apache)
Instale o Apache normalmente no Debian: apt-get install apache
Configure o Apache (por exemplo defina seus subdomínios e etc.). No arquivo de
configuração /etc/apache/httpd.conf, altere as opções
Group e User para chrapach. Reinicie o Apache e
tenha certeza que o servidor está funcionando corretamente. Agora, pare o
daemon do Apache.
Instale o makejail (disponível agora no Debian/testing). Você
também deve instalar wget e lynx, pois eles serão
usados pelo makejail para testar o servidor enjaulado:
apt-get install makejail wget lynx
Copie o arquivo de configuração de exemplo para o Apache para o diretório
/etc/makejail:
# cp /usr/share/doc/makejail/examples/apache.py /etc/makejail/
Edite o arquivo /etc/makejail/apache.py. Você precisa alterar as
opções chroot, users e groups. Para executar esta
versão do makejail, você também pode adicionar a opção
packages. Veja a documentação do
makejail. Veja o exemplo mostrado abaixo:
chroot="/var/chroot/apache"
testCommandsInsideJail=["/usr/sbin/apachectl start"]
processNames=["apache"]
testCommandsOutsideJail=["wget -r --spider http://localhost/",
"lynx --source https://localhost/"]
preserve=["/var/www",
"/var/log/apache",
"/dev/log"]
users=["chrapach"]
groups=["chrapach"]
packages=["apache", "apache-common"]
userFiles=["/etc/password",
"/etc/shadow"]
groupFiles=["/etc/group",
"/etc/gshadow"]
forceCopy=["/etc/hosts",
"/etc/mime.types"]
FIXME: algumas opções parecem não funcionar corretamente. Por
exemplo, /etc/shadow e /etc/gshadow não são copiados,
visto que /etc/password e /etc/group são copiados em
vez de serem filtrados.
Crie a árvore da jaula: makejail /etc/makejail/apache.py
Se /etc/password e /etc/group forem copiados
completamente, digite:
$ grep chrapach /etc/passwd > /var/chroot/apache/etc/passwd
$ grep chrapach /etc/group > /var/chroot/apache/etc/group
para substituí-los com as cópias filtradas.
Copie as páginas e os logs do site Web dentro da jaula. Estes arquivos não são
copiados automaticamente (veja a opção preserve no arquivo de
configuração do makejail).
# cp -Rp /var/www /var/chroot/apache/var
# cp -Rp /var/log/apache/*.log /var/chroot/apache/var/log/apache
Edite o script de inicialização para que o daemon de logging do sistema também
ouça do socket /var/chroot/apache/dev/log. No arquivo
/etc/init.d/sysklogd, substitua: SYSLOGD=""
com SYSLOGD=" -a /var/chroot/apache/dev/log" e reinicie
o daemon (/etc/init.d/sysklogd restart).
Edite o script de inicialização do Apache (/etc/init.d/apache).
Você pode precisar fazer algumas alterações no script de inicialização padrão
para que ele funcione apropriadamente com a árvore enjaulada. Como:
configure uma nova variável CHRDIR no início do arquivo;
edite as seções start, stop, reload, etc.;
adicione uma linha para montar e desmontar o sistema de arquivo
/proc que está dentro da jaula.
#! /bin/bash
#
# apache Start the apache HTTP server.
#
CHRDIR=/var/chroot/apache
NAME=apache
PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/sbin/apache
SUEXEC=/usr/lib/apache/suexec
PIDFILE=/var/run/$NAME.pid
CONF=/etc/apache/httpd.conf
APACHECTL=/usr/sbin/apachectl
trap "" 1
export LANG=C
export PATH
test -f $DAEMON || exit 0
test -f $APACHECTL || exit 0
# ensure we don't leak environment vars into apachectl
APACHECTL="env -i LANG=${LANG} PATH=${PATH} chroot $CHRDIR $APACHECTL"
if egrep -q -i "^[[:space:]]*ServerType[[:space:]]+inet" $CONF
then
exit 0
fi
case "$1" in
start)
echo -n "Starting web server: $NAME"
mount -t proc proc /var/chroot/apache/proc
start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON \
--chroot $CHRDIR
;;
stop)
echo -n "Stopping web server: $NAME"
start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" --oknodo
umount /var/chroot/apache/proc
;;
reload)
echo -n "Reloading $NAME configuration"
start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" \
--signal USR1 --startas $DAEMON --chroot $CHRDIR
;;
reload-modules)
echo -n "Reloading $NAME modules"
start-stop-daemon --stop --pidfile "$CHRDIR/$PIDFILE" --oknodo \
--retry 30
start-stop-daemon --start --pidfile $PIDFILE \
--exec $DAEMON --chroot $CHRDIR
;;
restart)
$0 reload-modules
exit $?
;;
force-reload)
$0 reload-modules
exit $?
;;
*)
echo "Usage: /etc/init.d/$NAME {start|stop|reload|reload-modules|force-reload|restart}"
exit 1
;;
esac
if [ $? == 0 ]; then
echo .
exit 0
else
echo failed
exit 1
fi
FIXME: should the first Apache process be run as another user than root (i.e. add --chuid chrapach:chrapach)? Cons: chrapach will need write access to the logs, which is awkward.
Substitua no /etc/logrotate.d/apache o
/var/log/apache/*.log com
/var/chroot/apache/var/log/apache/*.log
Inicialize o Apache (/etc/init.d/apache start) e verifique o que
está sendo reportado no log da jaula
(/var/chroot/apache/var/log/apache/error.log). Se a sua
configuração for mais complexa (exemplo: se também utiliza PHP e MySQL), alguns
arquivos provavelmente estarão faltando. Se estes arquivos não são copiados
automaticamente pelo makejail, você pode listá-los com a opção
forceCopy (para copiar os arquivos diretamente) ou packages
(para copiar pacotes completos e suas dependências) no arquivo de configuração
/etc/makejail/apache.py.
Digite ps aux | grep apache para ter certeza que o Apache está rodando. Você deve ver algo do tipo:
root 180 0.0 1.1 2936 1436 ? S 04:03 0:00 /usr/sbin/apache
chrapach 189 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
chrapach 190 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
chrapach 191 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
chrapach 192 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
chrapach 193 0.0 1.1 2960 1456 ? S 04:03 0:00 /usr/sbin/apache
Certifique-se que os processos do Apache estão sendo executados na jaula chroot
procurando no sistema de arquivo /proc: ls -la
/proc/process_number/root/. onde process_number é um
dos PID listados acima (por exemplo: segunda coluna; PID 189). As entradas
para a árvore restrita devem ser listadas:
drwxr-sr-x 10 root staff 240 Dec 2 16:06 .
drwxrwsr-x 4 root staff 72 Dec 2 08:07 ..
drwxr-xr-x 2 root root 144 Dec 2 16:05 bin
drwxr-xr-x 2 root root 120 Dec 3 04:03 dev
drwxr-xr-x 5 root root 408 Dec 3 04:03 etc
drwxr-xr-x 2 root root 800 Dec 2 16:06 lib
dr-xr-xr-x 43 root root 0 Dec 3 05:03 proc
drwxr-xr-x 2 root root 48 Dec 2 16:06 sbin
drwxr-xr-x 6 root root 144 Dec 2 16:04 usr
drwxr-xr-x 7 root root 168 Dec 2 16:06 var
Para automatizar este teste, você pode digitar:ls -la /proc/`cat /var/chroot/apache/var/run/apache.pid`/root/.
FIXME: Add other tests that can be run to make sure the jail is closed?
A razão pela qual eu gosto disso é que a configuração da jaula não é tão complicada e o servidor pode ser atualizado em somente duas linhas:
apt-get update && apt-get install apache
makejail /etc/makejail/apache.py
Se você está procurando por mais informações você pode considerar as referências que foram utilizadas para fazer este tutorial:
makejail homepage ,
this program was written by Alain Tesio)
Chrooting
daemons and system processes HOWTO by Jonathan, Network Dweebs,
21/10/2002
[ anterior ] [ Conteúdo ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ] [ H ] [ próximo ]
Securing Debian Manual
v3.1,mailto:jfs@debian.org