Configuración inicial de un servidor Ubuntu: 9 pasos para empezar en un servidor Ubuntu recién instalado

Entorno de pruebaFamilia DebianUbuntu 24.04.5 LTSroot · cuenta de usuario normal
Tareas de configuración inicial del servidor Ubuntu comprobadas

Cuando recibes un servidor nuevo, haces una vez la configuración inicial del servidor Ubuntu antes de poner en marcha cualquier servicio. En un servidor Ubuntu 24.04 creado en DigitalOcean nos conectamos como root y configuramos en orden desde la actualización de paquetes hasta un usuario sudo, el inicio de sesión con clave, el firewall, la zona horaria, las actualizaciones de seguridad automáticas y la swap, y comprobamos que los ajustes seguían igual después de reiniciar.

Los cuadros de resultado de abajo son la salida de ejecutar los comandos en este orden. La IP del servidor 203.0.113.10 es un valor de ejemplo, y el nuevo usuario normal se llama deploy.

🎯 Puntos clave
Actualización de paquetes y comprobación de reinicio necesario
sudo habilitado para el usuario normal deploy
deploy (inicio con clave comprobado) y después root (inicio de sesión bloqueado)
ufw permite solo SSH, 80 y 443
Cambio de zona horaria y comprobación de las actualizaciones de seguridad automáticas
Archivo swap de 2GB y ajustes que se mantienen tras reiniciar
Requisitos previos
Lectura previassh-keygenssh Comando
Conexiónroot: clave SSH para conectarse y un servidor Ubuntu 24.04

1️⃣ Actualización de paquetes de Ubuntu

Incluso un servidor recién creado tiene actualizaciones pendientes de instalar. Después de descargar una lista de paquetes nueva, comprueba qué va a cambiar antes de instalar nada.

🔲 apt-get update

export DEBIAN_FRONTEND=noninteractive

Los comandos apt-get de abajo se ejecutaron después de fijar primero este valor. Con él no aparecen ventanas que pidan ajustes durante la instalación de paquetes y se aplican las respuestas por defecto.

apt-get update
Hit:1 http://mirrors.digitalocean.com/ubuntu noble InRelease
Hit:2 http://mirrors.digitalocean.com/ubuntu noble-updates InRelease
Hit:3 http://mirrors.digitalocean.com/ubuntu noble-backports InRelease
Hit:4 https://repos-droplet.digitalocean.com/apt/droplet-agent main InRelease
Hit:5 http://security.ubuntu.com/ubuntu noble-security InRelease
Reading package lists...

🔲 apt-get -s upgrade

apt-get -s upgrade
Calculating upgrade...
The following upgrades have been deferred due to phasing:
  libsqlite3-0
The following packages will be upgraded:
  apt apt-transport-https apt-utils bind9-dnsutils bind9-host bind9-libs
  cloud-init distro-info-data gir1.2-glib-2.0 git git-man libapt-pkg6.0t64
  libbrotli1 libglib2.0-0t64 libglib2.0-bin libglib2.0-data liblzma5
  libmspack0t64 libpcre2-8-0 python3-jwt python3-twisted tmux
  ubuntu-pro-client ubuntu-pro-client-l10n xz-utils zlib1g
26 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

La opción -s es una ejecución simulada que solo calcula el resultado sin instalar nada. En este servidor había 26 paquetes para actualizar, y libsqlite3-0 quedó fuera de esta actualización como [deferred due to phasing]. El número de paquetes varía de un servidor a otro según cuándo se creó el servidor y la imagen usada.

🔲 apt-get -y upgrade

apt-get -y upgrade
26 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 15.4 MB of archives.
After this operation, 398 kB of additional disk space will be used.

Cuando termina la instalación, aparece a continuación la lista de servicios reiniciados.

Running kernel seems to be up-to-date.

Restarting services...
 /etc/needrestart/restart.d/systemd-manager
 systemctl restart cron.service fwupd.service multipathd.service packagekit.service polkit.service ssh.service systemd-journald.service systemd-networkd.service systemd-resolved.service systemd-timesyncd.service systemd-udevd.service udisks2.service

