Cómo instalar y asegurar Redis en Rocky Linux 8

Introducción

Redis es un almacén de datos de clave-valor en memoria, de código abierto, que sobresale en el almacenamiento en caché. Redis es una base de datos no relacional conocida por su flexibilidad, rendimiento, escalabilidad y amplio soporte de lenguajes.

Redis fue diseñado para ser utilizado por clientes de confianza en un entorno de confianza, y no tiene características de seguridad robustas propias. Sin embargo, Redis cuenta con algunas características de seguridad como autenticación de contraseña y la capacidad de renombrar o deshabilitar algunos comandos. Este tutorial proporciona instrucciones sobre cómo instalar Redis y configurar estas características de seguridad. También cubre algunas otras configuraciones que pueden mejorar la seguridad de una instalación independiente de Redis en Rocky Linux 8.

Tenga en cuenta que esta guía no aborda situaciones en las que el servidor Redis y las aplicaciones cliente están en hosts diferentes o en centros de datos diferentes. Las instalaciones donde el tráfico de Redis tiene que atravesar una red insegura o no confiable requerirán un conjunto diferente de configuraciones, como configurar un proxy SSL o una VPN entre las máquinas Redis.

También puede utilizar el Servicio de Redis Administrado de DigitalOcean.

Requisitos previos

Para completar este tutorial, necesitarás un servidor que ejecute Rocky Linux 8. Este servidor debe tener un usuario no root con privilegios administrativos y un firewall configurado con firewalld. Para configurar esto, sigue nuestra guía de Configuración Inicial del Servidor para Rocky Linux 8.

Paso 1 — Instalación y Inicio de Redis

Puedes instalar Redis con el gestor de paquetes DNF. Utilizando DNF, puedes instalar Redis, sus dependencias y nano, un editor de texto fácil de usar. No es necesario instalar nano, pero lo utilizaremos en ejemplos a lo largo de esta guía:

  1. sudo dnf install redis nano

Este comando te pedirá confirmación para instalar los paquetes seleccionados. Presiona y y luego ENTER para hacerlo:

Output
. . . Total download size: 1.5 M Installed size: 5.4 M Is this ok [y/N]: y

Después de esto, hay un cambio de configuración importante que debes hacer en el archivo de configuración de Redis, que se generó automáticamente durante la instalación.

Abre este archivo con tu editor de texto preferido. Aquí utilizaremos nano:

  1. sudo nano /etc/redis.conf

Dentro del archivo, encuentra la directiva supervised. Esta directiva te permite declarar un sistema init para administrar Redis como un servicio, brindándote más control sobre su funcionamiento. La directiva supervised está establecida en no de forma predeterminada. Dado que estás ejecutando Rocky Linux, que utiliza el sistema init systemd, cambia esto a systemd:

/etc/redis.conf
. . .

# Si ejecutas Redis desde upstart o systemd, Redis puede interactuar con tu
# árbol de supervisión. Opciones:
#   supervised no      - ninguna interacción de supervisión
#   supervised upstart - señal a upstart colocando Redis en modo SIGSTOP
#   supervised systemd - señal a systemd escribiendo READY=1 en $NOTIFY_SOCKET
#   supervised auto    - detecta el método upstart o systemd basado en
#                        las variables de entorno UPSTART_JOB o NOTIFY_SOCKET
# Nota: estos métodos de supervisión solo señalan "el proceso está listo."
#       No habilitan pings de continuidad de vida hacia tu supervisor.
supervised systemd

. . .

Esa es la única modificación que necesitas hacer en el archivo de configuración de Redis en este momento, así que guárdalo y ciérralo cuando hayas terminado. Si usaste nano para editar el archivo, guardas y sales con CTRL + X, luego cuando se te solicite, Y y luego Enter.

Después de editar el archivo, inicia el servicio de Redis:

  1. sudo systemctl start redis.service

Si deseas que Redis se inicie en el arranque, puedes habilitarlo con el comando enable:

  1. sudo systemctl enable redis

Notifique que este comando no incluye el sufijo .service después del nombre del archivo de unidad. Por lo general, puede omitir este sufijo en los comandos de systemctl, ya que se puede analizar automáticamente a partir de los nombres de servicio.

Puede verificar el estado de Redis ejecutando lo siguiente:

  1. 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

Una vez que haya confirmado que Redis está en ejecución, puede probar su funcionalidad con este comando:

  1. redis-cli ping

Esto debería imprimir PONG como respuesta:

Output
PONG

