Comment installer et sécuriser Redis sur Ubuntu 22.04

Introduction

Redis est un système de stockage de clés-valeurs en mémoire connu pour sa flexibilité, ses performances et son large support linguistique. Ce tutoriel montre comment installer, configurer et sécuriser Redis sur un serveur Ubuntu 22.04.

Prérequis

Pour suivre ce guide, vous aurez besoin d’accéder à un serveur Ubuntu 22.04 disposant d’un utilisateur non root avec des privilèges sudo et d’un pare-feu configuré avec ufw. Vous pouvez le configurer en suivant notre guide Configuration initiale du serveur pour Ubuntu 22.04.

Étape 1 — Installation et configuration de Redis

Nous utiliserons le gestionnaire de paquets APT pour installer Redis à partir des dépôts officiels d’Ubuntu. À l’heure actuelle, la version disponible dans les dépôts par défaut est 6.0.16.

Commencez par mettre à jour le cache local des paquets apt:

  1. sudo apt update

Ensuite, installez Redis en tapant:

  1. sudo apt install redis-server

Cela téléchargera et installera Redis et ses dépendances. Ensuite, il y a un changement de configuration important à effectuer dans le fichier de configuration de Redis, qui a été généré automatiquement lors de l’installation.

Ouvrez ce fichier avec votre éditeur de texte préféré :

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

À l’intérieur du fichier, recherchez la directive supervised. Cette directive vous permet de déclarer un système d’initialisation pour gérer Redis en tant que service, vous offrant ainsi plus de contrôle sur son fonctionnement. La directive supervised est définie par défaut sur no. Étant donné que vous utilisez Ubuntu, qui utilise le système d’initialisation systemd, changez cela en systemd :

/etc/redis/redis.conf
. . .

# Si vous exécutez Redis à partir d'upstart ou de systemd, Redis peut interagir avec votre
# arborescence de supervision. Options :
#   supervised no      - aucune interaction de supervision
#   supervised upstart - signaler upstart en mettant Redis en mode SIGSTOP
#   supervised systemd - signaler systemd en écrivant READY=1 dans $NOTIFY_SOCKET
#   supervised auto    - détecter la méthode upstart ou systemd en fonction de
#                        des variables d'environnement UPSTART_JOB ou NOTIFY_SOCKET
# Remarque : ces méthodes de supervision ne signalent que "le processus est prêt."
#       Elles n'activent pas de vérifications de continuité de vie continue vers votre superviseur.
supervised systemd

. . .

C’est le seul changement que vous devez apporter au fichier de configuration Redis à ce stade, alors enregistrez-le et fermez-le lorsque vous avez terminé. Si vous avez utilisé nano pour modifier le fichier, appuyez sur CTRL + X, puis sur Y, et enfin sur ENTRÉE.

Ensuite, redémarrez le service Redis pour refléter les modifications apportées au fichier de configuration:

  1. sudo systemctl restart redis.service

Ainsi, vous avez installé et configuré Redis, et il fonctionne sur votre machine. Avant de commencer à l’utiliser, cependant, il est prudent de vérifier d’abord si Redis fonctionne correctement.

Étape 2 — Test de Redis

Comme pour tout logiciel nouvellement installé, il est conseillé de s’assurer que Redis fonctionne comme prévu avant de procéder à d’autres modifications de sa configuration. Nous passerons en revue quelques façons de vérifier que Redis fonctionne correctement dans cette étape.

Commencez par vérifier que le service Redis est en cours d’exécution:

  1. sudo systemctl status redis

Si le service fonctionne sans erreurs, cette commande produira une sortie similaire à la suivante:

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 2022-04-20 20:40:52 UTC; 4s ago Docs: http://redis.io/documentation, man:redis-server(1) Main PID: 2899 (redis-server) Status: "Ready to accept connections" Tasks: 5 (limit: 2327) Memory: 2.5M CPU: 65ms CGroup: /system.slice/redis-server.service └─2899 "/usr/bin/redis-server 127.0.0.1:6379 . . .

Cette sortie indique que Redis est en cours d’exécution et est déjà activé, ce qui signifie qu’il est configuré pour démarrer à chaque démarrage du serveur.

Remarque: Ce paramètre est souhaitable pour de nombreux cas d’utilisation courants de Redis. Si, cependant, vous préférez démarrer Redis manuellement à chaque démarrage de votre serveur, vous pouvez le configurer avec la commande suivante:

  1. sudo systemctl disable redis

