Categoría: Aplicaciones

  • Configurando un relay SMTP ligero con Postfix en un contenedor LXC

    Objetivo

    Configurar un relay SMTP ligero en un contenedor LXC, utilizando Postfix, para que cualquier VM o contenedor de la red local del homelab pueda enviar alertas y notificaciones sin necesidad de configurar contraseñas individuales en cada servicio. Todo el tráfico se centraliza y reenvía hacia una cuenta de correo externa.

    Diagnóstico y problemas resueltos

    Descarte de Proxmox Mail Gateway

    Inicialmente se evaluó Proxmox Mail Gateway (PMG), pero se descartó por su elevado consumo de recursos (~4GB de RAM). Postfix, en cambio, consume menos de 15MB de RAM en reposo — una diferencia enorme para un homelab con recursos limitados.

    Apertura de la interfaz local

    La configuración por defecto de Postfix viene limitada a loopback-only (solo escucha a la propia máquina). Se abrió a toda la red local con inet_interfaces = all, para que otros equipos de la LAN puedan usar el relay.

    Bloqueo del puerto 587 por el ISP

    El proveedor de internet tenía bloqueado el puerto 587 saliente, lo que generaba un error de Connection timed out en la cola de correo. La solución fue cambiar al puerto 465 con cifrado SSL/TLS implícito (smtp_tls_wrappermode = yes), que no estaba bloqueado.

    Validación estricta del remitente

    Muchos hostings de correo exigen que el encabezado From: coincida exactamente con la cuenta autenticada. Si no coincide, el mensaje es rechazado aunque la autenticación sea correcta.

    Configuración final de main.cf

    El archivo /etc/postfix/main.cf quedó configurado así para permitir la escucha interna y la salida segura por el puerto 465:

    smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
    biff = no
    append_dot_mydomain = no
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    mydestination = $myhostname, localhost.$mydomain, localhost
    
    # Servidor de destino en puerto seguro 465
    relayhost = [smtp.tudominio.com]:465
    
    # Escuchar en todas las interfaces del contenedor
    inet_interfaces = all
    
    # Redes locales autorizadas a enviar correos sin contraseña
    mynetworks = 127.0.0.0/8, 192.168.0.0/24
    
    recipient_delimiter = +
    compatibility_level = 2
    
    # --- Configuración de autenticación segura (salida al hosting) ---
    smtp_sasl_auth_enable = yes
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    smtp_sasl_security_options = noanonymous
    smtp_sasl_mechanism_filter = plain, login
    
    # Parámetros obligatorios para el puerto 465 (SSL directo)
    smtp_tls_wrappermode = yes
    smtp_tls_security_level = encrypt
    smtp_tls_supported_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, >=TLSv1.2

    Archivo de credenciales

    El archivo /etc/postfix/sasl_passwd contiene la contraseña del buzón emisor, indexada para el puerto 465:

    [smtp.tudominio.com]:465    [email protected]:contraseña

    Comandos utilizados

    Instalación de dependencias

    apt update && apt install postfix libsasl2-modules sasl2-bin mailutils -y

    Indexar la contraseña en la base de datos de Postfix

    postmap /etc/postfix/sasl_passwd

    Asignar permisos seguros al archivo de contraseñas

    chmod 600 /etc/postfix/sasl_passwd

    Reiniciar el servicio

    systemctl restart postfix

    Diagnóstico y pruebas

    Ver el estado de la cola de correos (pendientes o rebotados):

    mailq

    Forzar el envío de los correos retenidos en la cola:

    postfix flush

    Enviar un correo de prueba manual respetando el remitente obligatorio:

    echo "Esta es una prueba de alerta desde el relay del homelab." | mail -s "Test Relay Homelab" -a "From: [email protected]" [email protected]

    Estado de recursos

    El contenedor LXC, con apenas 1 vCPU y 512MB de RAM, quedó en excelentes condiciones de salud tras la configuración. Postfix consume alrededor de 15MB de RAM y 0% de CPU en reposo, sin afectar el rendimiento de otros servicios que corran en el mismo contenedor.

  • Administración de permisos para Tomcat en Linux

    Contexto

    Tomcat instalado manualmente en /opt/tomcat, con el servicio configurado para ejecutarse bajo un usuario y grupo dedicados:

    [Service]
    User=tomcat
    Group=tomcat
    
    Environment="CATALINA_BASE=/opt/tomcat"
    Environment="CATALINA_HOME=/opt/tomcat"

    El usuario tomcat debe tener control sobre los archivos necesarios para ejecutar la aplicación, generar logs y trabajar con directorios temporales.

    1. Cómo agregar la «s» en permisos de directorios

    Para obtener algo como drwxrwsr-x, hay que activar el bit setgid:

    chmod g+s /opt/tomcat

    Verificación:

    ls -ld /opt/tomcat
    drwxrwsr-x tomcat tomcat /opt/tomcat

    ¿Qué hace el bit setgid?

    Cuando un directorio tiene setgid:

    • Los archivos creados dentro heredan el grupo del directorio padre.
    • Evita problemas cuando varios usuarios despliegan archivos.
    • Muy útil para directorios compartidos.
    2775 drwxrwsr-x tomcat:tomcat /opt/tomcat

    El 2 inicial representa el bit setgid.

    2. Problema al reconectar una sesión Screen

    Comando ejecutado:

    screen -r 1560987.pts-0.servidor-app

    Error:

    There is a screen on:
        1560987.pts-0.servidor-app (Attached)
    
    There is no screen to be resumed matching 1560987.pts-0.servidor-app.

    Causa

    La sesión ya está conectada desde otra terminal.

    Solución

    Forzar el detach y reconectar:

    screen -d -r 1560987.pts-0.servidor-app

    Ver sesiones activas:

    screen -ls

    3. Permisos recomendados para Tomcat

    Propietario

    chown -R tomcat:tomcat /opt/tomcat

    Directorios

    find /opt/tomcat -type d -exec chmod 750 {} \;

    Resultado: drwxr-x---

    Archivos

    find /opt/tomcat -type f -exec chmod 640 {} \;

    Resultado: -rw-r-----

    Scripts ejecutables

    find /opt/tomcat/bin -type f -name "*.sh" -exec chmod 750 {} \;

    Resultado: -rwxr-x---

    4. Permisos recomendados por directorio

    Directorio raíz

    chmod 2755 /opt/tomcat

    Resultado: drwxr-sr-x. Mantiene el grupo heredado, permite navegación, evita escrituras accidentales.

    Configuración

    chmod -R 750 /opt/tomcat/conf

    Protege archivos como server.xml, context.xml, tomcat-users.xml y logging.properties.

    Logs

    chmod -R 750 /opt/tomcat/logs

    Tomcat necesita crear, modificar y rotar logs.

    Directorios temporales

    chmod -R 750 /opt/tomcat/temp
    chmod -R 750 /opt/tomcat/work

    Tomcat escribe ahí JSP compilados, archivos temporales y cachés.

    Aplicaciones

    chmod -R 750 /opt/tomcat/webapps

    Tomcat debe leer los WAR, desplegar aplicaciones y puede generar archivos de trabajo.

    5. Script para generar reporte de permisos

    Guarda todos los permisos actuales en el home del usuario:

    #!/bin/bash
    
    OUTPUT="$HOME/permisos_tomcat.txt"
    
    echo "Fecha de generación: $(date)" > "$OUTPUT"
    echo "--------------------------------------------------" >> "$OUTPUT"
    
    find /opt/tomcat -printf '%M %u %g %p\n' | while read perms user group path
    do
        octal=$(stat -c "%a" "$path")
        echo "$octal $perms $user:$group $path" >> "$OUTPUT"
    done
    
    echo "Reporte guardado en: $OUTPUT"
    chmod +x ver_permisos.sh
    ./ver_permisos.sh

    6. Hallazgos típicos en un servidor real

    Correcto

    2775 drwxrwsr-x tomcat:tomcat /opt/tomcat
    2775 drwxrwsr-x tomcat:tomcat /opt/tomcat/work

    El uso de setgid es adecuado.

    Problema 1: logs con 777

    777 drwxrwxrwx tomcat:tomcat /opt/tomcat/logs

    Riesgo: cualquier usuario del servidor puede crear archivos, modificar logs o borrar información.

    Corrección:

    chmod 750 /opt/tomcat/logs

    Problema 2: catalina.out con propietario incorrecto

    640 -rw-r----- otrouser:otrouser /opt/tomcat/logs/catalina.out

    Riesgo: Tomcat puede fallar al escribir.

    Corrección:

    chown tomcat:tomcat /opt/tomcat/logs/catalina.out

    Problema 3: aplicación desplegada por otro usuario

    Es común encontrar una aplicación bajo /opt/tomcat/webapps/ con propietario distinto a tomcat, cuando otro usuario es quien la despliega. No es necesariamente incorrecto, pero Tomcat debe tener acceso de lectura y debe existir coherencia en los permisos.

    Opción A (más simple):

    chown -R tomcat:tomcat /opt/tomcat/webapps/nombre-app

    Opción B (si otro usuario despliega): agregarlo al grupo tomcat:

    usermod -aG tomcat usuario_deploy

    Y mantener:

    chmod -R 775 /opt/tomcat/webapps/nombre-app
    chmod g+s /opt/tomcat/webapps/nombre-app

    7. Configuración recomendada para producción

    chown -R tomcat:tomcat /opt/tomcat
    
    chmod 2755 /opt/tomcat
    
    chmod -R 750 /opt/tomcat/conf
    chmod -R 750 /opt/tomcat/logs
    chmod -R 750 /opt/tomcat/temp
    chmod -R 750 /opt/tomcat/work
    chmod -R 750 /opt/tomcat/webapps
    
    find /opt/tomcat/bin -name "*.sh" -exec chmod 750 {} \;

    Regla práctica

    • Directorios: 750
    • Archivos: 640
    • Scripts: 750
    • Directorios compartidos: 2775
    • Nunca usar 777 salvo casos excepcionales y temporales.
    • Mantener propietario tomcat:tomcat en todo aquello que Tomcat necesite escribir.