Une version précédente de ce tutoriel a été rédigée par Justin Ellingwood

Introduction

Redis est une base de données de valeurs-clés en mémoire renomée pour sa flexibilité, ses performances et son vaste support linguistique. Ce tutoriel est conçu pour vous apprendre à installer, configurer et sécuriser Redis sur un serveur Ubuntu 20.04.

Conditions préalables

Pour suivre ces instructions, vous aurez besoin d'accéder à un serveur Ubuntu 20.04 doté d'un non-root user avec des privilèges sudo et un pare-feu configuré avec ufw. Vous pouvez configurer ceci en suivant notre Guide de configuration initiale du serveur pour Ubuntu 20.04.

Étape 1 — Installation et configuration de Redis

Nous utiliserons le gestionnaire de packages APT pour installer redis à partir des référentiels Ubuntu officiels. À ce jour, la version disponible dans les référentiels par défaut est 5.0.7.

Commencez par mettre à jour votre cache local de package apt :

  • sudo apt update

Installez ensuite Redis en saisissant ce qui suit :

  • sudo apt install redis-server

Cette opération permettra le téléchargement et l'installation de Redis et de ses dépendances. Suite à cela, vous devez effectuer un changement de configuration important dans le fichier de configuration Redis, qui a été automatiquement généré lors de l'installation.

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

  • sudo nano /etc/redis/redis.conf

Dans le fichier, trouvez la directive supervised. Cette directive vous permet de déclarer un système init qui gérera Redis en tant que service et vous donnera plus de contrôle sur son fonctionnement. La directive supervised est configurée sur no par défaut. Etant donné vous exécutez Ubuntu, qui utilise le système init systemd, remplacez cette valeur par 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

. . .

À ce stade, c'est la seule modification que vous devez apporter au fichier de configuration Redis. Vous pouvez donc le sauvegarder et le fermer une fois l'opération terminée. Si vous avez modifié le fichier avec nano, faites-le en appuyant sur CTRL + X, Y, puis sur ENTER.

Ensuite, redémarrez le service Redis pour valider les modifications que vous avez apportées au fichier de configuration :

  • sudo systemctl restart redis.service

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

Étape 2 — Tester Redis

Comme pour tout logiciel nouvellement installé, il est conseillé de vous assurer que Redis fonctionne comme prévu avant d'apporter d'autres modifications à sa configuration. Au cours de cette étape, nous allons passer en revue plusieurs façons de vérifier que Redis fonctionne correctement.

Commencez par vérifier si le service Redis fonctionne :

  • sudo systemctl status redis

S'il s'exécute sans erreur, cette commande produira un résultat similaire à ce qui suit :

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

Ici, vous pouvez voir que Redis est en cours d'exécution et est déjà activé. Cela signifie qu'il est configuré pour se lancer à chaque fois que le serveur démarre.

Note : ce paramètre est conseillé pour de nombreux cas usuels d'utilisation de Redis. Si, toutefois, vous préférez lancer Redis manuellement à chaque démarrage de votre serveur, vous pouvez le configurer en utilisant la commande suivante :

  • sudo systemctl disable redis

Pour vérifier si Redis fonctionne correctement, connectez-vous au serveur à l'aide de redis-cli, le client de la ligne de commande de Redis:

  • redis-cli

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

  • ping
Output
PONG

Ce résultat confirme que la connexion au serveur est active. Ensuite, vérifiez que vous pouvez configurer des clés en exécutant les commandes suivantes :

  • set test "It's working!"
Output
OK

Récupérez la valeur en saisissant :

  • get test

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

Output
"It's working!"

Après avoir confirmé que la valeur est récupérable, quittez l'invite Redis pour revenir au shell :

  • exit

Nous allons procéder à un dernier test en vérifiant si Redis est capable de conserver les données même après avoir été arrêté ou redémarré. Pour ce faire, redémarrez tout d'abord l'instance Redis :

  • sudo systemctl restart redis

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

  • redis-cli

Puis confirmez que votre valeur de test est encore disponible

  • get test

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

Output
"It's working!"

Une fois que vous avez terminé, sortez pour aller dans le shell :

  • exit

