Lista de verificación posterior a la instalación de Linux: configuración inicial del servidor
Nivel: Principiante / Intermedio
Tiempo estimado: ~40 minutos
Objetivo: Completar la configuración inicial esencial de un servidor VPS Linux: reforzar el acceso SSH, crear un usuario con privilegios sudo, configurar un cortafuegos, habilitar actualizaciones de seguridad automáticas y programar tareas básicas de mantenimiento con cron.
Introducción
Los primeros 30 minutos tras aprovisionar un VPS son los más importantes. Un servidor Linux recién instalado está completamente expuesto: el inicio de sesión como root por SSH suele estar habilitado, no hay reglas de cortafuegos configuradas y los paquetes ya están desactualizados. Esta lista de verificación posterior a la instalación de Linux cubre todos los pasos relevantes para preparar un entorno listo para producción o de desarrollo: desde crear un usuario sudo y configurar la autenticación mediante clave SSH, hasta habilitar UFW y programar actualizaciones de seguridad automáticas. Seguir esta guía una vez te protege de los vectores de ataque más comunes antes de desplegar cualquier otra cosa sobre el servidor.
Esta guía cubre instancias VPS de Ubuntu, Debian y AlmaLinux (compatible con RHEL).
Requisitos previos
Antes de comenzar, asegúrate de cumplir las siguientes condiciones:
- Sistema operativo: Ubuntu 20.04/22.04/24.04 LTS, Debian 11/12/13 o AlmaLinux 8/9/10
- Acceso: acceso SSH como root al servidor (contraseña o clave; lo reforzarás a lo largo de esta guía)
- Equipo local: cliente SSH disponible (ssh en Linux/macOS, PuTTY o Windows Terminal en Windows)
- Conocimientos necesarios: uso básico de la línea de comandos de Linux: navegar por directorios, editar archivos con nano
- Tiempo estimado: ~40 minutos para una primera ejecución limpia
Esta guía se ha probado en Ubuntu 24.04 LTS, Debian 12/13 y AlmaLinux 9/10. Los pasos son idénticos salvo que se indique lo contrario.
Paso 1: Configurar el nombre de host del servidor
Un nombre de host adecuado facilita la lectura de los registros y evita confusiones al gestionar varios servidores.
Primero, actualiza /etc/hosts para que el sistema pueda resolver localmente su nuevo nombre de host. Abre el archivo:
sudo nano /etc/hosts
Añade o actualiza la línea correspondiente a 127.0.1.1 (o 127.0.0.1 si 127.0.1.1 no existe) para que coincida con tu nuevo nombre de host. Por ejemplo, si vas a usar web-01:
127.0.1.1 web-01
Guarda y sal (Ctrl+O, Enter, Ctrl+X).
A continuación, configura el nombre de host de forma global con hostnamectl:
sudo hostnamectl set-hostname <YOUR_HOSTNAME>
Verifica que se haya aplicado:
hostnamectl
Resultado esperado:
Static hostname: web-01 Icon name: computer-vm Chassis: vm Machine ID: a1b2c3d4e5f6... Boot ID: ... Operating System: Ubuntu 24.04.1 LTS Kernel: Linux 6.8.0-31-generic Architecture: x86-64
Muchos servicios —incluidos Postfix (correo) y herramientas de certificados SSL como Certbot— dependen de que el nombre de host se pueda resolver localmente. Actualizar /etc/hosts antes de ejecutar hostnamectl evita fallos de resolución difíciles de detectar.
Paso 2: Actualizar todos los paquetes
Ejecuta de inmediato una actualización completa del sistema. Los paquetes que vienen con una imagen de VPS recién creada casi siempre están desactualizados.
Ubuntu/Debian (APT):
sudo apt update && sudo apt upgrade -y
AlmaLinux/RHEL (DNF):
sudo dnf update -y
Cuando finalice la actualización, comprueba si es necesario reiniciar.
Debian/Ubuntu:
cat /var/run/reboot-required 2>/dev/null && echo "Reboot required" || echo "No reboot needed"
AlmaLinux/RHEL:
sudo dnf install -y dnf-utils needs-restarting -r
Si es necesario reiniciar, hazlo ahora antes de continuar: algunas actualizaciones del kernel y de las bibliotecas solo surten efecto tras un reinicio:
sudo reboot
Si omites el reinicio cuando es necesario, el kernel en ejecución y algunas bibliotecas permanecerán en la versión anterior. Esto puede dejar vulnerabilidades conocidas sin parchear incluso después de la actualización.
Paso 3: Crear un usuario sudo
Iniciar sesión como root para el trabajo diario no es seguro y es una mala práctica. Crea un usuario normal y concédele privilegios sudo.
3.1 Añadir el usuario
sudo adduser <YOUR_USERNAME>
En Ubuntu/Debian, el comando te pedirá que establezcas una contraseña y rellenes campos de contacto opcionales. Introduce la contraseña y omite el resto pulsando Enter.
En AlmaLinux/RHEL, adduser es un enlace simbólico a useradd y se ejecuta de forma no interactiva sin solicitar contraseña, dejando la cuenta bloqueada. Debes establecer la contraseña manualmente:
sudo passwd <YOUR_USERNAME>
3.2 Conceder privilegios sudo
Ubuntu/Debian: añade el usuario al grupo sudo:
sudo usermod -aG sudo <YOUR_USERNAME>
AlmaLinux/RHEL: añade el usuario al grupo wheel:
sudo usermod -aG wheel <YOUR_USERNAME>
3.3 Verificar el acceso
Cambia al nuevo usuario y prueba sudo:
su - <YOUR_USERNAME> sudo whoami
Resultado esperado:
root
Si ves root, el usuario tiene privilegios sudo funcionando correctamente. Ahora puedes cerrar la sesión de root:
exit
En AlmaLinux, la pertenencia al grupo wheel se define en /etc/sudoers mediante la línea %wheel ALL=(ALL) ALL, habilitada por defecto. En Ubuntu/Debian, el grupo sudo cumple la misma función.
Paso 4: Configurar la autenticación mediante clave SSH
El SSH basado en contraseña es vulnerable a ataques de fuerza bruta. La autenticación mediante clave SSH sustituye la contraseña por un par de claves criptográficas, mucho más difícil de atacar. Esta es una de las prácticas recomendadas más importantes que puedes aplicar en la configuración de SSH.
4.1 Generar un par de claves SSH (en tu equipo local)
Si aún no tienes un par de claves SSH, genera uno en tu equipo local (no en el servidor):
ssh-keygen -t ed25519 -C "<YOUR_USERNAME>@<YOUR_HOSTNAME>"
Acepta la ubicación predeterminada del archivo. Establece una passphrase cuando se te solicite: esto protege la clave si tu equipo local llega a verse comprometido.
ed25519 es el tipo de clave preferido. Es más rápido, más corto y más seguro que el antiguo rsa (2048 bits). Si tu cliente SSH no lo admite, usa en su lugar ssh-keygen -t rsa -b 4096.
4.2 Copiar la clave pública al servidor
Desde tu equipo local, copia la clave a la cuenta del nuevo usuario:
ssh-copy-id <YOUR_USERNAME>@<YOUR_SERVER_IP>
Si ssh-copy-id no está disponible (por ejemplo, en Windows), copia manualmente el contenido de ~/.ssh/id_ed25519.pub y añádelo al final de ~/.ssh/authorized_keys en el servidor.
4.3 Probar el inicio de sesión mediante clave
Abre una nueva ventana de terminal (no cierres todavía la sesión actual) y prueba el inicio de sesión:
ssh <YOUR_USERNAME>@<YOUR_SERVER_IP>
Deberías iniciar sesión sin que se te pida contraseña (solo la passphrase de la clave, si has establecido una).
No cierres tu sesión SSH actual hasta que hayas confirmado que el inicio de sesión mediante clave funciona. Si algo está mal configurado, seguirás teniendo la sesión actual para solucionarlo.
Paso 5: Reforzar la configuración de SSH y desactivar el inicio de sesión como root
Una vez confirmado el inicio de sesión mediante clave (Paso 4), bloquea el demonio SSH. Desactivar el inicio de sesión como root y la autenticación por contraseña a través de SSH es uno de los pasos más eficaces en cualquier checklist de refuerzo de seguridad de un servidor Linux.
En las tres distribuciones, /etc/ssh/sshd_config tiene una línea Include /etc/ssh/sshd_config.d/*.conf cerca del principio del archivo, y SSH aplica el primer valor que encuentra para cada opción. Los archivos drop-in del proveedor ya están presentes y anulan cualquier cosa que añadas después en el archivo principal:
- Ubuntu 24.04: 50-cloud-init.conf establece PasswordAuthentication yes
- AlmaLinux: 50-redhat.conf establece X11Forwarding yes
Por ese motivo, editar el sshd_config principal no es fiable. En su lugar, crea un archivo drop-in de refuerzo con un número bajo (00-) para que se lea primero y anule los archivos del proveedor. El mismo archivo funciona en las tres distribuciones.
Crea el archivo drop-in:
sudo tee /etc/ssh/sshd_config.d/00-hardening.conf > /dev/null <<'EOF' PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys X11Forwarding no EOF
El prefijo 00- garantiza que este archivo se analice antes que los drop-in del proveedor, como 50-cloud-init.conf y 50-redhat.conf. Dado que SSH aplica el principio de que la primera coincidencia prevalece, no necesitas editar esos archivos.
Valida la sintaxis de la configuración antes de reiniciar el servicio:
sudo sshd -t
Si el comando no devuelve ninguna salida, la sintaxis es válida. Ahora verifica los ajustes efectivos que realmente usará el demonio:
sudo sshd -T | grep -iE "permitrootlogin|passwordauthentication|x11forwarding"
Resultado esperado:
permitrootlogin no passwordauthentication no x11forwarding no
Confirma que los tres valores sean correctos antes de reiniciar. Si passwordauthentication sigue mostrando yes, un drop-in del proveedor está anulando tu archivo: comprueba que 00-hardening.conf se haya guardado correctamente. No cierres tu sesión SSH actual hasta haber verificado que el inicio de sesión mediante clave sigue funcionando.
Reinicia el demonio SSH para aplicar los cambios.
Ubuntu 24.04 (activación por socket):
sudo systemctl restart ssh.socket
Debian y versiones anteriores de Ubuntu:
sudo systemctl restart ssh
AlmaLinux/RHEL:
sudo systemctl restart sshd
Verifica que el servicio esté en ejecución (usa sshd en AlmaLinux, ssh.socket en Ubuntu 24.04):
sudo systemctl status ssh
Deberías ver Active: active (running) (o active (listening) si SSH se activa mediante socket).
Ahora confirma que el inicio de sesión como root está bloqueado. Desde tu equipo local:
ssh root@<YOUR_SERVER_IP>
Resultado esperado: la conexión se rechaza con Permission denied (publickey). El inicio de sesión como root por SSH ya está desactivado.
Paso 6: Configurar el cortafuegos (UFW)
UFW (Uncomplicated Firewall) es la herramienta de cortafuegos estándar en Ubuntu y Debian. En AlmaLinux, firewalld es la opción predeterminada, pero UFW también se puede instalar allí. Este paso cubre ambos enfoques.
Antes de habilitar cualquier cortafuegos, asegúrate de que SSH (puerto 22) esté explícitamente permitido. Si te equivocas en esto, quedarás bloqueado fuera del servidor.
6.1 UFW (Ubuntu/Debian)
En Debian (especialmente en Debian 13), es posible que ufw no esté instalado por defecto. Instálalo primero:
sudo apt update && sudo apt install -y ufw
Comprueba el estado actual:
sudo ufw status
Permite SSH antes de habilitar el cortafuegos:
sudo ufw allow ssh
Permite HTTP y HTTPS si vas a ejecutar un servidor web:
sudo ufw allow http sudo ufw allow https
Habilita el cortafuegos:
sudo ufw enable
Verifica las reglas activas:
sudo ufw status verbose
Resultado esperado:
Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere 80/tcp ALLOW IN Anywhere 443/tcp ALLOW IN Anywhere
6.2 Firewalld (AlmaLinux/RHEL)
Habilita e inicia firewalld:
sudo systemctl enable --now firewalld
Permite SSH, HTTP y HTTPS:
sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload
Verifica:
sudo firewall-cmd --list-all
Configurar el cortafuegos en Linux significa elegir la herramienta adecuada para tu distribución y no ejecutar dos demonios de cortafuegos a la vez. Si instalaste UFW en AlmaLinux, desactiva primero firewalld con sudo systemctl disable --now firewalld.
Paso 7: Sincronizar el reloj del sistema (NTP)
Una hora precisa es necesaria para los protocolos de seguridad (validación SSL/TLS, Kerberos), marcas de tiempo correctas en los registros y tareas programadas. Un reloj desincronizado puede provocar errores de certificado SSL, fallos de autenticación y entradas de registro confusas.
Comprueba el estado actual de sincronización:
timedatectl status
Resultado esperado:
System clock synchronized: yes NTP service: active
En Ubuntu 24.04 y Debian 13, NTP suele estar activo mediante systemd-timesyncd. En AlmaLinux 10, normalmente está activo mediante chrony. Si timedatectl muestra System clock synchronized: yes y NTP service: active, no necesitas cambiar nada.
Si el servicio NTP aparece como inactivo o n/a, instala y habilita chrony, el demonio NTP recomendado para servidores en producción:
Ubuntu/Debian:
sudo apt install chrony -y sudo systemctl enable --now chrony
En Debian 13, instalar chrony puede hacer que `timedatectl` muestre `NTP service: n/a`. En su lugar, usa `chronyc tracking` para verificarlo.
AlmaLinux/RHEL:
sudo dnf install chrony -y sudo systemctl enable --now chronyd
Espera entre 30 y 60 segundos tras iniciar el servicio y, después, verifica que la sincronización esté activa:
chronyc tracking
Busca Leap status: Normal. Eso confirma que el reloj del sistema está sincronizado y que NTP funciona correctamente.
Si gestionas servidores en varias zonas horarias, configura la zona horaria del sistema antes de configurar NTP, de modo que las marcas de tiempo de los registros queden en la hora local esperada. Ejemplo: sudo timedatectl set-timezone Europe/Warsaw.
Paso 8: Habilitar actualizaciones de seguridad automáticas
Las actualizaciones manuales funcionan, pero dependen de que te acuerdes de hacerlas. Las actualizaciones de seguridad automáticas son una red de seguridad, especialmente críticas para instancias VPS sin supervisión. Así es como se configuran las actualizaciones de seguridad automáticas en Linux sin afectar a la estabilidad.
8.1 Ubuntu/Debian - unattended-upgrades
Instala el paquete:
sudo apt install unattended-upgrades -y
Habilítalo y configúralo:
sudo dpkg-reconfigure --priority=low unattended-upgrades
Es fundamental seleccionar Yes cuando se te solicite. Si seleccionas No, el archivo de configuración necesario (/etc/apt/apt.conf.d/20auto-upgrades) no se creará, y las comprobaciones posteriores fallarán con un error de "No such file or directory". Esto habilita únicamente la instalación automática de actualizaciones de seguridad; las actualizaciones de funciones habituales siguen siendo manuales.
Verifica la configuración:
cat /etc/apt/apt.conf.d/20auto-upgrades
Resultado esperado:
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1";
Para probar sin aplicar cambios:
sudo unattended-upgrade --dry-run --debug
8.2 AlmaLinux/RHEL - dnf-automatic
Instala:
sudo dnf install dnf-automatic -y
Abre el archivo de configuración y establece el tipo de actualización solo en seguridad. Primero, haz una copia de seguridad:
sudo cp /etc/dnf/automatic.conf /etc/dnf/automatic.conf.bak sudo nano /etc/dnf/automatic.conf
Busca y establece:
apply_updates = yes upgrade_type = security
Habilita e inicia el temporizador:
sudo systemctl enable --now dnf-automatic.timer
Verifica:
sudo systemctl status dnf-automatic.timer
Paso 9: Programar mantenimiento básico con Cron
Cron gestiona tareas programadas: cosas que deben ocurrir regularmente sin intervención manual. Una tarea cron sencilla para operaciones como la limpieza de registros o la comprobación de la renovación de certificados es una práctica habitual en cualquier servidor gestionado.
Preparación para AlmaLinux/RHEL:
En un sistema AlmaLinux 10 limpio, es posible que nano no esté instalado, y crontab -e abrirá vi. Para usar nano en su lugar, ejecuta esta única línea para hacerlo correctamente en secuencia y asegurar que la variable de entorno se mantenga:
sudo dnf install nano -y && export EDITOR=nano && crontab -e
En otros sistemas (como Ubuntu/Debian), simplemente abre el crontab del usuario actual:
crontab -e
En la primera ejecución (en Ubuntu/Debian), se te pedirá que elijas un editor. Selecciona nano (opción 1).
Ejemplos comunes de tareas cron
Ejecutar una tarea cada noche a las 2:00 AM:
0 2 * * * /usr/local/bin/my-maintenance-script.sh >> /var/log/maintenance.log 2>&1
Renovar certificados SSL semanalmente (para usuarios de Certbot):
0 3 * * 0 certbot renew --quiet >> /var/log/certbot-renew.log 2>&1
Borrar archivos temporales mensualmente:
0 4 1 * * find /tmp -type f -atime +30 -delete
Cron utiliza el formato minuto hora día-del-mes mes día-de-la-semana comando. La parte >> /var/log/task.log 2>&1 redirige tanto stdout como stderr a un archivo de registro, para que puedas revisar lo ocurrido.
Verifica que tus tareas cron estén registradas:
crontab -l
Deberías ver las entradas que añadiste. Cron lee el archivo automáticamente; no es necesario recargar nada. Para comprobar si el servicio cron está en ejecución, usa:
Ubuntu/Debian:
sudo systemctl status cron
AlmaLinux/RHEL:
sudo systemctl status crond
Verificación
Repasa esta lista de comprobación para confirmar que todo se aplicó correctamente:
Comprueba el nombre de host:
hostnamectl | grep hostname
Confirma que el inicio de sesión SSH como root y la autenticación por contraseña estén desactivados (esto comprueba la configuración activa en tiempo de ejecución):
sudo sshd -T | grep -iE "permitrootlogin|passwordauthentication"
Esperado:
permitrootlogin no passwordauthentication no
Confirma que el servicio SSH esté en ejecución:
# Para Ubuntu 24.04: sudo systemctl status ssh.socket # Para Debian / Ubuntu antiguo: sudo systemctl status ssh # Para AlmaLinux: sudo systemctl status sshd
Comprueba el estado del cortafuegos (Ubuntu/Debian):
sudo ufw status verbose
Comprueba la sincronización NTP:
timedatectl status | grep -E "synchronized|NTP"
Esperado:
System clock synchronized: yes NTP service: active
Comprueba las actualizaciones automáticas (Ubuntu/Debian):
cat /etc/apt/apt.conf.d/20auto-upgrades
Lista las tareas cron activas:
crontab -l
Reversión
Para deshacer pasos concretos si algo salió mal:
Volver a habilitar el inicio de sesión SSH como root (si te quedaste bloqueado fuera y estás recuperando el acceso mediante consola):
# Reactivar temporalmente el inicio de sesión root/contraseña para recuperación sudo rm /etc/ssh/sshd_config.d/00-hardening.conf sudo sshd -t # Reinicia SSH (usa la variante para tu sistema): sudo systemctl restart ssh.socket # Ubuntu 24.04 sudo systemctl restart ssh # Debian / Ubuntu antiguo sudo systemctl restart sshd # AlmaLinux/RHEL
Desactivar UFW:
sudo ufw disable
Eliminar unattended-upgrades (Ubuntu/Debian):
sudo apt remove unattended-upgrades -y
Eliminar dnf-automatic (AlmaLinux):
sudo systemctl disable --now dnf-automatic.timer sudo dnf remove dnf-automatic -y
Eliminar una tarea cron:
crontab -e # Elimina la línea correspondiente, guarda y sal
Volver a habilitar el inicio de sesión como root o la autenticación por contraseña anula la mayor parte del refuerzo de seguridad realizado en esta guía. Hazlo solo temporalmente para recuperar el acceso y, después, vuelve a bloquearlo.
Conclusión
Con esto se cubre la lista de verificación completa posterior a la instalación de Linux. Ahora tienes un servidor con un nombre de host adecuado, paquetes totalmente actualizados, un usuario sudo distinto de root, autenticación mediante clave SSH configurada, inicio de sesión como root desactivado, un cortafuegos configurado, NTP sincronizado, actualizaciones de seguridad automáticas en funcionamiento y una programación de tareas cron lista para ampliar. Esta es la configuración base de un servidor Linux tras la instalación que todo VPS debería tener antes de desplegar cualquier otra cosa sobre él.
A partir de aquí, los siguientes pasos lógicos dependen del propósito del servidor:
- Servidor web: instala Nginx o Apache, configura un host virtual y configura SSL con Certbot
- Base de datos: instala y refuerza la seguridad de MySQL/MariaDB o PostgreSQL
- Monitorización: configura la agregación de registros (por ejemplo, logrotate) o un agente de monitorización ligero
- Control de acceso: revisa la configuración de sudoers y añade miembros del equipo siguiendo el mismo patrón del Paso 3
La lista de verificación de configuración inicial de un servidor Linux no termina aquí: evoluciona a medida que crece el rol del servidor. Pero esta base es el punto de partida innegociable.
Versión del documento: 1.0
Última actualización: mayo de 2026
Responsable: Equipo de Documentación Técnica