
Redis es muy rápido, pero una instancia expuesta, sin separación de usuarios o con una estrategia de persistencia incorrecta puede provocar accesos no autorizados y pérdida de datos.
Una configuración base para producción combina:
- ACL por aplicación y por operador.
- Acceso limitado a interfaces y redes privadas.
- Firewall con allowlist.
- Persistencia acorde con la criticidad de los datos.
- Backups cifrados y restauraciones probadas.
Esta guía está orientada a Redis Open Source 6 o posterior. Las pruebas con ACL DRYRUN requieren Redis 7 o posterior.
Cuándo conviene aplicarlo
Este enfoque es recomendable cuando Redis se utiliza para:
- Caché compartida.
- Sesiones.
- Rate limiting.
- Colas o streams.
- Coordinación entre aplicaciones.
- Datos temporales con requisitos de recuperación.
No mezcles caché descartable y datos críticos en la misma instancia sin evaluar cuidadosamente la política global de memoria, eviction y persistencia.
Arquitectura recomendada
El flujo seguro es:
Aplicación → Red privada → Firewall → Redis ACL → AOF/RDB → Backup cifradoLa administración debe usar una ruta separada:
Operador → SSH o localhost → Usuario ACL ops → RedisEl usuario de la aplicación solo debe acceder a sus claves y comandos. El usuario administrativo debe emplearse únicamente desde una ruta controlada.
Requisitos previos
Necesitas:
- Redis 6 o posterior.
- Acceso mediante
sudo. - IP privada fija en el servidor Redis.
- Firewall activo.
- Conectividad privada desde la aplicación.
- Consola fuera de banda o acceso alternativo.
- Backup verificado si ya existen datos.
- Un gestor de secretos para las credenciales ACL.
En Debian y Ubuntu, las rutas habituales son /etc/redis/redis.conf y el servicio redis-server, pero debes confirmarlas en tu instalación:
systemctl cat redis-server
redis-server --version
redis-cli INFO serverPaso 1: registrar el estado inicial
Antes de modificar la instancia, revisa su configuración efectiva:
redis-cli CONFIG GET bind
redis-cli CONFIG GET protected-mode
redis-cli CONFIG GET appendonly
redis-cli CONFIG GET appendfsync
redis-cli CONFIG GET save
redis-cli CONFIG GET dir
redis-cli CONFIG GET dbfilename
redis-cli ACL LIST
redis-cli INFO persistenceComprueba también dónde escucha Redis:
sudo ss -lntp | grep ':6379'Crea una copia protegida de la configuración:
sudo cp --preserve=all \
/etc/redis/redis.conf \
/etc/redis/redis.conf.pre-hardening
sudo chmod 600 /etc/redis/redis.conf.pre-hardeningPaso 2: crear un backup de los datos
Si utilizas RDB, solicita un snapshot en segundo plano:
redis-cli BGSAVE
redis-cli LASTSAVE
redis-cli INFO persistenceConfirma:
rdb_bgsave_in_progress:0
rdb_last_bgsave_status:okCopia el RDB resultante a un almacenamiento cifrado fuera del servidor.
Si AOF está activo, no copies indiscriminadamente sus archivos mientras ocurre una reescritura. Desde Redis 7, AOF utiliza varios archivos y un manifiesto; una copia tomada durante la transición puede quedar inconsistente. Utiliza snapshots consistentes del volumen o el procedimiento oficial de backup de AOF. Persistencia y backups de Redis.
Un archivo de persistencia local no reemplaza un backup externo y probado.
Paso 3: restringir las interfaces
Abre el archivo de configuración:
sudoedit /etc/redis/redis.confLocaliza bind y protected-mode. Para una aplicación ubicada en otro servidor privado:
bind 127.0.0.1 10.0.0.10
protected-mode yes
port 6379Sustituye 10.0.0.10 por la IP privada real del servidor Redis.
Si todas las aplicaciones se ejecutan en el mismo host, limita Redis a loopback:
bind 127.0.0.1
protected-mode yesNo utilices:
bind 0.0.0.0
protected-mode noLa documentación de Redis recomienda impedir el acceso externo al puerto y enlazar el servicio únicamente a interfaces controladas. protected-mode es una defensa adicional, no un reemplazo del firewall. Seguridad de Redis.
Paso 4: limitar el puerto mediante firewall
Autoriza únicamente al servidor de aplicación. Por ejemplo, con UFW:
sudo ufw allow \
from 10.0.0.20 \
to 10.0.0.10 \
port 6379 \
proto tcpVerifica las reglas antes de aplicarlas:
sudo ufw status numberedNo habilites una política restrictiva sin confirmar primero los accesos administrativos y de aplicación necesarios.
Una red privada no cifra automáticamente el tráfico. AUTH y el resto de los comandos se transmiten sin cifrar cuando no se utiliza TLS. Activa TLS si la red es compartida, atraviesa infraestructura no confiable o existe un requisito de cumplimiento. TLS en Redis.
Paso 5: preparar un archivo ACL persistente
Para varias identidades, Redis recomienda un archivo ACL externo. Crea el archivo con permisos limitados:
sudo install \
-o redis \
-g redis \
-m 0640 \
/dev/null \
/etc/redis/users.aclAgrega en redis.conf:
aclfile /etc/redis/users.aclNo combines usuarios declarados directamente mediante líneas user en redis.conf con un archivo externo: ambos métodos son mutuamente excluyentes. Archivos ACL externos.
Reinicia durante una ventana controlada:
sudo systemctl restart redis-server
sudo systemctl status redis-server --no-pager
sudo journalctl -u redis-server -n 50 --no-pagerConfirma que el servicio siga respondiendo localmente:
redis-cli PINGPaso 6: crear credenciales seguras
Crea dos contraseñas distintas:
app: usada exclusivamente por la aplicación.ops: usada para administración.
Redis dispone de ACL GENPASS para generar secretos aleatorios:
redis-cli ACL GENPASSGuarda cada contraseña inmediatamente en el gestor de secretos. No la insertes en scripts, repositorios ni documentación.
Las ACL pueden almacenar hashes SHA-256 mediante reglas que comienzan con #. Calcula el hash sin colocar la contraseña directamente en la línea de comandos:
read -r -s -p "Password ACL: " REDIS_PASSWORD
printf '\n'
printf '%s' "$REDIS_PASSWORD" | sha256sum
unset REDIS_PASSWORDConserva los 64 caracteres hexadecimales del resultado.
Paso 7: crear los usuarios app y ops
Crea primero el usuario limitado de la aplicación. Sustituye el hash ficticio:
redis-cli ACL SETUSER app \
reset \
on \
'#HASH_SHA256_APP' \
'~app:*' \
resetchannels \
+PING \
+@read \
+@write \
-@dangerousLas reglas significan:
reset: elimina cualquier permiso anterior.on: habilita el usuario.#HASH_SHA256_APP: agrega una contraseña previamente hasheada.~app:*: limita el acceso a claves con ese prefijo.resetchannels: impide Pub/Sub mientras no sea necesario.+PING: permite la comprobación de salud.+@ready+@write: permiten categorías de lectura y escritura.-@dangerous: elimina comandos considerados peligrosos.
Las reglas se procesan de izquierda a derecha. Por eso la denegación -@dangerous aparece después de las categorías permitidas. Sintaxis de ACL SETUSER.
Para aplicaciones estrictas, es preferible permitir comandos individuales, por ejemplo +GET, +SET, +DEL y +EXPIRE, en vez de categorías completas. Revisa las categorías después de actualizar Redis porque su composición puede cambiar.
Crea después la identidad administrativa:
redis-cli ACL SETUSER ops \
reset \
on \
'#HASH_SHA256_OPS' \
'~*' \
'&*' \
+@allops posee control completo. Su contraseña debe almacenarse por separado y utilizarse únicamente desde localhost, consola o un túnel SSH controlado.
Guarda las ACL:
redis-cli ACL SAVEACL SAVE persiste la configuración activa dentro de aclfile. CONFIG REWRITE no guarda automáticamente ese archivo. Persistencia de ACL.
Paso 8: validar los permisos antes de desactivar default
En Redis 7 o posterior, prueba permisos sin ejecutar realmente los comandos:
redis-cli ACL DRYRUN app SET app:health ok
redis-cli ACL DRYRUN app GET app:health
redis-cli ACL DRYRUN app SET otra:health ok
redis-cli ACL DRYRUN app CONFIG GET dirLos dos primeros deben responder OK. Los otros deben indicar falta de permisos.
ACL DRYRUN simula un comando sin producir sus efectos. Documentación de ACL DRYRUN.
Realiza después una autenticación con el usuario app. Evita colocar la contraseña en una URI porque puede quedar en el historial o en la lista de procesos:
read -r -s -p "Password de app: " REDISCLI_AUTH
printf '\n'
export REDISCLI_AUTH
redis-cli \
--user app \
-h 10.0.0.10 \
SET app:health ok
redis-cli \
--user app \
-h 10.0.0.10 \
GET app:health
redis-cli \
--user app \
-h 10.0.0.10 \
CONFIG GET dir
unset REDISCLI_AUTHEl SET y el GET deben funcionar. CONFIG GET debe ser rechazado.
Redis recomienda REDISCLI_AUTH en lugar de pasar la contraseña mediante -a. Aun así, elimina la variable después de usarla y evita ejecutar estas pruebas en entornos donde otros procesos puedan inspeccionar variables de entorno. Uso de redis-cli.
Prueba también el usuario ops desde una segunda terminal antes de continuar:
read -r -s -p "Password de ops: " REDISCLI_AUTH
printf '\n'
export REDISCLI_AUTH
redis-cli --user ops PING
redis-cli --user ops ACL WHOAMI
redis-cli --user ops ACL LIST
unset REDISCLI_AUTHNo desactives default hasta que esta prueba funcione.
Paso 9: desactivar el usuario default
Autentícate como ops:
read -r -s -p "Password de ops: " REDISCLI_AUTH
printf '\n'
export REDISCLI_AUTH
redis-cli --user ops ACL SETUSER default off
redis-cli --user ops ACL SAVE
redis-cli --user ops ACL LIST
unset REDISCLI_AUTHDeshabilitar un usuario no termina automáticamente sus conexiones existentes. Si necesitas cerrar conexiones autenticadas previamente como default, inspecciónalas y utiliza CLIENT KILL USER default desde ops:
redis-cli --user ops CLIENT KILL USER defaultEjecuta esta última operación solo después de comprobar que ninguna aplicación legítima continúa usando default.
Paso 10: elegir la persistencia
La estrategia depende del impacto de perder datos:
| Uso | Estrategia inicial |
|---|---|
| Caché completamente reconstruible | Sin persistencia o RDB opcional |
| Sesiones o rate limiting | AOF everysec, según tolerancia |
| Colas y datos recuperables | AOF everysec + RDB + backups |
| Datos con pérdida casi nula | Evaluar always, replicación y alta disponibilidad |
appendfsync everysec puede perder aproximadamente el último segundo de escrituras ante un fallo grave. RDB puede perder los cambios ocurridos desde el último snapshot. Opciones de persistencia.
Una configuración combinada puede ser:
appendonly yes
appendfsync everysec
save 900 1
save 300 10
stop-writes-on-bgsave-error yesCada línea save es una condición independiente:
- Snapshot después de 900 segundos si hubo al menos un cambio.
- Snapshot después de 300 segundos si hubo al menos diez cambios.
Evalúa el impacto de fork(), copy-on-write, latencia y espacio en disco con un volumen de datos representativo.
Paso 11: habilitar AOF sin perder datos existentes
En una instancia nueva o vacía, puedes aplicar la configuración durante el despliegue inicial.
Si el servidor ya utiliza RDB y contiene datos, no te limites a editar redis.conf y reiniciar. Redis advierte que esa secuencia puede causar pérdida de datos.
Habilita primero AOF en ejecución:
redis-cli CONFIG SET appendonly yes
redis-cli INFO persistenceEspera hasta comprobar:
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_bgrewrite_status:ok
aof_last_write_status:okDespués actualiza redis.conf para que contenga:
appendonly yes
appendfsync everysecAsí, la configuración persistirá en el siguiente reinicio. Los cambios ejecutados mediante CONFIG SET solo viven en memoria hasta que también se actualiza el archivo o se utiliza CONFIG REWRITE. Configuración dinámica de Redis.
Paso 12: comprobar el resultado
Verifica las interfaces:
sudo ss -lntp | grep ':6379'Comprueba el servicio y sus logs:
sudo systemctl status redis-server --no-pager
sudo journalctl -u redis-server -n 100 --no-pagerDesde el usuario ops, revisa:
redis-cli --user ops ACL LIST
redis-cli --user ops ACL LOG
redis-cli --user ops INFO persistence
redis-cli --user ops INFO memoryEn persistencia, presta atención a:
rdb_last_bgsave_status
aof_enabled
aof_last_write_status
aof_last_bgrewrite_status
aof_rewrite_in_progress
aof_pending_bio_fsyncEl comando INFO persistence expone estos indicadores para supervisar RDB y AOF. Referencia de INFO.
Finalmente:
- Prueba el acceso desde un servidor autorizado.
- Comprueba que un host no autorizado no llegue al puerto.
- Reinicia Redis en un entorno de prueba.
- Verifica que los datos esperados se recuperen.
- Restaura un backup en una instancia aislada.
Problemas frecuentes
La aplicación no puede autenticarse
Comprueba:
- Que use
AUTH usuario contraseña, no solo una contraseña. - Que el usuario esté
on. - Que la contraseña corresponda al hash configurado.
- Que la aplicación admita ACL de Redis 6 o posterior.
- Que no continúe intentando usar
default.
Revisa los rechazos:
redis-cli --user ops ACL LOGLa ACL bloquea comandos legítimos
Simula el comando exacto:
redis-cli --user ops ACL DRYRUN app EXPIRE app:session:123 3600Agrega únicamente el comando o categoría necesaria. Para Pub/Sub también debes conceder comandos +@pubsub y patrones de canal como:
&app:*Redis no inicia después del cambio
Desde la consola:
sudo systemctl status redis-server --no-pager
sudo journalctl -u redis-server -n 100 --no-pagerRestaura la configuración previa:
sudo cp \
/etc/redis/redis.conf.pre-hardening \
/etc/redis/redis.conf
sudo systemctl restart redis-serverNo existe en todas las versiones empaquetadas un comando portátil equivalente a --check-config; no lo presupongas. Revisa los logs y prueba primero en staging.
El usuario desaparece después de reiniciar
El cambio se aplicó solo en memoria. Comprueba:
aclfile /etc/redis/users.acly guarda las ACL:
redis-cli --user ops ACL SAVEAOF o RDB informa errores
Revisa:
- Espacio e inodos disponibles.
- Permisos del directorio de datos.
- Errores de disco.
- Presión de memoria durante
fork(). - Estado de la última reescritura o snapshot.
No ignores stop-writes-on-bgsave-error sin entender por qué fallan los snapshots.
Buenas prácticas para producción
- No publiques el puerto 6379 en Internet.
- Mantén
protected-mode yes. - Usa firewall aunque Redis escuche en una IP privada.
- Configura TLS cuando la red no sea completamente confiable.
- Asigna un usuario ACL distinto a cada aplicación.
- Conserva una identidad administrativa separada.
- Prefiere comandos explícitos para aplicaciones críticas.
- Rota contraseñas agregando primero la nueva y eliminando después la anterior.
- Supervisa
ACL LOG, memoria, eviction y persistencia. - Configura
maxmemoryy una política de eviction acorde con el uso. - Separa caché y datos durables en instancias diferentes.
- Cifra los backups y limita el acceso a RDB y AOF.
- Mantén backups fuera del host y prueba restauraciones.
- Recuerda que replicación y persistencia no sustituyen un backup.