Ainsi, votre installation Redis est entièrement opérationnelle et prête à être utilisée. Cependant, certains de ses paramètres de configuration par défaut ne sont pas sécurisés et donnent la possibilité aux acteurs malveillants d'attaquer et d'accéder à votre serveur et à ses données. Les étapes restantes de ce tutoriel couvrent les méthodes qui vous permettront de minimiser ces vulnérabilités, comme prescrit par le site officiel de Redis. Bien que ces étapes soient facultatives et que Redis fonctionnera malgré tout si vous choisissez de ne pas les suivre, il est fortement recommandé de les respecter afin de renforcer la sécurité de votre système.

Étape 3 - Liaison à localhost

Par défaut, Redis n'est accessible qu'à partir de 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 et ainsi autorisé les connexions depuis n'importe où. Cette méthode n'est pas aussi sûre qu'une liaison à localhost.

Pour y remédier, ouvrez le fichier de configuration Redis pour le modifier :

  • sudo nano /etc/redis/redis.conf

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

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

Une fois que vous avez fini, sauvegardez et fermez le fichier (appuyez sur CTRL + X, Y, puis sur ENTER).

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

  • sudo systemctl restart redis

Pour vérifier si cette modification est bien entrée en vigueur, exécutez la commande netstat suivante :

  • 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

Remarque : il se peut que la commande netstat ne soit pas disponible par défaut sur votre système. Si tel est le cas, vous pouvez l'installer (avec un certain nombre d'autres outils de mise en réseau pratiques) avec la commande suivante :

  • sudo apt install net-tools

Ce résultat montre que le programme redis-server est lié à localhost (127.0.0.1) et reflète le changement que vous venez de faire au fichier de configuration. Si vous voyez une autre adresse IP dans cette colonne (0.0.0.0, par exemple), vérifiez si vous avez bien décommenté la bonne ligne et redémarrez le service Redis à nouveau.

Maintenant que votre installation Redis n'écoute que sur localhost, les acteurs malveillants auront plus de mal à faire des requêtes ou à accéder à votre serveur. Cependant, la configuration actuelle de Redis n'oblige pas les utilisateurs à s'authentifier avant de modifier sa configuration ou aux données qu'il contient. Pour y remédier, Redis vous permet d'exiger que les utilisateurs s'authentifient avec un mot de passe avant de pouvoir apporter des modifications via le client Redis (redis-cli).

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

La configuration d'un mot de passe Redis permet d'activer l'une de ses deux fonctions de sécurité intégrées - la commande auth, qui exige à ce que les clients s'authentifient pour accéder à la base de données. La configuration du mot de passe se fait directement dans le fichier de configuration de Redis, /etc/redis/redis.conf. Donc, ouvrez à nouveau ce fichier avec votre éditeur préféré :

  • sudo nano /etc/redis/redis.conf

Faites défiler l'écran jusqu'à la section SECURITY et recherchez une directive commentée indiquant ce qui 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, vous trouverez une mise en garde commentée :

/etc/redis/redis.conf
. . .
# 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.
#
. . .

Il est donc important que la valeur du mot de passe soit très forte et très longue. Plutôt que de créer vous-même un mot de passe, vous pouvez utiliser la commande openssl qui en générera un au hasard, comme dans l'exemple suivant. En redirigeant le résultat de la première commande vers la deuxième commande openssl, comme illustré ici, cela supprimera tous les sauts de ligne produits par la première commande :

  • openssl rand 60 | openssl base64 -A

Votre résultat devrait ressembler à ce qui suit :

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Après avoir copié et collé le résultat de cette commande comme nouvelle valeur de requirepass, vous devriez avoir :

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

Une fois le mot de passe configuré, enregistrez et fermez le fichier, puis redémarrez Redis :

  • sudo systemctl restart redis.service

Pour vérifier si le mot de passe fonctionne, ouvrez le client Redis :

  • redis-cli

Vous pouvez voir ci-après une séquence de commandes qui permet de tester le bon fonctionnement du mot de passe Redis. La première commande tente de définir une clé sur une valeur avant l'authentification :

  • set key1 10

Cela ne fonctionnera pas car vous ne vous êtes pas authentifié et Redis renvoie donc une erreur :

