Cómo instalar y proteger Redis en Ubuntu 18.04

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Instalación y configuración de Redis
  • Paso 2: Prueba de Redis
  • Paso 3: vinculación al host local
  • Paso 4: Configuración de una contraseña de Redis
  • Paso 5: Cambiar el nombre de los comandos peligrosos
  • Conclusion
  • 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 sudoprivilegios 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 sudousuario y continúe a continuación.

    Paso 1: Instalación y configuración de Redis

    Para obtener la última versión de Redis, utilizaremos aptpara instalarla desde los repositorios oficiales de Ubuntu.

    Primero, actualice su aptcaché de paquetes local si no lo ha hecho recientemente:

    1. sudo apt update

    Luego, instala Redis escribiendo:

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

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

    Dentro del archivo, busque la superviseddirectiva . 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 superviseddirectiva está configurada en node 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:

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

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

    1. sudo systemctl disable redis

    Para probar que Redis está funcionando correctamente, conéctese al servidor mediante el cliente de línea de comandos:

    1. redis-cli

    En el mensaje que aparece a continuación, pruebe la conectividad con el pingcomando:

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

    1. set test "It's working!"
    OutputOK

    Recupere el valor escribiendo:

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

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

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

    1. redis-cli
    1. get test

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

    Output"It's working!"

    Salga nuevamente al shell cuando haya terminado:

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

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

    1. sudo systemctl restart redis

    Para comprobar que este cambio ha surtido efecto, ejecute el siguiente netstatcomando:

    1. 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-serverprograma está vinculado a localhost ( 127.0.0.1), lo que refleja la bindconfiguració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 authcomando, 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:

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

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

    /etc/redis/redis.conf

    # requirepass foobared

    Descomentelo eliminando el #, y cámbielo foobareda una contraseña segura.

    Nota: encima de la requirepassdirectiva en el redis.confarchivo, 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 opensslcomando 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:

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

    1. sudo systemctl restart redis.service

    Para probar que la contraseña funciona, acceda a la línea de comandos de Redis:

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

    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 reconoce:

    OutputOK

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

    1. set key1 10
    OutputOK

    get key1consulta a Redis el valor de la nueva clave.

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

    1. 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 SECURITYsección del /etc/redis/redis.confarchivo.

    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:

    1. 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-commanddirectivas y seguirlas con cadenas vacías, FLUSHDB, FLUSHALL, y DEBUGse 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 SHUTDOWNy CONFIGa SHUTDOWN_MENOTy ASC12_CONFIG, respectivamente.

    Guarde los cambios y cierre el archivo.

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

    1. sudo systemctl restart redis.service

    Para probar si estos comandos se actualizaron correctamente, abra el cliente Redis:

    1. redis-cli

    Luego, autenticar:

    1. auth your_redis_password
    OutputOK

    Supongamos que has cambiado el nombre del CONFIGcomando a ASC12_CONFIG, como en el ejemplo anterior. Primero, intenta usar el CONFIGcomando original. Debería fallar, porque lo has renombrado:

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

    1. asc12_config get requirepass

    El comando de Redis configpermite que quien lo ejecute interactúe con el archivo de configuración de la instalación. Cuando se combina con getuna 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:

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

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion