Redis, mi experiencia de uso

Todo lo que expondré a partir de ahora es mi total y completa experiencia con Redis, pues lo necesitaba para un proyecto y así fue como lo fui logrando. Espero les sirva.

0 – ¿Qué es redis?

Redis es de código abierto (licencia BSD). Se utiliza como base de datos, caché y agente de mensajes. Admite estructuras de datos como cadenas, hashes, listas, conjuntos, conjuntos ordenados con consultas de rango, mapas de bits, logs, índices geoespaciales con consultas de radio y flujos. Es un almacenador de datos clave-valor avanzado.

Redis está escrito en ANSI C y funciona en la mayoría de los sistemas POSIX como Linux, * BSD, OS X sin dependencias externas. Linux y OS X son los dos sistemas operativos en los que Redis se desarrolla y prueba más, y recomendamos utilizar Linux para la implementación. Redis puede funcionar en sistemas derivados de Solaris como SmartOS, pero el soporte es el mejor esfuerzo. No hay soporte oficial para las compilaciones de Windows.

1 – Instalación y configuración de Redis

Para acceder a la versión más reciente de Redis, utilizaremos apt para instalarla desde los repositorios oficiales de Ubuntu/Debian.

Actualice su caché de paquetes local de apt e instale Redis ingresando lo siguiente:

$ sudo apt update
$ sudo apt install -y 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/Debian, los cuales utilizan el sistema init de systemd, cambie el valor a systemd:

supervised systemd

Este es el único cambio que debe aplicar al archivo de configuración de Redis. Por ello, cuando termine guárdelo y ciérrelo. 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.

2 – Pruebas en Redis

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:

● 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í 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.

Para comprobar que Redis funcione de forma correcta, establezca conexión con el servidor utilizando el cliente de línea de comandos:

$ redis-cli

En la siguiente línea de comandos, realice una prueba de conectividad con el comando ping:

127.0.0.1:6379> ping

Resultado:

PONG

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:

127.0.0.1:6379> set prueba "FUNCIONA!"

Resultado:

OK

¿Qué hemos hecho? Sencillo, hemos creado una llave llamada prueba y le hemos asignado un valor, «FUNCIONA!»

Recupere el valor ingresando lo siguiente:

127.0.0.1:6379> get prueba

Suponiendo que todo funciona, podrá recuperar el valor almacenado:

Resultado:

"FUNCIONA!"

Una vez que confirme que puede obtener el valor, cierre la línea de comandos de Redis para volver al shell:

127.0.0.1:6379> 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

A continuación, establezca conexión con el cliente de línea de comandos y confirme que su valor de prueba siga disponible:

$ redis-cli
127.0.0.1:6379> get prueba

El acceso al valor de su clave debe seguir siendo posible:

Resultado:

"FUNCIONA!"

Cuando haya terminado, diríjase nuevamente al intérprete de comandos:

127.0.0.1:6379> 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.

3 – Asegurando Redis

3.1 – De forma predeterminada, sólo se puede acceder a Redis desde localhost. En caso de necesitar permitir conexiones desde otras direcciones también es posible, pero no se recomienda. Para lograr esto, abra el archivo de configuración de Redis para editar:

$ sudo nano /etc/redis/redis.conf

