Come installare e proteggere Redis su Ubuntu 22.04

Introduzione

Redis è un archivio chiave-valore in memoria noto per la sua flessibilità, prestazioni e ampio supporto linguistico. Questo tutorial dimostra come installare, configurare e proteggere Redis su un server Ubuntu 22.04.

Prerequisiti

Per completare questa guida, avrai bisogno di accesso a un server Ubuntu 22.04 che abbia un utente non root con privilegi sudo e un firewall configurato con ufw. Puoi configurare questo seguendo la nostra Guida alla Configurazione Iniziale del Server per Ubuntu 22.04.

Passaggio 1 — Installazione e Configurazione di Redis

Utilizzeremo il gestore di pacchetti APT per installare Redis dai repository ufficiali di Ubuntu. Al momento della stesura, la versione disponibile nei repository predefiniti è 6.0.16.

Inizia aggiornando la cache locale dei pacchetti apt:

  1. sudo apt update

Quindi installa Redis digitando:

  1. sudo apt install redis-server

Questo scaricherà ed installerà Redis e le sue dipendenze. Successivamente, c’è un importante cambiamento di configurazione da apportare nel file di configurazione di Redis, che è stato generato automaticamente durante l’installazione.

Apri questo file con il tuo editor di testo preferito:

  1. sudo nano /etc/redis/redis.conf

All’interno del file, trova la direttiva supervised. Questa direttiva ti permette di dichiarare un sistema di inizializzazione per gestire Redis come un servizio, fornendoti maggiore controllo sul suo funzionamento. La direttiva supervised è impostata su no per default. Poiché stai eseguendo Ubuntu, che utilizza il sistema di inizializzazione systemd, cambialo in systemd:

/etc/redis/redis.conf
. . .

# Se esegui Redis da upstart o systemd, Redis può interagire con il tuo
# albero di supervisione. Opzioni:
#   supervised no      - nessuna interazione di supervisione
#   supervised upstart - segnala a upstart mettendo Redis in modalità SIGSTOP
#   supervised systemd - segnala a systemd scrivendo READY=1 su $NOTIFY_SOCKET
#   supervised auto    - rileva il metodo upstart o systemd basato su
#                        variabili d'ambiente UPSTART_JOB o NOTIFY_SOCKET
# Nota: questi metodi di supervisione segnalano solo "il processo è pronto."
#       Non abilitano continui controlli di vitalità verso il tuo supervisore.
supervised systemd

. . .

Quella è l’unica modifica che devi apportare al file di configurazione di Redis in questo momento, quindi salvalo e chiudilo quando hai finito. Se hai usato nano per modificare il file, fallo premendo CTRL + X, Y, poi INVIO.

Quindi, riavvia il servizio Redis per riflettere le modifiche apportate al file di configurazione:

  1. sudo systemctl restart redis.service

Con questo, hai installato e configurato Redis ed è in esecuzione sul tuo computer. Prima di iniziare a usarlo, però, è prudente controllare prima se Redis funziona correttamente.

Passaggio 2 — Test di Redis

Come con qualsiasi software appena installato, è una buona idea assicurarsi che Redis funzioni come previsto prima di apportare ulteriori modifiche alla sua configurazione. Andremo oltre un paio di modi per verificare che Redis funzioni correttamente in questo passaggio.

Inizia controllando che il servizio Redis sia in esecuzione:

  1. sudo systemctl status redis

Se è in esecuzione senza errori, questo comando produrrà un output simile al seguente:

Output
● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2022-04-20 20:40:52 UTC; 4s ago Docs: http://redis.io/documentation, man:redis-server(1) Main PID: 2899 (redis-server) Status: "Ready to accept connections" Tasks: 5 (limit: 2327) Memory: 2.5M CPU: 65ms CGroup: /system.slice/redis-server.service └─2899 "/usr/bin/redis-server 127.0.0.1:6379 . . .

Questo output indica che Redis è in esecuzione ed è già abilitato, il che significa che è impostato per avviarsi ogni volta che il server si avvia.

Nota: Questa impostazione è desiderabile per molti casi d’uso comuni di Redis. Se, tuttavia, preferisci avviare manualmente Redis ogni volta che il server si avvia, puoi configurarlo con il seguente comando:

  1. sudo systemctl disable redis

