Una volta installato il sistema operativo è il momento di mettere in sicurezza il tuo nodo. Sebbene il Full Node possa funzionare anche senza queste configurazioni, applicarle fin da subito riduce notevolmente la superficie di attacco e permette di amministrarlo in modo più sicuro nel tempo.

Configurazione SSH (Secure Shell)

SSH (Secure Shell) è il principale strumento utilizzato per amministrare il tuo nodo da remoto. Per impostazione predefinita, però, permette l’accesso tramite password e utilizza una configurazione comune che può essere presa di mira da tentativi automatizzati.

Prima di procedere con le configurazioni successive è consigliato rendere l’accesso SSH più sicuro applicando alcune buone pratiche:

  • utilizzo dell’autenticazione tramite chiave SSH al posto delle password;
  • modifica della porta predefinita per ridurre gli attacchi automatizzati;
  • disabilitazione dell’accesso diretto dell’utente root.

Accesso tramite chiave SSH

Prima di procedere con la modifica del file di configurazione SSH, genera una coppia di chiavi:

  • Windows:
  • Scarica PuTTYgen 64 bit x86 o 32 bit x86 a seconda dell’architettura del tuo sistema operativo.
  • Avvia PuTTYgen e clicca sul pulsante “Generate”, muovi il mouse sulla finestra fino al termine dell’avanzamento della barra.
  • Inserisci un commento personalizzato su “Key comment” (es. chiave-nodo) ed aggiungi e conferma la Password [ C ] impostata in precedenza all’interno del campo “Key passphrase”
  • Clicca su:
    • “Save public key” ed assegnagli un nome (es. chiave_nodo_pub.txt)
    • “Save private key” ed assegnagli un nome (es. chiave_nodo_priv), salva la chiave in un luogo sicuro. La chiave privata non deve mai essere copiata sul nodo o condivisa con altre persone.
  • Apri il file della chiave pubblica salvato in precedenza e copia tutto il contenuto
  • macOS e/o Linux:
  • Apri il terminale ed esegui il comando: ssh-keygen -t ed25519 -f ~/.ssh/chiave-nodo (puoi personalizzare il nome della chiave a tuo piacimento)
  • Quando richiesto inserisci la Password [ C ] impostata in precedenza
  • Salva la chiave in un luogo sicuro. La chiave privata non deve mai essere copiata sul nodo o condivisa con altre persone.
  • Copia il contenuto della chiave pubblica con il comando: cat ~/.ssh/chiave-nodo.pub

Accedi al tuo nodo con l’utente giuseppe e crea la cartella che conterrà la chiave pubblica:

mkdir -p ~/.ssh

Limita i permessi della cartella .ssh, permettendo l’accesso solamente al proprietario:

chmod 700 ~/.ssh

Crea un file chiamato “authorized_keys” dove incollare le informazioni della chiave pubblica:

nano ~/.ssh/authorized_keys

Incolla il contenuto della chiave pubblicata salvata in precedenza e salva con CTRL+O ed esci con CTRL+X .

Limita i permessi di lettura e scrittura solo per il tuo utente:

chmod 600 ~/.ssh/authorized_keys

Prima di chiudere la sessione SSH attuale, apri una nuova connessione utilizzando la chiave privata generata in precedenza e verifica che l’accesso funzioni correttamente. Non procedere con lo step successivo finché non hai verificato il corretto funzionamento della chiave SSH.

  • Windows:
  • Avvia PuTTY e seleziona (a sinistra) la categoria “Session”, successivamente nella casella “Host Name” digita giuseppe@192.168.0.201 (dove 192.168.0.201 è l’indirizzo IP o HOSTNAME del tuo nodo), su “Port” lascia 22.
  • Seleziona (a sinistra) la categoria “SSH” → “Auth” → “Credentials” nella casella “Private key file for authentication:” clicca su “Browser” e seleziona la tua chiave privata.
  • Clicca su “Open” ed inserisci la passphrase della chiave SSH (Password [ C ]) per completare l’autenticazione.
  • macOS e/o Linux:
  • Apri il terminale ed esegui il comando: ssh -i ~/.ssh/chiave-nodo giuseppe@192.168.0.201 (dove 192.168.0.201 è l’indirizzo IP o HOSTNAME del tuo nodo)
  • Inserisci la passphrase della chiave SSH (Password [ C ]) per completare l’autenticazione.

Configurazione sshd personalizzata

Dopo aver generato e verificato le chiavi SSH, procedi modificando il file di configurazione di SSH. Invece di modificare il file principale sshd_config, creiamo un file di configurazione aggiuntivo all’interno della directory sshd_config.d. Questo permette di mantenere separate le personalizzazioni e riduce il rischio che vengano perse durante aggiornamenti futuri del pacchetto SSH.

Con l’utente giuseppe esegui:

