Hasta ahora todo se hizo conectado como root. Funciona, pero trabajar siempre como administrador significa que cualquier error o cualquier comando malicioso tiene poder total sobre el servidor. La práctica estándar es un usuario normal que pide permiso con sudo cuando hace falta.
1. Crear el nuevo usuario
Conéctate por SSH y ejecuta:
adduser abel
Te pedirá una contraseña (ponla y guárdala) y luego unos datos opcionales (nombre, teléfono); presiona Enter en todos y confirma con Y.
Ahora dale permiso de administrador:
usermod -aG sudo abel
Eso lo agrega al grupo sudo, que es el que permite ejecutar comandos privilegiados.
Copia tu llave SSH al nuevo usuario. Sin esto no podrías entrar con él:
rsync --archive --chown=abel:abel ~/.ssh /home/abel
Ese comando copia tu llave autorizada al nuevo usuario y le asigna la propiedad de los archivos.
1.1. Pruébalo, sin cerrar la sesión actual
Importante: abre una segunda terminal y déjala aparte, sin cerrar esta. Si algo sale mal, todavía tendrás la sesión de root abierta para arreglarlo.
En la terminal nueva:
ssh abel@TU_IP
Deberías entrar y ver un prompt distinto: abel@ubuntu...:~$. Fíjate que termina en $ y no en #. Ese símbolo significa que ya no eres root.
Prueba que sudo funciona:
sudo whoami
Te pedirá tu contraseña (la del usuario abel, no la de root) y debe responder root.
2. Desactivar el acceso directo de root por SSH
El usuario root existe en todos los servidores Linux, y los atacantes lo saben. Hay robots que escanean internet las 24 horas probando conectarse por SSH como root con miles de contraseñas.
Al desactivar ese acceso, todos esos intentos fallan antes de empezar, porque el servidor rechaza al usuario root sin importar qué credencial envíen. El atacante tendría que adivinar además el nombre del usuario (abel), que no es público.
Esto no te deja fuera del servidor: sigues entrando como abel y usas sudo para tareas administrativas. Y si algo saliera mal, DigitalOcean tiene el botón Web Console, que entra como root sin pasar por SSH — es la puerta de emergencia.
Conectado como abel:
sudo nano /etc/ssh/sshd_config
Busca la línea PermitRootLogin (puede decir yes o estar comentada con #) y déjala así:
PermitRootLogin no
Guarda (Ctrl+O, Enter, Ctrl+X) y aplica el cambio:
sudo systemctl restart ssh
2.1. Verificación
Importante: no cierres la sesión actual. Abre otra terminal y prueba:
ssh root@TU_IP # debe fallar: "Permission denied"
ssh abel@TU_IP # debe seguir funcionando
3. Mover la app al usuario abel
Primero compruébalo tú mismo. Como abel:
ps aux | grep "node /root"
Verás que la primera columna dice root. Ese es el proceso expuesto a internet.
Empieza quitando la app del PM2 de root:
sudo pm2 delete mi-app
sudo pm2 save
Copia el código a la casa de abel y hazlo suyo:
sudo cp -r /root/app /home/abel/app
sudo chown -R abel:abel /home/abel/app
Usamos cp en vez de mv para conservar el original por si algo falla. Y chown -R cambia el dueño de la carpeta y todo su contenido.
Verifica que el archivo con la contraseña de la base viajó bien (los archivos que empiezan con punto no se ven con ls normal):
ls -la /home/abel/app
Debes ver .env en la lista.
Arranca la app como abel, sin sudo:
cd /home/abel/app
pm2 start server.js --name mi-app
Configura el arranque automático para este usuario:
pm2 startup
Ese comando imprimirá otro comando (esta vez llevará sudo y mencionará a abel). Cópialo, pégalo y ejecútalo. Luego guarda:
pm2 save
3.1. Comprueba
ps aux | grep "node /home/abel"
Ahora la primera columna debe decir abel. Entra a tu dominio y confirma que todo sigue funcionando.
Ten en cuenta que ahora hay dos PM2 distintos: el de root (vacío) y el de abel (con la app). Por eso pm2 list como abel muestra la tuya, y sudo pm2 list mostraría la de root.
4. El flujo correcto desde cero
El orden ideal, si empezaras de nuevo, es crear el usuario al principio, no al final:
- Crear el droplet.
- Entrar como root una sola vez.
- Crear el usuario, darle sudo, copiarle la llave SSH.
- Desactivar el login de root.
exit, y desde ahí en adelante todo como ese usuario, con sudo cuando haga falta.- Instalar Node, Postgres, Nginx (con sudo, porque son del sistema).
- Poner el código en la carpeta del usuario y arrancarlo con PM2 sin sudo.
Con ese orden nunca se tienen dos PM2 ni hay que mover nada.
La regla que ordena todo esto es simple: sudo para lo que es del sistema, sin sudo para lo que es tuyo. Instalar paquetes, editar Nginx o reiniciar servicios son del sistema. Tu código y tu app son tuyos.