Comment sécuriser votre installation Redis sur Ubuntu 18.04

introduction

Redis est un cache en mémoire, NoSQL, une mémoire clé-valeur et un magasin qui peuvent également être conservés sur le disque. Il a été conçu pour être utilisé partrusted clients dans untrusted environment, sans aucune fonctionnalité de sécurité robuste. Pour souligner ce point, voici une citation desofficial Redis website:

Redis est conçu pour être accessible aux clients sécurisés dans des environnements sécurisés. Cela signifie qu'habituellement, ce n'est pas une bonne idée d'exposer l'instance Redis directement à Internet ou, en général, à un environnement dans lequel les clients non approuvés peuvent accéder directement au port TCP ou au socket UNIX de Redis.

En général, Redis n’est pas optimisé pour une sécurité maximale, mais pour des performances optimales et une grande simplicité.

Malgré cela, Redis possède quelques fonctionnalités de sécurité de base intégrées. Celles-ci incluent la possibilité de créer un mot de passe non chiffré et la liberté de renommer et de désactiver les commandes. Il manque notamment un véritable système de contrôle d'accès.

Ces fonctionnalités ne peuvent à elles seules garantir la sécurité de votre installation Redis. Cependant, leur configuration est encore un grand pas en avant en laissant votre base de données complètement non sécurisée.

Dans ce didacticiel, vous apprendrez à configurer les quelques fonctionnalités de sécurité dont dispose Redis et à apporter quelques modifications à la configuration de votre système, afin d’améliorer la sécurité d’une installation Redis autonome sur un serveur Ubuntu.

Notez que ce guide ne traite pas des situations dans lesquelles le serveur Redis et les applications clientes se trouvent sur des hôtes ou des centres de données différents. Les installations où le trafic Redis doit traverser un réseau non sécurisé ou non approuvé nécessitent un ensemble de configurations entièrement différent, comme la configuration d'un proxy SSL ou d'unVPN entre les machines Redis, en plus de celles données ici.

Conditions préalables

Pour ce tutoriel, vous aurez besoin de:

[[step-1 -—- verifying-that-redis-is-running]] == Étape 1 - Vérifier que Redis est en cours d'exécution

Commencez par SSH sur votre serveur avec votre utilisateur non root.

Pour vérifier que Redis fonctionne, ouvrez une ligne de commande Redis avec la commanderedis-cli:

redis-cli

[.Remarque]##

Note: Si vous avez déjà défini un mot de passe pour Redis, vous devez vous authentifier avec la commandeauth après la connexion:

auth your_redis_password
OutputOK

Si vous n'avez pas défini de mot de passe pour Redis, vous pouvez lire comment le faire à l'étape 4 de ce didacticiel.

Testez la connexion avec la commandeping:

ping

Si Redis fonctionne correctement, vous verrez ce qui suit:

OutputPONG

Ensuite, quittez la ligne de commande Redis:

quit

Maintenant que vous avez vérifié que Redis fonctionne et fonctionne correctement, passez à l’étape la plus importante pour l’amélioration de la sécurité de votre serveur: la configuration d’un pare-feu.

[[step-2 -—- secure-the-server-with-ufw]] == Étape 2 - Sécurisation du serveur avec UFW

Redis est simplement une application en cours d’exécution sur votre serveur. Comme il ne possède que quelques fonctionnalités de sécurité fondamentales, la première étape pour le sécuriser consiste à sécuriser le serveur sur lequel il est exécuté. Dans le cas d'un serveur public comme votre serveur Ubuntu 18.04, la configuration d'un pare-feu comme décrit dans lesInitial Server Setup Guide for Ubuntu 18.04 est cette première étape. Follow that link and set up your firewall now if you haven’t already done so.

Si vous ne savez pas si vous avez configuré un pare-feu ou s'il est actif, vous pouvez le vérifier en exécutant les opérations suivantes:

sudo ufw status

Si vous avez suivi le Guide de configuration initiale du serveur pour Ubuntu 18.04, vous verrez la sortie suivante:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Si vous avez implémenté les règles de pare-feu à l'aide de ce guide, vous n'avez pas besoin d'ajouter de règle supplémentaire pour Redis car, par défaut, UFW supprime tout le trafic entrant, sauf autorisation expresse de celui-ci. Puisqu'une installation autonome par défaut du serveur Redis écoute uniquement sur l'interface de bouclage (127.0.0.1 oulocalhost), il ne devrait y avoir aucun problème pour le trafic entrant sur son port par défaut.

Pour plus d'informations sur l'ajout de règles, veuillez consulter ceguide on common UFW rules and commands.

[[step-3 -—- binding-to-localhost]] == Étape 3 - Liaison à localhost

Par défaut, Redis n'est accessible qu'à partir delocalhost. Toutefois, si vous avez suivi un didacticiel différent pour configurer Redis par rapport à celui indiqué dans la section des conditions préalables, vous avez peut-être mis à jour le fichier de configuration pour autoriser les connexions à partir de n'importe où. Ce n'est pas aussi sûr que la liaison àlocalhost.

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 les# s'il existe):

/etc/redis/redis.conf

bind 127.0.0.1

Enregistrez et fermez le fichier lorsque vous avez terminé (appuyez surCTRL + X,Y, puisENTER).

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

