Cómo proteger Tomcat 10 con Apache o Nginx en Ubuntu 20.04

El autor seleccionó el Fondo de Código Libre y Abierto para recibir una donación como parte del programa Write for DOnations .
Introducción
Apache Tomcat es un servidor web y un contenedor de servlets que se utiliza para ofrecer aplicaciones Java . Es una implementación de código abierto de Jakarta Servlet , Jakarta Server Pages y otras tecnologías de la plataforma Jakarta EE .
Tras la instalación, Tomcat ofrece tráfico sin cifrar de forma predeterminada, incluidas las contraseñas u otros datos confidenciales. Para proteger su instalación de Tomcat, deberá integrar certificados TLS de Let’s Encrypt en todas las conexiones HTTP. Para incorporar TLS, puede configurar un proxy inverso con certificados configurados, que negociará de forma segura con los clientes y enviará las solicitudes a Tomcat.
Si bien las conexiones TLS se pueden configurar en Tomcat, no se recomienda porque Tomcat no tiene las últimas actualizaciones de seguridad y estándar TLS disponibles. En este tutorial, configurará esta conexión con Apache o Nginx . Ambos son muy comunes y están bien probados, mientras que el software que automatiza la provisión de certificados Let’s Encrypt, como certbot
, no brinda soporte para Tomcat. Si desea probar Apache y Nginx, necesitará servidores separados para cada uno.
Prerrequisitos
- Un servidor Ubuntu 20.04 con un usuario sudo no root y un firewall, que puede configurar siguiendo la guía de configuración inicial del servidor Ubuntu 20.04 .
- Tomcat 10 instalado en su servidor, que puede configurar siguiendo Cómo instalar Apache Tomcat 10 en Ubuntu 20.04 .
- Un nombre de dominio registrado. En este tutorial se utilizará
your_domain
como ejemplo. Puede comprar un nombre de dominio en Namecheap , obtener uno gratis en Freenom o utilizar el registrador de dominios que prefiera. - Un registro DNS que apunta a la dirección IP pública de su servidor. Puede consultar esta introducción a DNS de DigitalOcean para obtener más información sobre cómo agregarlo.
Opción 1: Utilizar Apache como proxy inverso
Requisitos previos de la sección
- Apache se instala siguiendo Cómo instalar Apache en Ubuntu 20.04 . Asegúrate de tener un archivo de host virtual para tu dominio.
- Certificados TLS Let’s Encrypt instalados en su servidor para su dominio. Siga los pasos que se describen en la guía Let’s Encrypt para Apache . Cuando se le solicite, habilite la redirección al dominio seguro.
Paso 1 – Configuración de hosts virtuales en Apache
Dado que configuraste un host virtual básico en tu dominio y lo aseguraste con Let’s Encrypt en la sección de requisitos previos, tienes dos hosts virtuales disponibles. Solo necesitarás editar el que configura el tráfico HTTPS. Para enumerarlos, muestra la configuración de Apache ejecutando lo siguiente:
- sudo apache2ctl -S
La salida será similar a esto:
Output...VirtualHost configuration:*:443 your_domain (/etc/apache2/sites-enabled/your_domain-le-ssl.conf:2)*:80 your_domain (/etc/apache2/sites-enabled/your_domain.conf:1)ServerRoot: "/etc/apache2"Main DocumentRoot: "/var/www/html"Main ErrorLog: "/var/log/apache2/error.log"Mutex watchdog-callback: using_defaultsMutex rewrite-map: using_defaultsMutex ssl-stapling-refresh: using_defaultsMutex ssl-stapling: using_defaultsMutex ssl-cache: using_defaultsMutex default: mechanism=defaultPidFile: "/var/run/apache2/apache2.pid"Define: DUMP_VHOSTSDefine: DUMP_RUN_CFGUser: name="www-data" id=33Group: name="www-data" id=33
El archivo que proporciona la configuración HTTPS es . Ábralo para editarlo ejecutando el siguiente comando, reemplazando con su nombre de dominio:/etc/apache2/sites-enabled/your_domain-le-ssl.conf
your_domain
- sudo nano /etc/apache2/sites-enabled/your_domain-le-ssl.conf
El archivo se verá similar a esto:
/etc/apache2/sites-enabled/su_dominio-le-ssl.conf
IfModule mod_ssl.cVirtualHost *:443 ServerAdmin webmaster@localhost ServerName your_domain ServerAlias www.your_domain DocumentRoot /var/www/your_domain.conf ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combinedSSLCertificateFile /etc/letsencrypt/live/your_domain/fullchain.pemSSLCertificateKeyFile /etc/letsencrypt/live/your_domain/privkey.pemInclude /etc/letsencrypt/options-ssl-apache.conf/VirtualHost/IfModule
Añade las líneas resaltadas a VirtualHost
:
/etc/apache2/sites-enabled/su_dominio-le-ssl.conf
... CustomLog ${APACHE_LOG_DIR}/access.log combined ProxyPreserveHost On ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/...
Las tres directivas resaltadas le indican a Apache que habilite el tráfico bidireccional entre Tomcat y el mundo exterior, preservando al mismo tiempo los valores del encabezado HTTP. Cuando termine, guarde y cierre el archivo.
Ahora ha indicado a Apache que envíe tráfico a su instalación de Tomcat, pero esa funcionalidad no está habilitada de forma predeterminada.
Paso 2: Prueba de la nueva configuración de Apache
En este paso, habilitará mod_proxy
y mod_proxy_http
, que son módulos de Apache que facilitan un proxy de conexión. Ejecute los siguientes comandos para habilitarlos:
- sudo a2enmod proxy
- sudo a2enmod proxy_http
Luego, verifique la configuración escribiendo:
- sudo apache2ctl configtest
La salida debe terminar con Syntax OK
. Si hay algún error, revise la configuración que acaba de modificar.
Por último, reinicie el proceso del servidor web Apache:
- sudo systemctl restart apache2
Ahora debería ver su instalación de Tomcat protegida con certificados TLS al acceder your_domain
desde su navegador web. Puede omitir la sección Nginx y seguir el paso para restringir el acceso a Tomcat.
Opción 2: Usar Nginx como proxy inverso
Requisitos previos de la sección
- Nginx instalado con un bloque de servidor para su dominio. Esta sección lo utilizará
/etc/nginx/sites-available/your_domain
como ejemplo. Puede configurar Nginx siguiendo Cómo instalar Nginx en Ubuntu 20.04 . - Certificados TLS de Let’s Encrypt instalados en su servidor para su dominio. Siga los pasos que se describen en la guía de Let’s Encrypt para Nginx . Cuando se le solicite, habilite la redirección al dominio seguro.
Paso 1: Ajuste de la configuración del bloque del servidor Nginx
En este paso, modificará la configuración del bloque del servidor para el dominio que creó en la sección requisitos previos para que Nginx reconozca a Tomcat.
Abra el archivo de configuración para editarlo con el siguiente comando:
- sudo nano /etc/nginx/sites-available/your_domain
Agregue las siguientes líneas en la parte superior del archivo:
/etc/nginx/sites-available/su_dominio
upstream tomcat { server 127.0.0.1:8080 fail_timeout=0;}
El upstream
bloque define cómo conectarse a Tomcat, lo que permite a Nginx saber dónde se encuentra Tomcat.
A continuación, dentro del server
bloque definido para el puerto 443, reemplace el contenido del location /
bloque con las directivas resaltadas:
/etc/nginx/sites-available/su_dominio
upstream tomcat { server 127.0.0.1:8080 fail_timeout=0;}server {... location / { include proxy_params; proxy_pass http://tomcat/; }...
Estas dos líneas especifican que todo el tráfico debe dirigirse al upstream
bloque llamado tomcat
, que acaba de definir. También ordena que se conserven todos los parámetros HTTP durante el proceso de proxy. Guarde y cierre el archivo cuando haya terminado.
Ahora probará esta configuración accediendo a Tomcat en su dominio.
Paso 2: Prueba de la nueva configuración de Nginx
Para comprobar que los cambios de configuración no introdujeron errores de sintaxis, ejecute este comando:
- sudo nginx -t
El resultado debería verse así:
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful
Si ve algún error, vuelva al paso anterior para revisar la configuración que modificó.
Luego, reinicie Nginx para volver a cargar la configuración:
- sudo systemctl restart nginx
Ahora puede ver su instalación de Tomcat al visitar la variante segura TLS de su dominio en su navegador web:
https://your_domain
Cómo restringir el acceso a Tomcat para Apache o Nginx
Ahora que ha expuesto su instalación de Tomcat en su dominio a través de un servidor proxy con certificados TLS, puede proteger su instalación de Tomcat restringiendo el acceso a ella.
Todas las solicitudes HTTP a Tomcat deben pasar por el proxy, pero puedes configurar Tomcat para que solo escuche conexiones en la interfaz de bucle local. Esta configuración garantiza que terceros no puedan intentar realizar solicitudes a Tomcat directamente.
Abra el server.xml
archivo para editarlo (ubicado dentro del directorio de configuración de Tomcat):
- sudo nano /opt/tomcat/conf/server.xml
Encuentre la Connector
definición debajo del Service
nombre Catalina
, que se ve así:
/opt/tomcat/conf/server.xml
... Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /...
Para restringir el acceso a la interfaz de bucle invertido local, especifique 127.0.0.1
como address
parámetro:
/opt/tomcat/conf/server.xml
... Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" address="127.0.0.1" redirectPort="8443" /...
Cuando termine, guarde y cierre el archivo.
Para que los cambios surtan efecto, reinicie Tomcat ejecutando:
- sudo systemctl restart tomcat
Ahora, su instalación de Tomcat solo debería ser accesible a través de su servidor proxy web Apache o Nginx. Apache o Nginx protegen a Tomcat de Internet, por lo que no será accesible en el 8080
puerto de su dominio.
Conclusión
En este tutorial, configuraste Tomcat detrás de un servidor proxy protegido con certificados TLS gratuitos de Let’s Encrypt. También deshabilitaste el acceso externo directo al restringir las conexiones a Tomcat a través de la interfaz de bucle local ( localhost
), lo que significa que solo las aplicaciones locales, como Apache o Nginx, pueden conectarse.
Si bien la configuración de un proceso de servidor web independiente puede aumentar la cantidad de software que se utiliza para brindar servicios a sus aplicaciones, simplifica el proceso de protección del tráfico de Tomcat. Para obtener más información sobre el proceso de proxy del tráfico, visite los documentos oficiales de Apache y Nginx .
Deja una respuesta