Checklist post-installazione Linux: configurazione iniziale del server | INTROSERV
EUR
european

EUR

usa

USD

Italy It
Ex. VAT Ex. VAT 0%

Checklist post-installazione Linux: configurazione iniziale del server

Livello: Principiante / Intermedio
Tempo stimato: ~40 minuti
Obiettivo: Completare la configurazione iniziale essenziale di un server VPS Linux: rafforzare l'accesso SSH, creare un utente sudo, configurare un firewall, abilitare gli aggiornamenti di sicurezza automatici e pianificare le attività di manutenzione di base con cron.

Introduzione

I primi 30 minuti dopo il provisioning di un VPS sono i più importanti. Un server Linux appena installato è completamente esposto: il login come root via SSH è solitamente abilitato, non ci sono regole firewall attive e i pacchetti sono già obsoleti. Questa checklist post-installazione Linux copre tutti i passaggi rilevanti per preparare un ambiente pronto per la produzione o per lo sviluppo: dalla creazione di un utente sudo e la configurazione dell'autenticazione tramite chiave SSH, fino all'abilitazione di UFW e alla pianificazione degli aggiornamenti di sicurezza automatici. Seguire questa guida una volta ti protegge dai vettori di attacco più comuni prima di distribuire qualsiasi cosa sul server.

Questa guida copre le istanze VPS Ubuntu, Debian e AlmaLinux (compatibile con RHEL).

Prerequisiti

Prima di iniziare, assicurati che siano soddisfatte le seguenti condizioni:

  • Sistema operativo: Ubuntu 20.04/22.04/24.04 LTS, Debian 11/12/13 o AlmaLinux 8/9/10
  • Accesso: accesso SSH come root al server (password o chiave; lo rafforzerai nel corso della guida)
  • Macchina locale: client SSH disponibile (ssh su Linux/macOS, PuTTY o Windows Terminal su Windows)
  • Conoscenze richieste: utilizzo di base della riga di comando Linux: navigare tra le directory, modificare file con nano
  • Tempo stimato: ~40 minuti per una prima esecuzione pulita

Info

Questa guida è testata su Ubuntu 24.04 LTS, Debian 12/13 e AlmaLinux 9/10. I passaggi sono identici salvo diversa indicazione.

Passaggio 1: Impostare l'hostname del server

Un hostname corretto rende i log leggibili ed evita confusione nella gestione di più server.

Per prima cosa, aggiorna /etc/hosts in modo che il sistema possa risolvere localmente il nuovo hostname. Apri il file:

sudo nano /etc/hosts

Aggiungi o aggiorna la riga per 127.0.1.1 (o 127.0.0.1 se 127.0.1.1 non esiste) in modo che corrisponda al nuovo hostname. Ad esempio, se prevedi di usare web-01:

127.0.1.1 web-01

Salva ed esci (Ctrl+O, Invio, Ctrl+X).

Successivamente, imposta l'hostname a livello globale con hostnamectl:

sudo hostnamectl set-hostname <YOUR_HOSTNAME>

Verifica che sia stato applicato:

hostnamectl

Output atteso:

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

Tip

Molti servizi, tra cui Postfix (posta) e strumenti per certificati SSL come Certbot, dipendono dal fatto che l'hostname sia risolvibile localmente. Aggiornare /etc/hosts prima di eseguire hostnamectl evita errori di risoluzione difficili da individuare.

Passaggio 2: Aggiornare tutti i pacchetti

Esegui subito un aggiornamento completo del sistema. I pacchetti forniti con un'immagine VPS appena creata sono quasi sempre obsoleti.

Ubuntu/Debian (APT):

sudo apt update && sudo apt upgrade -y

AlmaLinux/RHEL (DNF):

sudo dnf update -y

Al termine dell'aggiornamento, verifica se è necessario un riavvio.

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

Se è richiesto un riavvio, riavvia ora prima di procedere: alcuni aggiornamenti del kernel e delle librerie hanno effetto solo dopo un riavvio:

sudo reboot

Warning

Saltare il riavvio quando è necessario significa che il kernel in esecuzione e alcune librerie restano alla versione precedente. Questo può lasciare vulnerabilità note non corrette anche dopo l'aggiornamento.

Passaggio 3: Creare un utente sudo