Pour tester que Redis fonctionne correctement, connectez-vous au serveur en utilisant redis-cli, le client en ligne de commande de Redis :

  1. redis-cli

Dans l’invite qui suit, testez la connectivité avec la commande ping :

  1. ping
Output
PONG

Cette sortie confirme que la connexion au serveur est toujours active. Ensuite, vérifiez que vous pouvez définir des clés en exécutant :

  1. set test "It's working!"
Output
OK

Récupérez la valeur en tapant :

  1. get test

En supposant que tout fonctionne, vous pourrez récupérer la valeur que vous avez stockée :

Output
"It's working!"

Après avoir confirmé que vous pouvez récupérer la valeur, quittez l’invite Redis pour revenir à l’invite de commande :

  1. exit

En guise de dernier test, nous vérifierons si Redis est capable de persister les données même après avoir été arrêté ou redémarré. Pour ce faire, redémarrez d’abord l’instance Redis :

  1. sudo systemctl restart redis

Ensuite, connectez-vous à nouveau avec le client en ligne de commande :

  1. redis-cli

Et confirmez que votre valeur de test est toujours disponible :

  1. get test

La valeur de votre clé devrait toujours être accessible :

Output
"It's working!"

Quittez à nouveau pour revenir à l’invite de commande lorsque vous avez terminé :

  1. exit

Ainsi, votre installation de Redis est entièrement opérationnelle et prête à être utilisée. Cependant, certains de ses paramètres de configuration par défaut sont peu sécurisés et offrent aux acteurs malveillants des opportunités pour attaquer et accéder à votre serveur et à ses données. Les étapes restantes de ce tutoriel couvrent des méthodes pour atténuer ces vulnérabilités, telles que prescrites par le site web officiel de Redis. Bien que ces étapes soient facultatives et que Redis fonctionnera toujours si vous choisissez de ne pas les suivre, il est fortement recommandé de les compléter afin de renforcer la sécurité de votre système.

Étape 3 — Liaison à localhost

Par défaut, Redis est uniquement accessible depuis localhost. Cependant, si vous avez installé et configuré Redis en suivant un tutoriel différent de celui-ci, vous avez peut-être mis à jour le fichier de configuration pour autoriser les connexions depuis n’importe où. Ce n’est pas aussi sécurisé que de lier à localhost.

Pour corriger cela, ouvrez le fichier de configuration de Redis pour l’éditer :

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

