sábado, 14 de diciembre de 2013

El rincón de HighSec: Seguridad de servidores – Parte II – APACHE, Jaula

Compartir este artículo:
En el artículo anterior realicé un enjaulado con NGiNX, en éste lo voy a realizar con APACHE. APACHE es un servidor web HTTP de código abierto, para plataformas Unix (BSD, GNU/Linux, etc.), Microsoft Windows, Macintosh y otras.

La primera versión del servidor web Apache fue desarrollada por Robert McCool. Él estaba desarrollando el servidor web NCSA HTTPd (National Center for Supercomputing Applications). Cuando dejó la NCSA, en 1994, el desarrollo de httpd se detuvo. Robert McCool buscó otros desarrolladores para que lo ayudaran. Formaron el Apache Group y empezó el desarrollo de Apache, basándose inicialmente en el código de HTTPd en 1995. Algunos miembros del grupo original fueron Brian Behlendorf, Roy T. Fielding, Rob Hartill, David Robinson, Cliff Skolnick, Randy Terbush, Robert S. Thau, Andrew Wilson, Eric Hagberg, Frank Peters y Nicolas Pioch.

Para modularizar este software, el código fue reescrito en la versión 2. Además incorpora una capa de portabilidad, el Apache Portable Runtime. Realizada la introducción a qué es Apache, vamos a instalarlo y enjaularlo, tal cómo hicimos con NGiNX. Antes de nada, instalemos el paquete:
pacman ­S apache
Jaula en Archlinux
############################################################
# Inicializamos variables
############################################################
jail="/srv/apache"
dirapache=$(pacman ­Ql apache | grep ­v ­e '[[:alnum:]]$' |sed ­r 's/(apache )(.*)/\2/')
arcapache=$(pacman ­Ql apache | grep ­e '[[:alnum:]]$' | sed ­r 's/(apache )(.*)/\2/')
############################################################
# Creamos la esctructura de directorios de apache:
############################################################
for i in $dirapache; do
mkdir ­p $jail$i
done
mkdir $jail/dev
mkdir ­p $jail/srv/http
mkdir ­p $jail/usr/lib
mkdir $jail/tmp
mkdir $jail/run
cd /$jail
ln ­s usr/lib lib
ln ­s usr/bin bin
[[ `uname ­m` == "x86_64" ]] && {
  ln ­s usr/lib lib64
  cd usr
  ln ­s lib lib64
}
############################################################
# Copiamos los ficheros:
############################################################
for i in $arcapache; do
  cp ­Ld $i $jail$i
done
cp /usr/bin/sh $jail/usr/bin
############################################################
# Creamos los dispositivos
############################################################
mknod ­m 0666 $jail/dev/null c 1 3
mknod ­m 0666 $jail/dev/random c 1 8
mknod ­m 0444 $jail/dev/urandom c 1 9
touch $jail/etc/shells
############################################################
# Copiamos la bilbiotecas
############################################################
cp $(ldd /usr/bin/httpd |grep /usr/lib|sed ­r 's/(.+) (\/.*) (.*)/\2/') $jail/usr/lib
cp /lib/ld­linux­x86­64.so.2 $jail/lib
cp /usr/lib/libnss_* $jail/usr/lib
cp ­rfvL
/etc/{services,localtime,nsswitch.conf,nscd.conf,protocols,hosts,ld.so.cache,ld.so.conf,resolv.conf,host.conf}
$jail/etc
cp $(ldd /usr/bin/sh |grep /usr/lib | sed ­r 's/(.+) (\/.*) (.*)/\2/') $jail/usr/lib
cp $(ldd /usr/bin/ab |grep /usr/lib | sed ­r 's/(.+) (\/.*) (.*)/\2/') $jail/usr/lib
#########################################
#Creamos los usuarios
#########################################
echo ­e "http:x:33: \nnobody:x:99:" > $jail/etc/group
echo ­e "http:x:33:33:http:/:/bin/false \nnobody:x:99:99:nobody:/:/bin/false" > $jail/etc/passwd
echo ­e "http:::\nnobody:::" > $jail/etc/gshadow
############################################################
#Para poder utilizar puertos hasta el 1024 dentro del chroot
############################################################
setcap 'cap_net_bind_service=+ep' "$jail"/usr/bin/httpd
############################################################

#Establecemos permisos y montamos los dispositivos
############################################################
chmod ugo+rw $jail/tmp
chmod ugo+r $jail/run
mount ­t tmpfs none $jail/run ­o 'noexec,size=1M'
mount ­t tmpfs none $jail/tmp ­o 'noexec,size=100M'
chown ­R http:log $jail/var/log
mkdir $jail/run/httpd
chown http:http $jail/run/httpd
############################################################
# Copiamos las bibliotecas necesarias para los módulos
############################################################
dirlib=$(pacman ­Ql libldap | grep ­v ­e '[[:alnum:]]$' |sed ­r 's/(libldap )(.*)/\2/')
fichlib=$(pacman ­Ql libldap | grep ­e '[[:alnum:]]$' | sed ­r 's/(libldap )(.*)/\2/')
for i in $dirlib; do
  mkdir ­p $jail$i
done
for i in $fichlib; do
  cp ­Ld $i $jail$i
done
cp /usr/lib/libresolv.so.2 $jail/usr/lib/
cp /usr/lib/libsasl2.so.3 $jail/usr/lib
Ahora debemos crear la unidad de servicio, para que podamos levantar Apache con Systemd. Para
ello, creamos el archivo /usr/local/lib/systemd/system/http­jail.service
[Unit]
Description=Apache Web Server
After=network.target remote­fs.target nss­lookup.target
[Service]
Type=forking
PIDFile=/srv/apache/run/httpd/httpd.pid
ExecStart=/usr/bin/chroot ­­userspec=http:http /srv/apache /usr/bin/apachectl start
ExecStop=/usr/bin/chroot ­­userspec=http:http /srv/apache /usr/bin/apachectl graceful­stop
ExecReload=/usr/bin/chroot ­­userspec=http:http /srv/apache /usr/bin/apachectl graceful
PrivateTmp=true
LimitNOFILE=infinity
[Install]
WantedBy=multi­user.target

Para levantar Apache, ejecutamos:

systemctl start httpd­jail

Si queremos habilitarlo en el inicio del sistema:

systemctl enable httpd­jail

En los siguientes posts,  iremos viendo más sobre servers.

Espero que os haya gustado, happy hacking!!





Mª José Montes – mjose@highsec.es – @MMontesDiaz

No hay comentarios:

Publicar un comentario en la entrada

Related Posts Plugin for WordPress, Blogger...