Accedere come root per il lavoro quotidiano non è sicuro ed è una cattiva pratica. Crea un utente normale e assegnagli i privilegi sudo.

3.1 Aggiungere l'utente

sudo adduser <YOUR_USERNAME>

Su Ubuntu/Debian, il comando ti chiederà di impostare una password e compilare campi di contatto facoltativi. Inserisci la password; salta il resto premendo Invio.

Su AlmaLinux/RHEL, adduser è un collegamento simbolico a useradd e viene eseguito in modo non interattivo senza richiedere una password, lasciando l'account bloccato. Devi impostare la password manualmente:

sudo passwd <YOUR_USERNAME>

3.2 Assegnare i privilegi sudo

Ubuntu/Debian - aggiungi l'utente al gruppo sudo:

sudo usermod -aG sudo <YOUR_USERNAME>

AlmaLinux/RHEL - aggiungi l'utente al gruppo wheel:

sudo usermod -aG wheel <YOUR_USERNAME>

3.3 Verificare l'accesso

Passa al nuovo utente e testa sudo:

su - <YOUR_USERNAME> sudo whoami

Output atteso:

root

Se vedi root, l'utente dispone di privilegi sudo funzionanti. Ora puoi uscire dalla sessione root:

exit

Info

Su AlmaLinux, l'appartenenza al gruppo wheel è definita in /etc/sudoers tramite la riga %wheel ALL=(ALL) ALL, abilitata per impostazione predefinita. Su Ubuntu/Debian, il gruppo sudo svolge la stessa funzione.

Passaggio 4: Configurare l'autenticazione tramite chiave SSH

L'SSH basato su password è vulnerabile agli attacchi di forza bruta. L'autenticazione tramite chiave SSH sostituisce la password con una coppia di chiavi crittografiche, molto più difficile da attaccare. Questa è una delle best practice più importanti che puoi applicare nella configurazione SSH.

4.1 Generare una coppia di chiavi SSH (sulla macchina locale)

Se non disponi già di una coppia di chiavi SSH, generane una sulla tua macchina locale (non sul server):

ssh-keygen -t ed25519 -C "<YOUR_USERNAME>@<YOUR_HOSTNAME>"

Accetta la posizione predefinita del file. Imposta una passphrase quando richiesto: questo protegge la chiave nel caso in cui la tua macchina locale venga compromessa.

Info

ed25519 è il tipo di chiave preferito. È più veloce, più corto e più sicuro del più vecchio rsa (2048 bit). Se il tuo client SSH non lo supporta, usa invece ssh-keygen -t rsa -b 4096.

4.2 Copiare la chiave pubblica sul server

Dalla tua macchina locale, copia la chiave nell'account del nuovo utente:

ssh-copy-id <YOUR_USERNAME>@<YOUR_SERVER_IP>

Se ssh-copy-id non è disponibile (ad esempio su Windows), copia manualmente il contenuto di ~/.ssh/id_ed25519.pub e aggiungilo in fondo a ~/.ssh/authorized_keys sul server.

4.3 Testare il login basato su chiave

Apri una nuova finestra del terminale (non chiudere ancora la sessione corrente) e testa il login:

ssh <YOUR_USERNAME>@<YOUR_SERVER_IP>

Dovresti accedere senza che ti venga chiesta una password (solo la passphrase della chiave, se ne hai impostata una).

Warning

Non chiudere la sessione SSH esistente finché non hai confermato che il login basato su chiave funziona. Se qualcosa è configurato male, avrai comunque la sessione esistente per risolverlo.

Passaggio 5: Rafforzare la configurazione SSH e disabilitare il login root

Confermato il login basato su chiave (Passaggio 4), blocca il demone SSH. Disabilitare il login root e l'autenticazione tramite password via SSH è uno dei passaggi più efficaci in qualsiasi checklist di hardening di un server Linux.