Ubique la línea donde se encuentra el parámetro «bind» y compruebe que está descomentada (si existe un # eso quiere decir que ese servidor redis escucha en todas las interfaces a todas la redes, el quivalente a 0.0.0.0):

bind 127.0.0.1

Luego, guardar los cambios y para asegurar que systemd lea sus cambios reinicie el servicio:

$ sudo systemctl restart redis

o:

$ sudo /etc/init.d/redis-server restart

3.2 – Autenticación en Redis

Por defecto, uste dpuede ejecutar cualquier comando en Redis, por lo que se recomienda proveer de autenticación el servidor de redes para poder ejecutar comandos, como medida de seguridad. Para asignar contraseña al servidor de redis, debemos editar/setear en la configuración lo siguiente

$ sudo nano /etc/redis/redis.conf

Buscamos la línea que dice:

#requirepass

descomentamos y ponemos un password, dicho password debe estar en texto plano.

Si no sabemos que password poner, podemos autogenerarlo, pero debemos recordarlo:

$ openssl rand 8 | openssl base64 -A

Lo cual en este ejemplo me devuelve:

OZ9dEFljw+M=

Y después reiniciar el server:

systemctl restart redis-server

Luego, para probar entramos en la consola e intentamos pedir información del server redis

$ redis-cli
127.0.0.1:6379> info

Resultado:

(error) NOAUTH Authentication required.

Pero si ejecuta:

127.0.0.1:6379> auth OZ9dEFljw+M=

Resultado:

OK

Y si ejecuta nuevamente info:

127.0.0.1:6379> info

Resultado:

# Server
redis_version:5.0.3
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:afa0decbb6de285f
redis_mode:standalone
os:Linux 5.4.41-1-pve x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:8.3.0
process_id:771
run_id:21e7e8b9f11dc372d9319bb55673a71056a8913b
tcp_port:6379
uptime_in_seconds:35
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:14428668
executable:/usr/bin/redis-server
config_file:/etc/redis/redis.conf

. . .

Entre otros muchos resultados, que ahora mismo alargarían este texo, por eso los omito.

Ahora bien… Recuerdan este comando:

$ openssl rand 8 | openssl base64 -A

Que es para generar un password aleatorio… En el apartado de contraseña Redis nos advierte:

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

¿Qué quiere decir esto? Que debemos generar passwords largos en extensión, por lo cual se recomienda ejecutar el comando de la siguiente forma:

$ openssl rand 60 | openssl base64 -A

3.3 – Renombrar comandos peligrosos

Una 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
– 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 habilitar o desactivar comandos de Redis, vuelva a abrir el archivo de configuración:

$ sudo nano /etc/redis/redis.conf

Para deshabilitar comando que pudieran ser potenciales peligros a la seguridad del server, editamos el archivo de config

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 srvconfig
rename-command SHUTDOWN halt

Guardar, reiniciar y listo. Ya funciona:

$ sudo /etc/init.d/redis-server restart

Nota: Este tema de configurar para renombrar o deshabilitar comandos esta en dependencia del sistema que usará Redis, asi que tenga en cuenta que si un sistema de producción usa el comando original, por ejemplo «CONFIG», y no el modificado por usted, en este ejemplo «srvconfig», tendrá problemas y no funcionará como es debido.

3.4 – Gestión de memoria

Redis cuenta con un apartado en su configuración llamado: MEMORY MANAGEMENT. Este se dedica al uso de mamoria en el almacenamiento de datos. Dicho almacenamiento se divide en dos partes:

1- LRU – Least Recently Used
2- LFU – Least Frequently Used

Ahora, que significa esto. En dependencia de los datos que usted vaya salvando se irá llenando la memoria asignada, y cuando esta memoria se llene, redis irá vaciando recods de acuerdo con el parametro especificado de estas dos partes mencionadas anteriormente[LRU o LFU]

Por ejemplo:

maxmemory 256mb
maxmemory-policy allkeys-lru

A partir de los 256mb de almacenado de datos se procederá a borrar datos en el orden, último usado recientemente[LRU], o último usado frecuentemente[LFU]. En el ejemplo anterior se usa LRU. En virtud de tener un poco más de detalle en este apartado, leer el archivo de configuración.

Hasta acá lo básico de Redis. Creo que ha quedado bastante claro.

Nota: Investigando de uso y aplicaciones, descubrí Retwis, un clon de Twiter escrito en PHP cuya base de datos es Redis, y funciona OK.

Referencias:

https://redis.io/topics/security
https://www.howtoforge.com/install-and-secure-redis-server-on-debian-10/
https://www.howtoforge.com/how-to-install-and-secure-redis-on-ubuntu-18-04/
https://www.ionos.com/community/hosting/redis/securing-a-redis-installation/
https://www.digitalocean.com/community/tutorials/how-to-secure-your-redis-installation-on-ubuntu-18-04

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 5 / 5. Recuento de votos: 1

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Sé el primero en comentar

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*