Per un DBMS come Redis, che trova nella rete il suo habitat naturale, gli aspetti legati
alla sicurezza sono fondamentali.
Quando creeremo servizi web che lo usano come meccanismo di memorizzazione (persistente o meno)
dobbiamo fare in modo che non vi siano vie dirette di accesso ai database ma che ogni forma
di comunicazione passi dalle API appositamente predisposte. In questa lezione, fissiamo
alcuni concetti della configurazione che permettono di mettere in sicurezza il DBMS.
Indirizzi IP e porte TCP
Una delle prime decisioni che devono essere prese per una corretta gestione del proprio
server Redis riguarda gli indirizzi IP e la porta TCP su cui dovrà rendersi disponibile
alla connessione. Nel file di configurazione esistono appositamente due opzioni:
bind
, che determina su quali indirizzi IP il server rimarrà in ascolto. Da lì
potrà essere contattato dalle macchine che avranno accesso alle relative reti. L'impostazione
di default permette l'accesso solo dalla macchina locale:
bind 127.0.0.1
Ciò può essere cambiato abbinando un indirizzo diverso o più indirizzi. Ad esempio,
con la seguente impostazione:
bind 127.0.0.1 192.168.56.3
esponiamo il server con indirizzo 192.168.56.3 oltrechè ai servizi locali.port
, che introduce il numero di porta TCP, fissata di default a 6379
Specificare tali parametri è fondamentale perchè fornisce una grossa scrematura all'ingresso
e permette di decidere a chi mettere a disposizione il server. Oltre a ciò, come presumibile,
potranno essere associate all'installazione di Redis opportune regole del firewall.
Si ricorda inoltre che indirizzo IP e porta TCP possono essere passati anche all'avvio
del servizio senza modificare il file di configurazione mediante opzioni, come specificato
in una delle prime lezioni di questa guida.
Protected mode
A partire dalla versione 3.2, Redis ha visto l'introduzione, per motivi di sicurezza, di
una nuova modalità di lavoro: il protected mode. Questo si applica in automatico ad un server
Redis nel caso in cui non sia stata nè impostata l'opzione di bind (niente bind significa
connessione aperta su ogni indirizzo IP della macchina) e non sia stata impostata alcuna
password di autenticazione (lo tratteremo più avanti in questa stessa lezione) ed inoltre sia impostata
a "yes" l'opzione del file di configurazione protected-mode.
Pertanto, qualora a fronte di un'operazione da remoto ricevessimo un messaggio di errore
contraddistinto dall'incipit DENIED Redis is running in protected mode because...,
dovremo risolvere il problema impostando uno o più indirizzi di bind o una password di accesso
(o meglio ancora entrambi). Il problema potrebbe essere aggirato impostando a "no" l'opzione
protected-mode, ma è un rimedio che va evitato in quanto tale modalità
di sicurezza è stata introdotta appositamente al fine di contrastare il proliferare
di installazioni Redis non sicure.
Connessione a Redis e test del server
Per poter verificare le proprie configurazioni di sicurezza è importante sapersi connettere ad
una installazione remota di Redis e verificarne la disponibilità. Tali strumenti risulteranno
utili soprattutto quando si tratterà di eseguire installazioni in cluster o impostare
replica di dati su più server Redis.
Con il comando redis-cli ci si può connettere ad un altro server Redis fornendone
indirizzo IP e porta TCP di connessione (se quest'ultima è la 6379 può essere omessa
in quanto valore di default). Il seguente comando esegue la connessione all'indirizzo IP 192.68.56.3:
$ redis-cli -h 192.168.56.3
mentre in questo secondo caso specifichiamo una porta TCP:
$ redis-cli -h 192.168.56.3 -p 5588
Nel caso in cui si ottenga un messaggio del tipo Could not connect to Redis at
192.168.56.3:5588: Connection refused", significa che la connessione non è stata permessa,
probabilmente per le impostazioni di configurazione che abbiamo assegnato noi. In caso contrario
(quello di connessione autorizzata) si otterrà come risposta direttamente l'accesso alla
shell di Redis. A scopo di test, risulta molto utile il comando PING
che interroga il server di destinazione ed in caso di collegamento ben riuscito replica con
la stringa "PONG" a meno che non passiamo una nostra stringa personalizzata che verrà restituita
come risposta. Nelle seguenti righe vediamo il comando utilizzato nei confronti del server
locale:
> PING
PONG
> PING "messaggio di prova"
"messaggio di prova"
Per una verifica da remoto di un altro server, possiamo passare sempre da redis-cli. Per ottenere il medesimo
risultato in maniera più rapida, il PING
(come ogni altro comando Redis) può essere inoltrato anche direttamente
via redis-cli senza aprire la console di Redis:
$ redis-cli -h 192.168.56.3 -p 5588 PING
PONG
Autenticazione
Una prassi fondamentale per la sicurezza di Redis è l'impostazione di una parola chiave
di accesso. La si può immettere nella configurazione mediante l'opzione requirepass:
requirepass parolachiave
mentre la macchina client che farà accesso potrà usare il comando AUTH:
$ redis-cli -h 192.168.56.3
> SET nome Luca
(error) NOAUTH Authentication required.
> AUTH parolachiave
OK
> SET nome Luca
OK
In queste righe, abbiamo provato a fare accesso ad un server protetto da password. Il tentativo è stato respinto
ma dopo l'utilizzo della direttiva AUTH
siamo stati autorizzati e, come si vede, siamo riusciti anche a memorizzare una stringa,
a conferma della piena operatività conseguita.