Add unix user for tomcat service

Regresando un poco a las raices de como instalar este server creo que una pequeña y práctica nota para hacerlo es poner atención al usuario que utilizamos para ejecutar el contenedor web.

A veces no le damos mucha importancia a estos detalles porque generalmente siempre tenemos muchas actividades y lo que todo mundo quiere ver es la aplicación funcionando en el menor tiempo posible, y lo clasico es dejar la instalación con un usuario de administración o el root (en el peor de los casos).

Por ello decidí tomar unos minutos para escribir estas líneas con los comandos de como debemos agregar un usuario de servicio para nuestro contenedor para que sea ejecutado en el servidor.

#Create group and user
groupadd tomcat
useradd -r -m -d ${USR_TOMCAT_HOME_DIR} -s /bin/false tomcat -g tomcat
# In debian distro you can use this alternative
useradd -r -m -d ${USR_TOMCAT_HOME_DIR} -s /sbin/nologin tomcat -g tomcat
#set user password
passwd tomcat
#Change folder privilegies
chown -R tomcat.tomcat /path/to/tomcat
chmod 775 /path/to/tomcat/webapps
#start or stop server
sudo -u tomcat /opt/tomcat/bin/startup.sh
sudo -u tomcat /opt/tomcat/bin/shutdown.sh
#if you have normal or admin user you need these commands:
su - tomcat -c /opt/tomcat/bin/startup.sh
su - tomcat -c /opt/tomcat/bin/shutdown.sh
view raw TomcatUser.sh hosted with ❤ by GitHub

Con esto podemos crear un usuario que no tiene privilegios para firmarse en el sistema sin embargo, puede ejecutar comandos através de la instrucción sudo.

Esto es una muy buena practica de seguridad para evitar que se firmen en el sistema con los usuarios de servicio, sin embargo ¿que pasa si un día necesitas entrar con este usuario?, fácil podemos cambiarle el shell con la iinstrucción:

# Enable login
sudo usermod -s /bin/sh tomcat
# Disable login 
sudo usermod -s /bin/false tomcat

Ah y algo muy importante que puede pasar en algunas distribuciones es que al iniciar el contenedor no puede enlazar el puerto 80 con un usuario diferente al root por lo que debes redireccionar los puertos con el comando iptables:

When running Tomcat as a user other than the root user, you will not be able to bind to port 80, which is where Tomcat listens for HTTP requests

Aunque vaya esto último solo es para ambientes de desarrollo, en producción ¡nunca! debes hacer esto, en su lugar debes colocar un servidor proxy que redireccione las peticiones al tomcat.

Bueno y el último paso es generar un script para que se ejecute cada vez que se inicie o detenga el sistema operativo:

Generas un archivo «vi /etc/init.d/tomcat» con el siguiente contenido:

#!/bin/bash
### BEGIN INIT INFO
# Provides: tomcat7
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/Stop Tomcat server
### END INIT INFO
TOMCAT_HOME=/opt/apache-tomcat-7.0.57
PATH=/sbin:/bin:/usr/sbin:/usr/bin
start() {
sudo -u tomcat $TOMCAT_HOME/bin/startup.sh
}
stop() {
sudo -u tomcat $TOMCAT_HOME/bin/shutdown.sh
}
case $1 in
start|stop) $1;;
restart) stop; start;;
*) echo "Run as $0 <start|stop|restart>"; exit 1;;
esac
view raw Tomcat7.bash hosted with ❤ by GitHub

Debes cambiar la variable TOMCAT_HOME con la ruta donde se encuentra ubicado tu servidor.

# Add permisions
chmod 755 /etc/init.d/tomcat
# Add script to automatic 
update-rc.d tomcat defaults
Referencias

Create Mail Session in Tomcat (JNDI)

Crear una Sesión de Correo en Tomcat (JNDI)

El envío de correo electrónico es un mecanismo común en las aplicaciones web, en Java se hace a través del API  con las clases del paquete javax.mail, sin embargo es un proceso que requiere mucha atención por el nivel de carga que puede tener el servidor, porque impacta directamente en el rendimiento.

La forma adecuada de utilizarlo es através de un recurso de JNDI el cual crea una sesión unica y compartida para el envío de correo de un sistema, es decir, cuando se despliega un proyeccto web se genera una sola sesión la cual estará activa y disponible como un recurso para el sistema.

Así cada vez que hay que enviar un correo se toman los datos de la sesión y se ahorran recursos.

Procedimiento

Agrega las siguientes librerias a la carpeta de lib del Tomcat:

  • activation.jar
  • mail.jar


Seguir leyendo

Enable SSL (Secure Socket Layer) in Apache Tomcat (5.5, 6 y 7)

Activar SSL en Apache Tomcat (5.5, 6 y 7)

Secure Socket Layer (SSL) es un mecanismo que permite a los navegadores comunicarse con los servidores web a través de una conexión segura. Para activar SSL en Apache Tomcat es necesario utilizar un certificado del lado de servidor con el formato JKS, PKCS11 o PKCS12 <– este último es el estandar web.

Tomcat puede utilizar dos herramientas para SSL:

Veamos lo que dice la documentación:

Tomcat can use two different implementations of SSL:

  • the JSSE implementation provided as part of the Java runtime (since 1.4)
  • the APR implementation, which uses the OpenSSL engine by default.

The exact configuration details depend on which implementation is being used. The implementation used by Tomcat is chosen automatically unless it is overriden as described below. If the installation uses APR – i.e. you have installed the Tomcat native library – then it will use the APR SSL implementation, otherwise it will use the Java JSSE implementation.

Seguir leyendo

Apache Portable Runtime (APR) based Native library for Tomcat

Siempre que inicio el servidor tomcat me aparece un mensaje como este:

INFO: La biblioteca nativa de Apache Tomcat basada en ARP que permite un rendimiento óptimo en entornos de desarrollo no ha sido hallada en java.library.path:...

Y nunca le dí importancia hasta hoy, por que tengo que utilizarlo en un proyecto bastante amplio que necesita cuidar el performance al máximo, en fin le he dedicado un rato para investigar a que se refiere esta libreria y esto fue lo que encontre:

The Apache Portable Runtime is a highly portable library that is at the heart of Apache HTTP Server 2.x. APR has many uses, including access to advanced IO functionality (such as sendfile, epoll and OpenSSL), OS level functionality (random number generation, system status, etc), and native process handling (shared memory, NT pipes and Unix sockets).

These features allows making Tomcat a general purpose webserver, will enable much better integration with other native web technologies, and overall make Java much more viable as a full fledged webserver platform rather than simply a backend focused technology.

Al parecer es una libreria que mejora la integración del servidor con el sistema, y el resultado es que tomcat deja de ser un contenedor de servlets y hace que java sea mucho mas viable para esta técnologia y no solo un lenguaje de back end. Una de las ventajas es que mejora la velocidad del tomcat busque algunos test y afirman que mejora en rendimiento =)… (¬¬ de haber sabido que algo así existía…  tengo que fijarme más en los mensajes del log).

Seguir leyendo