Manager, Developer Education
Justin Ellingwood escribió una versión anterior de este tutorial.
Redis es un sistema de almacenamiento claves-valores en memoria conocido por su flexibilidad, su rendimiento y su soporte amplio en varios idiomas. En este tutorial, se muestra cómo instalar, configurar y proteger Redis en un servidor de Ubuntu 20.04.
Para completar esta guía, necesitará acceso a un servidor de Ubuntu 20.04 que tenga un non-root user con privilegios sudo
y un firewall configurado con ufw
. Puede establecerlos siguiendo nuestra Guía de configuración inicial del servidor para Ubuntu 20.04.
Utilizaremos el administrador de paquetes APT para instalar Redis desde los repositorios oficiales de Ubuntu. Al momento de la publicación de este artículo, la versión disponible en los repositorios predeterminados es 5.0.7.
Comience actualizando el caché de paquetes apt
local:
- sudo apt update
A continuación, escriba lo siguiente para instalar Redis:
- 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 se debe realizar en el archivo de configuración de Redis, generado automáticamente durante la instalación.
Abra este archivo con su editor de texto preferido:
- sudo nano /etc/redis/redis.conf
Encuentre la directiva supervised
dentro del archivo. Esta directiva le permite declarar un sistema init para administrar Redis como un servicio, lo que le proporcionará mayor control sobre su funcionamiento. Por defecto, el valor de la directiva supervised
es no
. Debido a que se trata de Ubuntu, el cual utiliza el sistema init de systemd, cambie el valor a systemd
:
. . .
# 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
. . .
En este momento, es el único cambio que debe aplicar al archivo de configuración de Redis. Por ello, cuando termine guárdelo y ciérrelo. Si utilizó nano
para editar el archivo, hágalo pulsando CTRL + X
, Y
y, luego, ENTER
.
A continuación, reinicie el servicio de Redis para reflejar los cambios realizados en el archivo de configuración:
- sudo systemctl restart redis.service
Con esto, Redis quedará instalado y configurado, funcionará en su equipo. Sin embargo, antes de comenzar a utilizarlo, es conveniente verificar primero si funciona correctamente.
Como en el caso de cualquier software recién instalado, antes de realizar cualquier otro cambio en la configuración de este es recomendable asegurarse de que funcione según lo previsto. En este paso, abordaremos varias maneras de verificar que Redis funcione correctamente.
Comience verificando que el servicio de Redis esté en ejecución:
- sudo systemctl status redis
Si se ejecuta sin errores, este comando generará 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 Thu 2020-04-30 23:26:54 UTC; 4s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 36552 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 36561 (redis-server)
Tasks: 4 (limit: 2345)
Memory: 1.8M
CGroup: /system.slice/redis-server.service
└─36561 /usr/bin/redis-server 127.0.0.1:6379
. . .
Aquí puede observar que Redis está en ejecución y habilitado, lo cual significa que está configurado para iniciarse cada vez que el servidor lo haga.
Nota: Esta configuración es recomendable para muchos casos de uso comunes de Redis. Sin embargo, si prefiere iniciar Redis manualmente cada vez que su servidor lo haga, puede fijar este ajuste con el siguiente comando:
- sudo systemctl disable redis
Para comprobar que Redis funcione de forma correcta, establezca conexión con el servidor utilizando redis-cli
, el cliente de línea de comandos de Redis:
- redis-cli
En la siguiente línea de comandos, realice una prueba de conectividad con el comando ping
:
- ping
OutputPONG
Este resultado confirma que la conexión del servidor está todavía activa. A continuación, asegúrese de poder configurar las claves ejecutando lo siguiente:
- set test "It's working!"
OutputOK
Recupere el valor ingresando lo siguiente:
- get test
Suponiendo que todo funciona, podrá recuperar el valor almacenado:
Output"It's working!"
Una vez que confirme que puede obtener el valor, cierre la línea de comandos de Redis para volver al shell:
- exit
Como prueba final, comprobaremos si Redis es capaz de persistir datos aún después de su detención o reinicio. Para hacer esto, primero reinicie la instancia de Redis:
- sudo systemctl restart redis
Luego, vuelva a conectarse con el cliente de línea de comandos:
- redis-cli
Y confirme que su valor de prueba está aún disponible
- get test
El acceso al valor de su clave debe seguir siendo posible:
Output"It's working!"
Cuando haya terminado, diríjase nuevamente al intérprete de comandos:
- exit
De esta forma, su instalación de Redis estará completamente funcional y lista para usarse. Sin embargo, algunos de sus ajustes de configuración predeterminados son inseguros y dan a individuos malintencionados la oportunidad de atacar y obtener acceso a su servidor y a sus datos. Según lo establecido en el sitio web oficial de Redis, en los pasos restantes de este tutorial se abarcan los métodos para mitigar estas vulnerabilidades. Aunque estos pasos son opcionales y Redis seguirá funcionando si decide no seguirlos, se recomienda encarecidamente completarlos para fortalecer la seguridad de su sistema.
De forma predeterminada, solo se puede acceder a Redis desde localhost. Sin embargo, si instaló y configuró Redis siguiendo un tutorial diferente, es posible que haya actualizado el archivo de configuración para permitir conexiones desde cualquier parte. Esto no es tan seguro como vincularse a localhost.
Para solucionar esto, abra el archivo de configuración de Redis para editar:
- sudo nano /etc/redis/redis.conf
Ubique esta línea y compruebe que está descomentada (si existe un #
elimínelo):
bind 127.0.0.1 ::1
Al finalizar, guarde y cierre el archivo (presione CTRL + X
, Y
y, luego, ENTER
).
Luego, para asegurar que systemd lea sus cambios reinicie el servicio:
- sudo systemctl restart redis
Para verificar que este cambio surta efecto, ejecute el siguiente comando netstat
:
- 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
Nota: Es posible que el comando netstat
no esté disponible en su sistema de forma predeterminada. De ser así, puede instalarlo (al igual que otras herramientas de conexión útiles) con el siguiente comando:
- sudo apt install net-tools
El resultado muestra que el programa de redis-server
está sujeto a localhost (127.0.0.1
), lo cual refleja el cambio que realizó al archivo de configuración. Si observa otra dirección IP en esa columna (por ejemplo, 0.0.0.0
), debe volver a verificar que descomentó la línea correcta y reiniciar el servicio de Redis.
Ahora que su instalación de Redis sólo está escuchando localhost, será más complicado para los agentes malintencionados realizar solicitudes o acceder a su servidor. Sin embargo, Redis aún no se ha configurado para solicitar que los usuarios se autentiquen antes de realizar cambios en su configuración o en los datos que almacena. Para solucionarlo, Redis le permite solicitar a los usuarios que se autentiquen con una contraseña antes de realizar cambios a través del cliente Redis (redis-cli
).
La configuración de una contraseña de Redis habilita una de sus dos funciones integradas de seguridad: el comando auth
, que requiere la autenticación de clientes 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
, por lo tanto abra ese archivo con el editor de su preferencia:
- sudo nano /etc/redis/redis.conf
Desplácese a la sección SECURITY
y busque una directiva comentada que diga:
. . .
# requirepass foobared
. . .
Quite los comentarios de esta eliminando el #
y cambie foobared
por una contraseña segura.
Nota: a la directiva de requirepass
dentro del archivo redis.conf
se antepone existe 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 defina para su contraseña un valor muy seguro y largo. En lugar de inventar una contraseña, puede usar el comando openssl
para generar una de forma aleatoria, como en el siguiente ejemplo. Como se muestra, al enlazar el resultado del primero al segundo comando openssl
, eliminará cualquier salto de línea generado por el primero:
- openssl rand 60 | openssl base64 -A
Su resultado debe parecerse a esto:
OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Una vez que se copie y se pegue el resultado de este comando como nuevo valor para requirepass
, debe aparecer lo siguiente:
/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Guarde y cierre el archivo después de configurar la contraseña, luego reinicie Redis:
- sudo systemctl restart redis.service
Para probar que la contraseña funciona, abra el cliente de Redis:
- redis-cli
A continuación se muestra una secuencia de comandos utilizados para comprobar que la contraseña de Redis funciona. El propósito del primer comando es configurar una clave para un valor antes de la autenticación:
- set key1 10
No funcionará ya que no se autenticó, de forma que Redis muestra 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 lo reconoce:
OutputOK
Después de eso, tendrá éxito al ejecutar de nuevo el comando anterior:
- set key1 10
OutputOK
get key1
consulta a Redis por el valor de la nueva clave.
- get key1
Output"10"
Después de confirmar que puede ejecutar comandos en el cliente de Redis tras la autenticación, puede salir de redis-cli
:
- quit
A continuación, veremos cómo renombrar comandos de Redis los cuales, si se ingresan por error o por un agente malintencionado, podrían causar graves daños a su máquina.
La característica adicional de seguridad incorporada en Redis implica renombrar o desactivar algunos comandos considerados peligrosos.
Cuando los ejecutan usuarios no autorizados, estos comandos pueden utilizarse para volver a configurar, destruir o borrar sus datos. Al igual que la contraseña de autenticación, el cambio de nombres o la inhabilitación de comandos se configura en la misma sección SECURITY
del archivo /etc/redis/redis.conf
.
Algunos de los comandos considerados peligrosos: FLUSHDB
, FLUSHALL
, KEYS
, PEXPIRE
, DEL
, CONFIG
, SHUTDOWN
, BGREWRITEAOF
, BGSAVE
, SAVE
, SPOP
, SREM
, RENAME
, y DEBUG
. No es una lista completa, pero renombrar o desactivar todos los comandos de esa lista es un buen comienzo para mejorar la seguridad de su servidor Redis.
Según sus necesidades específicas o las de su sitio, debe renombrar o desactivar un comando. Si sabe que nunca usará un comando que pueda someterse a manipulación, puede desactivarlo. Por otra parte, podría convenir renombrarlo.
Para renombrar o desactivar comandos de Redis, vuelva a abrir el archivo de configuración:
- sudo nano /etc/redis/redis.conf
Advertencia: Los siguientes pasos para desactivar y renombrar comandos son ejemplos. Sólo debe optar por desactivar o renombrar los comandos que le resulten pertinentes. Puede revisar la lista completa de comandos y determinar cómo pueden ser utilizados indebidamente en redis.io/commands.
Para desactivar un comando, simplemente renómbrelo de modo que pase a ser una cadena vacía (simbolizado por un par de comillas sin caracteres entre ellos), como se muestra a continuación:
. . .
# 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 ""
. . .
Para renombrar un comando, asígnele otro nombre como se muestra en los ejemplos siguientes. Los comandos renombrados deben ser difíciles de adivinar para otros, pero fáciles de recordar para usted.
. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .
Guarde los cambios y cierre el archivo.
Después de renombrar un comando, aplique el cambio reiniciando Redis:
- sudo systemctl restart redis.service
Para probar el nuevo comando, ingrese la línea de comandos de Redis:
- redis-cli
Luego, realice la autenticación:
- auth your_redis_password
OutputOK
Como en el ejemplo anterior, supongamos que cambió el nombre del comando CONFIG
por ASC12_CONFIG
. Primero, intente utilizar el comando CONFIG
original. Debido a que lo renombró, no debe funcionar:
- config get requirepass
Output(error) ERR unknown command `config`, with args beginning with:
Sin embargo, se podrá llamar al comando renombrado con éxito. No distingue entre mayúsculas y minúscula:
- asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"
Por último, podrá cerrar redis-cli
:
- exit
Considere que si ya utiliza la línea de comandos de Redis y reinicia Redis, deberá volver a realizar la autenticación. De lo contrario, si escribe un comando aparecerá este error:
OutputNOAUTH Authentication required.
Con respecto a la práctica de renombrar comandos, al final de la sección SECURITY
en /etc/redis/redis.conf
se encuentra la siguiente declaración de advertencia:
. . .
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.
. . .
Nota: Para el proyecto Redis se prefieren los términos “maestro” y “esclavo”, mientras que para DigitalOcean generalmente se privilegian las opciones “primario” y “secundario”. Para evitar confusiones, optamos por utilizar la terminología empleada en la documentación de Redis.
Esto significa que si el comando renombrado no se encuentra en el archivo AOF, o se encuentra y el archivo AOF no se transmitió a esclavos, no debería haber inconvenientes.
Tenga eso en cuenta cuando intente renombrar comandos. El mejor momento para renombrar un comando es cuando no utiliza la persistencia de AOF, o inmediatamente después de la instalación; es decir, antes de que su aplicación que utiliza Redis se implemente.
Cuando utilice AOF y realice una instalación de maestro y esclavo, tenga en cuenta esta respuesta de la página de solución a problemas del proyecto GitHub. La siguiente es una respuesta a la pregunta del autor:
Los comandos se registran en AOF y se replican en el esclavo de la misma manera en que se envían, de modo que si intenta reproducir AOF en una instancia que no tenga el mismo renombramiento, puede hallar inconsistencias debido a que el comando no puede ejecutarse (igual para los esclavos).
Así, la mejor forma de gestionar renombramientos en esos casos es asegurarse de que los comandos renombrados se apliquen a todas las instancias en instalaciones de maestros y esclavos.
A través de este tutorial, instaló y configuró Redis, validó la el funcionamiento correcto de su instalación de Redis y utilizó sus características de seguridad integradas para hacerlo menos vulnerable a ataques de individuos malintencionados.
Tenga en cuenta que una vez que alguien ingrese en su servidor, será muy fácil eludir las características de seguridad específicas de Redis que hemos establecido. Por lo tanto, la característica de seguridad más importante en su servidor Redis es su firewall (que pudo configurar si cumplió con los requisitos previos del tutorial de configuración inicial para servidores), que supone un enorme obstáculo para los individuos malintencionados.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Thanks!! this worked for me!