sudo nano /etc/ssh/sshd_config.d/config-ssh.conf

Incolla il seguente contenuto:

# BTC-NODE-ARM SSH Config
# https://giuxfila.com/progetti/btc-node-arm/sicurezza/#configurazione-personalizzata-di-sshd

Port 2022
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
LoginGraceTime 30
MaxAuthTries 3

Salva con CTRL+O ed esci con CTRL+X .

Verifica che la configurazione sia corretta e che non siano presenti errori:

sudo sshd -t

Se non ricevi alcuna risposta significa che il file è valido, procedi quindi a riavviare il demone SSH:

sudo systemctl restart ssh

Mantieni aperta la sessione SSH attuale fino a quando non hai verificato un nuovo accesso utilizzando la nuova configurazione.

Effettua una nuova connessione (mantenendo la sessione attuale aperta), utilizzando la nuova porta SSH configurata:

  • Windows:
  • Avvia PuTTY, mantieni invariato il campo “Host Name” e modifica il campo “Port” inserendo 2022
  • Verifica che nella categoria “SSH” → “Auth” → “Credentials” sia ancora selezionata la chiave privata.
  • Clicca su “Open” ed inserisci la Password [ C ] per verificare che l’accesso venga eseguito correttamente.
  • macOS e/o Linux:
  • Apri un nuovo terminale ed esegui il comando: ssh -p 2022 -i ~/.ssh/chiave-nodo giuseppe@192.168.0.201 (dove 192.168.0.201 è l’indirizzo IP o HOSTNAME del tuo nodo)
  • Inserisci la Password [ C ] per verificare che l’accesso venga eseguito correttamente.

Fail2ban

Fail2ban è un software che analizza i file di log dei servizi esposti e blocca temporaneamente gli indirizzi IP che effettuano numerosi tentativi di accesso falliti. In questa guida lo utilizziamo per proteggere il servizio SSH da attacchi brute-force.

Installa Fail2ban sul tuo nodo. Con l’utente giuseppe esegui:

sudo apt install fail2ban -y

Per mantenere separate le configurazioni personalizzate da quelle predefinite del pacchetto, crea un nuovo file all’interno della directory /etc/fail2ban/jail.d/:

sudo nano /etc/fail2ban/jail.d/ssh-custom.local

Inserisci:

[sshd]
enabled = true
maxretry = 3
findtime = 10m
bantime = 24h

Abilita ed avvia il servizio:

sudo systemctl enable --now fail2ban

Verifica che il servizio sia attivo e in esecuzione:

sudo systemctl status fail2ban

fail2ban-status

La voce Active: active (running) conferma che Fail2ban è avviato correttamente.

Verifica che la jail SSH sia attiva:

sudo fail2ban-client status sshd

fail2ban-sshd

La presenza della jail sshd conferma che Fail2ban sta monitorando il servizio SSH e applicherà automaticamente i blocchi agli indirizzi IP che superano il limite di tentativi configurato.


Firewall

Un firewall controlla il traffico di rete in entrata e in uscita, permettendo di decidere quali connessioni autorizzare e quali bloccare. Anche se Debian espone solo i servizi effettivamente in esecuzione, limitare esplicitamente le connessioni consentite riduce ulteriormente la superficie di attacco.

UFW (Uncomplicated Firewall) è un’interfaccia semplificata che permette di gestire il firewall Linux senza dover scrivere direttamente regole iptables/nftables.

Installa UFW sul tuo nodo. Con l’utente giuseppe esegui:

sudo apt install ufw -y

Disabilita la registrazione dei log del firewall per evitare scritture continue sul disco, riducendo l’usura del dispositivo di archiviazione:

sudo ufw logging off

Imposta i seguenti criteri, nega tutto il traffico in entrata e consenti tutto il traffico in uscita:

sudo ufw default deny incoming

sudo ufw default allow outgoing

Consenti l’accesso SSH applicando anche una limitazione dei tentativi di connessione. In questo modo UFW rallenterà i tentativi ripetuti di accesso, rendendo ancora più difficili gli attacchi “brute-force”:

sudo ufw limit 2022/tcp comment 'SSH'

Attiva il firewall:

sudo ufw enable

Imposta l’avvio automatico al reboot:

sudo systemctl enable ufw

Controlla che tutto sia attivo e con le regole definite:

sudo ufw status verbose

ufw-status

Da questo momento il nodo accetterà solamente le connessioni esplicitamente autorizzate. Eventuali nuovi servizi installati in futuro richiederanno l’apertura manuale della relativa porta sul firewall.


Nginx

Un reverse proxy permette di gestire l’accesso ai servizi web attraverso un unico punto di ingresso. Utilizzeremo Nginx per terminare le connessioni HTTPS, cifrando il traffico tramite SSL/TLS prima di inoltrarlo ai servizi interni del nodo.

