Introduzione
Redis è un datastore in grado di memorizzare strutture di dati chiave-valore su memoria oltre che su disco, ottimizzando la creazione rapida di applicazioni tramite la disponibilità di strutture dati molto versatili.
Rappresenta pertanto una delle soluzioni migliori per sviluppare applicazioni che richiedono un rapido scambio di dati in tempo reale. Per i diversi contesti di applicazione, è oggi uno dei database opensource più utilizzati.
In questo tutorial ti verrà mostrato come installare, configurare e mettere in sicurezza Redis su un server Linux CentOS 8.
Per prima cosa dovrai connetterti al tuo server tramite una connessione SSH. Se non l’hai ancora fatto, ti consigliamo di seguire la nostra guida per connetterti in sicurezza con il protocollo SSH. In caso di server locale puoi passare al punto successivo e aprire il terminale del tuo server.
Installazione e configurazione di Redis
Puoi tranquillamente installare Redis ricorrendo alle librerie ufficiali di CentOS, essendo una versione inclusa di default.
Per prima cosa accertati di aver aggiornato il tuo pacchetto locale apt tramite il comando:
$ sudo dnf update
Procedi quindi con l'installazione di Redis, digitando:
$ sudo dnf install redis -y
In questo modo installerai Redis e le sue dipendenze.
Ora sarà necessario che tu modifichi la configurazione impostata di default dopo l’installazione.
Per aprire il file di configurazione, utilizza il text-editor che preferisci. Nell’esempio seguente, verrà utilizzato nano.
$ sudo vim /etc/redis.conf
All’interno del file, troverai una voce denominata supervised, che permette di specificare un init-system che potrà regolare Redis come un servizio, per un migliore controllo del software.
La direttiva è impostata su no di default e, per abilitare un controllo tramite CentOS, va impostata come voce systemd. Puoi osservare un esempio qui sotto:
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
# They do not enable continuous liveness pings back to your supervisor.
supervised systemd
Al termine, ricorda di chiudere il file e salvare le impostazioni correnti.
Per completare l’applicazione della nuova impostazione, esegui il riavvio di Redis tramite comando:
$ sudo systemctl restart redis
A questo punto, prima di utilizzare Redis, non ti resta che eseguire qualche test per verificarne il corretto funzionamento.
Testare il funzionamento di Redis
Per verificare il funzionamento di Redis, inizia verificando che sia correttamente in esecuzione tramite il comando:
$ sudo systemctl status redis
Nell’output prodotto, dovresti controllare che compaia la dicitura enabled alla voce Loaded e active (running) alla voce Active.
Ecco un esempio di come dovrebbe apparire l’output, nel caso in cui Redis funzioni come previsto:
redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-04-30 23:26:54 UTC; 4s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 36552 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 36561 (redis-server)
Tasks: 4 (limit: 2345)
Memory: 1.8M
CGroup: /system.slice/redis-server.service
└─36561 /usr/bin/redis-server 127.0.0.1:6379
Se tutto appare come indicato, dovresti avere la conferma che Redis sarà eseguito a ogni avvio del tuo server CentOS.
N.B. Qualora preferissi inviare ogni volta un comando manuale per avviare l’applicativo, ti basterà disabilitare l’avvio automatico tramite il comando:
$ sudo systemctl disable redis
Ora, è necessario controllare che Redis funzioni correttamente, oltre a essere in esecuzione.
Inizia connettendo Redis al server tramite il comando del client:
$ redis-cli
Nel prompt che seguirà , utilizza il comando ping per testare la connettività:
127.0.0.1:6739> ping
Dovresti ottenere un output simile al seguente, che indicherà che la connessione al server è attiva:
PONG
Per proseguire con il test, prova ora a impostare una chiave con un certo valore tramite il comando set.
127.0.0.1:6739> set test “Funziona!”
Ora prova a visualizzare a video il valore della chiave appena creata:
127.0.0.1:6739> get test
Nel caso in cui l’output sia esattamente il valore precedentemente specificato, sarai riuscito a verificare che tutto stia funzionando correttamente.
Dopo aver portato a termine la verifica, potrai uscire dal prompt di Redis tramite il comando exit.
127.0.0.1:6739> exit
Come ultimo test, occorre verificare la persistenza dei dati. Si tratta di assicurarsi che se riavvii Redis, i valori impostati continuano a esistere.
Per verificarlo, utilizzando la chiave appena impostata.
Riavvia Redis tramite il comando:
$ sudo systemctl restart redis
Apri nuovamente il terminale di Redis tramite:
$ redis-cli
Usa il comando
get per estrapolare il valore della chiave
test:
127.0.0.1:6739> get test
Se il valore inserito prima appare come output, il test è stato completato. Non ti resterà che uscire dal terminale di Redis utilizzato nuovamente
exit.
Arrivato a questo punto della guida, dovresti già essere in grado di utilizzare Redis senza problemi, ma è consigliato metterlo prima in sicurezza. Alcune impostazioni di default potrebbero rendere infatti il tuo server esposto ad attacchi esterni, che permetterebbero a utenti malintenzionati di accedere ai dati presenti in esso.
É quindi fortemente consigliato che tu prosegua con i prossimi step per garantire un funzionamento sicuro di Redis.
Costringere Redis al localhost
Se hai seguito questa guida senza modificare alcuna impostazione di Redis, sappi che il programma è di default forzato alla connessione unicamente con il localhost.
Se tuttavia non fossi sicuro o avessi in precedenza consentito connessioni da qualunque altro host, allora sarebbe il caso di ritornare all’impostazione di costrizione al localhost.
Inizia aprendo col tuo editor di testo il file di configurazione di Redis. Nell’esempio verrà usato il comando nano:
$ sudo vim /etc/redis.conf
All’interno del file, cerca questa linea e assicurati di decommentarla, rimuovendo il carattere “#”
bind 127.0.0.1 ::1
Finita la modifica, puoi salvare e chiudere il file seguendo la combinazione di tasti CTRL+X e Invio. Riavvia quindi nuovamente Redis con il comando:
$ sudo systemctl restart redis
Ora non ti resta che controllare che i cambiamenti siano stati applicati, eseguendo il comando netstat.
$ sudo netstat -lnp | grep redis
N.B. Se il comando netstat non dovesse essere riconosciuto, puoi installarlo inserendo nel terminale:
$ sudo apt install net-tools
L'output mostrato sarà simile sl seguente:
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
Osservando l’indirizzo IP specificato nella prima linea (127.0.0.1), dovresti poter notare che la connessione di Redis sarà forzata unicamente al localhost.
N.B. Se in quella colonna dovesse comparire un altro indirizzo IP, potrebbe dipendere dal fatto che non hai decommentato la voce specificata precedentemente o non hai eseguito il riavvio di Redis per applicare i cambiamenti.
Arrivato a questo punto, dovresti essere protetto da attacchi di utenti malintenzionati. Avrai però ancora bisogno di inserire in Redis un meccanismo di autenticazione che si attivi nel caso in cui un utente voglia modificare dei dati tramite il client redis-cli.
Configurare una password per Redis
Impostare un meccanismo di autenticazione è la prima opzione di sicurezza configurabile in Redis. Sostanzialmente, potrai specificare , nel file di configurazione, una password da richiedere a qualunque utente desideri accedere al database.
Inizia aprendo il file di configurazione di Redis.
$ sudo vim /etc/redis.conf
Scorrendo il file, potrai trovare una sezione denominata SECURITY, dove ti imbatterai in questa voce:
# requirepass foobared
Decommetando la riga, ovvero rimuovendo il #, e inserendo una password al posto della voce “foobared”, avrai attivato il meccanismo di autenticazione.
Sicurezza della password di Redis
All’interno del file di configurazione di Redis, sotto la voce per l’autenticazione, troverai una nota a cui dovresti prestare particolare attenzione:
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#
La nota spiega che, a causa della velocità di Redis, è molto facile che un utente malintenzionato possa essere agevolato in un attacco di bruteforce: sarà quindi opportuno impostare una password molto lunga e difficile.
Il comando openssl ti viene in aiuto per produrre una stringa di caratteri alfanumerici di lunghezza da te stabilita: utilizzando bene il comando, potrai produrre una password efficace e difficilmente individuabile.
$ openssl rand 60 | openssl base64 -A
- Con la prima parte del comando, si specifica di produrre un output di caratteri casuali (rand) in una stringa lunga quanto il numero indicato.
- Con la seconda parte, farai si che l’output venga prodotto senza andare a capo.
L’output dovrebbe apparire in questo modo:
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
A questo punto, ti basterà copiare e incollare la stringa generata alla voce requirepass, come visto precedentemente, per impostare una password efficace.
Per concludere, occorrerà che tu testi l’attivazione del protocollo di autenticazione.
Riavvia Redis tramite il comando:
$ sudo systemctl restart redis
Per verificare che la password funzioni, avvia il client di Redis e prova a modificare i dati.
Inizia aprendo il client:
$ redis-cli
Ora, prova a impostare una nuova key con un determinato valore:
127.0.0.1:6739> set key1 10
Dovresti ottenere un errore che indica l’impossibilità di eseguire il comando senza una autenticazione.
Per autenticarti, basterà usare il comando auth, come mostrato di seguito:
127.0.0.1:6739> auth password
N.B. Sostituisci chiaramente "password" con la tua password impostata in precedenza.
Ottenuto il tipico OK da Redis, sarai sicuro di esserti autenticato e potrai riprovare il comando precedente, ottenendo questa volta un output di conferma.
Richiedendo a Redis il valore della chiave key1, dovresti essere in grado di leggere il valore impostato. Per farlo, ricorri al comando get come qui sotto:
127.0.0.1:6739> get key1
Se l’output sarà corretto, il test dell’autenticazione sarà completato e non ti rimarrà che uscire dal client di Redis tramite il comando:
127.0.0.1:6739> quit
L’ ultimo step riguarda la modifica dei nomi dei comandi di Redis. Ciò è necessario a evitare che vengano usati per sbaglio o da un utente malintenzionato, causando seri danni di funzionamento.
Rinominare i comandi pericolosi
La seconda opzione per la sicurezza di Redis è rinominare o cancellare i comandi pericolosi.
Alcuni comandi sono molto pericolosi poichè possono permettere a un utente malintenzionato di sovrascrivere, modificare o riconfigurare i dati all’interno di Redis.
Per abilitare una impostazione che permette di evitare questa possibilità, devi aprire il file di configurazione e spostarti nuovamente nella sezione SECURITY.
Non potendo indicarli tutti, viene mostrato un pacchetto base di comandi che sarebbe opportuno modificare per iniziare a garantire un adeguato livello di sicurezza:
FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME, DEBUG.
Ovviamente hai estrema libertà nella scelta dei comandi che per necessità dovessero apparirti più congeniali da modificare. Puoi visionare qui una lista dei comandi di Redis e dei possibili abusi di questi ultimi.
Per procedere alla modifica, inizia aprendo il file di configurazione:
$ sudo vim /etc/redis.conf
Nella sezione SECURITY, basterà aggiungere la voce rename-command, seguita dal nome originale del comando e dal nuovo nome che desideri assegnare.
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
Per rimuovere completamente un comando, basterà applicare la stessa voce ma, al posto del nuovo nome, inserire due apici i quali, indicando una stringa vuota, suggeriranno a Redis la disabilitazione del comando interessato.
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
Come al solito per salvare i cambiamenti, chiudi e salva il file di configurazione e riavvia Redis tramite il comando:
$ sudo systemctl restart redis.service
Per procedere con la verifica inizia aprendo il client di Redis tramite:
$ redis-cli
Autenticati con:
$ auth password
Completati i passaggi preliminari, dovrai provare i comandi che sono stati rinominati. Prendendo come esempio il comando CONFIG, rinominato in ASC12_CONFIG, verifica prima di tutto che il comando originale non venga riconosciuto come valido, essendo stato rinominato.
La stringa:
127.0.0.1:6739> config get requirepass
dovrebbe produrre un output di errore di questo tipo:
(error) ERR unknown command `config`, with args beginning with:
Se invece dovessi inserire il comando rinominato, anche in minuscolo, Redis dovrebbe riconoscerlo come valido:
127.0.0.1:6739> asc12_config get requirepass
L’output dovrebbe somigliare a questo:
1) "requirepass"
2) "your_redis_password"
Terminata la verifica, puoi uscire da Redis tramite il comando exit.
Ricorda che, riavviando Redis dopo esserti autenticato, ti verrà richiesto nuovamente di accedere.
Avvertenze sulla ridenominazione dei comandi
All’interno della sezione SECURITY del file di configurazione, è presente un altro avvertimento sulla ridenominazione dei comandi.
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.
Sostanzialmente, l’AOF file viene trasmesso dal master agli slaves: nel cambiare i comandi presenti al suo interno solo all’interno del master, si possono generare dei malfunzionamenti dovuti al conflitto dei nomi dei comandi.
É quindi fortemente consigliato eseguire queste modifiche appena dopo l’installazione di Redis, evitando modifiche dopo la “distribuzione”, o assicurarsi che le modifiche vengano effettuate su tutti gli slaves.
Conclusioni
Grazie a questa guida, sei riuscito non solo a installare Redis sul tuo server Linux CentOS, ma anche a impostare una buona configurazione di sicurezza.
Ovviamente ricorda che la massima protezione del tuo server Redis viene garantita dall’impostazione del firewall, dato che gli utenti malintenzionati potrebbero anche riuscire a eludere le normali impostazioni di sicurezza.