Si este es el caso, significa que ahora tiene Redis en funcionamiento en su servidor y puede comenzar a configurarlo para mejorar su seguridad.

Paso 2 — Configurar Redis y asegurarlo con un cortafuegos

Una manera efectiva de proteger Redis es asegurarse de que el servidor en el que se está ejecutando esté seguro. Puede hacer esto asegurándose de que Redis esté vinculado solo a localhost o a una dirección IP privada y también de que el servidor tenga un cortafuegos en funcionamiento.

Sin embargo, si eligió configurar Redis mediante otro tutorial, es posible que haya actualizado el archivo de configuración para permitir conexiones desde cualquier lugar. Esto no es tan seguro como vincularlo a localhost o a una dirección IP privada.

Para solucionar esto, abra nuevamente el archivo de configuración de Redis con su editor de texto preferido:

  1. sudo nano /etc/redis.conf

Localiza la línea que comienza con bind y asegúrate de que no esté comentada o desactivada, eliminando el signo # al principio de la línea si es necesario:

/etc/redis.conf
. . .
bind 127.0.0.1

Si necesitas enlazar Redis a otra dirección IP (como en casos en los que accederás a Redis desde un host separado), deberías considerar enlazarlo a una dirección IP privada. Enlazarlo a una dirección IP pública aumenta la exposición de la interfaz de tu Redis a partes externas:

/etc/redis.conf
. . .
bind your_private_ip

Después de confirmar que la directiva bind no está comentada, puedes guardar y cerrar el archivo.

Si has seguido el tutorial de Preparación Inicial del Servidor y has instalado firewalld en tu servidor, y no planeas conectarte a Redis desde otro host, entonces no necesitas agregar reglas de firewall adicionales para Redis. Después de todo, cualquier tráfico entrante será descartado por defecto a menos que sea explícitamente permitido por las reglas del firewall. Dado que una instalación independiente predeterminada del servidor Redis solo está escuchando en la interfaz de bucle de retorno (127.0.0.1 o localhost), no debería haber preocupación por el tráfico entrante en su puerto predeterminado.

Sin embargo, si planeas acceder a Redis desde otro host, necesitarás hacer algunos cambios en la configuración de tu firewalld usando el comando firewall-cmd. Nuevamente, solo debes permitir el acceso a tu servidor Redis desde tus hosts utilizando sus direcciones IP privadas para limitar el número de hosts a los que tu servicio está expuesto.

Para comenzar, agrega una zona de Redis dedicada a la política de tu firewalld:

  1. sudo firewall-cmd --permanent --new-zone=redis

Entonces especifique qué puerto le gustaría tener abierto. Redis utiliza el puerto 6379 por defecto.

  1. sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp

A continuación, especifique todas las direcciones IP privadas que deben poder pasar a través del firewall y acceder a Redis:

  1. sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP

Después de ejecutar esos comandos, recargue el firewall para implementar las nuevas reglas:

  1. sudo firewall-cmd --reload

Bajo esta configuración, cuando el firewall encuentre un paquete desde la dirección IP de su cliente, aplicará las reglas en la zona Redis dedicada a esa conexión. Todas las demás conexiones serán procesadas por la zona predeterminada public. Los servicios en la zona predeterminada se aplican a cada conexión, no solo a aquellas que no coinciden explícitamente, por lo que no necesita añadir otros servicios (por ejemplo, SSH) a la zona Redis, porque esas reglas se aplicarán automáticamente a esa conexión.

Tenga en cuenta que cualquier herramienta de firewall funcionará, ya sea que utilice firewalld, ufw o iptables. Lo importante es que el firewall esté activo y funcionando para que personas desconocidas no puedan acceder a su servidor. En el próximo paso, configurará Redis para que solo sea accesible con una contraseña fuerte.

Paso 3 — Configuración de una Contraseña Redis

Configurar una contraseña para Redis habilita una de sus características de seguridad incorporadas, el comando auth, que requiere que los clientes se autentiquen antes de permitirles acceder a la base de datos. Al igual que la configuración bind, la contraseña se configura directamente en el archivo de configuración de Redis, /etc/redis.conf. Reabra ese archivo:

  1. sudo nano /etc/redis.conf

Desplácese hasta la sección SECURITY y busque una directiva comentada que dice:

/etc/redis.conf
. . .
# requirepass foobared

Descoméntelo eliminando el #, y cambie foobared por una contraseña muy fuerte de su elección.

Nota: En lugar de inventar una contraseña usted mismo, puede usar una herramienta como apg o pwgen para generar una. Si no desea instalar una aplicación solo para generar una contraseña, puede usar el siguiente comando. Este comando ecoea un valor de cadena y lo canaliza al siguiente comando sha256sum, que mostrará el checksum SHA256 de la cadena.

