Salta al contenuto principale
Lympha technologies

Guide pratiche

Come mettere in sicurezza un VPS con Rocky Linux

Rocky Linux è enterprise e 100% compatibile con Red Hat — ma i comandi non sono quelli di Ubuntu: dnf al posto di apt, firewalld al posto di ufw, il gruppo wheel per il sudo. La messa in sicurezza di base, passo per passo.

Rocky Linux è un sistema operativo open source di livello enterprise. La sua principale peculiarità è l'essere progettato e mantenuto di pari passo a Red Hat Enterprise Linux, ovvero essere 100% bug-per-bug compatibile. In questa guida andremo a eseguire una prima, basilare messa in sicurezza di un VPS Rocky Linux appena installato. Questi primi semplici step andranno poi integrati con eventuali altri meccanismi di sicurezza, a seconda dei servizi che vorrai installare.

Vista l'origine comune (Red Hat), questa guida vale anche per i sistemi operativi CentOS 7 e 8.

Prerequisiti

  1. Un VPS Rocky Linux
  2. Un utente con privilegi adeguati, ovvero root
  3. Un editor di testo, nel nostro esempio useremo nano
  4. Il gestore di pacchetti dnf, normalmente incluso nel sistema operativo
  5. [Consigliato] Un firewall, nel nostro esempio useremo firewalld

Verifichiamo quale sistema operativo è installato

Essendo una distribuzione Linux che segue Red Hat EL, in caso di problemi è bene essere certi della versione su cui si lavora. Per farlo possiamo lanciare il comando:

# cat /etc/os-release
NAME="Rocky Linux"
VERSION="9.0 (Blue Onyx)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.0"
PLATFORM_ID="platform:el9"
PRETTY_NAME="Rocky Linux 9.0 (Blue Onyx)"
ANSI_COLOR="0;32"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:rocky:rocky:9::baseos"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"
ROCKY_SUPPORT_PRODUCT_VERSION="9.0"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.0"

Nel nostro esempio la versione è la 9.0, denominata Blue Onyx.

Aggiorna il tuo sistema operativo

Per verificare la presenza di aggiornamenti usiamo il comando dnf con il parametro check-update:

# dnf check-update

Questo comando mostrerà la lista di tutti i pacchetti da aggiornare. A questo punto è possibile scegliere se aggiornare tutto quanto suggerito oppure, selettivamente, solo alcuni pacchetti. Nel primo caso basterà lanciare il comando:

# dnf -y update

Il parametro -y serve soltanto a preconfermare la volontà di aggiornare tutti i pacchetti, senza chiedere alcuna conferma. Se invece vogliamo procedere con un aggiornamento selettivo, aggiornando quindi un determinato pacchetto, basterà lanciare il comando:

# dnf update cockpit.x86_64

Nel nostro esempio aggiorniamo il pacchetto cockpit, tralasciando gli altri.

Creazione di un utente con privilegi limitati

Come regola generale per la sicurezza, è bene non utilizzare l'utente root per le attività giornaliere sul VPS. A tale scopo andremo a creare un utente con privilegi limitati, ma che in caso di necessità possa impersonare temporaneamente l'utente root. Per creare un nuovo utente si utilizza il comando useradd:

# useradd mio_utente

Una volta creato l'utente, assegniamo una password utilizzando il comando passwd:

# passwd mio_utente
Changing password for user mio_utente
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

Anche se l'utente appena creato non avrà particolari chance di far danni sul sistema, evitiamo di utilizzare password deboli (almeno 8 caratteri alfanumerici, caratteri speciali compresi). A questo punto possiamo utilizzare l'utente appena creato per collegarci al VPS, ma per ora non saremo in grado di eseguire comandi che richiedono i privilegi dell'utente root.

Per eseguire comandi che richiedono i privilegi di root è possibile procedere in due modi:

  1. utilizzare il comando $ su root, per impersonare l'utente root;
  2. aggiungere l'utente appena creato al gruppo dei sudoer (gli utenti che possono eseguire comandi con privilegi di root): quando servirà, basterà scrivere $ sudo comando_con_privilegi (esempio $ sudo dnf update).

Se nel primo caso l'utente non privilegiato dovrà conoscere la password di root per poter operare, nel secondo sarà invece preautorizzato — a maggior ragione, non bisognerà sottovalutare la qualità della password scelta. Meglio sarebbe evitare di esporre SSH sulla porta standard e, ancor meglio, utilizzare chiavi cifrate per connettersi piuttosto che il mero sistema utente/password.

Per aggiungere l'utente creato al gruppo dei sudoer, accediamo al VPS come utente root e usiamo il comando:

# usermod -aG wheel mio_utente

Il gruppo «wheel» è un gruppo speciale, usato in alcuni sistemi Linux per controllare quali utenti possono utilizzare il comando sudo. Ora, se accediamo al VPS in SSH con l'utente senza privilegi, utilizzando sudo seguito dal comando che richiede privilegi potremo eseguire attività che richiedono normalmente i permessi di root, ad esempio:

$ sudo dnf check-update
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for mio_utente:

Ovviamente la password richiesta è quella dell'utente creato in precedenza, non quella di root. In questo modo potremo creare utenti per collaboratori esterni senza diffondere la password di root.

Gestione del firewall

Un aspetto importante per la sicurezza del VPS è la gestione del firewall. In Rocky Linux il firewall è attivo per default e ha una configurazione base che permette di collegarsi in SSH (porta standard TCP 22) e alla console web Cockpit (porta TCP 9090); quest'ultimo servizio non è attivo, quindi se proverai a collegarti all'indirizzo https://ip_vps:9090 non riceverai alcuna risposta. Diversamente dai sistemi operativi derivati da Debian (esempio Ubuntu Server), Rocky Linux utilizza firewalld: di conseguenza i comandi per la sua configurazione sono differenti da ufw (chi usa normalmente Ubuntu sa di cosa stiamo parlando).

