Cuando despliegas una aplicacion Node.js o cualquier aplicacion web en un servidor Linux, el mayor riesgo no es tu codigo sino la mala configuracion del servidor. En este articulo explico como convertir un servidor Ubuntu recien instalado en un entorno seguro y listo para produccion siguiendo pasos claros y aplicables. Q2BSTUDIO, empresa de desarrollo de software y aplicaciones a medida especializada en inteligencia artificial, ciberseguridad y servicios cloud, recomienda estas practicas para proteger tus proyectos y datos.
Filosofia de seguridad (explicacion sencilla): aplicamos tres reglas basicas: nunca ejecutar aplicaciones como root; cada aplicacion tiene su propio usuario; la aplicacion solo puede acceder a sus propios archivos. Si un atacante compromete tu aplicacion, no deberia poder instalar mineros, modificar archivos del sistema, crear usuarios ni afectar otras aplicaciones.
Supuestos: Ubuntu 22.04 o 24.04; puedes conectar por SSH al servidor; empiezas como root en un servidor en la nube recien provisionado.
Paso 1 Crear un usuario administrador no root. Crea un usuario normal para administracion, por ejemplo dev. Comando: adduser dev. Asigna una contraseña fuerte. Luego permite administracion sin entrar como root: usermod -aG sudo dev. Razon: el acceso SSH como root es peligroso. Un usuario normal con sudo es mas seguro y auditable.
Paso 2 Configurar acceso por clave SSH. En tu maquina local genera una clave si no tienes: ssh-keygen -t ed25519. Copia la clave publica al servidor: mkdir -p /home/dev/.ssh y nano /home/dev/.ssh/authorized_keys para pegar la clave publica. Ajusta permisos: chown -R dev:dev /home/dev/.ssh chmod 700 /home/dev/.ssh chmod 600 /home/dev/.ssh/authorized_keys. Prueba desde tu equipo: ssh dev@TU_IP_DEL_SERVIDOR.
Paso 3 Asegurar SSH. Edita el archivo de configuracion: sudo nano /etc/ssh/sshd_config. Asegurate de tener estas lineas: PermitRootLogin no y PubkeyAuthentication yes. Al final añade: Match all PasswordAuthentication no. Recarga SSH de forma segura: sudo systemctl reload ssh. Esto deshabilita login root y autenticacion por contraseña y obliga a usar claves. Las consolas de recuperacion en la nube siguen funcionando.
Paso 4 Activar el firewall. Antes de habilitar permite los puertos necesarios: sudo ufw allow OpenSSH sudo ufw allow 80 sudo ufw allow 443. Activa el firewall: sudo ufw enable. Comprueba estado: sudo ufw status verbose. Razon: bloquea barridos aleatorios por internet y solo permite lo que necesitas.
Paso 5 Instalar Node.js a nivel de sistema. Usa el repositorio oficial, ejemplo Node 24 LTS: curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash - y sudo apt install -y nodejs. Verifica con node -v y which node. Esperado: /usr/bin/node propiedad de root. Evita nvm para servicios del sistema porque systemd y servicios no funcionan bien con nvm.
Paso 6 Crear un usuario dedicado para la aplicacion. Nunca ejecutes apps con tu usuario administrador. Crea un usuario de servicio, ejemplo svc-nextjs: sudo adduser --system --no-create-home --group --shell /usr/sbin/nologin svc-nextjs. Esto significa: sin acceso SSH, sin shell, sin sudo, existe solo para ejecutar la aplicacion.
Paso 7 Aislar los archivos de la aplicacion. Crea un directorio: sudo mkdir -p /var/apps/nextjs y sudo chown -R svc-nextjs:svc-nextjs /var/apps/nextjs y sudo chmod 750 /var/apps/nextjs. Si intentas acceder como administrador directa mente veras restricciones y el usuario de servicio podra trabajar en su propio directorio: sudo -u svc-nextjs ls /var/apps/nextjs.
Paso 8 Ejecutar la aplicacion con systemd usando contencion. Crea el servicio: sudo nano /etc/systemd/system/nextjs.service y añade un archivo con contenido tipo unit y service. Ejemplo de seccion Service relevante: User = svc-nextjs Group = svc-nextjs WorkingDirectory = /var/apps/nextjs ExecStart = /usr/bin/node server.js Restart = always y parametros de endurecimiento como NoNewPrivileges = true ProtectSystem = strict ProtectHome = true ReadWritePaths = /var/apps/nextjs PrivateTmp = true PrivateDevices = true ProtectKernelTunables = true ProtectKernelModules = true ProtectControlGroups = true RestrictSUIDSGID = true RestrictNamespaces = true LockPersonality = true MemoryDenyWriteExecute = true UMask = 0077. Recarga systemd: sudo systemctl daemon-reload.
Paso 9 Comprobar el nivel de seguridad. Ejecuta: systemd-analyze security nextjs.service. Una puntuacion alrededor de 2 o 3 es excelente para un servicio web. Esto protege contra escalada de privilegios, modificacion de archivos del sistema, abuso del kernel, mineros criptograficos y movimiento lateral. Incluso si la aplicacion es comprometida, el sistema operativo permanece seguro.
Paso 10 Revisiones finales. Comprueba configuracion SSH: sudo sshd -T | egrep permitrootlogin|passwordauthentication|pubkeyauthentication y verifica que los valores sean permitrootlogin no passwordauthentication no pubkeyauthentication yes. Revisa el firewall con sudo ufw status. Ver lo logrado: acceso root por SSH deshabilitado, login por contraseña deshabilitado, acceso por clave obligatorio, firewall activo, usuarios de servicio por aplicacion, aislamiento de sistema de archivos y sandbox de systemd fuerte.
Consejos finales: una aplicacion debe tener un usuario de servicio propio; nunca ejecutes apps como root; deja que systemd aplique las restricciones. Mantener SSH simple y bloqueado es clave. Estas practicas son aplicables a Node.js, Python o cualquier back end.
Si necesitas ayuda profesional para desplegar entornos seguros, Q2BSTUDIO ofrece servicios integrales que incluyen desarrollo de aplicaciones a medida, desarrollo de aplicaciones a medida, y consultoria en servicios de ciberseguridad. Ademas brindamos soluciones de inteligencia artificial, ia para empresas, agentes IA, servicios cloud aws y azure, servicios inteligencia de negocio y power bi para mejorar la observabilidad y toma de decisiones. Si buscas software a medida, seguridad robusta o migracion a la nube, nuestro equipo puede ayudarte a implementar y mantener practicas de hardening que protejan tu inversion.
Palabras clave incluidas para mejorar posicionamiento: aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA, power bi.