Localisez cette ligne et assurez-vous qu’elle est décommentée (supprimez le # s’il existe) :

/etc/redis/redis.conf
. . .
bind 127.0.0.1 ::1
. . .

Enregistrez et fermez le fichier une fois terminé (appuyez sur CTRL + X, puis Y, puis ENTRÉE).

Ensuite, redémarrez le service pour vous assurer que systemd lit vos modifications :

  1. sudo systemctl restart redis

Pour vérifier que ce changement a bien été pris en compte, exécutez la commande netstat suivante :

  1. sudo netstat -lnp | grep redis
Output
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server

Note : La commande netstat peut ne pas être disponible sur votre système par défaut. Si tel est le cas, vous pouvez l’installer (ainsi que plusieurs autres outils réseau pratiques) avec la commande suivante :

  1. sudo apt install net-tools

Cet affichage montre que le programme redis-server est lié à localhost (127.0.0.1), reflétant le changement que vous venez de faire dans le fichier de configuration. S’il y a une autre adresse IP dans cette colonne (0.0.0.0, par exemple), alors vous devriez vérifier à nouveau que vous avez décommenté la bonne ligne et redémarrer le service Redis.

Maintenant que votre installation Redis n’écoute que sur localhost, il sera plus difficile pour les acteurs malveillants de faire des requêtes ou de prendre accès à votre serveur. Cependant, Redis n’est pas actuellement configuré pour exiger des utilisateurs qu’ils s’authentifient avant de faire des modifications à sa configuration ou aux données qu’il contient. Pour remédier à cela, Redis vous permet de demander aux utilisateurs de s’authentifier avec un mot de passe avant de faire des modifications via le client Redis (redis-cli).

Étape 4 — Configuration d’un mot de passe Redis

Configurer un mot de passe Redis active l’une de ses deux fonctionnalités de sécurité intégrées — la commande auth, qui demande aux clients de s’authentifier pour accéder à la base de données. Le mot de passe est configuré directement dans le fichier de configuration de Redis, /etc/redis/redis.conf, donc ouvrez à nouveau ce fichier avec votre éditeur préféré:

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

Faites défiler jusqu’à la section SECURITY et trouvez une directive commentée qui se lit comme suit:

/etc/redis/redis.conf
. . .
# requirepass foobared
. . .

Décommentez-la en supprimant le #, et remplacez foobared par un mot de passe sécurisé.

Remarque : Au-dessus de la directive requirepass dans le fichier redis.conf, il y a un avertissement commenté :

/etc/redis/redis.conf
. . .
# Avertissement : étant donné que Redis est assez rapide, un utilisateur externe peut essayer jusqu'à
# 150 000 mots de passe par seconde sur une bonne configuration. Cela signifie que vous devriez
# utiliser un mot de passe très fort, sinon il sera très facile à casser.
#
. . .

Il est donc important que vous spécifiiez une valeur très forte et très longue comme mot de passe. Plutôt que de créer un mot de passe vous-même, vous pouvez utiliser la commande openssl pour en générer un aléatoire, comme dans l’exemple suivant. En redirigeant la sortie de la première commande vers la deuxième commande openssl, comme indiqué ici, cela supprimera les sauts de ligne produits par la première commande :

  1. openssl rand 60 | openssl base64 -A

Cette commande renverra une sortie comme ceci :

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Après avoir copié et collé la sortie de cette commande en tant que nouvelle valeur pour requirepass, cela devrait ressembler à ceci :

/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Après avoir défini le mot de passe, enregistrez et fermez le fichier. Ensuite, redémarrez Redis :

  1. sudo systemctl restart redis.service

Pour tester si le mot de passe fonctionne, ouvrez le client Redis :

  1. redis-cli

Les commandes suivantes montrent une séquence de commandes utilisées pour tester si le mot de passe Redis fonctionne. La première commande tente de définir une clé sur une valeur avant l’authentification :

  1. set key1 10

Cela ne fonctionnera pas car vous n’avez pas été authentifié, donc Redis renvoie une erreur :

Output
(error) NOAUTH Authentication required.

La commande suivante s’authentifie avec le mot de passe spécifié dans le fichier de configuration de Redis :

  1. auth your_redis_password

Redis confirme :

Output
OK

Après cela, exécuter à nouveau la commande précédente réussira :

  1. set key1 10
Output
OK

get key1 interroge Redis pour la valeur de la nouvelle clé.

  1. get key1
Output
"10"

Après avoir confirmé que vous pouvez exécuter des commandes dans le client Redis après vous être authentifié, vous pouvez quitter redis-cli:

  1. quit

Ensuite, nous passerons à la renommer les commandes Redis qui, si elles sont saisies par erreur ou par un acteur malveillant, pourraient avoir des impacts sérieux sur vos données.

Étape 5 — Renommer les commandes dangereuses

L’autre fonction de sécurité intégrée à Redis implique de renommer ou de désactiver complètement certaines commandes considérées comme dangereuses.

Lorsqu’elles sont exécutées par des utilisateurs non autorisés, de telles commandes peuvent être utilisées pour reconfigurer, détruire ou autrement effacer vos données. Comme le mot de passe d’authentification, le renommage ou la désactivation des commandes est configuré dans la même section SECURITY du fichier /etc/redis/redis.conf.

Certaines des commandes considérées comme dangereuses incluent : FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME, et DEBUG. Cette liste n’est pas exhaustive, mais renommer ou désactiver toutes les commandes de cette liste est un bon point de départ pour améliorer la sécurité de votre serveur Redis.

Que vous deviez désactiver ou renommer une commande dépend de vos besoins spécifiques ou de ceux de votre site. Si vous savez que vous n’utiliserez jamais une commande qui pourrait être utilisée de manière abusive, vous pouvez la désactiver. Sinon, il pourrait être dans votre intérêt de la renommer.

Pour renommer ou désactiver des commandes Redis, ouvrez à nouveau le fichier de configuration :

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

Avertissement : Les étapes suivantes montrant comment désactiver et renommer des commandes sont des exemples. Vous devriez choisir de désactiver ou renommer uniquement les commandes qui ont du sens pour vous. Vous pouvez consulter la liste complète des commandes par vous-même et déterminer comment elles pourraient être utilisées de manière abusive sur redis.io/commands.

Pour désactiver une commande, renommez-la en une chaîne vide (indiquée par une paire de guillemets sans caractères entre eux), comme indiqué ci-dessous :

/etc/redis/redis.conf
. . .
# Il est également possible de supprimer complètement une commande en la renommant en
# une chaîne vide :
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .

Pour renommer une commande, donnez-lui un autre nom comme indiqué dans les exemples ci-dessous. Les commandes renommées doivent être difficiles à deviner pour les autres, mais faciles à retenir pour vous :

/etc/redis/redis.conf
. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .

Enregistrez vos modifications et fermez le fichier.

Après avoir renommé une commande, appliquez le changement en redémarrant Redis :

  1. sudo systemctl restart redis.service

Pour tester la nouvelle commande, accédez à la ligne de commande Redis :

  1. redis-cli

Ensuite, authentifiez-vous :

  1. auth your_redis_password
Output
OK

Supposons que vous avez renommé la commande CONFIG en ASC12_CONFIG, comme dans l’exemple précédent. Essayez d’abord d’utiliser la commande CONFIG originale. Elle devrait échouer, car vous l’avez renommée :

  1. config get requirepass
Output
(error) ERR unknown command `config`, with args beginning with:

Appeler la commande renommée sera cependant réussi. Il n’est pas sensible à la casse:

  1. asc12_config get requirepass
Output
1) "requirepass" 2) "your_redis_password"