Service restarts being deferred:
 systemctl restart ModemManager.service
 /etc/needrestart/restart.d/dbus.service
 systemctl restart systemd-logind.service
 systemctl restart unattended-upgrades.service

Cuando se instala una actualización que necesita reinicio, se crea el archivo /var/run/reboot-required. Esta vez apareció [Running kernel seems to be up-to-date.] y el archivo no se creó, así que pasamos al siguiente paso sin reiniciar.

2️⃣ Añadir usuario en Ubuntu y privilegios sudo

El trabajo diario se hace con un usuario normal y solo los comandos de administración se ejecutan con sudo. sudo eleva los privilegios con tu propia contraseña en lugar de la de root, así que queda registro de quién ejecutó cada comando.

🔲 adduser deploy

adduser deploy
info: Adding user `deploy' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `deploy' (1000) ...
info: Adding new user `deploy' (1000) with group `deploy (1000)' ...
info: Creating home directory `/home/deploy' ...
info: Copying files from `/etc/skel' ...
New password: 
Retype new password: 
passwd: password updated successfully
Changing the user information for deploy
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] Y
info: Adding new user `deploy' to supplemental / extra groups `users' ...
info: Adding user `deploy' to group `users' ...

adduser envuelve useradd; crea la carpeta personal y el grupo, y luego pide la contraseña y los datos del usuario uno por uno. La contraseña no se muestra en pantalla al escribirla, y los datos como el nombre o el teléfono se pueden dejar en blanco con Enter.

🔲 usermod -aG sudo deploy

usermod -aG sudo deploy
groups deploy
deploy : deploy sudo users

🔲 su

Los usuarios del grupo sudo pueden ejecutar comandos de administración con sudo. Cambia a la cuenta deploy con su y comprueba sus privilegios.

su - deploy
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
whoami
deploy
sudo whoami
[sudo] password for deploy: 
root
exit

Con sudo se pide la contraseña de deploy y, si es correcta, el comando se ejecuta con privilegios de root.

3️⃣ Registrar la clave SSH del nuevo usuario

Al principio solo root tiene una clave SSH registrada, así que deploy no puede iniciar sesión con clave. Copia el authorized_keys de root a la carpeta personal de deploy.

🔲 install -o deploy -g deploy

install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
install -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys
ls -la /home/deploy/.ssh
total 12
drwx------ 2 deploy deploy 4096 Nov  5 11:48 .
drwxr-x--- 3 deploy deploy 4096 Nov  5 11:48 ..
-rw------- 1 deploy deploy  100 Nov  5 11:48 authorized_keys

install crea la carpeta, copia el archivo y asigna el propietario y los permisos de una vez. sshd revisa los permisos y el propietario de los archivos del usuario antes de aceptar un inicio de sesión (StrictModes), así que deja la carpeta .ssh en 700 y authorized_keys en 600.

🔲 ssh deploy@203.0.113.10

No cierres la ventana de root que tienes abierta; primero comprueba en una ventana de terminal nueva que puedes conectarte como deploy.

ssh deploy@203.0.113.10
whoami
deploy
🧭 Un orden de configuración que no te deja fuera
Diagrama explicativo
🧭 Pasos
🔑① Copiar claveClave de root a deploy
➜
🪟② Comprobar en ventana nuevaVentana de root abierta
➜
⛔③ Bloquear rootPermitRootLogin no
➜
🪟④ Comprobar en ventana nuevadeploy sigue conectando
✅⑤ Permitir SSHufw allow OpenSSH
➜
🧱⑥ Activar ufwSolo se abren los puertos permitidos
➜
🪟⑦ Comprobar en ventana nuevaLa conexión sigue igual
Copia el authorized_keys de root a la carpeta personal de deploy.
No cierres la ventana de root que tienes abierta; comprueba en una ventana de terminal nueva que el inicio de sesión con clave funciona como deploy.
Bloquea el inicio de sesión de root solo después de confirmar la conexión de deploy. Si no puedes conectarte en la ventana nueva, deshaz el cambio en la ventana que dejaste abierta.
Después de recargar la configuración de SSH, comprueba en una ventana nueva que la conexión de deploy sigue funcionando.
Antes de activar el firewall, añade primero la regla que permite SSH.
En cuanto se activa, se bloquea toda conexión no permitida, así que la regla que permite SSH tiene que estar antes.
Después de activar el firewall, comprueba en una ventana nueva que puedes volver a conectarte como deploy.