Anche se il Full Node verrà utilizzato solamente all’interno della rete locale domestica, utilizzare HTTPS è comunque una buona pratica, protegge le credenziali, i token di accesso e le informazioni scambiate con le interfacce web dei servizi.

Per prima cosa aggiorniamo l’elenco dei pacchetti disponibili. Con l’utente giuseppe esegui:

sudo apt update

Importa la chiave di firma di Nginx in modo che apt possa verificarne l’autenticità:

curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Verifica che il file appena scaricato contenga la chiave corretta:

gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

nginx-gpg-key

Configura il repository ufficiale di Nginx:

. /etc/os-release && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://nginx.org/packages/debian $VERSION_CODENAME nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

Imposta il pinning del repository affinché apt preferisca i pacchetti provenienti dal repository ufficiale Nginx rispetto a quelli disponibili nei repository Debian.

echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx

Installa Nginx:

sudo apt update && sudo apt install nginx -y

Abilita il servizio:

sudo systemctl enable --now nginx

Verifica che Nginx sia avviato correttamente:

sudo systemctl status nginx

nginx-status

Verifica la versione installata:

sudo nginx -v

nginx-version

Crea un certificato SSL/TLS autofirmato, utilizzato successivamente per le connessioni HTTPS interne al nodo (validità 10 anni):

sudo openssl req -x509 -nodes -newkey rsa:4096 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt -subj "/CN=localhost" -days 3650

Configurazione

Nginx può funzionare sia come web server che come reverse proxy. In questa configurazione verrà utilizzato esclusivamente come proxy inverso per gestire in modo centralizzato le connessioni HTTPS verso i servizi interni del nodo.

Crea un backup della configurazione predefinita:

sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

Crea un nuovo file di configurazione:

sudo nano /etc/nginx/nginx.conf

Incolla:

user www-data;
worker_processes auto;

pid /run/nginx.pid;

include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
}

http {

    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

    ssl_session_cache shared:HTTP-TLS:1m;
    ssl_session_timeout 4h;

    ssl_protocols TLSv1.2 TLSv1.3;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    include /etc/nginx/sites-enabled/*.conf;
}

Crea le cartelle per i futuri file di configurazione: sites-available e sites-enabled:

sudo mkdir -p /etc/nginx/sites-available
sudo mkdir -p /etc/nginx/sites-enabled

Verifica che la configurazione sia corretta:

sudo nginx -t

nginx-test

Ricarica il servizio:

sudo systemctl reload nginx

Disabilita Bluetooth e Wi-Fi

Il nodo sarà dedicato a Bitcoin, periferiche come Bluetooth e Wi-Fi (nel caso in cui tu sia connesso via Ethernet) non hanno alcuna utilità. Disabilitare entrambi i moduli che non utilizzi riduce ulteriormente la superficie di attacco.

Con l’utente giuseppe digita il seguente comando:

sudo nano /boot/firmware/config.txt

Se il tuo nodo è connesso ad internet tramite cavo Ethernet, disabilita entrambi i moduli incollando alla fine del file il seguente contenuto:

dtoverlay=disable-bt

dtoverlay=disable-wifi

Se invece il tuo nodo è connesso ad internet tramite Wi-Fi disabilita solo il bluetooth incollando questo contenuto alla fine del file:

dtoverlay=disable-bt

Salva il file con CTRL+O ed esci con CTRL+X.

Effettua un riavvio del sistema per rendere effettive le modifiche:

sudo reboot

Aggiornamenti del sistema

Mantenere aggiornato il sistema operativo è fondamentale per correggere vulnerabilità, ricevere aggiornamenti di sicurezza e garantire la stabilità del nodo.

È consigliabile eseguire periodicamente gli aggiornamenti del sistema (ad esempio una volta al mese), verificando sempre le modifiche che verranno applicate prima di procedere.

Con l’utente giuseppe aggiorna l’elenco dei pacchetti disponibili:

sudo apt update

Visualizza gli aggiornamenti disponibili:

apt list --upgradable

aggiornamenti-disponibili

Se non viene mostrato alcun pacchetto, significa che il sistema è già aggiornato.

Dopo aver verificato le modifiche che verranno applicate, procedi con l’aggiornamento del sistema:

sudo apt full-upgrade -y

Al termine dell’operazione verifica se sono necessari riavvii del sistema:

test -f /var/run/reboot-required && echo "Riavvio necessario"

Se viene indicato un riavvio necessario, eseguilo con:

sudo reboot

Gli aggiornamenti di Bitcoin Core e degli altri software del nodo verranno invece gestiti manualmente seguendo le rispettive procedure di aggiornamento, così da poter verificare preventivamente eventuali modifiche che potrebbero influire sul funzionamento del servizio.