Configurazione iniziale del server Ubuntu: 9 passi per iniziare su un server Ubuntu appena installato

Ambiente di testFamiglia DebianUbuntu 24.04.5 LTSroot · account utente normale
Operazioni di configurazione iniziale del server Ubuntu verificate

Quando ricevi un nuovo server, esegui una volta la configurazione iniziale del server Ubuntu prima di metterci qualsiasi servizio. Su un server Ubuntu 24.04 creato su DigitalOcean ci siamo collegati come root e abbiamo configurato in ordine tutto, dagli aggiornamenti dei pacchetti a un utente sudo, l'accesso con chiave, il firewall, il fuso orario, gli aggiornamenti di sicurezza automatici e lo swap, verificando che le impostazioni restassero al loro posto anche dopo un riavvio.

I riquadri dei risultati qui sotto sono l'output dei comandi eseguiti in questo ordine. L'IP del server 203.0.113.10 è un valore di esempio, e il nuovo utente normale si chiama deploy.

🎯 Punti chiave
Aggiornamento dei pacchetti e verifica del riavvio necessario
sudo abilitato per l'utente normale deploy
deploy (accesso con chiave verificato), poi root (accesso bloccato)
ufw consente solo SSH, 80 e 443
Cambio del fuso orario e verifica degli aggiornamenti di sicurezza automatici
File di swap da 2GB e impostazioni mantenute dopo il riavvio
Prerequisiti
Da leggere primassh-keygenssh Comando
Connessioneroot: chiave SSH per collegarsi e un server Ubuntu 24.04

1️⃣ Aggiornamento dei pacchetti Ubuntu

Anche un server appena creato ha aggiornamenti in attesa di installazione. Dopo aver scaricato un elenco dei pacchetti aggiornato, controlla cosa cambierà prima di installare qualcosa.

🔲 apt-get update

export DEBIAN_FRONTEND=noninteractive

I comandi apt-get qui sotto sono stati eseguiti dopo aver impostato prima questo valore. Con questo valore non compaiono finestre che chiedono impostazioni durante l'installazione dei pacchetti e vengono applicate le risposte predefinite.

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.

L'opzione -s è un'esecuzione simulata che calcola solo il risultato senza installare nulla. Su questo server c'erano 26 pacchetti da aggiornare, e libsqlite3-0 è stato escluso da questo aggiornamento come [deferred due to phasing]. Il numero dei pacchetti varia da server a server, a seconda di quando è stato creato il server e dell'immagine usata.

🔲 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.

Al termine dell'installazione segue l'elenco dei servizi riavviati.

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

Quando viene installato un aggiornamento che richiede un riavvio, viene creato il file /var/run/reboot-required. Questa volta è comparso [Running kernel seems to be up-to-date.] e il file non è stato creato, quindi siamo passati al passo successivo senza riavviare.

2️⃣ Aggiungere un utente su Ubuntu e privilegi sudo

Il lavoro quotidiano si fa con un utente normale, e solo i comandi di amministrazione si eseguono con sudo. sudo alza i privilegi con la tua password invece che con quella di root, così resta traccia di chi ha eseguito ogni 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 è un wrapper di useradd: crea la cartella home e il gruppo, poi chiede in ordine la password e le informazioni dell'utente. La password non compare sullo schermo mentre la digiti, e informazioni come nome e numero di telefono si possono lasciare vuote con Invio.

🔲 usermod -aG sudo deploy

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

🔲 su

Gli utenti del gruppo sudo possono eseguire comandi di amministrazione con sudo. Passa all'account deploy con su e verifica i privilegi.

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 viene chiesta la password di deploy e, se è corretta, il comando viene eseguito con i privilegi di root.

3️⃣ Registrare la chiave SSH per il nuovo utente