Come primo step, assicuriamoci che il firewall sia in esecuzione:

$ sudo firewall-cmd --state

Visto che stai utilizzando un utente non root, ti sarà richiesta la password. Se tutto procede come sperato, l'output sarà un semplice «running».

Per verificare l'attuale configurazione del firewall usiamo il comando:

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Da qui possiamo vedere che la zona attiva si chiama public (active), che a tale zona è assegnata l'interfaccia di rete eth0, che sono permesse le comunicazioni in ingresso per i servizi cockpit, dhcpv6-client e ssh e che sono permesse le risposte ICMP — icmp-block-inversion: no (esempio: le risposte al comando ping).

La zona public blocca per default qualunque comunicazione in ingresso, se non specificato diversamente. Un concetto fondamentale di firewalld è che tutte le modifiche fatte alla configurazione sono temporanee, a meno che non venga utilizzato il parametro --permanent prima del comando. Questo significa che se, ad esempio, volessimo aprire la porta 443 per permettere l'accesso in HTTPS con il seguente comando:

$ sudo firewall-cmd --zone=public --add-service=https

al primo riavvio del VPS questa regola non sarebbe più presente. Se invece volessimo renderla permanente, basterà — come detto:

$ sudo firewall-cmd --permanent --zone=public --add-service=https

Modificare la porta del servizio SSH

Come direbbe il geniale scrittore contemporaneo Ken Follett sulla fiducia: «Fidarsi di qualcuno è come tenere dell'acqua nelle mani chiuse a coppa…»; se parliamo di sicurezza informatica, immaginate di tenere l'acqua nelle mani con le dita completamente aperte. Visto che non possiamo conoscere il «qualcuno» che tenterà di collegarsi al vostro VPS, non diamogli alcuna fiducia. Un suggerimento già dato in altri articoli è modificare la porta standard del servizio SSH: questa semplice operazione diminuisce i tentativi di accesso non autorizzati da parte di script che, in automatico, provano a collegarsi sulla porta 22.

Prima di iniziare la configurazione decidiamo quale porta utilizzare: in questo esempio abbiamo scelto la porta 4322/TCP.

Step 1 — Configuriamo il firewall. Aggiungiamo alla configurazione del firewall la porta 4322/TCP:

$ sudo firewall-cmd --permanent --zone=public --add-port=4322/tcp

Come puoi notare, abbiamo usato il parametro per rendere permanente la configurazione. A questo punto ricarichiamo tutti i parametri e accertiamoci che non vi siano errori:

$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-ports

Nell'output comparirà la nostra 4322/tcp.

Step 2 — Configuriamo il servizio SSH. La procedura per modificare la porta di default è abbastanza semplice: basta modificare il file /etc/ssh/sshd_config cambiando il numero della porta e successivamente riavviare il servizio. Per modificare il file useremo l'editor nano:

$ sudo nano /etc/ssh/sshd_config

In questo file tutto ciò che inizia con «#» indica un commento e non viene considerato dal sistema; allo stesso tempo, però, ci dice qual è il valore di default. Cerchiamo la riga che inizia per #Port 22, eliminiamo il simbolo «#» e modifichiamo il valore della porta — oppure aggiungiamo una riga appena sotto al commento con la nostra nuova porta SSH: Port 4322. Non resta che salvare la modifica con CTRL+X e Y di conferma.

Affinché le modifiche diventino effettive bisogna riavviare il servizio:

$ sudo systemctl restart sshd.service

Da questo momento, se provi a collegarti in SSH al tuo VPS riceverai il messaggio ssh: connect to host IP_VPS port 22: Connection refused. Per potersi collegare è necessario aggiungere al comando l'opzione -p seguita dalla nuova porta:

ssh mio_utente@IP_VPS -p 4322

Disabilitare l'accesso root via SSH

Per una maggiore sicurezza del tuo VPS è fortemente consigliato non permettere all'utente root l'accesso via SSH: a tale scopo in precedenza abbiamo creato un utente con privilegi limitati, ma che all'occorrenza possa diventare root. Ora andremo a impedire l'accesso in SSH a root. Anche in questo caso dovremo modificare il file di configurazione del servizio SSH, come fatto per il cambio della porta standard.

Apriamo il file /etc/ssh/sshd_config con l'editor nano ($ sudo nano /etc/ssh/sshd_config), cerchiamo la stringa «PermitRootLogin yes» e la impostiamo a «no»:

# Authentication:
#LoginGraceTime 2m
PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
#PubkeyAuthentication yes

Salviamo la modifica con CTRL+X e Y di conferma. Riavviamo il servizio per rendere effettive le modifiche:

$ sudo systemctl restart sshd.service

Anche se può apparire scomodo impedire a root di connettersi via SSH, è un passaggio importante per aumentare il livello di sicurezza del VPS. Se avrai la necessità di collegarti direttamente alla macchina con l'utente root, potrai sempre utilizzare la console web dalla dashboard del tuo account VPS GREEN.

Guida pubblicata originariamente sul blog di VPS GREEN, il servizio VPS sul nostro cloud privato green.

Condividi questo articolo

LinkedIn X Email

Redazione Lympha

Gli articoli di questo blog nascono dall'esperienza sul campo delle nostre Business Unit e dei Centri di Competenza: chi scrive è chi progetta, gestisce e supporta ogni giorno i sistemi di cui parliamo. I contenuti hanno scopo informativo e fotografano lo stato dell'arte alla data di pubblicazione.

Potrebbe interessarti anche