Servidor proxy inverso: componente central de la seguridad
El funcionamiento seguro de los servidores web o exchange sitúa a los administradores de redes ante un problema: los servicios online como el acceso a Internet o al correo electrónico tienen lugar a través de las redes públicas. La conexión directa con Internet hace que los sistemas sean propensos a la intrusión de malware y a robos manuales, aunque a menudo hace de intermediario un componente de red que recibe el nombre de servidor proxy inverso.
¿Qué es un servidor proxy inverso?
En términos generales, un servidor proxy es una interfaz de comunicación en una red que se hace cargo de las peticiones y las transmite en calidad de representante a un ordenador de destino. En las redes corporativas se recurre a esta estructura para que los dispositivos cliente tengan un acceso controlado a Internet. El servidor configurado como proxy se presenta, en este caso, como la única posibilidad de conexión con la red pública. Se puede hablar, así, de un proxy de reenvío (forward proxy).
Un servidor de reenvío canaliza todas las solicitudes procedentes de la red interna y las transmite al servidor de destino en Internet con su propia dirección remitente. Las respuestas del servidor suelen llegar al proxy antes de que se repartan por los diferentes dispositivos cliente, que permanecen en el anonimato -a no ser que se trate de un proxy transparente. Para ahorrar ancho de banda y hacer que aumente la velocidad con la que se puede acceder a las páginas web, los servidores proxy se suelen programar de manera que sean capaces de almacenar el contenido más solicitado en el caché para que esté disponible directamente sin necesidad de tener que volver a preguntar al servidor.
Mientras que un proxy de reenvío protege los dispositivos cliente en una red de las influencias procedentes de Internet, un proxy inverso, por el contrario, trabaja de modo que los proteja en sentido opuesto. Uno o varios servidores web activan un servidor proxy de tales características como componente de seguridad adicional para que pueda hacerse cargo de las solicitudes procedentes de Internet y las transmita a un servidor backend en segundo plano.
Como interfaz de comunicación antepuesta a la red, un proxy inverso puede asumir diversas funciones para lograr la seguridad del servidor backend y para optimizar el tráfico de datos.
Reverse proxy: función y ámbitos de aplicación
Los proxy inversos suelen estar instalados en una red privada o una zona desmilitarizada (DMZ) y estar protegidos por un firewall. De esta manera, el servidor proxy inverso, al igual que el servidor forward o de reenvío, representa la única conexión entre Internet y la red privada. Todas las peticiones que tienen lugar en el servidor backend en la red de área local recorren la misma interfaz de comunicación antes de transmitirse a los sistemas de destino correspondientes. Una combinación así hace posible controlar el tráfico de datos entrante, poner a disposición varios servidores bajo el mismo URL, distribuir solicitudes de manera simultánea por diferentes servidores y hacer que el almacenamiento en caché permita aumentar la cantidad de datos a la que se puede acceder.
Estos son los ámbitos de aplicación de un proxy inverso:
- Anonimización: puesto que el reverse proxy es el único acceso a la red interna, este intercepta en segundo plano la totalidad de las peticiones que se hacen al servidor y opera los programas cliente como si tuvieran algún tipo de relación con el verdadero sistema de destino. Para ello, el proxy transmite las peticiones a los sistemas de destino correspondientes, se ocupa de sus respuestas y las envía a los clientes que han realizado dichas peticiones. Los servidores backend reales permanecen en el anonimato.
- Protección y cifrado: un servidor proxy inverso ofrece la posibilidad de instalar sistemas de control como antivirus o filtros de paquetes que puedan proteger al servidor en segundo plano. Por lo tanto, el servidor proxy constituye un eslabón más en la cadena de seguridad entre Internet y la red privada. Asimismo, los servidores proxys inversos pueden utilizarse para llevar a cabo el cifrado y el traslado de los certificados SSL al proxy permite eliminar la carga del servidor web.
- Balanceo de carga: un servidor proxy inverso permite establecer la conexión de un URL con diversos servidores en una red privada, lo que ofrece la posibilidad de repartir las solicitudes entrantes por varios servidores. Esto, que es conocido como balanceo de carga evita la sobrecarga de los sistemas y permite establecer un equilibrio en caso de que se produzcan fallos. Si un servidor no está disponible debido a errores en el hardware o en el software, el módulo balanceador de carga del proxy redistribuye las peticiones entrantes por el resto de servidores. La disponibilidad de los servicios del servidor también estará protegida en caso de fallos.
- Caché: para aumentar la velocidad de los servicios del servidor, el reverse proxy ofrece una función con la que se pueden guardar las respuestas del servidor de manera temporal. Este caché hace que el servidor proxy sea capaz de responder por sí mismo de manera parcial o total a las peticiones recurrentes. En ello, los contenidos estáticos como las imágenes o las páginas web dinámicas más visitadas se alojarán de manera temporal en el caché. Así se puede conseguir que no se recurra a los datos del servidor backend o, si se hace, lo mínimo, por lo que se reduce la carga de los servicios web considerablemente. Debido a que en lo relativo a los contenidos que cambian con rapidez no siempre se puede asegurar que el caché del proxy contenga la versión actual, existe el riesgo de que los clientes que realizan las peticiones reciban datos que no sean actuales.
Configurar Apache como proxy inverso
Apache HTTP se puede utilizar para configurar un reverse proxy. Apache, el servidor más popular a nivel mundial, está compuesto por diversos módulos de ampliación para desarrollar diferentes funciones de proxy y puede configurarse con tan solo unas pocas líneas de código. Los siguientes apartados ponen de relieve cómo se lleva a cabo la instalación de Apache en Ubuntu para usar los módulos necesarios y cómo se puede crear un archivo de configuración para el reenvío. El servidor open source está disponible en la página web de la Apache Software Fundation de manera gratuita y en nuestra guía encuentras un manual para crear servidores web.
1. Instalación de los módulos de Apache como servidor proxy
Para poder utilizar un servidor Apache HTTP como servidor proxy inverso se necesita el módulo mod_proxy, que implementa la funcionalidad básica y que puede ampliarse con módulos adicionales:
- mod_proxy_http contiene todas las funciones del servidor proxy para solicitudes HTTP y HTTPS. Este módulo adicional soporta las versiones del protocolo, tales como HTTP/0.9, HTTP/1.0 y HTTP/1.1.
- mod_proxy_ftp es necesario para que las funciones del servidor proxy estén disponibles para las solicitudes FTP.
- mod_proxy_connect pone funciones del servidor proxy a disposición de un túnel SSL.
- mod_proxy_ajp implementa el Apache JServ Protocol (AJP). Este se usa en el marco del balanceo de carga para transmitir las solicitudes al servidor de aplicación.
- mod_cache, mod_disk_cache y mod_mem_cache implementan las funciones del caché, que permiten guardar los contenidos en el servidor Apache temporalmente.
- mod_proxy_html hace posible la reescritura de enlaces HTML.
- mod_headers hace posible la manipulación de datos de cabecera HTTP.
- mod_deflate implementa una función de compresión.
Para instalar el módulo mod_proxy y el resto de módulos adicionales solo se necesitan las siguientes líneas de comando:
sudo apt-get install libapache2-mod-proxy-html
El presente tutorial se centra en las funciones básicas del módulo de Apache mod_proxy. Para obtener una descripción detallada de los módulos adicionales y de todas las directrices requeridas, consulta la documentación oficial del proyecto Apache.
2. Activación de los módulos necesarios
Para activar los módulos individuales de la función proxy de Apache se utiliza el comando a2enmod. Los módulos que ya se han activado pueden desactivarse por medio de a2dismod. Para crear un servidor proxy inverso sencillo para un servidor web posterior es suficiente con cargar los módulos mod_proxy y mod_proxy_http:
sudo a2enmod proxy
sudo a2enmod proxy_http
Tras activar los módulos se tiene que reiniciar el servidor Apache HTTP:
sudo apache2 reload
3. Creación del archivo de configuración
Para que el reverse proxy pueda recibir peticiones procedentes de Internet y transmitirlas al servidor adecuado de la red local es necesario desactivar el archivo de configuración 000-default.conf en el directorio/etc/apache2/sites-enabled y reemplazarlo por medio de un archivo virtual host (de alojamiento virtual), como por ejemplo ejemplo.conf. En este sentido, es recomendable crear un archivo virtual host separado para cada servidor de destino con una IP propia siguiendo el siguiente esquema:
<VirtualHost *:80>
ServerName domain.tld
ServerAlias www.domain.tld
ProxyRequests Off
ProxyPass / http://123.456.7.89/
ProxyPassReverse / http://123.456.7.89/
</VirtualHost>
Las instrucciones para la función proxy se definen, así, dentro de la directiva <VirtualHost>. La etiqueta de apertura contiene, además, la dirección IP y el número de puerto en el que el servidor Apache configurado como servidor inverso puede escuchar las solicitudes. Si en ella se tienen que incluir todas las direcciones IP, se utiliza entonces el símbolo *. Los datos incluidos en las etiquetas VirtualHost se dan también en forma de directivas. Al contrario de lo que ocurre con la etiqueta VirtualHost, estos argumentos definen cómo se tienen que tratar las solicitudes entrantes y los paquetes de respuesta. A este respecto, resultan esenciales las directivas ServerName, ProxyPass y ReversePass.
- ServerName: la directiva ServerName define bajo qué nombres primarios se puede acceder a un servidor en Internet. Estos tienen que poder resolverse o bien vía DNS o por medio de los /etc/hosts. En el ejemplo se le indica al servidor Apache que tiene que hacerse cargo de todas las solicitudes en domain.tld.
- ProxyPass: la directiva ProxyPass define la dirección de destino para los reenvíos. El servidor proxy inverso reenviará todas las peticiones dirigidas a la dirección depositada bajo la etiqueta ServerName a la dirección interna consignada en el argumento de la directiva ProxyPass. En el ejemplo se trataría de la dirección IP ficticia 123.456.7.89.
- ProxyPassReverse: un proxy server no solo se ocupa de las peticiones, sino que también transmite los paquetes de respuesta del servidor backend a los clientes. Para impedir que dichas respuestas se entreguen con datos de encabezado que no sean correctos (es decir, con datos del servidor en un segundo plano), la directiva ProxyPassReverse transcribe el encabezamiento de las respuestas del servidor de tal manera que estas se adapten al servidor proxy. El servidor backend permanece anónimo.
Además, en el ejemplo aparecen dos directivas adicionales: ServerAlias y ProxyRequests. Estas no ofrecen funciones básicas para el servidor proxy y son, por lo tanto, facultativas.
- ServerAlias: la directiva ServerAlias permite, junto al nombre del servidor primario, definir un nombre alternativo para el servidor de destino.
- ProxyRequest: la directiva ProxyRequests con el argumento Off impide que se utilice el servidor Apache HTTP como proxy forward o de reenvío para evitar posibles abusos.
Si se han definido las reglas para la función proxy, se tiene que activar la configuración por medio del terminal:
sudo a2ensite ejemplo.conf
El servidor Apache HTTP es capaz ahora de recibir todas las peticiones realizadas al domain.tld o www.domain.tld y de dirigirlas en forma de solicitudes proxy a un servidor backend con la dirección IP 123.456.7.89.