GNU/Linux >> Tutoriales Linux >  >> Debian

Hacer chroot de Apache 2.4 con mod_unixd en Debian 8 (Jessie)

Esta guía explica cómo configurar mod_unixd con Apache 2.4 en un sistema Debian Jessie. Con mod_unixd, puede ejecutar Apache en un entorno chroot seguro y hacer que su servidor sea menos vulnerable a los intentos de intrusión que intentan explotar las vulnerabilidades en Apache o en sus aplicaciones web instaladas. El módulo mod_unixd es un reemplazo del módulo mod_chroot, que se usaba en el antiguo apache 2.2.

1 nota preliminar

Supongo que tiene un sistema Debian 8 en ejecución con Apache en funcionamiento, p. como se muestra en este tutorial:Tutorial del servidor Debian 8 Jessie LAMP con Apache 2, PHP 5 y MariaDB. Además de eso, supongo que tiene uno o más sitios web configurados dentro del directorio /var/www (por ejemplo, si usa ISPConfig).

El servidor que uso aquí tiene la dirección IP 192.168.1.100 y el nombre de host server1.example.com . Reemplace estos valores con la dirección IP y el nombre de host de su servidor dondequiera que aparezcan en el tutorial.

2 Configuración de Apache

El módulo apache mod_unixd que ofrece la función Chroot en Apache 2.4 es parte de los módulos centrales de Apache y está compilado estáticamente en el binario de Apache en Debian 8, por lo que no tenemos que instalar software adicional para usarlo.

Quiero usar el directorio /var/www como el directorio que contiene la cárcel chroot. Apache de Debian usa el archivo PID /var/run/apache2.pid; cuando Apache se cambia a /var/www, /var/run/apache2.pid se traduce a /var/www/var/run/apache2.pid. Por lo tanto, creamos ese directorio ahora:

mkdir -p /var/www/var/run
chown -R root:root /var/www/var/run

Ahora debemos decirle a Apache que queremos usar /var/www como nuestro directorio chroot. Abrimos /etc/apache2/apache2.conf, y justo debajo de la línea PidFile, agregamos una línea ChrootDir:

nano /etc/apache2/apache2.conf
[...]
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}
ChrootDir /var/www
[...]

A continuación, debemos informar a nuestros hosts virtuales que la raíz del documento ha cambiado (por ejemplo, DocumentRoot /var/www se traduce ahora a DocumentRoot /). Podemos hacer esto cambiando la directiva DocumentRoot de cada host virtual o, más fácilmente, creando un enlace simbólico en el sistema de archivos.

2.1 Primer método:Cambiando la raíz del documento

Supongamos que tenemos un host virtual con DocumentRoot /var/www. Ahora debemos abrir la configuración de vhost de ese vhost y cambiar DocumentRoot /var/www a DocumentRoot /. En consecuencia, DocumentRoot /var/www/web1/web ahora se traduciría a DocumentRoot /web1/web, y así sucesivamente. Si desea utilizar este método, debe cambiar DocumentRoot para cada host virtual.

2.2 Segundo método:creación de un enlace simbólico en el sistema de archivos

Este método es más fácil, porque solo tiene que hacerlo una vez y no tiene que modificar ninguna configuración de vhost. Creamos un enlace simbólico que apunta desde /var/www/var/www a /var/www:

mkdir -p /var/www/var
cd /var/www/var
ln -s ../../ www

Finalmente, debemos detener Apache, crear un enlace simbólico desde /var/run/apache2.pid a /var/www/var/run/apache2.pid, y volver a iniciarlo:

service apache2 stop
ln -s /var/www/var/run/apache2.pid /var/run/apache2.pid
service apache2 start

Eso es todo. Ahora puede llamar a sus páginas web como antes, y deberían servirse sin problemas, siempre que sean archivos HTML estáticos o usen mod_php.

Probaré esto ahora con una página phpinfo(). Abra un nuevo archivo info.php con nano en la raíz del documento del sitio web predeterminado:

nano /var/www/html/info.php

y agregue el siguiente contenido:

<php
phpinfo();

Guarde el archivo y abra el nombre de host de su servidor o la dirección IP en el navegador, seguido de /info.php. Ejemplo:

http://192.168.1.100/info.php

La siguiente página debería aparecer ahora cuando PHP funciona correctamente:

Hasta aquí todo bien, pero ¿cómo sabemos si Apache está realmente chrooteado? Intentemos acceder a un archivo que está fuera del chroot, usaré /etc/hosts aquí, por ejemplo.

nano /var/www/html/testchroot.php

con este contenido:

<?php
$var = file_get_contents('/etc/hosts');
echo 'The content of /etc/hosts is: <br />' . $var;

y abra la URL del archivo de prueba en un navegador. El resultado es:

Como puede ver, ya no se puede acceder al contenido del archivo /etc/hosts desde este script PHP.

Elimine los archivos de prueba si ya no los necesita:

rm /var/www/html/testchroot.php
rm /var/www/html/info.php

Si está utilizando CGI, p. Perl, Ruby, etc., luego debe copiar el intérprete (p. ej., /usr/bin/perl, etc.) en el chroot jail junto con todas las bibliotecas que necesita el intérprete. Puede obtener información sobre las bibliotecas requeridas con el comando ldd, por ejemplo,

ldd /usr/bin/perl
[email protected]:/var/www/html# ldd /usr/bin/perl
linux-vdso.so.1 (0x00007ffe951f4000)
libperl.so.5.20 => /usr/lib/x86_64-linux-gnu/libperl.so.5.20 (0x00007f1dafe54000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1dafc50000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1daf94f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1daf732000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1daf387000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f1daf150000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1db0214000)
[email protected]:/var/www/html#

o use las herramientas de jailkit para construir el entorno de la cárcel. Si ha copiado todos los archivos necesarios, pero la página sigue sin funcionar, debe consultar el registro de errores de Apache /var/log/apache2/error.log . Por lo general, te dice dónde está el problema.

3 Enlaces

  • mod_unixd:https://httpd.apache.org/docs/2.4/mod/mod_unixd.html
  • Apache:http://httpd.apache.org/
  • Debian:http://www.debian.org/

Debian
  1. Acelere Apache con mod_pagespeed y Memcached en Debian 8

  2. Configuración de Master-Master Replication con MySQL en Debian 8 (Jessie)

  3. Cómo instalar WebDAV con Lighttpd en Debian 8 (Jessie)

  4. Configure Apache y Php con mod_fcgid en Ubuntu/Debian

  5. Instale phpMyAdmin en Debian 11 con Apache

Cómo instalar phpMyAdmin con Apache en Debian 11 / Debian 10

Instale phpMyAdmin con Apache (LAMP) en Debian 10 Buster

Cómo instalar LAMP (Apache, MySQL, PHP) en Debian 8 Jessie

Cómo instalar Apache con PHP-FPM en Debian 10

Instale Zabbix en Debian 11 Bullseye con MySQL/MariaDB y Apache

Cómo instalar Apache con Python Mod_wsgi en Debian 10