Cómo conectarse a una instancia de Redis administrada a través de TLS con Stunnel y redis-cli

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Instalación de Stunnel y redis-cli
  • Paso 2: Configuración de Stunnel
  • Paso 3: Conexión a su base de datos administrada mediante TLS
  • Conclusión
  • Una instancia administrada de Redis puede brindar beneficios como alta disponibilidad y actualizaciones automáticas. Sin embargo, cada vez que se establece una conexión a un servidor de base de datos remoto, se corre el riesgo de que agentes maliciosos filtren la información confidencial que se le envía.

    redis-cli, la interfaz de línea de comandos de Redis, no admite de forma nativa conexiones a través de TLS, un protocolo criptográfico que permite comunicaciones seguras a través de una red. Esto significa que, sin una configuración adicional, redis-clino es una forma segura de conectarse a un servidor Redis remoto. Una forma de establecer una conexión segura a una instancia Redis administrada es crear un túnel que use el protocolo TLS.

    Stunnel es un proxy de código abierto que se utiliza para crear túneles seguros y que le permite comunicarse con otras máquinas a través de TLS. En esta guía, le explicaremos cómo instalar y configurar Stunnel para que pueda conectarse a una instancia administrada de Redis a través de TLS con redis-cli.

    Prerrequisitos

    Para completar esta guía, necesitarás:

    • Acceso a un servidor Ubuntu 18.04. Este servidor debe tener un usuario no root con privilegios administrativos y un firewall configurado con ufw. Para configurarlo, siga nuestra guía de configuración inicial de servidores para Ubuntu 18.04.
    • Una instancia de base de datos Redis administrada. Los pasos descritos en este tutorial se probaron en una base de datos Redis administrada de DigitalOcean, aunque por lo general deberían funcionar para bases de datos administradas de cualquier proveedor de nube. Para aprovisionar una base de datos Redis administrada de DigitalOcean, siga nuestra documentación del producto Redis administrada.

    Paso 1: Instalación de Stunnel y redis-cli

    Cuando instalas un servidor Redis, normalmente viene empaquetado con redis-cli. Sin embargo, puedes instalarlo redis-clisin el servidor Redis instalando el redis-toolspaquete desde los repositorios predeterminados de Ubuntu. También puedes instalar stunnel desde los repositorios predeterminados de Ubuntu descargando el stunnel4paquete.

    Primero, actualice el índice de paquetes de su servidor si no lo ha hecho recientemente:

    1. sudo apt update

    Luego instala los paquetes redis-toolsy stunnel4con APT:

    1. sudo apt install redis-tools stunnel4

    Cuando se le solicite, presione ENTERpara confirmar que desea instalar los paquetes.

    Puede comprobar si stunnel se instaló correctamente y si su servicio systemd está funcionando ejecutando el siguiente comando:

    1. sudo systemctl status stunnel4
    Output● stunnel4.service - LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons)   Loaded: loaded (/etc/init.d/stunnel4; generated)   Active: active (exited) since Thu 2019-09-12 14:34:05 UTC; 8s ago     Docs: man:systemd-sysv-generator(8)    Tasks: 0 (limit: 2362)   CGroup: /system.slice/stunnel4.serviceSep 12 14:34:05 stunnel systemd[1]: Starting LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons)...Sep 12 14:34:05 stunnel stunnel4[2034]: TLS tunnels disabled, see /etc/default/stunnel4Sep 12 14:34:05 stunnel systemd[1]: Started LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons).

    Aquí, puedes ver que el servicio stunnel está activo, aunque el proceso salió inmediatamente. Esto nos indica que stunnel está ejecutándose, pero no puede hacer nada en realidad, ya que aún no lo hemos configurado.

    Paso 2: Configuración de Stunnel

    Los sistemas Linux modernos dependen de systemd para inicializar y administrar servicios y demonios. Sin embargo, stunnel utiliza un script de inicio de estilo SysV, que se basa en el antiguo sistema de inicio UNIX System V, para el inicio. Deberá modificar el /etc/default/stunnel4archivo para habilitar este script de inicio.

    Abra este archivo con su editor de texto preferido. Aquí utilizaremos nano:

    1. sudo nano /etc/default/stunnel4

    Busque la ENABLEDopción cerca de la parte superior del archivo. Estará configurada 0de forma predeterminada, pero cámbiela a 1para permitir que Stunnel se inicie al arrancar:

    /etc/predeterminado/stunnel4

    # /etc/default/stunnel# Julien LEMOINE speedblue@debian.org# September 2003# Change to one to enable stunnel automatic startupENABLED=1. . .

    Guarde y cierre el archivo. Si solía nanoeditar el archivo, hágalo presionando CTRL+X, Yy luego ENTER.

    A continuación, deberá crear un archivo de configuración para stunnel que le indicará al programa dónde debe enrutar el tráfico.

    Abra un nuevo archivo llamado stunnel.confen el /etc/stunneldirectorio:

    1. sudo nano /etc/stunnel/stunnel.conf

    Añade el siguiente contenido a este archivo:

    /etc/stunnel/stunnel.conf

    fips = nosetuid = nobodysetgid = nogrouppid = /home/sammy/pids/stunnel.piddebug = 7delay = yes[redis-cli]  client = yes  accept = 127.0.0.1:8000  connect = managed_redis_hostname_or_ip:managed_redis_port

    Las primeras cinco líneas del archivo son opciones globales, lo que significa que se aplicarán a todos los servicios que incluya en este archivo:

    • fips: Habilita o deshabilita el modo FIPS 140-2 de Stunnel. En este modo, Stunnel validará que la conexión cumpla con el Estándar Federal de Procesamiento de Información. Si se configura en esta opción, nose deshabilita esta función. Tenga en cuenta que deshabilitar esta función no es menos seguro, pero mantenerla habilitada (como está de manera predeterminada) requeriría una configuración adicional.
    • setuid: Define el ID de usuario de Unix con el que se ejecutará stunnel. De forma predeterminada, el proceso stunnel es propiedad del usuario root . Sin embargo, la documentación de stunnel recomienda que elimine los privilegios administrativos una vez que se inicie el túnel, ya que no hacerlo representa un riesgo de seguridad. Si se establece el setuidparámetro en , nobody , un usuario sin privilegios, tomará posesión del proceso stunnel una vez que se haya establecido el túnel.nobody
    • setgid: Define el ID del grupo Unix bajo el cual se ejecutará stunnel. Al igual que con setuid, esta configuración especifica un grupo sin privilegios especiales ( nogroup ) para evitar posibles problemas de seguridad.
    • pid: Define la ubicación de un archivo donde stunnel creará un .pidarchivo, un tipo de archivo que contiene el PID de un proceso. .pidLos archivos son utilizados normalmente por otros programas para encontrar el PID de un proceso en ejecución. De forma predeterminada, stunnel crea un .pidarchivo en el /var/run/stunnel4/directorio, pero como el usuario nobody no tiene permiso para acceder a ese directorio, evitará que el túnel se inicie correctamente. En su lugar, esta línea especifica un archivo llamado stunnel.pidque se encuentra en un directorio llamado pidsen el directorio de inicio del usuario de Ubuntu. Crearemos este directorio y el stunnel.pidarchivo en breve. A medida que agregue esta línea, asegúrese de cambiarla sammypor el nombre de su usuario de sistema Ubuntu.
    • debug: Establece el nivel de depuración de stunnel, que puede variar de 0a 7. En este ejemplo, lo configuraremos en 7, el nivel más alto disponible, ya que proporcionará la información más detallada si stunnel encuentra algún problema. Puede configurarlo en cualquier nivel que desee, pero tenga en cuenta que la configuración predeterminada es 5.
    • delay: Cuando se configura en yes, esta opción hace que Stunnel retrase la búsqueda de DNS de la dirección que aparece en la connectopción. También evitará que Stunnel almacene en caché las direcciones IP. Esta configuración ayudará a mantener abierto el túnel incluso si la instancia de Redis administrada se desconecta, como puede suceder al ampliar el clúster.

    Las líneas restantes son opciones de nivel de servicio y solo se aplican al túnel que crearemos para redis-cli:

    • [redis-cli]: Este es un nombre de servicio y especifica que las siguientes líneas representan una configuración de servicio individual para un programa cliente. Puede tener más de un servicio en un archivo de configuración de stunnel, aunque cada uno debe estar asociado con una aplicación cliente existente y no puede tener dos servicios para la misma aplicación.
    • client:Al configurar esto, yesse le indica a stunnel que se ejecute en modo cliente, lo que significa que stunnel se conectará a un servidor TLS (la instancia Redis administrada) en lugar de actuar como un servidor TLS.
    • accept: Define el host y el puerto en el que stunnel aceptará conexiones del cliente. Aquí, especificamos la dirección IP 127.0.0.1, que es una dirección de bucle invertido IPv4 que se utiliza para representar al host local , y el puerto 8000. Esto significa que stunnel escuchará las conexiones que se originen desde el servidor Ubuntu en el puerto 8000y las cifrará. Tenga en cuenta que puede configurar el puerto en cualquier número de puerto que desee, siempre y cuando no esté ya en uso.
    • connect: Define la dirección remota y el puerto al que se conectará Stunnel. Asegúrese de cambiar este parámetro para que coincida con el puerto y el nombre de host o la dirección IP de su base de datos administrada.

    Nota: El nombre de host o la dirección IP y el puerto que debe especificar en la connectdirectiva serán específicos de su propia base de datos Redis administrada. Por lo general, estos se pueden encontrar en la interfaz de usuario de administración de bases de datos de su proveedor de nube donde aprovisionó su instancia Redis.

    Si utiliza una base de datos Redis administrada por DigitalOcean, puede encontrar esta información yendo a su Panel de control y haciendo clic en Bases de datos en el menú de la barra lateral izquierda. Luego, haga clic en el nombre de la instancia Redis a la que desea conectarse y desplácese hacia abajo hasta la sección Detalles de conexión . Allí, encontrará campos que describen el host y el puerto de su base de datos .

    Se trata de una configuración bastante mínima que conserva muchas de las configuraciones predeterminadas de Stunnel. El programa tiene muchas opciones disponibles para que puedas crear túneles que se adapten a tus necesidades particulares. Consulta la documentación oficial para obtener más detalles.

    Después de agregar este contenido, guarde y cierre el archivo.

    A continuación, asegúrese de estar en el directorio de inicio de su usuario de Ubuntu:

    1. cd

    Luego crea el pidsdirectorio que contendrá el stunnel.pidarchivo:

    1. mkdir pids

    El proceso stunnel creará el stunnel.pidarchivo automáticamente, por lo que no es necesario que lo hagas tú mismo. Sin embargo, sí es necesario cambiar la propiedad del pidsdirectorio al usuario nobody y al grupo nogroup :

    1. sudo chown -R nobody:nogroup pids/

    Luego, reinicie el stunnel4servicio para que stunnel lea el nuevo archivo de configuración:

    1. sudo systemctl restart stunnel4

    A continuación, puede comprobar si stunnel creó correctamente un túnel invocando netstat, una utilidad de línea de comandos que se utiliza para mostrar las conexiones de red. Ejecute el siguiente comando, que canaliza la netstatsalida a un grepcomando que, a su vez, la busca en todas las instancias de stunnel:

    1. sudo netstat -plunt | grep stunnel
    Outputtcp        0      0 127.0.0.1:8000         0.0.0.0:*               LISTEN      17868/stunnel 

    Esta salida muestra que stunnel está escuchando conexiones en el puerto local 8000.

    También puedes confirmar que el usuario nobody ha tomado posesión del proceso stunnel con ps, un programa que muestra todos los procesos que se están ejecutando actualmente:

    1. ps aux | grep stunnel
    Outputnobody   15674  0.0  0.1 121912  3180 ?        Ssl  19:28   0:00 /usr/bin/stunnel4 /etc/stunnel/stunnel.conf. . .

    Aquí se puede ver que, de hecho, nadie se ha hecho cargo del proceso de tunelización.

    Stunnel ya está completamente configurado y funcionando en su sistema. Está listo para conectarse a su instancia Redis administrada y probar que el túnel esté funcionando como se espera.

    Paso 3: Conexión a su base de datos administrada mediante TLS

    Ahora que ha instalado redis-cliy configurado stunnel en su servidor, está listo para conectarse a su base de datos administrada a través de TLS.

    Según la configuración definida en el archivo de configuración creado en el Paso 2, podrá conectarse a su base de datos administrada con el siguiente comando:

    1. redis-cli -h localhost -p 8000

    Este comando incluye la -hbandera, que indica redis-clique el siguiente argumento será el host al que nos conectaremos. En este caso, es localhostporque nos estamos conectando a un túnel creado localmente en el servidor. Después de eso está la -pbandera, que precede al puerto del túnel local al que nos estamos conectando, que en este caso es port 8000.

    Después de ejecutar ese comando, se conectará a su servidor Redis administrado. Su mensaje cambiará para reflejar que se conectó y se encuentra en redis-cliel modo interactivo de :

    Nota: A menudo, las bases de datos administradas se configuran para requerir que los usuarios se autentiquen con una contraseña cuando se conectan. Si su instancia administrada de Redis requiere una contraseña, puede incluir la -amarca en su redis-clicomando, seguida de su contraseña:

    1. redis-cli -h localhost -p 8000 -a password

    Alternativamente, puede autenticarse ejecutando el authcomando seguido de su contraseña después de establecer la conexión:

    1. auth password

    Si está utilizando una base de datos administrada por DigitalOcean, puede encontrar la contraseña de su instancia de Redis en el mismo lugar donde encontró su nombre de host y puerto. En su Panel de control , haga clic en Bases de datos en el menú de la barra lateral izquierda. Luego, haga clic en el nombre de la instancia de Redis a la que se conectó. Desplácese hacia abajo hasta la sección Detalles de conexión y allí encontrará un campo denominado contraseña . Haga clic en el botón mostrar para revelar la contraseña, luego cópiela y péguela en cualquiera de estos comandos (reemplazando password) para autenticarse.

    Puede probar si el túnel funciona como se espera ejecutando el pingcomando desde el modo interactivo de Redis:

    1. ping

    Si la conexión está activa, devolverá PONG:

    OutputPONG

    Sin embargo, si stunnel no está tunelizando el tráfico desde su servidor a su instancia de Redis correctamente, es posible que vea un mensaje de error como este antes de desconectarse de Redis:

    OutputError: Server closed the connection

    Si recibe este error o un error similar, verifique que haya ingresado correctamente el nombre de host y el puerto de su instancia de Redis en el stunnel.confarchivo. Asimismo, asegúrese de haber ingresado el número de puerto correcto en el redis-clicomando.

    También puede recibir este error cuando la instancia administrada de Redis restablece sus conexiones abiertas, como puede suceder cuando amplía la configuración de su clúster. En tales casos, es posible que no se desconecte de Redis, aunque deberá volver a autenticarse.

    Una vez que hayas confirmado que el túnel está funcionando, continúa y desconéctate de tu instancia de Redis:

    1. exit

    Si alguna vez cambia la configuración de stunnel, deberá volver a cargar o reiniciar el stunnel4servicio para que stunnel note los cambios:

    1. sudo systemctl reload stunnel4

    Si en algún momento en el futuro desea cerrar el túnel TLS, también puede hacerlo con systemctl:

    1. sudo systemctl stop stunnel4

    Una vez cerrado el túnel, puedes volver a abrirlo iniciando el servicio nuevamente:

    1. sudo systemctl start stunnel4

    Ahora que ha configurado Stunnel correctamente, está todo listo para comenzar a agregar datos a su instancia de Redis administrada con redis-cli.

    Conclusión

    Stunnel es una herramienta muy útil para crear túneles TLS y establecer conexiones seguras con servidores remotos. Esto resulta especialmente útil en casos en los que el transporte seguro de información entre máquinas es fundamental, como sucede con una base de datos remota.

    Desde aquí, puede comenzar a explorar Redis e integrarlo con su próxima aplicación. Si es la primera vez que trabaja con Redis, puede que le resulte útil nuestra serie sobre cómo administrar una base de datos de Redis.

    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