Per verificare che Redis funzioni correttamente, connettersi al server utilizzando redis-cli, il client da riga di comando di Redis:

  1. redis-cli

Nella prompt che segue, testare la connettività con il comando ping:

  1. ping
Output
PONG

Questa output conferma che la connessione al server è ancora attiva. Successivamente, verificare di poter impostare delle chiavi eseguendo:

  1. set test "It's working!"
Output
OK

Recuperare il valore digitando:

  1. get test

Assumendo che tutto funzioni correttamente, sarà possibile recuperare il valore memorizzato:

Output
"It's working!"

Dopo aver confermato di poter recuperare il valore, uscire dal prompt di Redis per tornare alla shell:

  1. exit

Come ultimo test, verificheremo se Redis è in grado di persistere i dati anche dopo essere stato arrestato o riavviato. Per fare ciò, prima riavviare l’istanza di Redis:

  1. sudo systemctl restart redis

Quindi connettersi nuovamente con il client da riga di comando:

  1. redis-cli

E confermare che il valore di test sia ancora disponibile

  1. get test

Il valore della tua chiave dovrebbe essere ancora accessibile:

Output
"It's working!"

Uscire nuovamente dalla shell quando hai finito:

  1. exit

Con questo, l’installazione di Redis è completamente operativa e pronta per essere utilizzata. Tuttavia, alcune delle sue impostazioni di configurazione predefinite sono insicure e forniscono agli attori malevoli opportunità per attaccare e ottenere accesso al tuo server e ai suoi dati. I passaggi rimanenti in questo tutorial coprono metodi per mitigare queste vulnerabilità, come prescritto dal sito web ufficiale di Redis. Anche se questi passaggi sono opzionali e Redis funzionerà comunque se scegli di non seguirli, è fortemente raccomandato completarli per rinforzare la sicurezza del sistema.

Passaggio 3 — Binding a localhost

Di default, Redis è accessibile solo da localhost. Tuttavia, se hai installato e configurato Redis seguendo un tutorial diverso da questo, potresti aver aggiornato il file di configurazione per consentire connessioni da qualsiasi luogo. Questo non è sicuro come il binding a localhost.

Per correggere questo problema, apri il file di configurazione di Redis per modificarlo:

  1. sudo nano /etc/redis/redis.conf