Tenga en cuenta que al ingresar este comando como está escrito, generará la misma contraseña cada vez. Para crear una contraseña única, cambie la cadena entre comillas por cualquier otra palabra o frase:

  1. echo "digital-ocean" | sha256sum

Aunque la contraseña generada no será memorable, será muy fuerte y larga, lo que es exactamente el tipo de contraseña requerida para Redis. Después de copiar y pegar la salida de ese comando como el nuevo valor para requirepass, debería leerse:

/etc/redis.conf
. . .
requirepass password_copied_from_output

Alternativamente, si prefiere una contraseña más corta, podría usar la salida de un checksum diferente. Nuevamente, cambie la palabra entre comillas para que no genere la misma contraseña que este comando:

  1. echo "digital-ocean" | sha1sum

Después de establecer la contraseña, guarda y cierra el archivo, luego reinicia Redis:

  1. sudo systemctl restart redis

Para probar que la contraseña funciona, abre el cliente de Redis:

  1. redis-cli

Lo siguiente es una secuencia de comandos utilizados para probar si la contraseña de Redis funciona. El primer comando intenta establecer una clave con un valor antes de la autenticación:

  1. set key1 10

Eso no funcionará ya que aún no te has autenticado, así que Redis devuelve un error:

Output
(error) NOAUTH Authentication required.

El siguiente comando se autentica con la contraseña especificada en el archivo de configuración de Redis:

  1. auth your_redis_password

Redis confirmará que te has autenticado:

Output
OK

Después de eso, ejecutar el comando anterior nuevamente debería ser exitoso:

  1. set key1 10
Output
OK

El comando get key1 consulta Redis para el valor de la nueva clave:

  1. get key1
Output
"10"

Este último comando sale de redis-cli. También puedes usar exit:

  1. quit

Ahora debería ser muy difícil para usuarios no autorizados acceder a tu instalación de Redis. Ten en cuenta que si ya estás usando el cliente de línea de comandos de Redis y luego reinicias Redis, deberás volver a autenticarte. Además, ten en cuenta que sin SSL o una VPN, esta contraseña aún puede ser interceptada por partes externas si te estás conectando a Redis de forma remota.

A continuación, esta guía repasará cómo renombrar los comandos de Redis para proteger aún más Redis de actores malintencionados.

Paso 4 — Renombrar Comandos Peligrosos

Otra característica de seguridad incorporada en Redis te permite renombrar o deshabilitar completamente ciertos comandos que se consideran peligrosos. Cuando son ejecutados por usuarios no autorizados, estos comandos pueden ser utilizados para reconfigurar, destruir o eliminar tus datos. Algunos de los comandos que se consideran peligrosos incluyen:

  • FLUSHDB
  • FLUSHALL
  • KEYS
  • PEXPIRE
  • DEL
  • CONFIG
  • SHUTDOWN
  • BGREWRITEAOF
  • BGSAVE
  • SAVE
  • SPOP
  • SREM
  • RENAME
  • DEBUG

Esta no es una lista exhaustiva, pero renombrar o deshabilitar todos los comandos en esta lista puede ayudar a mejorar la seguridad de tu almacén de datos. Si sabes que nunca usarás un comando que pueda ser abusado, entonces puedes deshabilitarlo. De lo contrario, deberías renombrarlo.

Al igual que la contraseña de autenticación, renombrar o deshabilitar comandos se configura en la sección SEGURIDAD del archivo /etc/redis.conf. Para habilitar o deshabilitar comandos de Redis, abre el archivo de configuración para editarlo una vez más:

  1. sudo nano /etc/redis.conf

NOTA: Estos son ejemplos. Deberías elegir desactivar o renombrar los comandos que tengan sentido para ti. Puedes aprender más sobre los comandos de Redis y determinar cómo podrían ser mal utilizados en redis.io/commands.

Para desactivar o eliminar un comando, renómbralo a una cadena vacía, así:

/etc/redis.conf
# También es posible eliminar por completo un comando renombrándolo a
# una cadena vacía:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""

Para renombrar un comando, dale otro nombre como en los ejemplos a continuación. Los comandos renombrados deberían ser difíciles de adivinar para otros, pero fáciles de recordar para ti:

/etc/redis.conf
# También es posible eliminar por completo un comando renombrándolo a
# una cadena vacía:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

Guarda tus cambios y cierra el archivo. Luego, aplica los cambios reiniciando Redis:

  1. sudo systemctl restart redis.service