Su tutte e tre le distribuzioni, /etc/ssh/sshd_config contiene una riga Include /etc/ssh/sshd_config.d/*.conf vicino all'inizio del file, e SSH applica il primo valore che trova per ciascuna impostazione. I file drop-in del vendor sono già presenti e sovrascrivono qualsiasi cosa aggiungi in seguito nel file principale:

  • Ubuntu 24.04: 50-cloud-init.conf imposta PasswordAuthentication yes
  • AlmaLinux: 50-redhat.conf imposta X11Forwarding yes

Per questo motivo, modificare il file principale sshd_config non è affidabile. Crea invece un file drop-in di hardening con un numero basso (00-) in modo che venga letto per primo e sovrascriva i file del vendor. Lo stesso file funziona su tutte e tre le distribuzioni.

Crea il file 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

Un prefisso 00- garantisce che questo file venga analizzato prima dei drop-in del vendor come 50-cloud-init.conf e 50-redhat.conf. Poiché SSH applica il principio "vince la prima corrispondenza", non è necessario modificare quei file.

Convalida la sintassi della configurazione prima di riavviare il servizio:

sudo sshd -t

Se il comando non restituisce alcun output, la sintassi è valida. Ora verifica le impostazioni effettive che il demone utilizzerà realmente:

sudo sshd -T | grep -iE "permitrootlogin|passwordauthentication|x11forwarding"

Output atteso:

permitrootlogin no passwordauthentication no x11forwarding no

Warning

Conferma che tutti e tre i valori siano corretti prima di riavviare. Se passwordauthentication mostra ancora yes, un drop-in del vendor sta sovrascrivendo il tuo file: verifica che 00-hardening.conf sia stato salvato correttamente. Non chiudere la sessione SSH esistente finché non hai verificato che il login basato su chiave funzioni ancora.

Riavvia il demone SSH per applicare le modifiche.

Ubuntu 24.04 (attivazione tramite socket):

sudo systemctl restart ssh.socket

Debian e versioni precedenti di Ubuntu:

sudo systemctl restart ssh

AlmaLinux/RHEL:

sudo systemctl restart sshd

Verifica che il servizio sia in esecuzione (usa sshd su AlmaLinux, ssh.socket su Ubuntu 24.04):

sudo systemctl status ssh

Dovresti vedere Active: active (running) (o active (listening) per SSH attivato tramite socket).

Ora conferma che il login root sia bloccato. Dalla tua macchina locale:

ssh root@<YOUR_SERVER_IP>

Risultato atteso: la connessione viene rifiutata con Permission denied (publickey). Il login root via SSH è ora disabilitato.

Passaggio 6: Configurare il firewall (UFW)

UFW (Uncomplicated Firewall) è lo strumento firewall standard su Ubuntu e Debian. Su AlmaLinux, firewalld è l'opzione predefinita, ma anche UFW può essere installato lì. Questo passaggio copre entrambi gli approcci.

Warning

Prima di abilitare qualsiasi firewall, assicurati che SSH (porta 22) sia esplicitamente consentito. Un errore qui ti blocca fuori dal server.

6.1 UFW (Ubuntu/Debian)

Su Debian (specialmente Debian 13), ufw potrebbe non essere installato per impostazione predefinita. Installalo prima:

sudo apt update && sudo apt install -y ufw

Controlla lo stato attuale:

sudo ufw status

Consenti SSH prima di abilitare il firewall:

sudo ufw allow ssh

Consenti HTTP e HTTPS se prevedi di eseguire un server web:

sudo ufw allow http sudo ufw allow https

Abilita il firewall:

sudo ufw enable

Verifica le regole attive:

sudo ufw status verbose

Output atteso:

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)

Abilita e avvia firewalld:

sudo systemctl enable --now firewalld

Consenti SSH, HTTP e 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

Info

Configurare il firewall su Linux significa scegliere lo strumento giusto per la propria distribuzione e non eseguire due demoni firewall contemporaneamente. Se hai installato UFW su AlmaLinux, disabilita prima firewalld con sudo systemctl disable --now firewalld.

Passaggio 7: Sincronizzare l'orologio di sistema (NTP)

Un orario preciso è necessario per i protocolli di sicurezza (validazione SSL/TLS, Kerberos), timestamp dei log corretti e attività pianificate. Un orologio non sincronizzato può causare errori nei certificati SSL, autenticazioni fallite e voci di log confuse.

Controlla lo stato attuale della sincronizzazione:

timedatectl status

Output atteso:

System clock synchronized: yes NTP service: active

Info

Su Ubuntu 24.04 e Debian 13, NTP è tipicamente attivo tramite systemd-timesyncd. Su AlmaLinux 10, è solitamente attivo tramite chrony. Se timedatectl mostra System clock synchronized: yes e NTP service: active, non è necessario modificare nulla.

Se il servizio NTP risulta inattivo o n/a, installa e abilita chrony, il demone NTP consigliato per i server di produzione:

Ubuntu/Debian:

sudo apt install chrony -y sudo systemctl enable --now chrony

Tip

Su Debian 13, l'installazione di chrony potrebbe far sì che `timedatectl` mostri `NTP service: n/a`. Usa invece `chronyc tracking` per verificare.

AlmaLinux/RHEL:

sudo dnf install chrony -y sudo systemctl enable --now chronyd

Attendi 30-60 secondi dopo l'avvio del servizio, quindi verifica che la sincronizzazione sia attiva:

chronyc tracking

Cerca Leap status: Normal. Questo conferma che l'orologio di sistema è sincronizzato e NTP funziona correttamente.

Tip

Se gestisci server in più fusi orari, imposta il fuso orario di sistema prima di configurare NTP, in modo che i timestamp dei log siano nell'ora locale prevista. Esempio: sudo timedatectl set-timezone Europe/Warsaw.

Passaggio 8: Abilitare gli aggiornamenti di sicurezza automatici

Gli aggiornamenti manuali funzionano, ma dipendono dal fatto che tu ricordi di eseguirli. Gli aggiornamenti di sicurezza automatici sono una rete di sicurezza, particolarmente critica per le istanze VPS non presidiate. Ecco come configurare gli aggiornamenti di sicurezza automatici su Linux senza compromettere la stabilità.

8.1 Ubuntu/Debian - unattended-upgrades

Installa il pacchetto:

sudo apt install unattended-upgrades -y

Abilitalo e configuralo:

sudo dpkg-reconfigure --priority=low unattended-upgrades

Warning

È fondamentale selezionare Yes quando richiesto. Se selezioni No, il file di configurazione necessario (/etc/apt/apt.conf.d/20auto-upgrades) non verrà creato, e i controlli successivi falliranno con un errore "No such file or directory". Questo abilita solo l'installazione automatica degli aggiornamenti di sicurezza; gli aggiornamenti regolari delle funzionalità restano manuali.

Verifica la configurazione:

cat /etc/apt/apt.conf.d/20auto-upgrades

Output atteso:

APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1";

Per testare senza applicare modifiche:

sudo unattended-upgrade --dry-run --debug

8.2 AlmaLinux/RHEL - dnf-automatic

Installa:

sudo dnf install dnf-automatic -y

Apri il file di configurazione e imposta il tipo di aggiornamento solo su sicurezza. Prima, fai un backup:

sudo cp /etc/dnf/automatic.conf /etc/dnf/automatic.conf.bak sudo nano /etc/dnf/automatic.conf

Trova e imposta:

apply_updates = yes upgrade_type = security

Abilita e avvia il timer:

sudo systemctl enable --now dnf-automatic.timer

Verifica:

sudo systemctl status dnf-automatic.timer

Passaggio 9: Pianificare la manutenzione di base con Cron

Cron gestisce le attività pianificate, ovvero cose che devono avvenire regolarmente senza intervento manuale. Un semplice job cron per operazioni come la pulizia dei log o il controllo del rinnovo dei certificati è pratica standard su qualsiasi server gestito.

Preparazione per AlmaLinux/RHEL:

Su un sistema AlmaLinux 10 pulito, nano potrebbe non essere installato, e crontab -e aprirà vi. Per usare nano al suo posto, esegui questa singola riga per eseguirla correttamente in sequenza e assicurarti che la variabile d'ambiente persista:

sudo dnf install nano -y && export EDITOR=nano && crontab -e

Per altri sistemi (come Ubuntu/Debian), apri semplicemente il crontab dell'utente corrente:

crontab -e

Alla prima esecuzione (su Ubuntu/Debian), ti verrà chiesto di scegliere un editor. Seleziona nano (opzione 1).

Esempi comuni di job cron

Eseguire un'attività ogni notte alle 2:00:

0 2 * * * /usr/local/bin/my-maintenance-script.sh >> /var/log/maintenance.log 2>&1

Rinnovare i certificati SSL settimanalmente (per gli utenti di Certbot):

0 3 * * 0 certbot renew --quiet >> /var/log/certbot-renew.log 2>&1

Eliminare i file temporanei mensilmente:

0 4 1 * * find /tmp -type f -atime +30 -delete

Info

Cron utilizza il formato minuto ora giorno-del-mese mese giorno-della-settimana comando. La parte >> /var/log/task.log 2>&1 reindirizza sia stdout che stderr su un file di log, così puoi rivedere cosa è successo.

Verifica che i tuoi job cron siano registrati:

crontab -l

Dovresti vedere le voci che hai aggiunto. Cron legge il file automaticamente: non serve alcun ricaricamento. Per verificare se il servizio cron è in esecuzione, usa:

Ubuntu/Debian:

sudo systemctl status cron

AlmaLinux/RHEL:

sudo systemctl status crond

Verifica

Ripercorri questa checklist per confermare che tutto sia stato applicato correttamente:

Controlla l'hostname:

hostnamectl | grep hostname

Conferma che il login SSH come root e l'autenticazione tramite password siano disabilitati (questo verifica la configurazione attiva in runtime):

sudo sshd -T | grep -iE "permitrootlogin|passwordauthentication"

Atteso:

permitrootlogin no passwordauthentication no

Conferma che il servizio SSH sia in esecuzione:

# Per Ubuntu 24.04: sudo systemctl status ssh.socket # Per Debian / Ubuntu più vecchio: sudo systemctl status ssh # Per AlmaLinux: sudo systemctl status sshd

Controlla lo stato del firewall (Ubuntu/Debian):

sudo ufw status verbose

Controlla la sincronizzazione NTP:

timedatectl status | grep -E "synchronized|NTP"

Atteso:

System clock synchronized: yes NTP service: active

Controlla gli aggiornamenti automatici (Ubuntu/Debian):

cat /etc/apt/apt.conf.d/20auto-upgrades

Elenca i job cron attivi:

crontab -l

Rollback

Per annullare passaggi specifici in caso di problemi:

Riabilitare il login SSH come root (se sei rimasto bloccato fuori e stai recuperando tramite console):

# Riabilita temporaneamente il login root/password per il ripristino sudo rm /etc/ssh/sshd_config.d/00-hardening.conf sudo sshd -t # Riavvia SSH (usa la variante per il tuo sistema): sudo systemctl restart ssh.socket # Ubuntu 24.04 sudo systemctl restart ssh # Debian / Ubuntu più vecchio sudo systemctl restart sshd # AlmaLinux/RHEL

Disabilitare UFW:

sudo ufw disable

Rimuovere unattended-upgrades (Ubuntu/Debian):

sudo apt remove unattended-upgrades -y

Rimuovere dnf-automatic (AlmaLinux):

sudo systemctl disable --now dnf-automatic.timer sudo dnf remove dnf-automatic -y

Rimuovere un job cron:

crontab -e # Elimina la riga interessata, salva ed esci

Warning

Riabilitare il login root o l'autenticazione tramite password annulla gran parte dell'hardening di sicurezza effettuato in questa guida. Fallo solo temporaneamente per recuperare l'accesso, poi ripristina il blocco.

Conclusione

Questo copre l'intera checklist post-installazione Linux. Ora disponi di un server con un hostname corretto, pacchetti completamente aggiornati, un utente sudo non-root, autenticazione tramite chiave SSH configurata, login root disabilitato, un firewall configurato, NTP sincronizzato, aggiornamenti di sicurezza automatici in esecuzione e una pianificazione di job cron pronta per essere estesa. Questa è la configurazione di base di un server Linux dopo l'installazione che ogni VPS dovrebbe avere prima di distribuire qualsiasi altra cosa su di esso.

Da qui, i prossimi passaggi logici dipendono dallo scopo del server:

  • Server web: installa Nginx o Apache, configura un host virtuale e configura SSL con Certbot
  • Database: installa e rafforza MySQL/MariaDB o PostgreSQL
  • Monitoraggio: configura l'aggregazione dei log (ad esempio logrotate) o un agente di monitoraggio leggero
  • Controllo degli accessi: rivedi la configurazione di sudoers e aggiungi membri del team seguendo lo stesso schema del Passaggio 3

La checklist di configurazione iniziale di un server Linux non finisce qui: evolve man mano che cresce il ruolo del server. Ma questa base è il punto di partenza non negoziabile.

Versione del documento: 1.0
Ultimo aggiornamento: maggio 2026
Responsabile: Team di Documentazione Tecnica

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA