Salta al contenuto principale

Perché e Come Costruire un Server Domestico Sicuro

Inviato da enzo de simone il
cloud

Cari lettori, avvocati, commercialisti, geometri e professionisti di ogni settore. Quotidianamente maneggiamo dati sensibili: documenti legali, dichiarazioni dei redditi, progetti, cartelle cliniche, informazioni sui clienti. La comodità di averli sempre a portata di mano sul cellulare o da qualsiasi computer è ormai irrinunciabile.

La realtà è che nessun cloud è completamente sicuro. Le violazioni sono all'ordine del giorno e, spesso, vengono scoperte con mesi di ritardo, lasciando tutto il tempo necessario ai malintenzionati di fare ciò che vogliono con le nostre informazioni più preziose.

Il Paradosso della Sicurezza: Affidarsi agli Altri vs. Affidarsi a Sé Stessi

Da un lato, i grandi provider investono somme enormi in sicurezza. Dall'altro, sono bersagli enormi e appetitosi. La loro promessa di sicurezza è valida fino a quando un dipendente malintenzionato, un bug software zero-day o un attacco sofisticato non apre una crepa in quel sistema perfetto.

L'Alternativa: Il Server Domestico (o "Self-Hosted Cloud")

Immaginate un server, un computer sempre acceso e connesso a internet, che risiede fisicamente nel vostro ufficio o a casa vostra. Su questo server voi installate tutto il software necessario per:

  • Condividere e sincronizzare file (come Dropbox o Google Drive)

  • Gestire i contatti e il calendario

  • Accedere da remoto in massima sicurezza

  • Backup automatici dei vostri dispositivi


Vantaggi e Svantaggi

Vantaggi

  • Sovranità dei dati: I dati sono fisicamente sotto il vostro controllo

  • Privacy: Nessun fornitore di servizi può analizzarli per fini pubblicitari

  • Personalizzazione: Potete installare solo i servizi di cui avete bisogno

  • Costi prevedibili: Investimento iniziale e costi di gestione minimi

Svantaggi

  • Manutenzione: Richiede cura e aggiornamenti periodici

  • Banda internet: Serve una connessione decentemente veloce

  • Responsabilità: La sicurezza finale dipende dalle vostre configurazioni


Il Nostro Percorso: Costruiamo Insieme un Fortino Digitale

In questa serie di guide, trasformeremo un semplice computer nel vostro server personale fortificato. Useremo Debian 13 (Trixie), per la sua stabilità proverbiale e il vastissimo repository di software libero.

Roadmap del Percorso

1. La Scelta dell'Hardware

Come scegliere il PC giusto: prestazioni, consumo energetico, rumore. Riciclo di un vecchio PC o acquisto di un mini-computer?

2. L'Installazione di Debian

Prepariamo la chiavetta USB e installiamo Debian 13 con una configurazione minimale e sicura fin dal primo avvio.

3. La Sicurezza di Base

Il muro di cinta: configurazione del firewall, aggiornamenti automatici, disabilitazione degli accessi non necessari.

4. L'Accesso da Remoto Sicuro (SSH)

Come accedere al server da fuori casa in modo sicurissimo, utilizzando chiavi crittografiche invece delle password.

5. Reverse Proxy con Nginx

Come pubblicare in sicurezza i servizi web senza aprire mille porte sul firewall.

6. Il Cuore del Nostro Cloud: Nextcloud

Installazione e configurazione di Nextcloud, la suite che diventerà il vostro Dropbox, Google Calendar e Contacts privato.

7. Extra - Email e Backup

Accenni alla gestione della posta e, soprattutto, come impostare un sistema di backup robusto e automatico.


Server Domestico: La Scelta dell'Hardware - Puntata 2

Ben tornati nella nostra serie dedicata alla creazione di un server domestico sicuro. Nella prima puntata abbiamo visto perché vale la pena considerare questa soluzione alternativa al cloud pubblico. Oggi affrontiamo il primo step pratico: la scelta dell'hardware giusto per le nostre esigenze.

Obiettivo della puntata: Capire quali caratteristiche hardware cercare e valutare le diverse opzioni disponibili in base alle proprie esigenze e budget.

I Requisiti Fondamentali

Un server domestico non richiede hardware super potente, ma deve avere alcune caratteristiche specifiche:

1. Affidabilità e Stabilità

Il server dovrà rimanere acceso 24/7, quindi l'affidabilità è cruciale. Meglio evitare componenti economici di dubbia qualità.

2. Basso Consumo Energetico

Considerando che resterà sempre acceso, il consumo energetico inciderà sulla bolletta elettrica. Componenti a basso consumo sono da preferire.

3. Silenziosità

Se il server sarà posizionato in ambienti vissuti, la rumorosità potrebbe diventare fastidiosa. Ventole silenziose o sistemi passivi sono ideali.

4. Capacità di Archiviazione

Determinate quanto spazio vi serve ora e quanto potrebbe servirvi in futuro. Considerate sempre l'espandibilità.

Le Tre Opzioni Principali

Opzione 1: Riciclare un Vecchio PC

La soluzione più economica e ecologica.

Vantaggi:

  • Costo quasi nullo

  • Ecologico (riutilizzo)

  • Facilmente espandibile

Svantaggi:

  • Probabilmente alto consumo energetico

  • Spesso rumoroso

  • Ingombrante

Quando sceglierla: Se avete un PC non troppo vecchio (meno di 7-8 anni) e volete iniziare senza investire.

Opzione 2: Mini PC o Single-Board Computer

Soluzioni compatte come Intel NUC, Minisforum, o Raspberry Pi.

Vantaggi:

  • Bassissimo consumo energetico

  • Completamente silenziosi (nessuna ventola)

  • Piccoli e discreti

Svantaggi:

  • Limiti nelle espansioni

  • Prestazioni limitate

  • Costo non sempre basso

Quando sceglierla: Per servizi basici (cloud, backup, media center) o quando lo spazio è limitato.

Opzione 3: Hardware Specializzato NAS o Server

Dispositivi progettati specificamente come server domestici.

Vantaggi:

  • Ottimizzati per il ruolo

  • Alta affidabilità

  • Gestione semplificata

Svantaggi:

  • Costo elevato

  • Spesso chiusi e poco personalizzabili

  • Meno flessibili

Quando sceglierla: Se avete budget sufficiente e preferite una soluzione chiavi in mano.

Configurazione Consigliata per un Professionista

Per un professionista che gestisce documenti sensibili, una configurazione bilanciata potrebbe essere:

  • CPU: Processore dual-core o quad-core moderno (Intel i3 o equivalente)

  • RAM: 8GB DDR4 (espandibili a 16GB)

  • Archiviazione: 2 dischi da 2TB in RAID 1 (mirroring) per la redundanza

  • Rete: Gigabit Ethernet

  • Alimentazione: Alimentatore efficiente (80 Plus Bronze o superiore)

Consiglio tecnico: Per l'archiviazione dei dati, preferite sempre dischi NAS specifici (Western Digital Red, Seagate IronWolf) che sono progettati per funzionare 24/7 e offrono maggiore affidabilità.

Il Mio Setup Consigliato per Iniziare

Per chi vuole iniziare con un budget contenuto (200-300€):

  • Mini PC usato (Intel NUC di 6a/7a generazione)

  • 8GB di RAM

  • SSD da 256GB per il sistema operativo

  • HDD esterno da 1-2TB per i dati (da sostituire eventualmente con doppio disco interno in futuro)

Preparazione per la Prossima Puntata

Nella prossima puntata affronteremo l'installazione di Debian 13 sul nostro hardware. Per prepararvi:

  1. Assicuratevi di avere una chiavetta USB da almeno 8GB

  2. Scaricate l'immagine ISO di Debian 13 dal sito ufficiale

  3. Preparatevi a dedicare 1-2 ore per l'installazione


Obiettivo della puntata: Installare Debian 13 con una configurazione minimale e sicura, pronta per i successivi step di configurazione.

Preparazione dei strumenti necessari

