03 · Configurazione e sicurezza
Obiettivo: conoscere i parametri di redis.conf che contano in produzione,
gestirli a caldo con CONFIG, e mettere in sicurezza l’istanza con ACL e TLS.
3.1 Come funziona la configurazione
Sezione intitolata “3.1 Come funziona la configurazione”Redis legge un file (redis.conf) all’avvio; molti parametri sono poi
modificabili a runtime senza riavvio con CONFIG SET.
redis-cli CONFIG GET maxmemoryredis-cli CONFIG SET maxmemory 256mbCONFIG SET cambia il valore in memoria ma non riscrive il file: al riavvio
torna quello del redis.conf. Per persistere le modifiche fatte a caldo:
redis-cli CONFIG REWRITEPer ispezionare tutta la config attiva:
redis-cli CONFIG GET '*' | paste - - | sort | head -n 40Pratica ops: tieni il
redis.confsotto version control (git) e trattaCONFIG SETcome intervento d’emergenza da riportare poi nel file. Evita la deriva tra runtime e file.
3.2 Parametri di base che configuri sempre
Sezione intitolata “3.2 Parametri di base che configuri sempre”Estratto commentato di un redis.conf di produzione standalone:
# --- Rete ---bind 127.0.0.1 10.0.0.10 # interfacce su cui ascoltare (mai 0.0.0.0 in chiaro)protected-mode yes # rifiuta connessioni esterne senza auth/bindport 6379tcp-backlog 511timeout 0 # 0 = non chiudere connessioni idletcp-keepalive 300
# --- Generale ---daemonize no # no se usi systemd con Type=notifysupervised systemdpidfile /run/redis/redis.pidloglevel noticelogfile /var/log/redis/redis.logdatabases 16
# --- Memoria ---maxmemory 2gbmaxmemory-policy noeviction # vedi modulo 07 per la sceltamaxclients 10000
# --- Persistenza (dettaglio nel modulo 04) ---dir /var/lib/redissave 3600 1 300 100 60 10000appendonly yesParametri da capire bene:
bind: lista di IP locali su cui ascoltare. Lasciare l’ascolto su tutte le interfacce senza protezioni è la causa numero uno di Redis compromessi su Internet.protected-mode: seyes(default), Redis rifiuta connessioni da IP non locali quando non c’è nébindesplicito né password. È una rete di sicurezza, non un sostituto di autenticazione e firewall.maxclients: limite connessioni; ricorda che dipende anche dal limite di file descriptor del processo (ulimit -n, modulo 07).timeout/tcp-keepalive: gestione connessioni idle e rilevamento peer morti.
3.3 Autenticazione: da requirepass agli ACL
Sezione intitolata “3.3 Autenticazione: da requirepass agli ACL”Modo legacy: password unica
Sezione intitolata “Modo legacy: password unica”redis-cli CONFIG SET requirepass 'UnaPasswordLungaECasuale!'redis-cli -a 'UnaPasswordLungaECasuale!' pingrequirepass dà a tutti i client gli stessi pieni poteri. In produzione moderna
si usano gli ACL (da Redis 6), che permettono utenti multipli con permessi
granulari.
ACL (raccomandato)
Sezione intitolata “ACL (raccomandato)”Visualizza l’utente di default:
redis-cli ACL LISTredis-cli ACL WHOAMICrea un utente applicativo che può solo leggere/scrivere chiavi con un certo prefisso e usare solo alcuni comandi:
redis-cli ACL SETUSER app_cache on '>PasswordApp!' '~cache:*' '+@read' '+@write' '-@dangerous'Lettura della spiegazione: on abilita l’utente, >... imposta la password,
~cache:* limita le chiavi accessibili al pattern, +@read +@write concede le
categorie di comandi di lettura/scrittura, -@dangerous toglie i comandi
pericolosi (FLUSHALL, KEYS, CONFIG, SHUTDOWN, …).
Verifica e prova:
redis-cli ACL GETUSER app_cacheredis-cli -u 'redis://app_cache:PasswordApp!@127.0.0.1:6379' set cache:1 okCategorie utili: +@read, +@write, +@admin, +@dangerous, +@keyspace,
+@connection. Elenco:
redis-cli ACL CATDisabilita o riduci l’utente default (in produzione spesso lo si mette
nopass off oppure gli si toglie ogni permesso):
redis-cli ACL SETUSER default offAttenzione: se disabiliti
defaultassicurati di avere un altro utente admin funzionante, altrimenti ti chiudi fuori.
File ACL persistente
Sezione intitolata “File ACL persistente”Per gestire molti utenti, esternalizza in un file:
# in redis.confaclfile /etc/redis/users.aclredis-cli ACL SAVE # scrive gli utenti correnti nell'aclfileredis-cli ACL LOAD # ricarica dall'aclfile
requirepasseaclfilesono mutuamente esclusivi: scegli uno dei due approcci. Conaclfilela password didefaultsi gestisce dentro il file.
Comandi pericolosi
Sezione intitolata “Comandi pericolosi”Storicamente si usava rename-command per nascondere/disabilitare comandi (es.
rinominare FLUSHALL). È deprecato: l’approccio corretto è togliere i comandi
via ACL (-flushall, -config, -@dangerous). Mantieni almeno un utente admin
che li conservi per la manutenzione.
3.4 TLS (cifratura in transito)
Sezione intitolata “3.4 TLS (cifratura in transito)”Da Redis 6 il TLS è nativo. Serve un Redis compilato con TLS (i pacchetti
ufficiali e AppStream recenti lo includono; da sorgente: make BUILD_TLS=yes).
Generare certificati di test
Sezione intitolata “Generare certificati di test”Per laboratorio puoi generare una CA e un certificato server:
mkdir -p ~/redis-tls && cd ~/redis-tlsopenssl genrsa -out ca.key 4096 && openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -subj "/CN=Redis-Lab-CA" -out ca.crtopenssl genrsa -out redis.key 2048 && openssl req -new -key redis.key -subj "/CN=redis-server" -out redis.csr && openssl x509 -req -in redis.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 365 -sha256 -out redis.crtIn produzione usa certificati emessi dalla CA aziendale, non self-signed.
Configurare Redis per il TLS
Sezione intitolata “Configurare Redis per il TLS”# in redis.confport 0 # disabilita la porta in chiaro (opzionale ma consigliato)tls-port 6379tls-cert-file /etc/redis/tls/redis.crttls-key-file /etc/redis/tls/redis.keytls-ca-cert-file /etc/redis/tls/ca.crttls-auth-clients yes # richiede certificato client (mTLS); 'no' per solo serverConnettersi in TLS
Sezione intitolata “Connettersi in TLS”redis-cli --tls --cert ~/redis-tls/redis.crt --key ~/redis-tls/redis.key --cacert ~/redis-tls/ca.crt -p 6379 pingPer replica e cluster in TLS servono anche tls-replication yes e
tls-cluster yes. Nota: il TLS aggiunge latenza/CPU; valuta l’impatto con
redis-benchmark (modulo 07).
3.5 Checklist di hardening
Sezione intitolata “3.5 Checklist di hardening”Da applicare prima di esporre Redis oltre localhost:
La sicurezza di Redis è a strati: ogni livello ferma un attacco diverso, nessuno basta da solo.
flowchart TB
NET["1. Rete: firewall + bind su IP interni (mai 0.0.0.0 esposto)"]
PM["2. protected-mode yes"]
AUTH["3. Autenticazione: ACL per ruolo, default disabilitato"]
CMD["4. Comandi pericolosi rimossi via ACL (-@dangerous)"]
TLS["5. TLS / mTLS sul traffico che esce dall'host"]
OS["6. Utente di servizio non privilegiato + permessi file stretti"]
NET --> PM --> AUTH --> CMD --> TLS --> OS --> SAFE["Istanza esponibile in rete interna"]
- Rete:
bindsolo sulle interfacce necessarie; firewall (firewalld) che consente 6379 solo dalle subnet client; mai esposto su Internet. protected-mode yes(lascialo attivo).- Autenticazione: ACL con utenti dedicati per ruolo;
defaultdisabilitato o senza permessi; password lunghe e casuali, gestite in un secret manager. - Comandi pericolosi rimossi via ACL agli utenti applicativi
(
-@dangerous,-keys,-flushall,-config,-debug). - TLS per il traffico che esce dall’host; mTLS dove richiesto.
- Utente di servizio non privilegiato (
redis), file con permessi stretti su chiavi private e aclfile (chmod 600). - Limiti di sistema allineati (
maxclients,ulimit -n, vedi modulo 07). maxmemory+ policy impostati per evitare OOM (modulo 07).
Verifica rapida dello stato di sicurezza:
redis-cli CONFIG GET 'bind' && redis-cli CONFIG GET 'protected-mode' && redis-cli ACL WHOAMI && redis-cli ACL LISTEsempio regola firewalld (consenti solo da una subnet):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="6379" protocol="tcp" accept' && sudo firewall-cmd --reloadProssimo passo
Sezione intitolata “Prossimo passo”Modulo 04 — Persistenza. Lab corrispondenti: Lab 1 e Lab 3 nel modulo 09.