La mayor comunidad de Debian en español

Apache2 con mod_chroot y soporte PHP5 y mysql.



Introducción.

Este artículo versará sobre como construir un blog en Debian GNU/Linux y derivados, utilizando como base serendipity, y dándole un extra de seguridad mediante el uso de una jaula chroot. Usaremos para ello apache2, mod_chroot, php5 y mysql. Vamos a empezar con lo primero, instalar apache2 y crear la jaula chroot, la cual situará en /var/chroot. Dentro de esta, crearemos un árbol de directorios similar al que tenemos en nuestro Debian. Por supuesto, todas estas acciones hay que ejecutarlas como root.


1. Apache2 y mod_chroot.

Instalamos apache2, el módulo chroot y debootstrap (herramienta para crear jaulas de este tipo):
apt-get install apache2 libapache2-mod-chroot debootstrap

Creamos la jaula chroot:
debootstrap etch /var/chroot http://ftp.fr.debian.org/debian

Copiamos ficheros importantes a la jaula:

cp -a /etc/resolv.conf /var/chroot/etc/
cp -a /etc/hosts /var/chroot/etc/
cp -a /etc/mime.types /var/chroot/etc/
cp -a /usr/share/zoneinfo/Europe/Madrid /var/chroot/usr/share/zoneinfo/Europe/
cp -a /etc/adjtime /var/chroot/etc/

Instalamos apache2 dentro de la jaula:

chroot /var/chroot apt-get update
chroot /var/chroot apt-get install apache2-common apache2-utils

Necesitamos copiar el "pidfile" de apache. Una vez copiado ese "pidfile" habrá que enlazarlo fuera de la jaula. De esta manera nos aseguraremos que esté accesible desde ambos sitios.

mv /var/run/apache2.pid /var/chroot/var/run/apache2.pid
ln -s /var/chroot/var/run/apache2.pid /var/run/apache2.pid

Activamos el módulo chroot:
a2enmod mod_chroot

Indicamos a apache2 que utilice la jaula chroot. Para esta labor, necesitaremos editar el archivo /etc/apache2/httpd.conf y dejarlo así:

PidFile /var/run/apache2.pid
ChrootDir /var/chroot/

