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
:
Quindi installa Redis digitando:
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:
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
:
. . .
# 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:
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:
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:
Per verificare che Redis funzioni correttamente, connettersi al server utilizzando redis-cli
, il client da riga di comando di Redis:
Nella prompt che segue, testare la connettività con il comando ping
:
OutputPONG
Questa output conferma che la connessione al server è ancora attiva. Successivamente, verificare di poter impostare delle chiavi eseguendo:
OutputOK
Recuperare il valore digitando:
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:
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:
Quindi connettersi nuovamente con il client da riga di comando:
E confermare che il valore di test sia ancora disponibile
Il valore della tua chiave dovrebbe essere ancora accessibile:
Output"It's working!"
Uscire nuovamente dalla shell quando hai finito:
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:
Trova questa riga e assicurati che sia decommentata (rimuovi il #
se esiste):
. . .
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:
Per verificare che questa modifica sia entrata in vigore, esegui il seguente comando netstat
:
Outputtcp 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:
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:
Scorri fino alla sezione SECURITY
e trova una direttiva commentata che recita:
. . .
# 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:
. . .
# 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:
Questo comando restituirà un output simile a questo:
OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Dopo aver copiato e incollato l’output di tale comando come nuovo valore per requirepass
, dovrebbe essere:
/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Dopo aver impostato la password, salva e chiudi il file. Quindi riavvia Redis:
Per verificare che la password funzioni, apri il client Redis:
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:
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:
Redis lo riconosce:
OutputOK
Dopo di che, eseguire nuovamente il comando precedente avrà successo:
OutputOK
get key1
interroga Redis per il valore della nuova chiave.
Output"10"
Dopo aver confermato di poter eseguire comandi nel client Redis dopo l’autenticazione, puoi uscire da redis-cli
:
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:
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:
. . .
# È 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:
. . .
# 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:
Per testare il nuovo comando, accedi alla linea di comando di Redis:
Quindi, autenticati:
OutputOK
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:
Output(error) ERR unknown command `config`, with args beginning with:
Chiamare il comando rinominato, tuttavia, avrà successo. Non è sensibile alle maiuscole:
Output1) "requirepass"
2) "your_redis_password"
Infine, puoi uscire da redis-cli
:
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:
OutputNOAUTH 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:
. . .
# 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