sudo systemctl restart redis

Pour vérifier que cette modification est entrée en vigueur, exécutez la commandenetstat suivante:

sudo netstat -lnp | grep redis
Outputtcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      2855/redis-server 1

Cette sortie montre que le programmeredis-server est lié àlocalhost (127.0.0.1), reflétant la modification que vous venez d'apporter au fichier de configuration. Si vous voyez une autre adresse IP dans cette colonne (0.0.0.0, par exemple), vous devez vérifier que vous avez décommenté la ligne correcte et redémarrer le service Redis.

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

[[step-4 -—- configuring-a-redis-password]] == Étape 4 - Configuration d'un mot de passe Redis

La configuration d'un mot de passe Redis active l'une de ses deux fonctions de sécurité intégrées - la commandeauth, qui oblige les clients à 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, alors ouvrez à nouveau ce fichier avec votre éditeur préféré:

sudo nano /etc/redis/redis.conf

Faites défiler jusqu'à la sectionSECURITY et recherchez une directive commentée qui lit:

/etc/redis/redis.conf

# requirepass foobared

Décommentez-le en supprimant les# et remplacezfoobared par un mot de passe sécurisé.

[.Remarque]##

Note: Au-dessus de la directiverequirepass dans le fichierredis.conf, il y a un avertissement commenté:

/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 de spécifier 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 commandeopenssl pour en générer un au hasard, comme dans l'exemple suivant. Le tube vers la deuxième commandeopenssl supprimera tous les sauts de ligne générés par la première commande:

openssl rand 60 | openssl base64 -A

Votre sortie devrait ressembler à quelque chose comme:

OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Après avoir copié et collé la sortie de cette commande en tant que nouvelle valeur pourrequirepass, elle devrait lire:

/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

sudo systemctl restart redis.service

Pour vérifier que le mot de passe fonctionne, accédez à la ligne de commande Redis:

redis-cli

Ce qui suit montre une séquence de commandes permettant de vérifier si le mot de passe Redis fonctionne. 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é, 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 Redis:

auth your_redis_password

Redis reconnaît:

OutputOK

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

set key1 10
OutputOK

get key1 demande à Redis la valeur de la nouvelle clé.

get key1
Output"10"

Après avoir confirmé que vous êtes en mesure d'exécuter des commandes dans le client Redis après l'authentification, vous pouvez quitter lesredis-cli:

quit

Nous verrons ensuite comment renommer les commandes Redis qui, si elles étaient entrées par erreur ou par un acteur malveillant, pourraient sérieusement endommager votre ordinateur.

[[step-5 -—- renaming-dangerous-commands]] == Étape 5 - Renommer les commandes dangereuses

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

Lorsqu'elles sont exécutées par erreur ou 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, le changement de nom ou la désactivation des commandes est configuré dans la même sectionSECURITY 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 etDEBUG. 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 susceptible d'être utilisée de manière abusive, vous pouvez la désactiver. Sinon, il serait dans votre intérêt de le renommer.

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

sudo nano  /etc/redis/redis.conf

[.warning] #Warning: Les étapes suivantes montrant comment désactiver et renommer des commandes sont des exemples. Vous ne devez choisir de désactiver ou de renommer que les commandes qui vous conviennent. Vous pouvez consulter la liste complète des commandes par vous-même et déterminer comment elles pourraient être mal utilisées àredis.io/commands.
#

Pour désactiver une commande, renommez-la simplement en une chaîne vide (indiquée par une paire de guillemets sans autre caractère), comme indiqué 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, attribuez-lui un autre nom, comme indiqué dans les exemples ci-dessous. Les commandes renommées devraient être difficiles à deviner, mais faciles à retenir:

/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 la modification en redémarrant Redis:

sudo systemctl restart redis.service

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

redis-cli

Ensuite, authentifiez-vous:

auth your_redis_password
OutputOK

Supposons que vous ayez renommé la commandeCONFIG enASC12_CONFIG, comme dans l'exemple précédent. Tout d'abord, essayez d'utiliser la commande d'origineCONFIG. Il devrait échouer car vous l'avez renommé:

config get requirepass
Output(error) ERR unknown command 'config'

L'appel de la commande renommée, cependant, réussira. Ce n'est pas sensible à la casse:

asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"

Enfin, vous pouvez quitterredis-cli:

exit

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

OutputNOAUTH Authentication required.

[.Attention]##

En ce qui concerne la pratique de renommer les commandes, il y a une mise en garde à la fin de la sectionSECURITY dans/etc/redis/redis.conf qui se lit comme suit:

Please note that changing the name of commands that are logged into the AOF file or transmitted to slaves may cause problems.

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». Afin d'é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 ne se trouve 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 gérez une installation maître-esclave, pensez àthis answer from the project’s GitHub issue page. 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'a pas le même renommage, vous pouvez rencontrer des incohérences car la commande ne peut pas être exécutée ( idem pour les esclaves).

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

Conclusion

N'oubliez pas 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 est votre pare-feu, ce qui rend extrêmement difficile pour les acteurs malveillants de sauter cette clôture.

Si vous essayez de sécuriser la communication Redis sur un réseau non approuvé, vous devrez utiliser un proxy SSL, comme recommandé par les développeurs Redis dans lesofficial Redis security guide.