Para probar tus nuevos comandos, ingresa a la línea de comandos de Redis:

  1. redis-cli

Autentícate usando la contraseña que definiste anteriormente:

  1. auth your_redis_password
Output
OK

Suponiendo que renombraste el comando CONFIG a ASC12_CONFIG, intentar usar el comando config fallará:

  1. config get requirepass
Output
(error) ERR unknown command 'config'

En cambio, llamar al comando renombrado será exitoso. Ten en cuenta que los comandos de Redis no distinguen mayúsculas de minúsculas:

  1. asc12_config get requirepass
Output
1) "requirepass" 2) "your_redis_password"

Finalmente, puedes salir de redis-cli:

  1. exit

Advertencia: En cuanto a renombrar comandos, hay una declaración de precaución al final de la sección SECURITY en el archivo /etc/redis.conf, que dice:

/etc/redis.conf
. . .

# Ten en cuenta que cambiar el nombre de los comandos que se registran en el archivo 
# AOF o que se transmiten a las réplicas puede causar problemas.

. . .

Esto significa que si el comando renombrado no está en el archivo AOF, o si lo está pero el archivo AOF no se ha transmitido a las réplicas, entonces no debería haber ningún problema. Ten esto en cuenta mientras renombras comandos. El mejor momento para renombrar un comando es cuando no estás usando la persistencia AOF o justo después de la instalación (es decir, antes de que se haya implementado tu aplicación que usa Redis).

Paso 5 — Configurando la propiedad del directorio de datos y los permisos de archivos

Este paso repasará un par de cambios de propiedad y permisos que es posible que necesites hacer para mejorar el perfil de seguridad de tu instalación de Redis. Esto implica asegurarse de que solo el usuario que necesita acceder a Redis tenga permiso para leer sus datos. Ese usuario es, por defecto, el usuario redis.

Puedes verificar esto ejecutando un grep del directorio de datos de Redis en un listado largo de su directorio padre. Este comando y su salida se dan a continuación:

  1. ls -l /var/lib | grep redis
Output
drwxr-x---. 2 redis redis 22 Sep 6 22:22 redis

Este resultado indica que el directorio de datos de Redis es propiedad del usuario redis, con acceso secundario otorgado al grupo redis. Esta configuración de propiedad es segura al igual que los permisos de la carpeta, los cuales, utilizando la notación octal, están establecidos en 750.

Si el directorio de datos de Redis tiene permisos inseguros, puedes asegurarte de que solo el usuario y el grupo de Redis tengan acceso a la carpeta y su contenido ejecutando el comando chmod. El siguiente ejemplo cambia la configuración de permisos de esta carpeta a 770:

  1. sudo chmod 770 /var/lib/redis

Otro permiso que podrías necesitar cambiar es el del archivo de configuración de Redis. Por defecto, tiene un permiso de archivo de 640 y es propiedad de root, con propiedad secundaria del grupo root:

  1. ls -l /etc/redis.conf
Output
-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis.conf

Ese permiso (640) significa que el archivo de configuración de Redis solo es legible por el usuario redis y el grupo root. Dado que el archivo de configuración contiene la contraseña sin cifrar que configuraste en el Paso 4, redis.conf debería ser propiedad del usuario redis, con propiedad secundaria del grupo redis. Para establecer esto, ejecuta el siguiente comando:

  1. sudo chown redis:redis /etc/redis.conf

Luego cambia los permisos para que solo el propietario del archivo pueda leer y escribir en él:

  1. sudo chmod 600 /etc/redis.conf

Puedes verificar la nueva propiedad y los permisos ejecutando nuevamente los comandos ls anteriores:

  1. ls -l /var/lib | grep redis
Output
total 40 drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
  1. ls -l /etc/redis.conf
Output
total 40 -rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf

Finalmente, reinicia Redis para reflejar estos cambios:

  1. sudo systemctl restart redis

Con eso, tu instalación de Redis ha sido asegurada.

Conclusión

Ten en cuenta que una vez que alguien ha iniciado sesión en tu servidor, es posible eludir las características de seguridad específicas de Redis que has implementado. Por eso, la característica de seguridad más importante cubierta en este tutorial es el firewall, ya que evita que usuarios desconocidos inicien sesión en tu servidor en primer lugar.

Si estás intentando asegurar la comunicación de Redis a través de una red no confiable, tendrás que emplear un proxy SSL, como recomiendan los desarrolladores de Redis en la guía oficial de seguridad de Redis.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-rocky-linux-8