Enfin, vous pouvez quitter redis-cli:

  1. exit

Notez que si vous utilisez déjà la ligne de commande Redis et que vous redémarrez Redis, vous devrez vous ré-authentifier. Sinon, vous obtiendrez cette erreur si vous tapez une commande:

Output
NOAUTH Authentication required.

Avertissement: En ce qui concerne la pratique de renommer les commandes, il y a une déclaration de prudence à la fin de la section SECURITY dans /etc/redis/redis.conf qui se lit comme suit:

/etc/redis/redis.conf
. . .
# Veuillez noter que le changement de nom de commandes qui sont journalisées dans le
# fichier AOF ou transmises aux répliques peut causer des problèmes.
. . .

Remarque: Le projet Redis choisit d’utiliser les termes « maître » et « esclave », tandis que DigitalOcean préfère généralement les alternatives « primaire » et « secondaire ». Pour éviter toute confusion, nous avons choisi d’utiliser les termes utilisés dans la documentation Redis ici.

Cela signifie que si la commande renommée n’est pas dans le fichier AOF, ou si elle l’est mais que le fichier AOF n’a pas été transmis aux esclaves, alors il ne devrait y avoir aucun problème.

Donc, gardez cela à l’esprit lorsque vous essayez de renommer des commandes. Le meilleur moment pour renommer une commande est lorsque vous n’utilisez pas la persistance AOF, ou juste après l’installation, c’est-à-dire avant que votre application utilisant Redis ne soit déployée.

Lorsque vous utilisez AOF et que vous traitez avec une installation maître-esclave, considérez cette réponse de la page des problèmes GitHub du projet. Ce qui suit est une réponse à la question de l’auteur:

Les commandes sont enregistrées dans le AOF et répliquées à l’esclave de la même manière qu’elles sont envoyées, donc si vous essayez de rejouer le AOF sur une instance qui n’a pas le même renommage, vous pourriez faire face à des incohérences car la commande ne peut pas être exécutée (de même pour les esclaves).

Ainsi, la meilleure façon de gérer le renommage dans des cas comme celui-ci est de s’assurer que les commandes renommées sont appliquées à toutes les instances dans les installations maître-esclave.

Conclusion

Dans ce tutoriel, vous avez installé et configuré Redis, validé que votre installation Redis fonctionne correctement, et utilisé ses fonctionnalités de sécurité intégrées pour la rendre moins vulnérable aux attaques d’acteurs malveillants.

Gardez à l’esprit qu’une fois que quelqu’un est connecté à votre serveur, il est très facile de contourner les fonctionnalités de sécurité spécifiques à Redis que nous avons mises en place. Par conséquent, la fonctionnalité de sécurité la plus importante de votre serveur Redis est votre pare-feu (que vous avez configuré si vous avez suivi le tutoriel prérequis Configuration initiale du serveur), car cela rend extrêmement difficile pour les acteurs malveillants de franchir cette barrière.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-22-04