Trova questa riga e assicurati che sia decommentata (rimuovi il # se esiste):

/etc/redis/redis.conf
. . .
bind 127.0.0.1 ::1
. . .

Salva e chiudi il file quando hai finito (premi CTRL + X, Y, quindi ENTER).

Successivamente, riavvia il servizio per garantire che systemd legga le tue modifiche:

  1. sudo systemctl restart redis

Per verificare che questa modifica sia entrata in vigore, esegui il seguente comando netstat:

  1. sudo netstat -lnp | grep redis
Output
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server

Nota: Il comando netstat potrebbe non essere disponibile di default sul tuo sistema. In tal caso, puoi installarlo (insieme ad altre utili strumenti di rete) con il seguente comando:

  1. sudo apt install net-tools

Questo output mostra che il programma redis-server è vincolato a localhost (127.0.0.1), riflettendo la modifica appena apportata al file di configurazione. Se c’è un altro indirizzo IP in quella colonna (0.0.0.0, ad esempio), dovresti verificare di nuovo di aver decommentato la riga corretta e riavviare nuovamente il servizio Redis.

Ora che la tua installazione di Redis sta solo ascoltando su localhost, sarà più difficile per gli attori malevoli fare richieste o ottenere accesso al tuo server. Tuttavia, attualmente Redis non è impostato per richiedere agli utenti di autenticarsi prima di apportare modifiche alla sua configurazione o ai dati che contiene. Per ovviare a questo problema, Redis ti consente di richiedere agli utenti di autenticarsi con una password prima di apportare modifiche tramite il client Redis (redis-cli).

Passaggio 4 — Configurazione di una password per Redis

La configurazione di una password per Redis abilita una delle sue due funzionalità di sicurezza integrate: il comando auth, che richiede ai client di autenticarsi per accedere al database. La password viene configurata direttamente nel file di configurazione di Redis, /etc/redis/redis.conf, quindi apri nuovamente quel file con il tuo editor preferito:

  1. sudo nano /etc/redis/redis.conf

Scorri fino alla sezione SECURITY e trova una direttiva commentata che recita:

/etc/redis/redis.conf
. . .
# requirepass foobared
. . .

Decommentala rimuovendo il carattere # e cambia foobared con una password sicura.

Nota: Sopra la direttiva requirepass nel file redis.conf, c’è un avviso commentato:

/etc/redis/redis.conf
. . .
# Avviso: poiché Redis è piuttosto veloce, un utente esterno può provare fino a
# 150.000 password al secondo su un server performante. Ciò significa che è necessario
# utilizzare una password molto forte altrimenti sarà molto facile da violare.
#
. . .

Pertanto, è importante specificare una password molto forte e molto lunga. Piuttosto che inventare una password da soli, è possibile utilizzare il comando openssl per generarne una casuale, come nell’esempio seguente. Facendo passare l’output del primo comando al secondo comando openssl, come mostrato qui, verranno rimossi eventuali interruzioni di riga prodotte dal primo comando:

  1. openssl rand 60 | openssl base64 -A

Questo comando restituirà un output simile a questo:

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Dopo aver copiato e incollato l’output di tale comando come nuovo valore per requirepass, dovrebbe essere:

/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Dopo aver impostato la password, salva e chiudi il file. Quindi riavvia Redis:

  1. sudo systemctl restart redis.service

Per verificare che la password funzioni, apri il client Redis:

  1. redis-cli

Quanto segue mostra una sequenza di comandi utilizzati per verificare se la password Redis funziona. Il primo comando cerca di impostare una chiave su un valore prima dell’autenticazione:

  1. set key1 10

Ciò non funzionerà perché non hai effettuato l’autenticazione, quindi Redis restituisce un errore:

Output
(error) NOAUTH Authentication required.

Il comando successivo si autentica con la password specificata nel file di configurazione di Redis:

  1. auth your_redis_password

Redis lo riconosce:

Output
OK

Dopo di che, eseguire nuovamente il comando precedente avrà successo:

  1. set key1 10
Output
OK

get key1 interroga Redis per il valore della nuova chiave.

  1. get key1
Output
"10"

Dopo aver confermato di poter eseguire comandi nel client Redis dopo l’autenticazione, puoi uscire da redis-cli:

  1. quit

Successivamente, passeremo a rinominare i comandi Redis che, se inseriti per errore o da un attore malintenzionato, potrebbero avere gravi conseguenze sui tuoi dati.

Passaggio 5 — Rinominare i Comandi Pericolosi

L’altra funzionalità di sicurezza integrata in Redis riguarda la rinomina o il completo disabilitamento di alcuni comandi considerati pericolosi.

Quando eseguiti da utenti non autorizzati, tali comandi possono essere utilizzati per riconfigurare, distruggere o cancellare i tuoi dati. Come la password di autenticazione, la rinomina o il disabilitamento dei comandi è configurato nella stessa sezione SECURITY del file /etc/redis/redis.conf.

Alcuni dei comandi considerati pericolosi includono: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME e DEBUG. Questo non è un elenco esaustivo, ma rinominare o disabilitare tutti i comandi in quell’elenco è un buon punto di partenza per migliorare la sicurezza del tuo server Redis.

Se dovresti disabilitare o rinominare un comando dipende dalle tue esigenze specifiche o da quelle del tuo sito. Se sai che non userai mai un comando che potrebbe essere abusato, allora puoi disabilitarlo. Altrimenti, potrebbe essere nel tuo interesse rinominarlo.

Per rinominare o disabilitare i comandi Redis, apri nuovamente il file di configurazione:

  1. sudo nano /etc/redis/redis.conf

Avviso: I seguenti passaggi che mostrano come disabilitare e rinominare i comandi sono esempi. Dovresti scegliere solo di disabilitare o rinominare i comandi che hanno senso per te. Puoi esaminare l’elenco completo dei comandi da solo e determinare come potrebbero essere abusati su redis.io/commands.

Per disabilitare un comando, rinominalo con una stringa vuota (indicata da un paio di virgolette senza caratteri tra di loro), come mostrato di seguito:

/etc/redis/redis.conf
. . .
# È anche possibile uccidere completamente un comando rinominandolo in
# una stringa vuota:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .

Per rinominare un comando, assegnagli un altro nome come mostrato negli esempi seguenti. I comandi rinominati dovrebbero essere difficili da indovinare per gli altri, ma facili da ricordare per te:

/etc/redis/redis.conf
. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .

Salva le modifiche e chiudi il file.

Dopo aver rinominato un comando, applica la modifica riavviando Redis:

  1. sudo systemctl restart redis.service

Per testare il nuovo comando, accedi alla linea di comando di Redis:

  1. redis-cli

Quindi, autenticati:

  1. auth your_redis_password
Output
OK

Supponiamo che tu abbia rinominato il comando CONFIG in ASC12_CONFIG, come nell’esempio precedente. Prova prima a utilizzare il comando CONFIG originale. Dovrebbe fallire, perché lo hai rinominato:

  1. config get requirepass
Output
(error) ERR unknown command `config`, with args beginning with:

Chiamare il comando rinominato, tuttavia, avrà successo. Non è sensibile alle maiuscole:

  1. asc12_config get requirepass
Output
1) "requirepass" 2) "your_redis_password"

