Cómo instalar y proteger Redis en Ubuntu 18.04

Introducción
Redis es un almacén de clave-valor en memoria conocido por su flexibilidad, rendimiento y amplia compatibilidad con idiomas. Este tutorial demuestra cómo instalar, configurar y proteger Redis en un servidor Ubuntu 18.04.
Prerrequisitos
Para completar esta guía, necesitarás acceso a un servidor Ubuntu 18.04 que tenga un usuario no root con sudo
privilegios y un firewall básico configurado. Puedes configurarlo siguiendo nuestra guía de configuración inicial del servidor .
Cuando esté listo para comenzar, inicie sesión en su servidor Ubuntu 18.04 como su sudo
usuario y continúe a continuación.
Paso 1: Instalación y configuración de Redis
Para obtener la última versión de Redis, utilizaremos apt
para instalarla desde los repositorios oficiales de Ubuntu.
Primero, actualice su apt
caché de paquetes local si no lo ha hecho recientemente:
- sudo apt update
Luego, instala Redis escribiendo:
- sudo apt install redis-server
Esto descargará e instalará Redis y sus dependencias. A continuación, hay un cambio de configuración importante que se debe realizar en el archivo de configuración de Redis, que se generó automáticamente durante la instalación.
Abra este archivo con su editor de texto preferido:
- sudo nano /etc/redis/redis.conf
Dentro del archivo, busque la supervised
directiva . Esta directiva le permite declarar un sistema de inicio para administrar Redis como un servicio, lo que le brinda más control sobre su funcionamiento. La supervised
directiva está configurada en no
de forma predeterminada. Dado que está ejecutando Ubuntu, que utiliza el sistema de inicio systemd, cambie esto a systemd
:
/etc/redis/redis.conf
. . .# If you run Redis from upstart or systemd, Redis can interact with your# supervision tree. Options:# supervised no - no supervision interaction# supervised upstart - signal upstart by putting Redis into SIGSTOP mode# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET# supervised auto - detect upstart or systemd method based on# UPSTART_JOB or NOTIFY_SOCKET environment variables# Note: these supervision methods only signal "process is ready."# They do not enable continuous liveness pings back to your supervisor.supervised systemd. . .
Ese es el único cambio que debe realizar en el archivo de configuración de Redis en este momento, así que guárdelo y ciérrelo cuando haya terminado. Luego, reinicie el servicio Redis para reflejar los cambios que realizó en el archivo de configuración:
- sudo systemctl restart redis.service
Con esto, ya ha instalado y configurado Redis y ya está funcionando en su máquina. Sin embargo, antes de comenzar a usarlo, es prudente comprobar primero si Redis está funcionando correctamente.
Paso 2: Prueba de Redis
Al igual que con cualquier software recién instalado, es una buena idea asegurarse de que Redis esté funcionando como se espera antes de realizar más cambios en su configuración. Repasaremos algunas formas de comprobar que Redis esté funcionando correctamente en este paso.
Comience por verificar que el servicio Redis esté ejecutándose:
- sudo systemctl status redis
Si se ejecuta sin ningún error, este comando producirá un resultado similar al 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 2018-06-27 18:48:52 UTC; 12s ago Docs: http://redis.io/documentation, man:redis-server(1) Process: 2421 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS) Process: 2424 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS) Main PID: 2445 (redis-server) Tasks: 4 (limit: 4704) CGroup: /system.slice/redis-server.service └─2445 /usr/bin/redis-server 127.0.0.1:6379. . .
Aquí puedes ver que Redis se está ejecutando y ya está habilitado, lo que significa que está configurado para iniciarse cada vez que se inicia el servidor.
Nota: esta configuración es recomendable para muchos casos de uso comunes de Redis. Sin embargo, si prefiere iniciar Redis manualmente cada vez que se inicia el servidor, puede configurarlo con el siguiente comando:
- sudo systemctl disable redis
Para probar que Redis está funcionando correctamente, conéctese al servidor mediante el cliente de línea de comandos:
- redis-cli
En el mensaje que aparece a continuación, pruebe la conectividad con el ping
comando:
- ping
OutputPONG
Esta salida confirma que la conexión con el servidor sigue activa. A continuación, comprueba que puedes configurar las claves ejecutando lo siguiente:
- set test "It's working!"
OutputOK
Recupere el valor escribiendo:
- get test
Suponiendo que todo esté funcionando, podrás recuperar el valor que almacenaste:
Output"It's working!"
Después de confirmar que puede obtener el valor, salga del indicador de Redis para volver al shell:
- exit
Como prueba final, comprobaremos si Redis puede conservar los datos incluso después de que se haya detenido o reiniciado. Para ello, primero reinicie la instancia de Redis:
- sudo systemctl restart redis
Luego, conéctese nuevamente con el cliente de línea de comandos y confirme que su valor de prueba aún esté disponible:
- redis-cli
- get test
El valor de tu clave aún debería estar accesible:
Output"It's working!"
Salga nuevamente al shell cuando haya terminado:
- exit
Con esto, su instalación de Redis está completamente operativa y lista para que la use. Sin embargo, algunas de sus configuraciones predeterminadas son inseguras y brindan a los actores maliciosos oportunidades de atacar y obtener acceso a su servidor y sus datos. Los pasos restantes de este tutorial cubren métodos para mitigar estas vulnerabilidades, según lo prescrito por el sitio web oficial de Redis . Aunque estos pasos son opcionales y Redis seguirá funcionando si decide no seguirlos, se recomienda encarecidamente que los complete para reforzar la seguridad de su sistema.
Paso 3: vinculación al host local
De forma predeterminada, solo se puede acceder a Redis 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, abra el archivo de configuración de Redis para editarlo:
- sudo nano /etc/redis/redis.conf
Localice esta línea y asegúrese de que no esté comentada (elimine el comentario #
si existe):
/etc/redis/redis.conf
bind 127.0.0.1 ::1
Guarde y cierre el archivo cuando haya terminado (presione CTRL + X
, Y
, luego ENTER
).
Luego, reinicie el servicio para asegurarse de que systemd lea sus cambios:
- sudo systemctl restart redis
Para comprobar que este cambio ha surtido efecto, ejecute el siguiente netstat
comando:
- sudo netstat -lnp | grep redis
Outputtcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server
Esta salida muestra que el redis-server
programa está vinculado a localhost ( 127.0.0.1
), lo que refleja la bind
configuración en el archivo de configuración de Redis. Si ve otra dirección IP en esa columna ( 0.0.0.0
, por ejemplo), debe verificar que haya quitado los comentarios de la línea correcta y reiniciar el servicio Redis nuevamente.
Ahora que su instalación de Redis solo escucha en localhost , será más difícil para los actores maliciosos realizar solicitudes u obtener acceso a su servidor. Sin embargo, Redis actualmente no está configurado para requerir que los usuarios se autentiquen antes de realizar cambios en su configuración o los datos que contiene. Para solucionar esto, Redis le permite requerir que los usuarios se autentiquen 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
La configuración de una contraseña de Redis habilita una de sus dos funciones de seguridad integradas: el auth
comando, que requiere que los clientes se autentiquen 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 vuelva a abrir ese archivo con su editor preferido:
- sudo nano /etc/redis/redis.conf
Desplácese hasta la SECURITY
sección y busque una directiva comentada que dice:
/etc/redis/redis.conf
# requirepass foobared
Descomentelo eliminando el #
, y cámbielo foobared
a una contraseña segura.
Nota: encima de la requirepass
directiva en el redis.conf
archivo, hay una advertencia comentada:
# Warning: since Redis is pretty fast an outside user can try up to# 150k passwords per second against a good box. This means that you should# use a very strong password otherwise it will be very easy to break.#
Por lo tanto, es importante que especifiques un valor muy fuerte y muy largo como contraseña. En lugar de crear una contraseña tú mismo, puedes usar el openssl
comando para generar una aleatoria, como en el siguiente ejemplo. Al canalizar la salida del primer comando al segundo openssl
, como se muestra aquí, se eliminarán los saltos de línea producidos por el primer comando:
- openssl rand 60 | openssl base64 -A
El resultado debería verse así:
OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Después de copiar y pegar la salida de ese comando como el nuevo valor para requirepass
, debería leerse:
/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Después de configurar la contraseña, guarde y cierre el archivo, luego reinicie Redis:
- sudo systemctl restart redis.service
Para probar que la contraseña funciona, acceda a la línea de comandos de Redis:
- redis-cli
A continuación se muestra una secuencia de comandos que se utilizan para probar si la contraseña de Redis funciona. El primer comando intenta establecer una clave en un valor antes de la autenticación:
- 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:
- auth your_redis_password
Redis reconoce:
OutputOK
Después de esto, ejecutar nuevamente el comando anterior tendrá éxito:
- set key1 10
OutputOK
get key1
consulta a Redis el valor de la nueva clave.
- get key1
Output"10"
Después de confirmar que puede ejecutar comandos en el cliente Redis después de la autenticación, puede salir redis-cli
:
- quit
A continuación, veremos cómo cambiar el nombre de los comandos de Redis que, si se ingresan por error o por un actor malintencionado, podrían causar daños graves a su máquina.
Paso 5: Cambiar el nombre de los comandos peligrosos
La otra característica de seguridad integrada en Redis implica cambiar el nombre o deshabilitar por completo ciertos comandos que se consideran peligrosos.
Cuando los ejecutan usuarios no autorizados, estos comandos se pueden utilizar para reconfigurar, destruir o borrar de algún modo sus datos. Al igual que la contraseña de autenticación, los comandos de cambio de nombre o desactivación se configuran en la misma SECURITY
sección del /etc/redis/redis.conf
archivo.
Algunos de los comandos que se consideran peligrosos son: FLUSHDB , FLUSHALL , KEYS , PEXPIRE , DEL , CONFIG , SHUTDOWN , BGREWRITEAOF , BGSAVE , SAVE , SPOP , SREM , RENAME y DEBUG . Esta no es una lista completa, pero cambiar el nombre o deshabilitar todos los comandos de esa lista es un buen punto de partida para mejorar la seguridad de su servidor Redis.
La decisión de desactivar o cambiar el nombre de un comando depende de sus necesidades específicas o de las de su sitio. Si sabe que nunca utilizará un comando que pueda ser objeto de abuso, puede desactivarlo. De lo contrario, puede que le convenga cambiarle el nombre.
Para habilitar o deshabilitar los comandos de Redis, abra el archivo de configuración una vez más:
- sudo nano /etc/redis/redis.conf
Advertencia: Los siguientes pasos que muestran cómo deshabilitar y cambiar el nombre de los comandos son ejemplos. Solo debe optar por deshabilitar o cambiar el nombre de los comandos que tengan sentido para usted. Puede revisar la lista completa de comandos usted mismo y determinar cómo se pueden usar incorrectamente en redis.io/commands .
Para deshabilitar un comando, cámbiele el nombre a una cadena vacía (indicada por un par de comillas sin caracteres entre ellas), de la siguiente manera:
/etc/redis/redis.conf
. . .# It is also possible to completely kill a command by renaming it into# an empty string:#rename-command FLUSHDB ""rename-command FLUSHALL ""rename-command DEBUG "". . .
Al agregar estas rename-command
directivas y seguirlas con cadenas vacías, FLUSHDB
, FLUSHALL
, y DEBUG
se deshabilitarán en esta instalación de Redis.
Para cambiar el nombre de un comando, asígnele otro nombre, como en los siguientes ejemplos. Los comandos renombrados deberían 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_MENOTrename-command CONFIG ASC12_CONFIG. . .
Estos ejemplos cambian el nombre de los comandos SHUTDOWN
y CONFIG
a SHUTDOWN_MENOT
y ASC12_CONFIG
, respectivamente.
Guarde los cambios y cierre el archivo.
Después de cambiar el nombre de un comando, aplique el cambio reiniciando Redis:
- sudo systemctl restart redis.service
Para probar si estos comandos se actualizaron correctamente, abra el cliente Redis:
- redis-cli
Luego, autenticar:
- auth your_redis_password
OutputOK
Supongamos que has cambiado el nombre del CONFIG
comando a ASC12_CONFIG
, como en el ejemplo anterior. Primero, intenta usar el CONFIG
comando original. Debería fallar, porque lo has renombrado:
- config get requirepass
Output(error) ERR unknown command 'config'
Sin embargo, la ejecución del comando renombrado se realizará correctamente. No distingue entre mayúsculas y minúsculas:
- asc12_config get requirepass
El comando de Redis config
permite que quien lo ejecute interactúe con el archivo de configuración de la instalación. Cuando se combina con get
una directiva del archivo de configuración y la sigue, el comando devolverá esa directiva y su configuración actual:
Output1) "requirepass"2) "your_redis_password"
Finalmente, puedes salir de redis-cli
:
- exit
Tenga en cuenta que si ya está usando la línea de comandos de Redis y luego reinicia Redis, deberá volver a autenticarse. De lo contrario, obtendrá este error si escribe un comando:
OutputNOAUTH Authentication required.
Warning: Regarding the practice of renaming commands, there’s a cautionary statement at the end of the SECURITY
section in /etc/redis/redis.conf
which reads:
/etc/redis/redis.conf
. . .# Please note that changing the name of commands that are logged into the# AOF file or transmitted to slaves may cause problems.. . .
This means if the renamed command is not in the AOF file, or if it is but the AOF file has not been transmitted to slaves, then there should be no problem.
So, keep that in mind when you’re trying to rename commands. The best time to rename a command is when you’re not using AOF persistence, or right after installation, that is, before your Redis-using application has been deployed.
When you’re using AOF and dealing with a master-slave installation, consider this answer from the project’s GitHub issue page. The following is a reply to the author’s question:
The commands are logged to the AOF and replicated to the slave the same way they are sent, so if you try to replay the AOF on an instance that doesn’t have the same renaming, you may face inconsistencies as the command cannot be executed (same for slaves).
Thus, the best way to handle renaming in cases like that is to make sure that renamed commands are applied to all instances in master-slave installations.
Note: The Redis project chooses to use the terms “master” and “slave,” while DigitalOcean generally prefers the alternatives “primary” and “replica.” In order to avoid confusion we’ve chosen to use the terms used in the Redis documentation here.
Conclusion
In this tutorial, you installed and configured Redis, validated that your Redis installation is functioning correctly, and used its built-in security features to make it less vulnerable to attacks from malicious actors.
Keep in mind that once someone is logged in to your server, it’s very easy to circumvent the Redis-specific security features we’ve put in place. Therefore, the most important security feature on your Redis server is your firewall (which you configured if you followed the prerequisite Initial Server Setup tutorial), as this makes it extremely difficult for malicious actors to jump that fence.
Deja una respuesta