Cómo instalar y asegurar Redis en Ubuntu 22.04

Introducción

Redis es una base de datos de almacenamiento en caché en memoria conocida por su flexibilidad, rendimiento y amplio soporte de lenguajes. Este tutorial demuestra cómo instalar, configurar y asegurar Redis en un servidor Ubuntu 22.04.

Requisitos previos

Para completar esta guía, necesitará acceso a un servidor Ubuntu 22.04 que tenga un usuario no root con privilegios de sudo y un firewall configurado con ufw. Puede configurarlo siguiendo nuestra guía Configuración inicial del servidor para Ubuntu 22.04.

Paso 1: Instalar y configurar Redis

Utilizaremos el gestor de paquetes APT para instalar Redis desde los repositorios oficiales de Ubuntu. Hasta la fecha de esta redacción, la versión disponible en los repositorios predeterminados es 6.0.16.

Comience actualizando la caché local de paquetes apt:

  1. sudo apt update

Luego instale Redis escribiendo:

  1. sudo apt install redis-server

Esto descargará e instalará Redis y sus dependencias. Después de esto, hay un cambio de configuración importante que 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:

  1. sudo nano /etc/redis/redis.conf

Dentro del archivo, encuentra la directiva supervised. Esta directiva te permite declarar un sistema init para gestionar 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 Ubuntu, que utiliza el sistema init systemd, cambia esto a systemd:

/etc/redis/redis.conf
. . .

# Si ejecutas Redis desde upstart o systemd, Redis puede interactuar con tu
# árbol de supervisión. Opciones:
#   supervised no      - sin interacción de supervisión
#   supervised upstart - señal a upstart poniendo Redis en modo SIGSTOP
#   supervised systemd - señal a systemd escribiendo READY=1 en $NOTIFY_SOCKET
#   supervised auto    - detecta el método de upstart o systemd basado en
#                        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 al supervisor.
supervised systemd

. . .

Esa es el único cambio que necesitas hacer en el archivo de configuración de Redis en este punto, así que guárdalo y ciérralo cuando hayas terminado. Si utilizaste nano para editar el archivo, hazlo presionando CTRL + X, luego Y, y finalmente ENTER.

Luego, reinicia el servicio de Redis para reflejar los cambios que realizaste en el archivo de configuración:

  1. sudo systemctl restart redis.service

Con eso, has instalado y configurado Redis y está en ejecución en tu máquina. Sin embargo, antes de comenzar a usarlo, es prudente verificar primero si Redis está funcionando correctamente.

Paso 2 — Probando Redis

Como con cualquier software recién instalado, es una buena idea asegurarse de que Redis esté funcionando como se espera antes de hacer más cambios en su configuración. Repasaremos algunas formas de verificar que Redis esté funcionando correctamente en este paso.

Comienza verificando que el servicio de Redis esté en ejecución:

  1. sudo systemctl status redis

Si está en ejecución sin errores, este comando producirá una salida similar a la siguiente:

Output
● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2022-04-20 20:40:52 UTC; 4s ago Docs: http://redis.io/documentation, man:redis-server(1) Main PID: 2899 (redis-server) Status: "Ready to accept connections" Tasks: 5 (limit: 2327) Memory: 2.5M CPU: 65ms CGroup: /system.slice/redis-server.service └─2899 "/usr/bin/redis-server 127.0.0.1:6379 . . .

Esta salida indica que Redis está en ejecución y ya está habilitado, lo que significa que está configurado para iniciar cada vez que se inicie el servidor.

Nota: Esta configuración es deseable para muchos casos de uso comunes de Redis. Sin embargo, si prefieres iniciar Redis manualmente cada vez que se inicie tu servidor, puedes configurarlo con el siguiente comando:

  1. sudo systemctl disable redis

Para probar que Redis está funcionando correctamente, conecta al servidor usando redis-cli, el cliente de línea de comandos de Redis:

  1. redis-cli

En el indicador que aparece a continuación, prueba la conectividad con el comando ping:

  1. ping
Output
PONG

Esta salida confirma que la conexión al servidor sigue activa. A continuación, verifica que puedas establecer claves ejecutando:

  1. set test "It's working!"
Output
OK

Recupera el valor escribiendo:

  1. get test

Suponiendo que todo funcione, podrás recuperar el valor que almacenaste:

Output
"It's working!"

Después de confirmar que puedes obtener el valor, sale del indicador de Redis para volver a la terminal:

  1. exit

Como prueba final, verificaremos si Redis puede persistir datos incluso después de que se haya detenido o reiniciado. Para hacer esto, primero reinicia la instancia de Redis:

  1. sudo systemctl restart redis

Luego conecta nuevamente con el cliente de línea de comandos:

  1. redis-cli

Y confirma que tu valor de prueba aún está disponible:

  1. get test

El valor de tu clave aún debería ser accesible:

Output
"It's working!"

Sal de nuevo a la terminal cuando hayas terminado:

  1. exit