Prima di iniziare, assicuratevi di avere:

  • Il computer che diventerà il vostro server

  • Una chiavetta USB da almeno 8GB

  • Un altro computer per preparare il supporto d'installazione

  • Connessione cablata alla rete (consigliata per l'installazione)

  • Monitor, tastiera e mouse (temporaneamente)

Scaricare l'immagine di Debian 13

Visitate il sito ufficiale di Debian e scaricate l'immagine ISO di Debian 13 (Trixie).

Consiglio: Scaricate la versione "netinst" (installazione da internet) che è più leggera e vi permetterà di scegliere solo i pacchetti necessari.

Creare la chiavetta USB avviabile

Su Windows:

  1. Scaricate e installate Rufus

  2. Inserite la chiavetta USB

  3. Avviate Rufus e selezionate l'immagine ISO di Debian scaricata

  4. Lasciate le impostazioni predefinite e cliccate "START"

Su macOS:

  1. Scaricate Balena Etcher

  2. Inserite la chiavetta USB

  3. Avviate Etcher, selezionate l'ISO e la chiavetta, poi cliccate "Flash!"

Su Linux:

  1. Inserite la chiavetta USB

  2. Identificate il dispositivo con lsblk o sudo fdisk -l

  3. Usate il comando dd (sostituite /dev/sdX con il vostro dispositivo):
    sudo dd if=debian-13.0.0-amd64-netinst.iso of=/dev/sdX bs=4M status=progress oflag=sync

Installazione di Debian 13

Ora siamo pronti per l'installazione:

  1. Inserite la chiavetta USB nel server

  2. Avviate il computer ed entrate nel BIOS/UEFI (di solito premendo F2, Canc o F12)

  3. Impostate la boot priority per avviare dalla chiavetta USB

  4. Riavviate e attendete il caricamento dell'installer di Debian

Configurazione durante l'installazione

Seguite questi passaggi nell'installer:

  • Lingua: Italiano

  • Posizione: Italia

  • Tastiera: Italiana

  • Hostname: Scegliete un nome per il vostro server (es. server-casa, server-azienda)

  • Domain name: Lasciate vuoto o usate "local"

  • Password di root: Impostate una password complessa e sicura

  • Utente: Create un utente normale (non usate root per le operazioni quotidiane)

  • Partizionamento: Scelta importante! Selezionate "Guided - use entire disk" e poi "Separate /home partition"

  • Mirror per pacchetti: Selezionate un mirror italiano (come debian.debian.it)

  • Software: Deselezionate tutto tranne "SSH server" e "standard system utilities"

  • GRUB: Installate il boot loader sul disco principale

Nota importante: L'approccio minimale nell'installazione è fondamentale per la sicurezza. installeremo solo ciò che ci serve realmente, riducendo la superficie di attacco.

Configurazione base post-installazione

Una volta completata l'installazione e riavviato il sistema:

  1. Collegatevi via SSH dal vostro computer principale (più comodo che lavorare direttamente sul server):
    ssh vostro-utente@indirizzo-ip-server

  2. Aggiornate il sistema:
    sudo apt update && sudo apt upgrade -y

  3. Installate alcuni tool utili:
    sudo apt install sudo curl wget ufw

Prepariamoci per la prossima puntata

Ora avete un sistema Debian 13 base installato e funzionante. Nella prossima puntata approfondiremo la configurazione della sicurezza di base:

  • Configurazione del firewall UFW

  • Disabilitazione degli accessi non necessari

  • Impostazione degli aggiornamenti automatici

  • Miglioramento delle policy di password

Verifica finale: Assicuratevi di poter accedere al server via SSH con il vostro utente (non come root) e che il sistema sia aggiornato.


Obiettivo della puntata: Implementare le fondamenta della sicurezza: firewall, aggiornamenti automatici, hardening degli accessi e configurazioni basilari per un server esposto a Internet.

1. Configurazione del firewall (UFW)

Un firewall è la prima linea di difesa. Debian include ufw (Uncomplicated Firewall), che semplifica la gestione di iptables.

Attivazione e configurazione base:

  1. Verificare che ufw sia installato: sudo apt install ufw

  2. Impostare le policy di default (rifiutare tutto in entrata, permettere tutto in uscita):

    sudo ufw default deny incoming
    sudo ufw default allow outgoing
  3. Permettere SSH (assicuratevi di non bloccarvi fuori!):

    sudo ufw allow ssh
  4. Attivare il firewall: sudo ufw enable

  5. Verificare le regole: sudo ufw status verbose

Attenzione: Assicuratevi di aver configurato l'accesso SSH correttamente prima di abilitare il firewall, altrimenti rischiate di bloccarvi fuori dal server!

2. Disabilitare l'accesso root via SSH

L'accesso diretto come root via SSH è un rischio per la sicurezza. Meglio disabilitarlo e usare sudo.

  1. Modificare il file di configurazione SSH:

    sudo nano /etc/ssh/sshd_config
  2. Trovare la linea #PermitRootLogin yes e modificarla in:

    PermitRootLogin no
  3. Riavviare il servizio SSH: sudo systemctl restart ssh

  4. Verificare di poter ancora accedere con il vostro utente normale prima di chiudere la sessione corrente

3. Aggiornamenti automatici di sicurezza

Mantenere il sistema aggiornato è cruciale per la sicurezza. Configuriamo aggiornamenti automatici:

  1. Installare unattended-upgrades:

    sudo apt install unattended-upgrades apt-listchanges
  2. Abilitare gli aggiornamenti automatici:

    sudo dpkg-reconfigure -plow unattended-upgrades

    Selezionare "Yes" quando richiesto.

  3. Configurare quali aggiornamenti applicare:

    sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

    Modificare le linee relevanti per abilitare gli aggiornamenti di sicurezza:

    Unattended-Upgrade::Origins-Pattern {
            "origin=Debian,codename=${distro_codename},label=Debian-Security";
    };
  4. Verificare il funzionamento: sudo unattended-upgrades --dry-run --debug

4. Configurare un firewall aggiuntivo con fail2ban

Fail2ban protegge da attacchi brute force monitorando i log e bloccando IP sospetti.

  1. Installare fail2ban: sudo apt install fail2ban

  2. Creare una configurazione locale:

    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  3. Modificare la configurazione base:

    sudo nano /etc/fail2ban/jail.local

    Cercare la sezione [sshd] e modificare:

    [sshd]
    enabled = true
    port = ssh
    logpath = /var/log/auth.log
    maxretry = 3
    bantime = 3600
  4. Riavviare fail2ban: sudo systemctl restart fail2ban

  5. Verificare lo status: sudo fail2ban-client status sshd

5. Hardening aggiuntivo

Disabilitare servizi non necessari:

sudo systemctl list-unit-files --state=enabled
# Disabilitare servizi non necessari, ad esempio:
sudo systemctl disable avahi-daemon

Configurare il motore di randomizzazione:

sudo apt install haveged
sudo systemctl enable haveged

Controllare i permessi dei file sensibili:

sudo chmod 600 /etc/shadow
sudo chmod 600 /etc/gshadow

6. Verifica della configurazione di sicurezza

Dopo tutte queste modifiche, verifichiamo che tutto funzioni correttamente:

  1. Riavvio del server: sudo reboot

  2. Verifica di poter accedere via SSH con il proprio utente

  3. Controllo dello stato dei servizi:

    sudo systemctl status ufw
    sudo systemctl status fail2ban
    sudo systemctl status unattended-upgrades
  4. Verifica degli aggiornamenti di sicurezza: sudo unattended-upgrades --dry-run

Ricordate: La sicurezza non è un prodotto ma un processo. Queste configurazioni sono la base, ma dovrebbero essere integrate con monitoraggio regolare e aggiornamenti periodici.

Prepariamoci per la prossima puntata

Ora il nostro server ha una solida base di sicurezza. Nel prossimo articolo affronteremo l'accesso remoto sicuro con SSH, includendo:

  • Autenticazione con chiavi crittografiche invece delle password

  • Configurazione avanzata di SSH per maggiore sicurezza

  • Accesso tramite tunnel sicuri

  • Impostazione di una VPN domestica


Obiettivo della puntata: Configurare SSH per un accesso remoto massimamente sicuro, utilizzando autenticazione a chiavi crittografiche, porte non standard e tecniche avanzate di hardening.

1. Perché rafforzare SSH è cruciale

SSH (Secure Shell) è il metodo principale per accedere al server da remoto, ma è anche un obiettivo comune per attacchi brute force. Ecco perché dobbiamo renderlo il più sicuro possibile:

  • Gli attacchi brute force a SSH sono tra i più comuni su Internet

  • Un accesso SSH compromesso significa controllo completo del server

  • Configurazioni predefinite spesso non sono sufficientemente sicure

2. Autenticazione a chiavi crittografiche

L'autenticazione con chiavi è molto più sicura delle password. Ecco come configurarla:

Generare una coppia di chiavi (sul client):

  1. Su Linux/macOS: Aprire un terminale e digitare:

    ssh-keygen -t ed25519 -a 100 -C "commento per identificare la chiave"
  2. Su Windows (con WSL o Git Bash): Stesso comando

  3. Scegliere una passphrase complessa quando richiesto (non lasciare vuota)

Copiare la chiave pubblica sul server:

  1. Metodo semplice con ssh-copy-id:

    ssh-copy-id -i ~/.ssh/id_ed25519.pub il_tuo_utente@indirizzo_server
  2. Metodo manuale (se ssh-copy-id non funziona):

    cat ~/.ssh/id_ed25519.pub | ssh il_tuo_utente@indirizzo_server "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Disabilitare l'autenticazione via password (sul server):

  1. Modificare il file di configurazione SSH:

    sudo nano /etc/ssh/sshd_config
  2. Trovare e modificare queste linee:

    PasswordAuthentication no
    PubkeyAuthentication yes
  3. Riavviare il servizio SSH: sudo systemctl restart ssh

  4. Importante: Verificare di poter accedere con le chiavi prima di chiudere la sessione corrente

3. Cambiare la porta SSH

Cambiare la porta SSH standard (22) riduce notevolmente gli attacchi automatici:

  1. Modificare il file di configurazione:

    sudo nano /etc/ssh/sshd_config
  2. Trovare la linea #Port 22 e modificarla in:

    Port 2222  # Scegliere una porta tra 1024 e 65535
  3. Aggiornare il firewall per permettere la nuova porta:

    sudo ufw allow 2222/tcp
    sudo ufw deny ssh  # Blocca la porta 22
  4. Riavviare SSH: sudo systemctl restart ssh

  5. Per connettersi alla nuova porta:

    ssh -p 2222 il_tuo_utente@indirizzo_server

Nota: Cambiare porta non è sicurezza tramite oscuramento, ma riduce drasticamente il rumore nei log dagli attacchi automatici.

4. Configurazione avanzata di SSH

Altre importanti opzioni di sicurezza nel file /etc/ssh/sshd_config:

# Disabilita login root
PermitRootLogin no

# Limita gli utenti che possono connettersi via SSH
AllowUsers il_tuo_utente altro_utente_autorizzato

# Numero massimo di tentativi di login
MaxAuthTries 3

# Timeout per login lenti
LoginGraceTime 30

# Disabilita forwarding X11 (a meno non serva)
X11Forwarding no

# Disabilita altri forwarding non necessari
AllowTcpForwarding no
AllowStreamLocalForwarding no

# Configurazione cifrari, MAC e algoritmi di scambio chiave
KexAlgorithms curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com

5. Utilizzare un client SSH configurato correttamente

Anche il client deve essere configurato per la massima sicurezza:

Configurazione del client SSH (~/.ssh/config):

Host myserver
    HostName indirizzo_ip_server
    Port 2222
    User il_tuo_utente
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60
    ServerAliveCountMax 3

Dopo questa configurazione, potrete connettervi semplicemente con: ssh myserver

6. Monitoraggio e mantenimento

Dopo aver configurato SSH, è importante monitorarne gli accessi:

  1. Controllare i log di autenticazione:

    sudo grep "ssh" /var/log/auth.log | tail -20
  2. Verificare gli accessi correnti:

    who
    last
  3. Controllare lo stato di fail2ban per SSH:

    sudo fail2ban-client status sshd

7. Accesso tramite smartphone

Per accedere al server dallo smartphone:

  • Android: App Termux o ConnectBot

  • iOS: App Termius o Prompt

  • Importare la chiave privata nell'app scelta

  • Utilizzare sempre connessioni sicure (evitare reti Wi-Fi pubbliche non affidabili)

Consiglio avanzato: Per accesso ancor più sicuro, considerare l'uso di un bastion host o VPN, che affronteremo in una puntata futura.


Obiettivo della puntata: Configurare Nginx come reverse proxy per esporre servizi web interni in modo sicuro, gestire certificati SSL e organizzare l'accesso a più servizi sotto un unico dominio.

1. Cos'è un reverse proxy e perché è importante

Un reverse proxy è un server che si frappone tra i client e i server interni, offrendo numerosi vantaggi:

  • Sicurezza: Nasconde l'infrastruttura interna

  • SSL Termination: Gestisce la cifratura SSL una volta sola

  • Compressione: Comprime i dati per velocizzare il trasferimento

  • Load Balancing: Distribuisce il carico tra più server

  • Flessibilità: Permette di esporre servizi su porte diverse tramite un unico punto di ingresso

2. Installazione di Nginx

Iniziamo installando Nginx sul nostro server Debian:

  1. Aggiornare la lista dei pacchetti:

    sudo apt update
  2. Installare Nginx:

    sudo apt install nginx
  3. Verificare che Nginx sia attivo:

    sudo systemctl status nginx
  4. Se necessario, abilitare Nginx al boot:

    sudo systemctl enable nginx
  5. Aprire la porta HTTP (80) e HTTPS (443) sul firewall:

    sudo ufw allow 'Nginx Full'

3. Configurazione base di Nginx

La configurazione di Nginx si trova in /etc/nginx/. I file di configurazione dei siti sono in /etc/nginx/sites-available/ e si abilitano creando un link simbolico in /etc/nginx/sites-enabled/.

Struttura di base di un file di configurazione:

server {
    listen 80;
    server_name tuodominio.com www.tuodominio.com;
    
    # Cartella dove verranno serviti i file statici
    root /var/www/tuodominio.com/html;
    
    index index.html index.htm index.nginx-debian.html;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

4. Configurare Nginx come reverse proxy

Supponiamo di avere un servizio web interno in ascolto sulla porta 8080. Ecco come esporlo tramite Nginx:

server {
    listen 80;
    server_name tuodominio.com www.tuodominio.com;
    
    location / {
        # Impostare l'IP e la porta del servizio interno
        proxy_pass http://localhost:8080;
        
        # Headers importanti per il corretto funzionamento
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Timeout
        proxy_connect_timeout 30;
        proxy_send_timeout 30;
        proxy_read_timeout 30;
    }
}

5. Configurazione di Let's Encrypt per HTTPS

Ora aggiungiamo il supporto HTTPS gratuito con Let's Encrypt:

  1. Installare Certbot e il plugin per Nginx:

    sudo apt install certbot python3-certbot-nginx
  2. Ottenere un certificato SSL (sostituire con il vostro dominio):

    sudo certbot --nginx -d tuodominio.com -d www.tuodominio.com
  3. Verificare il rinnovo automatico:

    sudo certbot renew --dry-run

6. Configurazione avanzata del reverse proxy

Ecco una configurazione più avanzata e sicura per il nostro reverse proxy:

server {
    listen 80;
    server_name tuodominio.com www.tuodominio.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name tuodominio.com www.tuodominio.com;
    
    # Path ai certificati SSL (generati da Certbot)
    ssl_certificate /etc/letsencrypt/live/tuodominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/tuodominio.com/privkey.pem;
    
    # Configurazione SSL avanzata
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    
    # HSTS (HTTP Strict Transport Security)
    add_header Strict-Transport-Security "max-age=63072000" always;
    
    location / {
        proxy_pass http://localhost:8080;
        
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Timeout
        proxy_connect_timeout 30;
        proxy_send_timeout 30;
        proxy_read_timeout 30;
    }
    
    # Bloccare l'accesso a file nascosti
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
}

7. Gestire più servizi con un unico server

Se abbiamo più servizi, possiamo esporli tramite path diversi:

server {
    listen 443 ssl;
    server_name tuodominio.com;
    
    # ... configurazione SSL ...
    
    # Servizio principale
    location / {
        proxy_pass http://localhost:8080;
        # ... altre impostazioni proxy ...
    }
    
    # Altro servizio su un path specifico
    location /servizio2/ {
        proxy_pass http://localhost:8081/;
        # ... altre impostazioni proxy ...
    }
    
    # API interna
    location /api/ {
        proxy_pass http://localhost:3000/;
        # ... altre impostazioni proxy ...
    }
}

8. Test e troubleshooting

Dopo aver configurato Nginx, è importante testare e verificare il tutto:

  1. Verificare la sintassi del file di configurazione:

    sudo nginx -t
  2. Ricaricare la configurazione di Nginx:

    sudo systemctl reload nginx
  3. Controllare i log di Nginx per errori:

    sudo tail -f /var/log/nginx/error.log
  4. Verificare che i servizi siano raggiungibili:

    curl -I https://tuodominio.com

Consiglio: Utilizzare SSL Labs per testare la configurazione SSL del vostro server.

9. Ottimizzazioni prestazionali

Alcune ottimizzazioni per migliorare le prestazioni di Nginx:

# Aumentare il numero di worker processes
worker_processes auto;

# Ottimizzazioni per SSL
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

# Compressione Gzip
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

Prepariamoci per la prossima puntata

Ora abbiamo un reverse proxy funzionante che ci permette di esporre servizi in modo sicuro. Nel prossimo articolo installeremo Nextcloud, la soluzione completa per il cloud privato:

  • Installazione e configurazione di Nextcloud

  • Integrazione con il reverse proxy Nginx

  • Configurazione del database

  • Ottimizzazioni per Nextcloud


Obiettivo della puntata: Installare e configurare Nextcloud, integrandolo con il nostro reverse proxy Nginx e preparandolo per essere il sostituto privato di servizi come Dropbox, Google Drive e Microsoft Office Online.

1. Perché Nextcloud?

Nextcloud è la soluzione open source più completa per un cloud privato. Ecco cosa offre:

  • File storage e sincronizzazione (alternativa a Dropbox/Google Drive)

  • Calendar e Contacts (sostituto di Google Calendar/Contacts)

  • Collaborazione documenti online (simile a Google Docs/Office Online)

  • Galleria foto automatica con riconoscimento facciale

  • Note, Task e tantissime altre app attraverso l'ecosistema di estensioni

  • Completamente auto-ospitato e sotto il vostro controllo

2. Preparazione dell'ambiente

Prima di installare Nextcloud, prepariamo l'ambiente con tutti i requisiti necessari:

Installazione dei pacchetti necessari:

sudo apt update
sudo apt install php-fpm php-common php-mbstring php-xmlrpc php-soap php-apcu php-smbclient php-ldap php-redis php-gd php-xml php-intl php-json php-imagick php-mysql php-cli php-curl php-zip php-sqlite3

Installazione e configurazione di MariaDB (MySQL):

sudo apt install mariadb-server
sudo mysql_secure_installation

Creazione del database per Nextcloud:

sudo mysql -u root -p
# Nel prompt di MySQL eseguire:
CREATE DATABASE nextcloud;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'password_molto_sicura';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

3. Download e installazione di Nextcloud

Scarichiamo l'ultima versione di Nextcloud:

cd /var/www
sudo wget https://download.nextcloud.com/server/releases/latest.zip
sudo unzip latest.zip
sudo rm latest.zip
sudo chown -R www-data:www-data /var/www/nextcloud
sudo chmod -R 755 /var/www/nextcloud

4. Configurazione di Nginx per Nextcloud

Creiamo un file di configurazione Nginx per Nextcloud:

sudo nano /etc/nginx/sites-available/nextcloud

Incollare la seguente configurazione (adattando il server_name al vostro dominio):

upstream php-handler {
    server unix:/run/php/php8.2-fpm.sock;
}

server {
    listen 80;
    server_name cloud.tuodominio.com;
    
    # Redirect HTTP to HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name cloud.tuodominio.com;
    
    # SSL configuration (usare i certificati di Let's Encrypt)
    ssl_certificate /etc/letsencrypt/live/cloud.tuodominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cloud.tuodominio.com/privkey.pem;
    
    # Path to the root of your Nextcloud installation
    root /var/www/nextcloud;
    
    # Add headers to serve security related headers
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header Referrer-Policy no-referrer;
    
    # Set max upload size
    client_max_body_size 10G;
    
    # Enable gzip but do not remove ETag headers
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    
    # Pagespeed is not supported by Nextcloud, so disable it
    pagespeed off;
    
    location = / {
        if ( $http_user_agent ~ ^DavClnt ) {
            return 302 /remote.php/webdav/$is_args$args;
        }
    }
    
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
    
    # Make a regex exception for `/.well-known` so that clients can still
    # access it despite the existence of the regex rule
    # `location ~ /(\.|autotest|...)` which would otherwise handle requests
    # for `/.well-known`.
    location ^~ /.well-known {
        # The rules in this block are an adaptation of the rules
        # in `.htaccess` that concern `/.well-known`.
        
        location = /.well-known/carddav { return 301 /remote.php/dav/; }
        location = /.well-known/caldav  { return 301 /remote.php/dav/; }
        
        location /.well-known/acme-challenge    { try_files $uri $uri/ =404; }
        location /.well-known/pki-validation    { try_files $uri $uri/ =404; }
        
        # Let Nextcloud's API for `/.well-known` URIs handle all other
        # requests by passing them to the front-end controller.
        return 301 /index.php$request_uri;
    }
    
    # Rules borrowed from `.htaccess` to hide certain paths from clients
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                { return 404; }
    
    # Ensure this block, which passes PHP files to the PHP process, is above the blocks
    # handling static assets (as seen below). If this block is not declared first,
    # then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`
    # to the URI, resulting in a HTTP 500 error response.
    location ~ \.php(?:$|/) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        set $path_info $fastcgi_path_info;
        
        try_files $fastcgi_script_name =404;
        
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_param HTTPS on;
        
        fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
        fastcgi_param front_controller_active true;     # Enable pretty urls
        fastcgi_pass php-handler;
        
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }
    
    location ~ \.(?:css|js|svg|gif)$ {
        try_files $uri /index.php$request_uri;
        expires 6M;         # Cache-Control policy borrowed from `.htaccess`
        access_log off;     # Optional: Don't log access to assets
    }
    
    location ~ \.woff2?$ {
        try_files $uri /index.php$request_uri;
        expires 7d;         # Cache-Control policy borrowed from `.htaccess`
        access_log off;     # Optional: Don't log access to assets
    }
    
    # Rule borrowed from `.htaccess`
    location /remote {
        return 301 /remote.php$request_uri;
    }
    
    location / {
        try_files $uri $uri/ /index.php$request_uri;
    }
}

Abilitare il sito e testare la configurazione:

sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

5. Installazione via Web

Ora completiamo l'installazione attraverso l'interfaccia web:

  1. Aprire il browser e visitare https://cloud.tuodominio.com

  2. Creare un account amministratore con username e password sicuri

  3. Configurare la connessione al database:

    • Tipo database: MySQL/MariaDB

    • Utente database: nextclouduser

    • Password database: la password scelta in precedenza

    • Nome database: nextcloud

    • Host database: localhost

  4. Cliccare su "Installa" e attendere il completamento

6. Configurazioni post-installazione

Configurazione di Redis per le performance (opzionale ma consigliato):

sudo apt install redis-server
sudo nano /var/www/nextcloud/config/config.php

Aggiungere queste righe alla configurazione (prima della parentesi finale):

'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' => [
    'host' => 'localhost',
    'port' => 6379,
],

Configurazione di Cron per le operazioni in background:

sudo crontab -u www-data -e

Aggiungere la riga (assicurarsi di sostituire il percorso se diverso):

*/5  *  *  *  * php -f /var/www/nextcloud/cron.php

7. App e funzionalità aggiuntive

Nextcloud ha un ecosistema di app che potete installare per estenderne le funzionalità:

  • Calendar e Contacts per gestire agenda e contatti

  • Notes per appunti testuali

  • Tasks per la gestione delle attività

  • Collabora Online per l'editing collaborativo di documenti

  • Talk per chat e videochiamate

  • Photos per la galleria foto con riconoscimento facciale

8. Client desktop e mobile

Nextcloud offre client per tutti i dispositivi:

  • Desktop: Client per Windows, macOS e Linux per sincronizzare i file

  • Mobile: App per iOS e Android per accedere ai file, calendario, contatti

  • WebDAV: Accesso diretto via WebDAV da qualsiasi client compatibile

9. Manutenzione e backup

Ecco alcuni comandi utili per la manutenzione:

# Modalità manutenzione
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on

# Disattivare modalità manutenzione
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off

# Aggiornare Nextcloud
sudo -u www-data php /var/www/nextcloud/occ upgrade

# Vedere lo stato del sistema
sudo -u www-data php /var/www/nextcloud/occ status

Consiglio: Configurate un backup regolare della cartella /var/www/nextcloud e del database Nextcloud per non perdere i vostri dati.

Prepariamoci per la prossima puntata

Ora abbiamo un cloud privato completo e funzionante! Nel prossimo articolo, che sarà l'ultimo della serie, parleremo di backup e manutenzione avanzata:

  • Strategie di backup per i dati e la configurazione

  • Monitoraggio del server

  • Manutenzione periodica

  • Aggiornamenti di sicurezza


Obiettivo della puntata: Implementare un sistema di backup affidabile per tutti i nostri dati e servizi, e comprendere le basi dell'hosting email autonomo con i suoi pro e contro.

1. Perché il backup è fondamentale

Il backup dei dati è spesso trascurato fino a quando non si verifica un disastro. Ecco perché è essenziale:

  • Protezione da guasti hardware: I dischi rigidi hanno una vita limitata

  • Protezione da errori umani: Cancellazioni accidentali o configurazioni errate

  • Protezione da malware e ransomware: Attacchi che possono cifrare o danneggiare i dati

  • Conformità: Molte professioni richiedono backup regolari dei dati clienti

Regola d'oro del backup 3-2-1: Mantenere 3 copie dei dati, su 2 supporti diversi, di cui 1 conservata off-site.

2. Strategia di backup completa

Implementiamo una strategia a più livelli per proteggere tutti i nostri dati:

Backup dei dati utente (Nextcloud):

# Script per backup Nextcloud (nextcloud-backup.sh)
#!/bin/bash

# Configurazione
BACKUP_DIR="/backup/nextcloud"
DATE=$(date +%Y%m%d_%H%M%S)
NC_DIR="/var/www/nextcloud"
DB_USER="nextclouduser"
DB_PASS="password_molto_sicura"
DB_NAME="nextcloud"

# Creazione directory backup
mkdir -p $BACKUP_DIR/$DATE

# Modalità manutenzione Nextcloud
sudo -u www-data php $NC_DIR/occ maintenance:mode --on

# Backup database
mysqldump --single-transaction -h localhost -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/$DATE/nextcloud-sqlbkp_$DATE.bak

# Backup file Nextcloud
rsync -Aavx $NC_DIR/ $BACKUP_DIR/$DATE/nextcloud-dirbkp/

# Disattivazione modalità manutenzione
sudo -u www-data php $NC_DIR/occ maintenance:mode --off

# Eliminazione backup più vecchi di 30 giorni
find $BACKUP_DIR/* -type d -ctime +30 -exec rm -rf {} \;

echo "Backup completato: $BACKUP_DIR/$DATE"

Automazione del backup con Cron:

# Aggiungere al crontab (sudo crontab -e)
0 2 * * * /path/to/nextcloud-backup.sh

3. Backup configurazioni del server

Oltre ai dati, è cruciale backup delle configurazioni:

# Script per backup configurazioni (config-backup.sh)
#!/bin/bash

# Directory backup
BACKUP_DIR="/backup/config"
DATE=$(date +%Y%m%d)
CONFIG_BACKUP="$BACKUP_DIR/server-config_$DATE.tar.gz"

# Elenco directory importanti da backupare
tar -czf $CONFIG_BACKUP \
  /etc/nginx \
  /etc/ssh \
  /etc/letsencrypt \
  /etc/fail2ban \
  /home/*/.ssh \
  /root/.ssh \
  /var/log \
  2>/dev/null

# Eliminazione backup più vecchi di 90 giorni
find $BACKUP_DIR/* -type f -ctime +90 -exec rm -rf {} \;

echo "Backup configurazioni completato: $CONFIG_BACKUP"

4. Soluzioni di backup off-site

Implementiamo backup esterni per la regola 3-2-1:

Utilizzo di Rclone per backup cloud:

# Installazione Rclone
curl https://rclone.org/install.sh | sudo bash

# Configurazione (seguire il wizard)
rclone config

# Sincronizzazione backup con cloud esterno
rclone sync /backup/nextcloud remote:backup-server -P --transfers 10

Backup su disco esterno:

# Script per backup su disco esterno (external-backup.sh)
#!/bin/bash

# Verifica se il disco esterno è montato
if mountpoint -q /mnt/backup-disk; then
    rsync -av --delete /backup/ /mnt/backup-disk/
    echo "Backup su disco esterno completato"
else
    echo "Disco esterno non montato"
fi

5. Introduzione all'email self-hosted

Hosting della propria email è complesso ma possibile. Ecco cosa considerare:

Avvertenza: L'email self-hosted è avanzato e richiede manutenzione costante. Molti provider bloccano email da server residenziali. Valutate soluzioni ibride.

Componenti di un server email:

  • MTA (Mail Transfer Agent): Postfix, Exim

  • MDA (Mail Delivery Agent): Dovecot

  • Filtri antispam: SpamAssassin, Rspamd

  • Filtri antivirus: ClamAV

  • Webmail: Roundcube, RainLoop

6. Configurazione email base con Postfix e Dovecot

Installazione minima per testing o uso interno:

# Installazione pacchetti base
sudo apt install postfix dovecot-imapd dovecot-pop3d

# Durante l'installazione di Postfix, selezionare "Internet Site"
# e inserire il vostro dominio

Configurazione base Postfix (main.cf):

# /etc/postfix/main.cf
myhostname = mail.tuodominio.com
mydomain = tuodominio.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
home_mailbox = Maildir/

Configurazione base Dovecot:

# /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir

7. Soluzioni ibride per l'email

Per evitare problemi di deliverability, considerate soluzioni ibride:

  • Incoming: Usare il vostro server per ricevere email

  • Outgoing: Usare un servizio SMTP relay come SendGrid, Mailgun o Amazon SES

  • Vantaggi: Maggiore affidabilità nell'invio e meno rischi di blacklist

8. Monitoraggio e manutenzione del server

Strumenti per tenere sotto controllo il server:

Installazione di Cockpit per gestione web:

sudo apt install cockpit
sudo systemctl enable --now cockpit.socket
sudo ufw allow 9090

Monitoraggio con netdata:

bash <(curl -Ss https://my-netdata.io/kickstart.sh)
sudo ufw allow 19999

Script di manutenzione automatica:

# Script manutenzione (maintenance.sh)
#!/bin/bash

# Aggiornamento sistema
apt update && apt upgrade -y

# Pulizia pacchetti non necessari
apt autoremove -y
apt autoclean -y

# Rotazione log
logrotate -f /etc/logrotate.conf

# Riavvio servizi principali
systemctl restart nginx
systemctl restart php8.2-fpm
systemctl restart mysql

9. Checklist di manutenzione regolare

  • Giornaliera: Verifica backup, controlla log, verifica spazio disco

  • Settimanale: Aggiornamento pacchetti, pulizia system, verifica sicurezza

  • Mensile: Test restore backup, verifica certificati SSL, audit sicurezza

  • Trimestrale: Verifica hardware, aggiornamento major software, review configurazioni

10. Conclusioni della serie

In questa serie abbiamo costruito insieme un server domestico completo e sicuro:

  1. Valutazione hardware e pianificazione

  2. Installazione di Debian 13

  3. Configurazione della sicurezza di base

  4. Accesso remoto sicuro con SSH

  5. Reverse proxy con Nginx e SSL

  6. Installazione di Nextcloud come cloud privato

  7. Backup e soluzioni email (questa puntata)

Ora avete un sistema completo sotto il vostro controllo, che rispetta la vostra privacy e vi libera dai servizi cloud commerciali.

Ricordate: Un server richiede manutenzione costante. dedicate del tempo ogni mese per verificare che tutto funzioni correttamente e che i backup siano integri.

Risorse utili