4️⃣ Bloquear el inicio de sesión root por SSH

En Ubuntu 24.04, la línea Include al principio de sshd_config carga primero los archivos de la carpeta /etc/ssh/sshd_config.d/, y para un mismo ajuste se aplica el valor que se lee primero. Por eso, antes de cambiar nada, comprueba el valor que se aplica ahora y el archivo que lo contiene.

/etc/ssh└─ sshd_config  al principio: Include /etc/ssh/sshd_config.d/*.conf   ├─ ① sshd_config.d/50-cloud-init.conf         PasswordAuthentication no   ├─ ② sshd_config.d/60-cloudimg-settings.conf  PasswordAuthentication no   └─ ③ sshd_config línea 42                     PermitRootLogin yes → no

🔲 sshd -T

sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) '
permitrootlogin yes
passwordauthentication no
sudo grep -rn 'PasswordAuthentication' /etc/ssh/sshd_config.d/
/etc/ssh/sshd_config.d/60-cloudimg-settings.conf:1:PasswordAuthentication no
/etc/ssh/sshd_config.d/50-cloud-init.conf:1:PasswordAuthentication no

El inicio de sesión con contraseña ya está desactivado en dos archivos dentro de sshd_config.d, y lo único que hay que cambiar es la línea de inicio de sesión de root en el archivo principal.

🔲 sed -i PermitRootLogin

sudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config
42:PermitRootLogin yes
sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config
42:PermitRootLogin no

🔲 systemctl reload ssh

sudo sshd -t
sudo systemctl reload ssh
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) '
permitrootlogin no
passwordauthentication no

sshd -t comprueba la sintaxis de la configuración y, si no muestra nada, no hay errores. Después de recargar, confirma en una ventana nueva que la conexión de deploy sigue funcionando y luego intenta conectarte como root para ver que se rechaza.

ssh root@203.0.113.10
root@203.0.113.10: Permission denied (publickey).

Aunque la clave sea correcta, no puedes entrar como root; el trabajo de administración se hace conectándote como deploy y usando sudo.

5️⃣ Firewall de Ubuntu ufw

ufw es la herramienta de firewall por defecto de Ubuntu, pero al principio está desactivada. En cuanto se activa, se bloquea toda conexión no permitida, así que añade primero la regla que permite SSH y actívalo al final.

sudo ufw status verbose
Status: inactive

🔲 ufw allow OpenSSH

sudo ufw app list
Available applications:
  OpenSSH
sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)
sudo ufw allow 80/tcp
Rules updated
Rules updated (v6)
sudo ufw allow 443/tcp
Rules updated
Rules updated (v6)
sudo ufw show added
Added user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp

OpenSSH es un perfil que abre el puerto 22, y 80 y 443 son los puertos que usa un servidor web. Las reglas se añaden tanto para IPv4 como para IPv6.

🔲 ufw enable

sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere                  
80/tcp                     ALLOW IN    Anywhere                  
443/tcp                    ALLOW IN    Anywhere                  
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)             
80/tcp (v6)                ALLOW IN    Anywhere (v6)             
443/tcp (v6)               ALLOW IN    Anywhere (v6)             

Las conexiones entrantes se bloquean por defecto y, con solo los tres puertos permitidos abiertos, el firewall también se activa al arrancar. Después de activarlo, vuelve a conectarte como deploy en una ventana nueva y comprueba los números de las reglas.

sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere                  
[ 2] 80/tcp                     ALLOW IN    Anywhere                  
[ 3] 443/tcp                    ALLOW IN    Anywhere                  
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6)             
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)             

6️⃣ Configuración de la zona horaria en Ubuntu

La zona horaria inicial es Etc/UTC. Para ajustar la hora de los registros y de las tareas programadas a la región del servidor, este servidor, creado en la región de Singapur, se configuró en Asia/Singapore.

timedatectl
               Local time: Thu 2026-11-05 12:00:31 UTC
           Universal time: Thu 2026-11-05 12:00:31 UTC
                 RTC time: Thu 2026-11-05 12:00:31
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

🔲 timedatectl list-timezones

timedatectl list-timezones | grep Singapore
Asia/Singapore

🔲 timedatectl set-timezone

sudo timedatectl set-timezone Asia/Singapore
timedatectl
               Local time: Thu 2026-11-05 20:00:32 +08
           Universal time: Thu 2026-11-05 12:00:32 UTC
                 RTC time: Thu 2026-11-05 12:00:32
                Time zone: Asia/Singapore (+08, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Solo cambian las líneas Local time y Time zone; la sincronización del reloj (NTP) y la hora UTC siguen igual.

7️⃣ unattended upgrades: actualizaciones de seguridad automáticas

Ubuntu instala las actualizaciones de seguridad automáticamente con el paquete unattended-upgrades, que viene instalado y activado desde el principio. Por eso, en este paso compruebas que está activado y qué instala automáticamente.

🔲 dpkg-query -W

dpkg-query -W unattended-upgrades
unattended-upgrades	2.9.1+nmu4ubuntu1
systemctl is-enabled unattended-upgrades apt-daily.timer apt-daily-upgrade.timer
enabled
enabled
enabled

🔲 cat 20auto-upgrades

cat /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

El 1 de los dos valores significa una vez al día, y si los cambias a 0 se desactivan las actualizaciones automáticas. Lo que se instala lo decide el archivo 50unattended-upgrades.

grep -vE '^[[:space:]]*(//|$)' /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
	"${distro_id}:${distro_codename}";
	"${distro_id}:${distro_codename}-security";
	"${distro_id}ESMApps:${distro_codename}-apps-security";
	"${distro_id}ESM:${distro_codename}-infra-security";
};
Unattended-Upgrade::Package-Blacklist {
};
Unattended-Upgrade::DevRelease "auto";

Entre los orígenes permitidos está -security pero no -updates, así que las actualizaciones normales no se instalan automáticamente y solo se instalan las de seguridad. Para recibir también las actualizaciones normales de forma automática, quita el comentario de la línea -updates en este archivo.

🔲 unattended-upgrade

sudo unattended-upgrade --dry-run --debug
Starting unattended upgrades script
Allowed origins are: o=Ubuntu,a=noble, o=Ubuntu,a=noble-security, o=UbuntuESMApps,a=noble-apps-security, o=UbuntuESM,a=noble-infra-security

Son las dos últimas líneas de la misma ejecución.

No packages found that can be upgraded unattended and no pending auto-removals
The list of kept packages can't be calculated in dry-run mode.

--dry-run solo calcula lo que haría la actualización automática, sin instalar nada. Como las actualizaciones de paquetes ya estaban hechas, indicó que no había paquetes para instalar automáticamente. Los registros de las ejecuciones reales se guardan en la carpeta /var/log/unattended-upgrades/.

sudo ls -l /var/log/unattended-upgrades/
total 32
-rw-r--r-- 1 root root     0 Nov  5 20:00 unattended-upgrades-dpkg.log
-rw-r--r-- 1 root root     0 Nov  5 17:34 unattended-upgrades-shutdown.log
-rw-r--r-- 1 root root 29093 Nov  5 20:04 unattended-upgrades.log

8️⃣ Configuración de la memoria swap en Ubuntu

Este servidor tiene 1GB de memoria y al principio no tiene swap. Antes de desplegar aplicaciones, crea un archivo swap de 2GB y regístralo en /etc/fstab para que también se active después de reiniciar.

free -h
               total        used        free      shared  buff/cache   available
Mem:           961Mi       328Mi       161Mi       4.0Mi       631Mi       633Mi
Swap:             0B          0B          0B
df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        24G  2.0G   22G   9% /

🔲 fallocate -l 2G /swapfile

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
ls -lh /swapfile
-rw------- 1 root root 2.0G Nov  5 20:04 /swapfile

🔲 mkswap /swapfile

sudo mkswap /swapfile
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=0b43ccd8-5b4a-4048-9b84-eee12667b387

🔲 swapon /swapfile

sudo swapon /swapfile
swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2
free -h
               total        used        free      shared  buff/cache   available
Mem:           961Mi       328Mi       160Mi       4.0Mi       632Mi       632Mi
Swap:          2.0Gi          0B       2.0Gi

🔲 tee -a /etc/fstab

swapon solo lo activa en ese momento; para que también se active después de reiniciar, añade una línea a fstab.

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
/swapfile none swap sw 0 0

9️⃣ Comprobación de la configuración inicial del servidor Ubuntu

Cuando compruebas que los ajustes se mantienen después de reiniciar, la configuración inicial de Ubuntu está terminada.

🔲 systemctl reboot

sudo systemctl reboot

🔲 uptime -p

Después de reiniciar, vuelve a conectarte como deploy.

uptime -p
up 2 minutes
swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) '
permitrootlogin no
passwordauthentication no
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere                  
80/tcp                     ALLOW IN    Anywhere                  
443/tcp                    ALLOW IN    Anywhere                  
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)             
80/tcp (v6)                ALLOW IN    Anywhere (v6)             
443/tcp (v6)               ALLOW IN    Anywhere (v6)             
timedatectl | head -n 4
               Local time: Thu 2026-11-05 20:06:35 +08
           Universal time: Thu 2026-11-05 12:06:35 UTC
                 RTC time: Thu 2026-11-05 12:06:35
                Time zone: Asia/Singapore (+08, +0800)
systemctl is-active unattended-upgrades ssh.socket
active
active

La swap, la configuración de SSH, el firewall, la zona horaria y las actualizaciones automáticas están igual que antes de reiniciar. A continuación, en este servidor se pone en marcha una aplicación Node.js con PM2 y Nginx.

🔢 FAQ & contenido recomendado

Puedes dejarlo así. Un paquete que queda fuera como [deferred due to phasing] es una actualización en despliegue por fases. Ubuntu publica algunas actualizaciones primero solo para una parte de los servidores y, si no hay problemas, amplía el despliegue a todos. Las actualizaciones de seguridad no se despliegan por fases, y el paquete que quedó fuera se instala en la siguiente actualización cuando se amplía el despliegue.

La tarea de actualización automática se ejecuta una vez al día, y los dos temporizadores apt-daily.timer y apt-daily-upgrade.timer la lanzan con un retraso aleatorio respecto a una hora fija. En este servidor, la siguiente ejecución de apt-daily-upgrade.timer estaba programada para el día siguiente a las 06:27:59 (+08). Si el servidor está apagado y se salta esa hora, la tarea puede ejecutarse justo en el siguiente arranque, por lo que las tareas de apt pueden esperar un momento nada más arrancar.

Con la configuración por defecto no reinician. El valor por defecto de Automatic-Reboot en 50unattended-upgrades es false, y en la configuración de este servidor esa línea tampoco está activada. Cuando se instala una actualización que necesita reinicio, se crea el archivo /var/run/reboot-required, así que reinicia tú mismo cuando exista ese archivo.

ℹ️ Aviso de afiliados
El contenido de este sitio incluye enlaces de afiliado. Cuando un visitante compra un producto o servicio a través de uno de ellos, el sitio recibe una comisión del vendedor. El importe que paga el comprador(baja durante las promociones ↓)no aumenta. Los precios, descuentos y existencias publicados corresponden al momento de redacción y pueden variar, así que confírmalos con el vendedor antes de comprar. Los productos se eligen y evalúan con criterios propios, y las comisiones no influyen en el orden ni en el contenido de las reseñas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Demuestra que eres humano: 3   +   8   =