Con eso, tu instalación de Redis está completamente operativa y lista para que la uses. Sin embargo, algunos de sus ajustes de configuración predeterminados son inseguros y brindan a actores maliciosos oportunidades para atacar y obtener acceso a tu servidor y sus datos. Los pasos restantes en este tutorial cubren métodos para mitigar estas vulnerabilidades, como se prescribe en el sitio web oficial de Redis. Aunque estos pasos son opcionales y Redis seguirá funcionando si decides no seguirlos, es altamente recomendable que los completes para fortalecer la seguridad de tu sistema.

Paso 3 — Vinculación a localhost

Por defecto, Redis solo es accesible desde localhost. Sin embargo, si instalaste y configuraste Redis siguiendo un tutorial diferente a este, es posible que hayas actualizado el archivo de configuración para permitir conexiones desde cualquier lugar. Esto no es tan seguro como vincularlo a localhost.

Para corregir esto, abre el archivo de configuración de Redis para editarlo:

  1. sudo nano /etc/redis/redis.conf

Localiza esta línea y asegúrate de que esté descomentada (elimina el # si existe):

/etc/redis/redis.conf
. . .
bind 127.0.0.1 ::1
. . .

Guarda y cierra el archivo cuando hayas terminado (presiona CTRL + X, luego Y, y finalmente ENTER).

Luego, reinicia el servicio para asegurarte de que systemd lea tus cambios:

  1. sudo systemctl restart redis

Para verificar que este cambio haya surtido efecto, ejecuta el siguiente comando netstat:

  1. sudo netstat -lnp | grep redis
Output
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

Nota: Es posible que el comando netstat no esté disponible en tu sistema de forma predeterminada. Si este es el caso, puedes instalarlo (junto con varias otras herramientas útiles de redes) con el siguiente comando:

  1. sudo apt install net-tools

Esta salida muestra que el programa redis-server está vinculado a localhost (127.0.0.1), reflejando el cambio que acabas de hacer en el archivo de configuración. Si hay otra dirección IP en esa columna (0.0.0.0, por ejemplo), entonces deberías revisar nuevamente si descomentaste la línea correcta y reiniciar el servicio de Redis nuevamente.

Ahora que tu instalación de Redis solo está escuchando en localhost, será más difícil para actores maliciosos hacer solicitudes o acceder a tu servidor. Sin embargo, Redis actualmente no está configurado para requerir que los usuarios se autentifiquen antes de realizar cambios en su configuración o en los datos que contiene. Para solucionar esto, Redis te permite requerir que los usuarios se autentifiquen con una contraseña antes de realizar cambios a través del cliente de Redis (redis-cli).

Paso 4 — Configuración de una contraseña de Redis

Configurar una contraseña de Redis habilita una de sus dos características de seguridad integradas: el comando auth, que requiere que los clientes se autentifiquen para acceder a la base de datos. La contraseña se configura directamente en el archivo de configuración de Redis, /etc/redis/redis.conf, así que abre ese archivo nuevamente con tu editor preferido:

  1. sudo nano /etc/redis/redis.conf

Desplázate hasta la sección SECURITY y encuentra una directiva comentada que dice:

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

Descoméntala eliminando el # y cambia foobared por una contraseña segura.

Nota: Encima de la directiva requirepass en el archivo redis.conf, hay una advertencia comentada:

/etc/redis/redis.conf
. . .
# Advertencia: dado que Redis es bastante rápido, un usuario externo puede intentar hasta
# 150 mil contraseñas por segundo contra un buen sistema. Esto significa que deberías
# utilizar una contraseña muy fuerte, de lo contrario, será muy fácil de romper.
#
. . .

Por lo tanto, es importante que especifiques un valor muy fuerte y muy largo como tu contraseña. En lugar de inventar una contraseña tú mismo, puedes usar el comando openssl para generar una aleatoria, como en el siguiente ejemplo. Al dirigir la salida del primer comando al segundo comando openssl, como se muestra aquí, eliminará cualquier salto de línea producido por el primer comando:

  1. openssl rand 60 | openssl base64 -A

Este comando devolverá una salida como esta:

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Después de copiar y pegar la salida de ese comando como el nuevo valor para requirepass, debería leer:

/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

  1. sudo systemctl restart redis.service

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

  1. redis-cli

Lo siguiente muestra 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 autenticarse:

  1. set key1 10

Eso no funcionará porque no te autenticaste, por lo 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 lo reconoce:

Output
OK

Después de eso, ejecutar nuevamente el comando anterior tendrá éxito:

  1. set key1 10
Output
OK

get key1 consulta Redis para obtener el valor de la nueva clave.

  1. get key1
Output
"10"

Después de confirmar que puedes ejecutar comandos en el cliente de Redis después de autenticarte, puedes salir de redis-cli:

  1. quit

A continuación, repasaremos cómo cambiar el nombre de los comandos de Redis que, si se ingresan por error o por un actor malintencionado, podrían tener graves consecuencias para tus datos.

Paso 5 — Cambiar el Nombre de los Comandos Peligrosos

Otra característica de seguridad incorporada en Redis implica cambiar el nombre o deshabilitar por completo ciertos comandos que se consideran peligrosos.

Cuando son ejecutados por usuarios no autorizados, tales comandos pueden ser utilizados para reconfigurar, destruir o de alguna manera borrar tus datos. Al igual que la contraseña de autenticación, cambiar el nombre o deshabilitar comandos se configura en la misma sección de SECURITY del archivo /etc/redis/redis.conf.

Algunos de los comandos que se consideran peligrosos incluyen: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME y DEBUG. Esta no es una lista exhaustiva, pero cambiar el nombre o deshabilitar todos los comandos en esa lista es un buen punto de partida para mejorar la seguridad de tu servidor Redis.

Ya sea que deba deshabilitar o renombrar un comando depende de sus necesidades específicas o las de su sitio. Si sabe que nunca usará un comando que podría ser abusado, entonces puede deshabilitarlo. De lo contrario, podría ser mejor renombrarlo.

Para renombrar o deshabilitar comandos de Redis, abra el archivo de configuración una vez más:

  1. sudo nano /etc/redis/redis.conf

Advertencia: Los siguientes pasos que muestran cómo deshabilitar y renombrar comandos son ejemplos. Solo debería elegir deshabilitar o renombrar los comandos que tengan sentido para usted. Puede revisar la lista completa de comandos por sí mismo y determinar cómo podrían ser mal utilizados en redis.io/commands.

Para deshabilitar un comando, renómbrelo a una cadena vacía (indicado por un par de comillas sin caracteres entre ellas), como se muestra a continuación:

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

Para renombrar un comando, déle otro nombre como se muestra en los ejemplos a continuación. Los comandos renombrados deben ser difíciles de adivinar para otros, pero fáciles de recordar para usted:

/etc/redis/redis.conf
. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .

Guarde sus cambios y cierre el archivo.

Después de renombrar un comando, aplique el cambio reiniciando Redis:

  1. sudo systemctl restart redis.service

Para probar el nuevo comando, ingrese a la línea de comandos de Redis:

  1. redis-cli

Luego, autentíquese:

  1. auth your_redis_password
Output
OK

Supongamos que renombró el comando CONFIG a ASC12_CONFIG, como en el ejemplo anterior. Primero, intente usar el comando original CONFIG. Debería fallar, porque lo ha renombrado:

  1. config get requirepass
Output
(error) ERR unknown command `config`, with args beginning with:

Llamar al comando renombrado, sin embargo, tendrá éxito. No distingue entre mayúsculas y minúsculas:

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

Finalmente, puedes salir de redis-cli:

  1. exit

Ten en cuenta que si ya estás utilizando la línea de comandos de Redis y luego reinicias Redis, deberás volver a autenticarte. De lo contrario, obtendrás este error si escribes un comando:

Output
NOAUTH Authentication required.

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

/etc/redis/redis.conf
. . .
# Por favor, ten en cuenta que cambiar el nombre de los comandos que se registran en el
# archivo AOF o se transmiten a réplicas puede causar problemas.
. . .

Nota: El proyecto Redis elige utilizar los términos “maestro” y “esclavo”, mientras que DigitalOcean generalmente prefiere las alternativas “primario” y “secundario”. Para evitar confusiones, hemos optado por utilizar los términos utilizados en la documentación de Redis aquí.

Eso 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 problema.

Por lo tanto, tenlo en cuenta cuando intentes renombrar comandos. El mejor momento para renombrar un comando es cuando no estás utilizando la persistencia AOF, o justo después de la instalación, es decir, antes de que se haya implementado tu aplicación que utiliza Redis.

Cuando estés utilizando AOF y trabajando con una instalación maestro-esclavo, considera esta respuesta de la página de problemas de GitHub del proyecto. Lo siguiente es una respuesta a la pregunta del autor:

Los comandos se registran en el AOF y se replican al esclavo de la misma manera en que se envían, por lo que si intenta reproducir el AOF en una instancia que no tiene el mismo renombramiento, puede enfrentar inconsistencias ya que el comando no se puede ejecutar (lo mismo para los esclavos).

Por lo tanto, la mejor manera de manejar el renombramiento en casos como este es asegurarse de que los comandos renombrados se apliquen a todas las instancias en las instalaciones maestro-esclavo.

Conclusión

En este tutorial, instalaste y configuraste Redis, validaste que tu instalación de Redis esté funcionando correctamente y utilizaste sus funciones de seguridad integradas para hacerlo menos vulnerable a los ataques de actores malintencionados.

Ten en cuenta que una vez que alguien haya iniciado sesión en tu servidor, es muy fácil eludir las características de seguridad específicas de Redis que hemos implementado. Por lo tanto, la característica de seguridad más importante en tu servidor Redis es tu firewall (que configuraste si seguiste el tutorial de Configuración Inicial del Servidor), ya que esto hace extremadamente difícil para los actores maliciosos saltar esa barrera.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-22-04