Output
(error) NOAUTH Authentication required.

La commande suivante procède à l'authentification avec le mot de passe spécifié dans le fichier de configuration de Redis :

  • auth your_redis_password

Redis valide :

Output
OK

Après cela, la ré-exécution de la commande précédente sera probante :

  • set key1 10
Output
OK

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

  • get key1
Output
"10"

Après avoir confirmé que vous étiez en mesure d'exécuter des commandes sur le client Redis suite à l'authentification, vous pouvez quitter ​​redis-cli​​​ :

  • quit

Ensuite, nous allons voir comment renommer les commandes Redis qui, si elles sont entrées par erreur ou par un acteur malveillant, pourraient endommager sérieusement votre allons

Étape 5 - Changement de nom des commandes dangereuses

Redis intègre une autre fonctionnalité de sécurité qui consiste à renommer ou à désactiver complètement certaines commandes considérées comme dangereuses.

Lorsqu'elles sont exécutées par des utilisateurs non autorisés, ces commandes peuvent être utilisées pour reconfigurer, détruire ou effacer vos données. Comme le mot de passe d'authentification, la configuration qui permet de renommer ou désactiver les commandes, se fait dans la même section SECURITY du fichier /etc/redis/redis.conf​​​.

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

Que vous deviez désactiver ou renommer une commande, cela 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 faire l'objet d'un abus, vous pouvez la désactiver. Sinon, il serait peut-être dans votre intérêt de la renommer.

Pour renommer ou désactiver les commandes Redis, rouvrez le fichier de configuration :

  • sudo nano /etc/redis/redis.conf

Attention : les étapes suivantes qui vous montrent de quelle manière désactiver et renommer des commandes sont données à titre d'exemple. Vous devez décider de désactiver ou de 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 de quelle amnière elles peuvent être utilisées à mauvais escient sur redis.io/commands.

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

/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 ""
. . .

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

Sauvegardez vos modifications et fermez le fichier.

Après avoir renommé une commande, appliquez la modification en redémarrant Redis :

  • sudo systemctl restart redis.service

Pour tester la nouvelle commande, saisissez la ligne de commande Redis :

  • redis-cli

Ensuite, authentifiez-vous :

  • auth your_redis_password
Output
OK

Supposons que vous avez renommé la commande CONFIG par ASC12_CONFIG, comme dans l'exemple précédent. Tout d'abord, essayez d'utiliser la commande originale CONFIG. L'opération devrait échouer, car vous l'avez renommée :

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

Toutefois, en saisissant la commande renommée, cela devrait fonctionner. Elle n'est pas sensible à la casse :

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

Enfin, vous pouvez quitter redis-cli​​

  • exit

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

Output
NOAUTH Authentication required.

Concernant la pratique de renommer les commandes, une mise en garde se trouve à la fin de la section SECURITY dans /etc/redis/redis.conf qui indique ce qui suit :

/etc/redis/redis.conf
. . .
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.
. . .

Note: 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 ici les termes utilisés dans la documentation Redis.

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, il ne devrait pas y avoir de 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 le déploiement de votre application utilisant Redis.

Lorsque vous utilisez AOF et que vous traitez une installation maître-esclave, prenez en considération cette réponse qui provient de la page de problème GitHub du projet. Voici une réponse à la question de l'auteur :

Les commandes sont journalisées sur l'AOF et répliquées sur l'esclave de la même manière qu'elles sont envoyées. Donc si vous essayez de rejouer l'AOF sur une instance qui n'est pas renommée de la même manière, vous risquez de rencontrer des incohérences car la commande ne peut pas être exécutée (idem pour les esclaves).

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

Conclusion

Dans ce didacticiel, vous avez installé et configuré Redis, vérifié que votre installation Redis fonctionne correctement et utilisé ses fonctionnalités de sécurité intégrées pour le rendre moins vulnérable aux attaques d'acteurs malveillants.

Gardez à l'esprit qu'une fois qu'une personne est connectée à 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 reste votre pare-feu (que vous avez configuré si vous avez suivi le tutoriel Configuration initiale du serveur) qui rend extrêmement difficile pour les acteurs malveillants de franchir cette barrière.

0 Comments

Creative Commons License