All'inizio solo root ha una chiave SSH registrata, quindi l'accesso con chiave non funziona per deploy. Copia il file authorized_keys di root nella cartella home di 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 cartella, copia il file e imposta proprietario e permessi in un colpo solo. sshd controlla i permessi e il proprietario dei file dell'utente prima di accettare un accesso (StrictModes), quindi imposta la cartella .ssh a 700 e authorized_keys a 600.

🔲 ssh deploy@203.0.113.10

Non chiudere la finestra di root aperta; prima verifica in una nuova finestra del terminale di riuscire a collegarti come deploy.

ssh deploy@203.0.113.10
whoami
deploy
🧭 Un ordine di configurazione che non ti chiude fuori
Diagramma esplicativo
🧭 Passi
🔑① Copia chiaveChiave di root a deploy
➜
🪟② Verifica nuova finestraFinestra di root aperta
➜
⛔③ Blocca accesso rootPermitRootLogin no
➜
🪟④ Verifica nuova finestraAccesso di deploy invariato
✅⑤ Consenti SSHufw allow OpenSSH
➜
🧱⑥ Attiva ufwSolo porte consentite aperte
➜
🪟⑦ Verifica nuova finestraAccesso invariato
Copia il file authorized_keys di root nella cartella home di deploy.
Non chiudere la finestra di root aperta; verifica in una nuova finestra del terminale che l'accesso con chiave funzioni come deploy.
Blocca l'accesso di root solo dopo aver confermato l'accesso di deploy. Se nella nuova finestra non riesci a collegarti, annulla la modifica nella finestra che hai lasciato aperta.
Dopo aver ricaricato le impostazioni SSH, verifica in una nuova finestra che l'accesso di deploy funzioni ancora.
Prima di attivare il firewall, aggiungi la regola che consente SSH.
Appena viene attivato, ogni connessione non consentita viene bloccata, quindi la regola che consente SSH deve esserci già.
Dopo aver attivato il firewall, verifica in una nuova finestra di riuscire di nuovo a collegarti come deploy.

4️⃣ Bloccare l'accesso root via SSH

In Ubuntu 24.04 la riga Include in cima a sshd_config carica prima i file della cartella /etc/ssh/sshd_config.d/, e per la stessa impostazione vale il valore letto per primo. Per questo, prima di cambiare qualcosa, controlla il valore applicato ora e il file che lo contiene.

/etc/ssh└─ sshd_config  in cima: 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 riga 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

L'accesso con password è già disattivato in due file dentro sshd_config.d; l'unica cosa da cambiare è la riga dell'accesso root nel file principale.

🔲 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 controlla la sintassi della configurazione e, se non viene mostrato nulla, non ci sono errori. Dopo aver ricaricato, conferma in una nuova finestra che l'accesso di deploy funziona ancora, poi prova a collegarti come root per vedere che viene rifiutato.

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

Anche con la chiave giusta non puoi entrare come root; il lavoro di amministrazione si fa collegandosi come deploy e usando sudo.

5️⃣ Firewall di Ubuntu ufw

ufw è lo strumento firewall predefinito di Ubuntu, ma all'inizio è disattivato. Appena viene attivato, ogni connessione non consentita viene bloccata, quindi aggiungi prima la regola che consente SSH e attivalo per ultimo.

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 è un profilo che apre la porta 22, mentre 80 e 443 sono le porte usate da un server web. Le regole vengono aggiunte sia per IPv4 sia per 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)             

Le connessioni in entrata sono bloccate per impostazione predefinita, restano aperte solo le tre porte consentite e il firewall si attiva anche all'avvio. Dopo averlo attivato, collegati di nuovo come deploy in una nuova finestra e controlla i numeri delle regole.

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️⃣ Impostare il fuso orario su Ubuntu

Il fuso orario iniziale è Etc/UTC. Per allineare l'orario dei log e delle attività pianificate alla regione del server, questo server, creato nella regione di Singapore, è stato impostato su 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

Cambiano solo le righe Local time e Time zone; la sincronizzazione dell'orologio (NTP) e l'ora UTC restano uguali.

7️⃣ unattended upgrades: aggiornamenti di sicurezza automatici