Infine, puoi uscire da redis-cli:

  1. exit

Nota che se stai già utilizzando la riga di comando di Redis e poi riavvii Redis, dovrai autenticarti nuovamente. Altrimenti, otterrai questo errore se digiti un comando:

Output
NOAUTH Authentication required.

Avvertimento: Riguardo alla pratica di rinominare i comandi, c’è una dichiarazione di avvertimento alla fine della sezione SECURITY in /etc/redis/redis.conf che recita:

/etc/redis/redis.conf
. . .
# Si prega di notare che cambiare il nome dei comandi che vengono registrati nel
# file AOF o trasmessi ai repliche può causare problemi.
. . .

Nota: Il progetto Redis sceglie di utilizzare i termini “master” e “slave”, mentre DigitalOcean preferisce generalmente le alternative “primary” e “secondary”. Per evitare confusione abbiamo scelto di utilizzare i termini usati nella documentazione di Redis qui.

Ciò significa che se il comando rinominato non è nel file AOF, o se lo è ma il file AOF non è stato trasmesso alle repliche, non ci dovrebbero essere problemi.

Quindi, tieni presente questo quando stai cercando di rinominare i comandi. Il momento migliore per rinominare un comando è quando non stai utilizzando la persistenza AOF, o subito dopo l’installazione, cioè prima che la tua applicazione che utilizza Redis sia stata distribuita.

Quando stai utilizzando AOF e stai affrontando un’installazione master-slave, considera questa risposta dalla pagina delle issue su GitHub del progetto. Quanto segue è una risposta alla domanda dell’autore:

I comandi vengono registrati nell’AOF e replicati allo slave allo stesso modo in cui vengono inviati, quindi se provi a riprodurre l’AOF su un’istanza che non ha lo stesso ridenominamento, potresti incontrare delle incongruenze poiché il comando non può essere eseguito (stesso discorso per gli slave).

Quindi, il modo migliore per gestire la ridenominazione in casi del genere è assicurarsi che i comandi rinominati siano applicati a tutte le istanze nelle installazioni master-slave.

Conclusione

In questo tutorial, hai installato e configurato Redis, validato che la tua installazione di Redis funzioni correttamente e utilizzato le sue funzionalità di sicurezza integrate per renderlo meno vulnerabile agli attacchi da parte di attori malevoli.

Tieni presente che una volta che qualcuno è loggato sul tuo server, è molto facile aggirare le funzionalità di sicurezza specifiche di Redis che abbiamo messo in atto. Pertanto, la funzionalità di sicurezza più importante sul tuo server Redis è il firewall (che hai configurato se hai seguito il tutorial Configurazione Iniziale del Server), poiché rende estremamente difficile per attori malevoli superare questa barriera.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-22-04