Ya tendríamos apache2 enjaulado y funcionando. Quedaría copiar aquello que estuviéramos sirviendo antes de ponernos con chroot:
cp -a /var/www/* /var/chroot/var/www/

Y reiniciar el servicio de apache2:
/etc/init.d/apache2 restart

Pueden comprobar que funciona visitando http://localhost


2. Añadir soporte php5.

Para activar el soporte de php bastará con instalarlo fuera de la jaula (dentro solo hace falta el php5-common).

apt-get install php5 libapache2-mod-php5 php5-gd php5-ps php5-cli php-pear php5-gd
chroot /var/chroot apt-get install php5-common

Reiniciamos apache2 para comprobar que todo ha ido bien hasta este punto.

/etc/init.d/apache2 restart


3. Mysql.

Mysql no va a estar enjaulado por 2 razones. La primera de ellas es por compatibilidad, ya que así garantizamos que las bases de datos puedan ser usadas sin problemas desde fuera de la jaula. La segunda es que mysql no es un servicio tan "inseguro" como puede resultar apache. Primero instalamos mysql (y establecemos la contraseña del administrador), y después lo "engañamos" para que cree su 'socket' y el 'pidfile' tanto fuera como dentro de la jaula.

apt-get install mysql-server-5.0 mysql-client-5.0 php5-mysql

Para establecer la contraseña del administrador tenemos dos maneras en debian. La primera de ellas (la mas sencilla) es reconfigurar el paquete mysql-server-5.0:

dpkg-reconfigure mysql-server-5.0

La segunda es el modo manual.

mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD('pass') WHERE user = 'root';
mysql> FLUSH PRIVILEGES;
mysql> quit;

Importante: hay que parar ahora el servicio de mysql:
/etc/init.d/mysql stop

Movemos la carpeta del pidfile y el socket de mysql y enlazamos

mv /var/run/mysqld /var/chroot/var/run/mysqld
ln -s /var/chroot/var/run/mysqld /var/run/mysqld

Arrancamos el servicio de mysql:
/etc/init.d/mysql start

si todo ha ido bien, ya tenemos un servidor apache2 enjaulado, con soporte para PHP5 y mysql.


4. El blog.

Esta parte dependerá un poco de lo que quieras implementar en tu sitio. En este caso voy a explicar como proceder en la creación de un blog con serendipity (un CMS sencillo, libre y fácil de utilizar), pero puedes utilizar el que mejor se adapte a tus necesidades (joomla, drupal, wordpress, b2evolution, etc.).

Nos bajamos el archivo serendipity*.tar.gz de ( http://www.s9y.org/12.html ), ya que con el paquete deb resulta algo más engorroso puesto que tiene muchas dependencias.

Desempaquetamos el archivo tar.gz en nuestra home, de manera que tengamos algo como /home/usuario/serendipity/, y que dentro de esa carpeta (serendipity), están situados una serie de archivos, entre los cuales exit.php e index.php.

Lo siguiente es copiar esa carpeta a nuestra jaula chroot.
cp -a /home/usuario/serendipity /var/chroot/var/www/

Nos vamos a /var/chroot/var/www/serendipity
cd /var/chroot/var/www/serendipity/

Aquí, tenemos que asegurarnos de que existen las carpetas "archives", "templates_c" y
"uploads". Estas son indispensables, por lo que si falta alguna, la creamos con mkdir. Continuamos
dando los permisos adecuados a estas carpetas.

chmod 1777 uploads archives templates_c
Y al directorio padre, pues serendipity necesitará crear aquí algunos ficheros (NOTA: incluir el punto).
chmod 1777 .

Bueno, pues ya nos queda bien poco. Lo siguiente es hacer que serendipity tenga disponible los archivos binarios de imagemagick para habilitar el manejo de imágenes dentro del blog.

chroot /var/chroot apt-get install imagemagick

Creamos la base de datos de mysql para nuestro blog de serendipity (la llamaremos serendipity también):
mysqladmin -p create serendipity

Y ya lo tenemos todo. Reiniciamos nuevamente apache2:
/etc/init.d/apache2 restart

Concluimos metiéndonos en http://localhost/serendipity para configurar nuestro blog, para lo cual
podremos consultar la documentación existente en la página oficial de serendipity.

NOTA: Quizá necesites instalar alguna librería extra que no he comentado para el correcto funcionamiento de serendipity. En tal caso, el propio serendipity te avisará durante el proceso de configuración del blog.

5. Consejos para asegurar Apache.

Hay muchas formas de mejorar la seguridad de nuestro servidor apache2. Algunos buenos consejos los podeis ver en el siguiente enlace:
http://enespanol.com.ar/2006/06/30/20-formas-de-asegurar-tu-instalacion-...

En nuestro caso, al estar trabajando con entornos chroot, el asegurar la fortaleza de este entorno dependerá de varios factores, de entre los que explico más los más importantes:

1º: Hay que asegurarse de que apache2 no corra como usuario "root" ni como usuario/grupo "nobody" (para ello, basta con ver el archivo /etc/apache2/apache2.conf, y fijarse en las lineas donde dice User y Group, en las que deberá aparecer algo como "www-data"). Aunque parezca una tontería, desmontar una jaula chroot si se tienen los permisos de superusuarios puede resultar bastante sencillo.

2º: Como nuestra jaula solo va a servir de soporte para apache2, no necesitamos los nodos de /dev, por lo que borramos todo el contenido de este directorio:

rm -rf /var/chroot/dev/*

3º: Es muy recomendable eliminar los permisos bit suid de los archivos binarios, ello nos asegurara que aunque entren en nuestra jaula, no conseguiran (al menos facilmente) hacerse con la cuenta de root. Los podremos localizar y quitar dichos permisos bit suid con un:
for SEC in $(echo $(find /var/chroot/ -type f \( -perm -04000 -o -perm -02000 \) -print)); do chmod -s ${SEC}; done

4º: En el caso de /var/chroot/bin/su y /var/chroot/bin/stty, no vamos a necesitar esos binarios para nada, pues cuando nosotros hagamos chroot a nuestra jaula, entraremos directamente como root. Podemos entonces quitarles los permisos de ejecucion

chmod -x /var/chroot/bin/{su,stty}

5º: En Debian Lenny ha entrado un módulo para apache2 llamado "evasive" que nos permitirá frenar gran parte de los ataques DoS que lleguen a nuestro servidor, y que de otro modo, lo podrían dejar fuera de servicio durante un rato. Su instalación es sencilla:
apt-get install libapache2-mod-evasive

Y su configuración no es demasiado complicada.

Lo primero de todo es decirle a apache2 que cargue el módulo cuando él arranque. Bastará con un
echo "LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so" > /etc/apache2/mods-available/evasive.load

A continuación, tenemos que editar su archivo de configuración para definir varias variables:
nano /etc/apache2/mods-available/evasive.conf

Y dejarlo similar a lo siguiente:

<IfModule mod_evasive.c>
DOSHashTableSize 3097 # IPs almacenadas
DOSPageCount 2            # Numero de paginas para que se active
DOSSiteCount 50            # Numero de solicitudes maximas para que se active
DOSPageInterval 1          # Intervalo entre peticiones de paginasen segundos$
DOSSiteInterval 1            # Idem para solicitudes
DOSBlockingPeriod 900   # Tiempo que bloqueara el acceso a nuestra pagina al atacante
# IPs que no se veran afectadas por estas directrices.
DOSWhitelist 127.0.0.1
DOSWhitelist 192.168.1.*
DOSWhitelist 66.249.65.*
DOSWhitelist 66.249.66.*
# Estas dos ultimas son las que utiliza google para indexar.
</IfModule>

La información sobre este módulo proviene de:
http://gnu4all.wordpress.com/2007/08/25/evitando-dos-en-apache2-mod_evas...

6º: Recomiendo también que todos aquellos que vayan a montar servidores con apache2 vigilen bien los logs de apache2 (sobre todo /var/log/apache2/error.log y el /var/log/apache2/access.log). Allí podrán encontrar información acerca de que buscan determinadas IPs en nuestro servidor, y podremos ver si hay alguna IP que esté buscando demasiados archivos inexistentes (lo más común es que busquen el phpmyadmin) para proceder a su bloqueo.

7º: Otra medida interesante (que podría mejorar la estabilidad del sitio) es limitar el ancho de banda que consumirá nuestro servidor apache2. Podemos utilizar para ello el módulo cband de apache2. Aquí explican como utilizarlo:
http://www.apache-es.org/index.php/2006/10/29/control-de-ancho-de-banda-...
http://www.howtoforge.com/mod_cband_apache2_bandwidth_quota_throttling_p...