Ubuntu installa gli aggiornamenti di sicurezza automaticamente con il pacchetto unattended-upgrades, già installato e attivo fin dall'inizio. Per questo, in questo passo controlli che sia attivo e cosa installa automaticamente.

🔲 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";

L'1 nei due valori significa una volta al giorno, e cambiandoli in 0 gli aggiornamenti automatici si disattivano. Cosa installare lo decide il file 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";

Tra le origini consentite c'è -security ma non -updates, quindi gli aggiornamenti normali non vengono installati automaticamente e si installano solo quelli di sicurezza. Per ricevere automaticamente anche gli aggiornamenti normali, togli il commento alla riga -updates in questo file.

🔲 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

Sono le ultime due righe della stessa esecuzione.

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 calcola solo cosa farebbe l'aggiornamento automatico, senza installare nulla. Dato che gli aggiornamenti dei pacchetti erano già stati fatti, ha indicato che non c'erano pacchetti da installare automaticamente. I log delle esecuzioni reali restano nella cartella /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️⃣ Configurare la memoria swap su Ubuntu

Questo server ha 1GB di memoria e all'inizio nessuno swap. Prima di metterci delle app, crea un file di swap da 2GB e registralo in /etc/fstab, così si attiva anche dopo un riavvio.

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 lo attiva solo per ora; per averlo attivo anche dopo un riavvio, aggiungi una riga a fstab.

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

9️⃣ Verifica della configurazione iniziale del server Ubuntu

Quando hai verificato che le impostazioni superano un riavvio, la configurazione iniziale di Ubuntu è completa.

🔲 systemctl reboot

sudo systemctl reboot

🔲 uptime -p

Dopo il riavvio, collegati di nuovo come 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

Swap, impostazioni SSH, firewall, fuso orario e aggiornamenti automatici sono tutti come prima del riavvio. Su questo server arriva poi un'app Node.js con PM2 e Nginx.

🔢 FAQ & contenuti consigliati

Puoi lasciarlo così. Un pacchetto escluso come [deferred due to phasing] è un aggiornamento in distribuzione graduale. Ubuntu rilascia alcuni aggiornamenti prima solo a una parte dei server e, se non ci sono problemi, estende la distribuzione a tutti. Gli aggiornamenti di sicurezza non vengono distribuiti in modo graduale, e il pacchetto escluso viene installato con l'aggiornamento successivo quando la distribuzione si allarga.

L'attività di aggiornamento automatico gira una volta al giorno, e i due timer apt-daily.timer e apt-daily-upgrade.timer la avviano con un ritardo casuale dopo un orario fisso. Su questo server la prossima esecuzione di apt-daily-upgrade.timer era fissata per il giorno dopo alle 06:27:59 (+08). Se il server è spento e salta quell'orario, l'attività può partire subito al successivo avvio, per cui le attività di apt a volte aspettano un momento subito dopo l'avvio.

Con le impostazioni predefinite no. Il valore predefinito di Automatic-Reboot in 50unattended-upgrades è false, e nemmeno nelle impostazioni di questo server quella riga è attiva. Quando viene installato un aggiornamento che richiede un riavvio, viene creato il file /var/run/reboot-required; riavvia tu il server quando quel file esiste.

ℹ️ Informativa sull'affiliazione
I contenuti di questo sito includono link di affiliazione. Se un visitatore acquista un prodotto o un servizio tramite uno di questi link, il sito riceve una commissione dal venditore. In questo processo l'importo pagato dall'acquirente (durante le promozioni l'importo scende↓) non aumenta. Prezzi, sconti e disponibilità indicati si riferiscono al momento della stesura e possono differire da quelli reali: prima di acquistare verifica sempre presso il venditore. I prodotti vengono scelti e valutati secondo criteri propri, e le commissioni non influiscono sull'ordine di presentazione né sul contenuto delle valutazioni.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Dimostra di essere umano: 6   +   10   =