Introduzione
Redis è un sistema di archiviazione dati open-source basato su chiave e valore in memoria che eccelle nella memorizzazione nella cache. Redis è un database non relazionale noto per la sua flessibilità, prestazioni, scalabilità e ampio supporto linguistico.
Redis è stato progettato per essere utilizzato da client affidabili in un ambiente affidabile e non dispone di robuste funzionalità di sicurezza proprie. Tuttavia, Redis ha alcune funzionalità di sicurezza come l’autenticazione della password e la possibilità di rinominare o disabilitare alcuni comandi. Questo tutorial fornisce istruzioni su come installare Redis e configurare queste funzionalità di sicurezza. Copre anche alcune altre impostazioni che possono migliorare la sicurezza di un’installazione standalone di Redis su Rocky Linux 8.
Si noti che questa guida non affronta situazioni in cui il server Redis e le applicazioni client si trovano su host diversi o in data center diversi. Le installazioni in cui il traffico Redis deve attraversare una rete non sicura o non affidabile richiederanno un set diverso di configurazioni, come la configurazione di un proxy SSL o di una VPN tra le macchine Redis.
È inoltre possibile utilizzare il servizio Redis gestito di DigitalOcean.
Prerequisiti
Per completare questo tutorial, avrai bisogno di un server che esegua Rocky Linux 8. Questo server dovrebbe avere un utente non root con privilegi amministrativi e un firewall configurato con firewalld
. Per configurare questo, segui la nostra guida Configurazione Iniziale del Server per Rocky Linux 8.
Passo 1 — Installazione e Avvio di Redis
Puoi installare Redis con il gestore dei pacchetti DNF. Utilizzando DNF, puoi installare Redis, le sue dipendenze e nano
, un editor di testo amico. Non è necessario installare nano
, ma lo utilizzeremo negli esempi di questa guida:
- sudo dnf install redis nano
Questo comando ti chiederà conferma se desideri installare i pacchetti selezionati. Premi y
e poi INVIO
per farlo:
Output. . .
Total download size: 1.5 M
Installed size: 5.4 M
Is this ok [y/N]: y
In seguito, c’è una modifica di configurazione importante 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. Qui useremo nano
:
- sudo nano /etc/redis.conf
All’interno del file, trova la direttiva supervised
. Questa direttiva ti permette di dichiarare un sistema di avvio per gestire Redis come servizio, fornendoti maggior controllo sul suo funzionamento. La direttiva supervised
è impostata su no
di default. Poiché stai utilizzando Rocky Linux, che utilizza il sistema di avvio systemd, cambialo in systemd
:
. . .
# Se esegui Redis tramite 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
# UPSTART_JOB o NOTIFY_SOCKET delle variabili d'ambiente
# Nota: questi metodi di supervisione segnalano solo "il processo è pronto."
# Non abilitano ping di continuità verso il tuo supervisore.
supervised systemd
. . .
Questa è l’unica modifica che devi apportare al file di configurazione di Redis in questo momento, quindi salva e chiudi quando hai finito. Se hai utilizzato nano
per modificare il file, salva e esci con CTRL + X
, quindi quando richiesto, Y
e poi Invio.
Dopo aver modificato il file, avvia il servizio Redis:
- sudo systemctl start redis.service
Se desideri che Redis si avvii all’avvio, puoi abilitarlo con il comando enable
:
- sudo systemctl enable redis
Nota che questo comando non include il suffisso .service
dopo il nome del file unità. Di solito è possibile omettere questo suffisso dai comandi systemctl
, poiché può essere analizzato automaticamente dai nomi dei servizi.
Puoi controllare lo stato di Redis eseguendo il seguente:
- sudo systemctl status redis
Output● redis.service - Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/redis.service.d
└─limit.conf
Active: active (running) since Tue 2022-09-06 22:11:52 UTC; 40s ago
Main PID: 14478 (redis-server)
Tasks: 4 (limit: 11152)
Memory: 6.6M
CGroup: /system.slice/redis.service
└─14478 /usr/bin/redis-server 127.0.0.1:6379
Dopo aver confermato che Redis è effettivamente in esecuzione, puoi testarne la funzionalità con questo comando:
- redis-cli ping
Questo dovrebbe stampare PONG
come risposta:
OutputPONG
Se questo è il caso, significa che ora hai Redis in esecuzione sul tuo server e puoi iniziare a configurarlo per migliorarne la sicurezza.
Passaggio 2 — Configurazione di Redis e Sicurezza con un Firewall
Un modo efficace per proteggere Redis è assicurarsi che il server su cui è in esecuzione sia sicuro. Puoi farlo assicurandoti che Redis sia vincolato solo a localhost o a un indirizzo IP privato e che il server abbia un firewall attivo.
Tuttavia, se hai scelto di configurare Redis utilizzando un altro tutorial, potresti aver aggiornato il file di configurazione per consentire connessioni da qualsiasi luogo. Questo non è sicuro come il vincolo a localhost o a un indirizzo IP privato.
Per rimediare a questo, apri nuovamente il file di configurazione di Redis con il tuo editor di testo preferito:
- sudo nano /etc/redis.conf
Localizza la riga che inizia con bind
e assicurati che non sia commentata o disabilitata, rimuovendo il segno #
all’inizio della riga se necessario:
. . .
bind 127.0.0.1
Se devi collegare Redis a un altro indirizzo IP (come nei casi in cui accederai a Redis da un host separato) dovresti considerare seriamente di collegarlo a un indirizzo IP privato. Il collegamento a un indirizzo IP pubblico aumenta l’esposizione dell’interfaccia Redis a parti esterne:
. . .
bind your_private_ip
Dopo aver confermato che la direttiva bind
non è commentata, puoi salvare e chiudere il file.
Se hai seguito il tutorial preliminare di configurazione del server e installato firewalld sul tuo server, e non prevedi di connetterti a Redis da un altro host, allora non è necessario aggiungere regole del firewall aggiuntive per Redis. Dopotutto, qualsiasi traffico in entrata verrà eliminato per impostazione predefinita a meno che non sia esplicitamente consentito dalle regole del firewall. Poiché un’installazione standalone predefinita del server Redis sta ascoltando solo sull’interfaccia di loopback (127.0.0.1
o localhost), non dovrebbe esserci preoccupazione per il traffico in entrata sulla porta predefinita.
Tuttavia, se prevedi di accedere a Redis da un altro host, dovrai apportare alcune modifiche alla configurazione di firewalld utilizzando il comando firewall-cmd
. Di nuovo, dovresti consentire l’accesso al tuo server Redis solo dai tuoi host utilizzando i loro indirizzi IP privati al fine di limitare il numero di host a cui il tuo servizio è esposto.
Per iniziare, aggiungi una zona Redis dedicata alla tua politica firewalld:
- sudo firewall-cmd --permanent --new-zone=redis
Quindi specifica quale porta desideri aprire. Redis utilizza la porta 6379
per impostazione predefinita:
- sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp
Successivamente, specifica gli indirizzi IP privati che devono essere autorizzati a passare attraverso il firewall e accedere a Redis:
- sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP
Dopo aver eseguito questi comandi, ricarica il firewall per implementare le nuove regole:
- sudo firewall-cmd --reload
In questa configurazione, quando il firewall riceve un pacchetto dall’indirizzo IP del tuo client, applicherà le regole nella zona Redis dedicata a quella connessione. Tutte le altre connessioni saranno elaborate dalla zona predefinita public
. I servizi nella zona predefinita si applicano a ogni connessione, non solo a quelle che non corrispondono esplicitamente, quindi non è necessario aggiungere altri servizi (ad esempio SSH) alla zona Redis, poiché quelle regole verranno applicate automaticamente a tale connessione.
Tieni presente che qualsiasi strumento firewall funzionerà, che tu stia usando firewalld
, ufw
o iptables
. L’importante è che il firewall sia attivo e in esecuzione in modo che individui sconosciuti non possano accedere al tuo server. Nel prossimo passo, configurerai Redis in modo che sia accessibile solo con una password sicura.
Passaggio 3 — Configurazione di una password Redis
Configurare una password Redis abilita una delle sue funzionalità di sicurezza integrate – il comando auth
– che richiede ai client di autenticarsi prima di poter accedere al database. Come l’impostazione bind
, la password è configurata direttamente nel file di configurazione di Redis, /etc/redis.conf
. Riapri quel file:
- sudo nano /etc/redis.conf
Scorri fino alla sezione SECURITY
e cerca una direttiva commentata che dica:
. . .
# requirepass foobared
Decommentala rimuovendo il #
, e cambia foobared
con una password molto forte da te scelta.
Nota: Piuttosto che inventare una password tu stesso, puoi usare uno strumento come apg
o pwgen
per generarne una. Se non vuoi installare un’applicazione solo per generare una password, però, puoi usare il comando seguente. Questo comando ripete un valore di stringa e lo invia al comando sha256sum
seguente, che mostrerà il checksum SHA256 della stringa.
Tieni presente che inserire questo comando così com’è scritto genererà sempre la stessa password. Per creare una password unica, cambia la stringa tra virgolette con qualsiasi altra parola o frase:
- echo "digital-ocean" | sha256sum
Anche se la password generata non sarà memorabile, sarà molto forte e lunga, il che è esattamente il tipo di password richiesto per Redis. Dopo aver copiato e incollato l’output di quel comando come nuovo valore per requirepass
, dovrebbe leggersi:
. . .
requirepass password_copied_from_output
In alternativa, se preferisci una password più corta, potresti invece usare l’output di un checksum diverso. Di nuovo, cambia la parola tra virgolette in modo che non generi la stessa password di questo comando:
- echo "digital-ocean" | sha1sum
Dopo aver impostato la password, salva e chiudi il file e poi riavvia Redis:
- sudo systemctl restart redis
Per verificare che la password funzioni, apri il client Redis:
- redis-cli
Di seguito è riportata una sequenza di comandi utilizzati per verificare se la password di Redis funziona. Il primo comando cerca di impostare una chiave su un valore prima dell’autenticazione:
- set key1 10
Questo non funzionerà poiché non ti sei ancora autenticato, quindi Redis restituisce un errore:
Output(error) NOAUTH Authentication required.
Il seguente comando si autentica con la password specificata nel file di configurazione di Redis:
- auth your_redis_password
Redis confermerà che sei stato autenticato:
OutputOK
Dopo ciò, eseguire nuovamente il comando precedente dovrebbe avere successo:
- set key1 10
OutputOK
Il comando get key1
interroga Redis per il valore della nuova chiave:
- get key1
Output"10"
Questo ultimo comando esce da redis-cli
. Puoi anche usare exit
:
- quit
Ora dovrebbe essere molto difficile per gli utenti non autorizzati accedere alla tua installazione di Redis. Tieni presente che se stai già usando il client Redis da riga di comando e poi riavvii Redis, dovrai riautenticarti. Inoltre, nota che senza SSL o una VPN, questa password potrebbe ancora essere intercettata da parti esterne se ti stai connettendo a Redis in remoto.
Successivamente, questa guida illustrerà come rinominare i comandi di Redis per proteggere ulteriormente Redis da attori malintenzionati.
Passaggio 4 — Rinominare i comandi pericolosi
Un’altra funzione di sicurezza incorporata in Redis consente di rinominare o disabilitare completamente alcuni comandi considerati pericolosi. Quando eseguiti da utenti non autorizzati, questi comandi possono essere utilizzati per riconfigurare, distruggere o altrimenti cancellare i tuoi dati. Alcuni dei comandi considerati pericolosi includono:
FLUSHDB
FLUSHALL
KEYS
PEXPIRE
DEL
CONFIG
SHUTDOWN
BGREWRITEAOF
BGSAVE
SAVE
SPOP
SREM
RENAME
DEBUG
Questa non è una lista esaustiva, ma rinominare o disabilitare tutti i comandi in questa lista può contribuire a migliorare la sicurezza del tuo store dati. Se devi disabilitare o rinominare un dato comando dipenderà dalle tue esigenze specifiche. Se sai che non userai mai un comando che può essere abusato, allora puoi disabilitarlo. Altrimenti, dovresti rinominarlo.
Come la password di autenticazione, la rinomina o la disabilitazione dei comandi è configurata nella sezione SECURITY
del file /etc/redis.conf
. Per abilitare o disabilitare i comandi Redis, apri nuovamente il file di configurazione per modificarlo:
- sudo nano /etc/redis.conf
NOTA: Questi sono esempi. Dovresti scegliere di disabilitare o rinominare i comandi che hanno senso per te. Puoi saperne di più sui comandi di Redis e capire come potrebbero essere abusati su redis.io/commands.
Per disabilitare o eliminare un comando, rinominalo con una stringa vuota, come questo:
# È anche possibile eliminare completamente un comando rinominandolo in
# una stringa vuota:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
Per rinominare un comando, dagli un altro nome come negli esempi qui sotto. I comandi rinominati dovrebbero essere difficili da indovinare per gli altri, ma facili da ricordare per te:
# È anche possibile eliminare completamente un comando rinominandolo in
# una stringa vuota:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
Salva le tue modifiche e chiudi il file. Poi applica le modifiche riavviando Redis:
- sudo systemctl restart redis.service
Per testare i tuoi nuovi comandi, entra nella linea di comando di Redis:
- redis-cli
Autenticati usando la password che hai definito in precedenza:
- auth your_redis_password
OutputOK
Supponendo che tu abbia rinominato il comando CONFIG
in ASC12_CONFIG
, cercare di usare il comando config
fallirà:
- config get requirepass
Output(error) ERR unknown command 'config'
Chiamando invece il comando rinominato avrai successo. Nota che i comandi Redis non sono sensibili alle maiuscole:
- asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"
Infine, puoi uscire da redis-cli
:
- exit
Avviso: Riguardo al rinominare i comandi, c’è una dichiarazione di avvertimento alla fine della sezione SECURITY
nel file /etc/redis.conf
, che dice:
. . .
# Si prega di notare che cambiare il nome dei comandi che vengono registrati nel file
AOF o trasmessi alle repliche potrebbe causare problemi.
. . .
Ciò significa che se il comando rinominato non è presente nel file AOF o se è presente ma il file AOF non è stato trasmesso alle repliche, non dovrebbe esserci alcun problema. Tienilo presente durante la rinomina dei comandi. Il momento migliore per rinominare un comando è quando non si utilizza la persistenza AOF o subito dopo l’installazione (ovvero prima che l’applicazione Redis venga distribuita).
Passaggio 5 – Impostare la proprietà della directory dei dati e i permessi dei file
In questo passaggio verranno eseguite alcune modifiche di proprietà e di permessi che potrebbero essere necessarie per migliorare il profilo di sicurezza dell’installazione di Redis. Ciò implica assicurarsi che solo l’utente che ha bisogno di accedere a Redis abbia il permesso di leggere i suoi dati. Questo utente è, per impostazione predefinita, l’utente redis.
Puoi verificare ciò utilizzando il comando grep
per trovare la directory dei dati di Redis in un elenco dettagliato della directory principale. Di seguito è riportato il comando e il relativo output:
- ls -l /var/lib | grep redis
Outputdrwxr-x---. 2 redis redis 22 Sep 6 22:22 redis
Questo output indica che la directory dei dati di Redis è di proprietà dell’utente redis, con accesso secondario concesso al gruppo redis. Questa impostazione di proprietà è sicura, così come i permessi della cartella che, utilizzando la notazione ottale, sono impostati su 750
.
Se la directory dei dati di Redis ha permessi non sicuri, è possibile garantire che solo l’utente e il gruppo Redis abbiano accesso alla cartella e ai suoi contenuti eseguendo il comando chmod
. L’esempio seguente modifica l’impostazione dei permessi di questa cartella in 770
:
- sudo chmod 770 /var/lib/redis
L’altro permesso che potrebbe essere necessario modificare è quello del file di configurazione di Redis. Per impostazione predefinita, ha un permesso di file di 640
ed è di proprietà dell’utente root, con proprietà secondaria del gruppo root:
- ls -l /etc/redis.conf
Output-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis.conf
Quel permesso (640
) significa che il file di configurazione di Redis è leggibile solo dall’utente redis e dal gruppo root. Poiché il file di configurazione contiene la password non criptata configurata nella fase 4, redis.conf
dovrebbe essere di proprietà dell’utente redis, con proprietà secondaria del gruppo redis. Per impostarlo, eseguire il seguente comando:
- sudo chown redis:redis /etc/redis.conf
Quindi modificare i permessi in modo che solo il proprietario del file possa leggere e scriverlo:
- sudo chmod 600 /etc/redis.conf
È possibile verificare la nuova proprietà e i permessi eseguendo nuovamente i comandi ls
precedenti:
- ls -l /var/lib | grep redis
Outputtotal 40
drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
- ls -l /etc/redis.conf
Outputtotal 40
-rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf
Infine, riavviare Redis per riflettere queste modifiche:
- sudo systemctl restart redis
Con questo, l’installazione di Redis è stata resa sicura.
Conclusione
Tieni presente che una volta che qualcuno è loggato nel tuo server, è possibile aggirare le funzionalità di sicurezza specifiche di Redis che hai implementato. Ecco perché la caratteristica di sicurezza più importante trattata in questo tutorial è il firewall, poiché impedisce a utenti sconosciuti di accedere al tuo server in primo luogo.
Se stai cercando di proteggere la comunicazione Redis su una rete non attendibile, dovrai utilizzare un proxy SSL, come raccomandato dagli sviluppatori di Redis nella guida ufficiale alla sicurezza di Redis.
Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-rocky-linux-8