Comment installer et sécuriser Redis sur Rocky Linux 8

Introduction

Redis est une base de données open-source en mémoire, de type clé-valeur, qui excelle dans la mise en cache. Redis est une base de données non relationnelle reconnue pour sa flexibilité, ses performances, sa scalabilité et son large support linguistique.

Redis a été conçu pour être utilisé par des clients de confiance dans un environnement de confiance et ne dispose pas de fonctionnalités de sécurité robustes. Cependant, Redis dispose de quelques fonctionnalités de sécurité telles que l’authentification par mot de passe et la possibilité de renommer ou désactiver certaines commandes. Ce tutoriel fournit des instructions sur l’installation de Redis et la configuration de ces fonctionnalités de sécurité. Il couvre également quelques autres paramètres qui peuvent renforcer la sécurité d’une installation Redis autonome sur Rocky Linux 8.

Remarquez que ce guide ne traite pas des situations où le serveur Redis et les applications clientes sont sur des hôtes différents ou dans des centres de données différents. Les installations où le trafic Redis doit traverser un réseau non sécurisé ou non fiable nécessiteront un ensemble différent de configurations, telles que la mise en place d’un proxy SSL ou d’un VPN entre les machines Redis.

Vous pouvez également utiliser le service Redis géré de DigitalOcean.

Prérequis

Pour terminer ce tutoriel, vous aurez besoin d’un serveur exécutant Rocky Linux 8. Ce serveur devrait avoir un utilisateur non root avec des privilèges administratifs et un pare-feu configuré avec firewalld. Pour configurer cela, suivez notre guide Configuration initiale du serveur pour Rocky Linux 8.

Étape 1 — Installation et démarrage de Redis

Vous pouvez installer Redis avec le gestionnaire de paquets DNF. En utilisant DNF, vous pouvez installer Redis, ses dépendances, et nano, un éditeur de texte convivial. Vous n’êtes pas obligé d’installer nano, mais nous l’utiliserons dans des exemples tout au long de ce guide:

  1. sudo dnf install redis nano

Cette commande vous demandera de confirmer que vous souhaitez installer les paquets sélectionnés. Appuyez sur y puis sur ENTRÉE pour le faire:

Output
. . . Total download size: 1.5 M Installed size: 5.4 M Is this ok [y/N]: y

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é. Ici, nous utiliserons nano:

  1. sudo nano /etc/redis.conf

À l’intérieur du fichier, trouvez 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 Rocky Linux, qui utilise le système d’initialisation systemd, modifiez ceci en systemd:

/etc/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 basée sur
#                        les 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 les vérifications continues de disponibilité vers votre superviseur.
supervised systemd

. . .

C’est le seul changement que vous devez apporter au fichier de configuration Redis à ce stade, alors enregistrez et fermez-le lorsque vous avez terminé. Si vous avez utilisé nano pour éditer le fichier, enregistrez et quittez avec CTRL + X, puis lorsque vous êtes invité, appuyez sur Y et ensuite sur Entrée.

Après avoir modifié le fichier, démarrez le service Redis :

  1. sudo systemctl start redis.service

Si vous souhaitez que Redis démarre au démarrage, vous pouvez l’activer avec la commande enable:

  1. sudo systemctl enable redis

Remarquez que cette commande n’inclut pas le suffixe .service après le nom du fichier d’unité. Vous pouvez généralement laisser ce suffixe de côté dans les commandes systemctl, car il peut être analysé automatiquement à partir des noms de service.

Vous pouvez vérifier le statut de Redis en exécutant ce qui suit :

  1. sudo systemctl status redis
Output
● redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since Tue 2022-09-06 22:11:52 UTC; 40s ago Main PID: 14478 (redis-server) Tasks: 4 (limit: 11152) Memory: 6.6M CGroup: /system.slice/redis.service └─14478 /usr/bin/redis-server 127.0.0.1:6379

Une fois que vous avez confirmé que Redis fonctionne bien, vous pouvez tester sa fonctionnalité avec cette commande :

  1. redis-cli ping

Cela devrait afficher PONG en réponse :

Output
PONG

Si c’est le cas, cela signifie que Redis fonctionne maintenant sur votre serveur et vous pouvez commencer à le configurer pour améliorer sa sécurité.

Étape 2 — Configuration de Redis et sécurisation avec un pare-feu

Une façon efficace de protéger Redis est de sécuriser le serveur sur lequel il fonctionne. Vous pouvez le faire en vous assurant que Redis est lié uniquement à localhost ou à une adresse IP privée et également que le serveur dispose d’un pare-feu activé et opérationnel.

Cependant, si vous avez choisi de configurer Redis en suivant un autre tutoriel, 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 la liaison à localhost ou à une adresse IP privée.

Pour remédier à cela, ouvrez à nouveau le fichier de configuration Redis avec votre éditeur de texte préféré :

  1. sudo nano /etc/redis.conf

Localisez la ligne commençant par bind et assurez-vous qu’elle n’est pas commentée ou désactivée, en supprimant le # au début de la ligne si nécessaire:

/etc/redis.conf
. . .
bind 127.0.0.1

Si vous devez lier Redis à une autre adresse IP (comme dans les cas où vous accéderez à Redis à partir d’un hôte séparé), vous devriez sérieusement envisager de le lier à une adresse IP privée. Lier à une adresse IP publique augmente l’exposition de votre interface Redis aux parties externes:

/etc/redis.conf
. . .
bind your_private_ip

Après avoir confirmé que la directive bind n’est pas commentée, vous pouvez enregistrer et fermer le fichier.

Si vous avez suivi le tutoriel de configuration initiale du serveur préalable et installé firewalld sur votre serveur, et que vous ne prévoyez pas de vous connecter à Redis à partir d’un autre hôte, alors vous n’avez pas besoin d’ajouter de règles de pare-feu supplémentaires pour Redis. Après tout, tout le trafic entrant sera par défaut refusé sauf s’il est explicitement autorisé par les règles du pare-feu. Étant donné qu’une installation autonome par défaut du serveur Redis écoute uniquement sur l’interface de bouclage (127.0.0.1 ou localhost), il ne devrait y avoir aucune préoccupation pour le trafic entrant sur son port par défaut.

Cependant, si vous prévoyez d’accéder à Redis à partir d’un autre hôte, vous devrez apporter quelques modifications à la configuration de votre firewalld en utilisant la commande firewall-cmd. Encore une fois, vous ne devriez autoriser l’accès à votre serveur Redis qu’à partir de vos hôtes en utilisant leurs adresses IP privées afin de limiter le nombre d’hôtes exposés à votre service.

Pour commencer, ajoutez une zone Redis dédiée à votre politique firewalld:

  1. sudo firewall-cmd --permanent --new-zone=redis

Ensuite, spécifiez le port que vous souhaitez ouvrir. Redis utilise le port 6379 par défaut :

  1. sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp

Ensuite, spécifiez les adresses IP privées autorisées à traverser le pare-feu et à accéder à Redis :

  1. sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP

Après avoir exécuté ces commandes, rechargez le pare-feu pour mettre en œuvre les nouvelles règles :

  1. sudo firewall-cmd --reload

Sous cette configuration, lorsque le pare-feu rencontre un paquet provenant de l’adresse IP de votre client, il appliquera les règles de la zone Redis dédiée à cette connexion. Toutes les autres connexions seront traitées par la zone par défaut public. Les services dans la zone par défaut s’appliquent à chaque connexion, pas seulement à celles qui ne correspondent pas explicitement, vous n’avez donc pas besoin d’ajouter d’autres services (par exemple, SSH) à la zone Redis, car ces règles seront appliquées automatiquement à cette connexion.

Gardez à l’esprit que l’utilisation de n’importe quel outil de pare-feu fonctionnera, que vous utilisiez firewalld, ufw ou iptables. L’important est que le pare-feu soit opérationnel afin que des individus inconnus ne puissent pas accéder à votre serveur. À l’étape suivante, vous configurerez Redis pour n’être accessible qu’avec un mot de passe fort.

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

Configurer un mot de passe Redis active l’une de ses fonctionnalités de sécurité intégrées – la commande auth – qui nécessite que les clients s’authentifient avant d’être autorisés à accéder à la base de données. Comme le paramètre bind, le mot de passe est configuré directement dans le fichier de configuration de Redis, /etc/redis.conf. Ouvrez ce fichier :

  1. sudo nano /etc/redis.conf

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

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

Décommentez-la en supprimant le #, et changez foobared par un mot de passe très fort de votre choix.

Remarque : Au lieu d’inventer un mot de passe vous-même, vous pouvez utiliser un outil comme apg ou pwgen pour en générer un. Si vous ne souhaitez pas installer une application juste pour générer un mot de passe, vous pouvez utiliser la commande ci-dessous. Cette commande renvoie une valeur de chaîne et la passe en entrée de la commande sha256sum suivante, qui affichera la somme de contrôle SHA256 de la chaîne.

Sachez que l’entrée de cette commande telle qu’elle est écrite générera le même mot de passe à chaque fois. Pour créer un mot de passe unique, changez la chaîne entre guillemets par n’importe quel autre mot ou phrase :

  1. echo "digital-ocean" | sha256sum

Bien que le mot de passe généré ne soit pas mémorisable, il sera très fort et long, ce qui correspond exactement au type de mot de passe requis pour Redis. Après avoir copié et collé la sortie de cette commande en tant que nouvelle valeur pour requirepass, elle devrait se lire comme suit :

/etc/redis.conf
. . .
requirepass password_copied_from_output

Alternativement, si vous préférez un mot de passe plus court, vous pouvez utiliser la sortie d’une somme de contrôle différente. Encore une fois, changez le mot entre guillemets pour qu’il ne génère pas le même mot de passe que cette commande :

  1. echo "digital-ocean" | sha1sum

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

  1. sudo systemctl restart redis

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

  1. redis-cli

Voici une séquence de commandes utilisées pour 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 :

  1. set key1 10

Cela ne fonctionnera pas car vous n’avez pas encore é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 Redis :

  1. auth your_redis_password

Redis reconnaîtra que vous avez été authentifié :

Output
OK

Après cela, réexécuter la commande précédente devrait réussir :

  1. set key1 10
Output
OK

La commande get key1 interroge Redis pour la valeur de la nouvelle clé :

  1. get key1
Output
"10"

Cette dernière commande quitte redis-cli. Vous pouvez également utiliser exit :

  1. quit

Il devrait maintenant être très difficile pour les utilisateurs non autorisés d’accéder à votre installation Redis. Notez que si vous utilisez déjà le client de ligne de commande Redis et que vous redémarrez ensuite Redis, vous devrez vous réauthentifier. De plus, notez qu’en l’absence de SSL ou d’un VPN, ce mot de passe peut toujours être intercepté par des tiers si vous vous connectez à Redis à distance.

Ensuite, ce guide abordera le renommage des commandes Redis pour protéger davantage Redis des acteurs malveillants.

Étape 4 — Renommer les commandes dangereuses

Une autre fonctionnalité de sécurité intégrée à Redis vous permet 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, ces commandes peuvent être utilisées pour reconfigurer, détruire ou effacer vos données. Certaines des commandes considérées comme dangereuses incluent :

  • FLUSHDB
  • FLUSHALL
  • KEYS
  • PEXPIRE
  • DEL
  • CONFIG
  • SHUTDOWN
  • BGREWRITEAOF
  • BGSAVE
  • SAVE
  • SPOP
  • SREM
  • RENAME
  • DEBUG

Il ne s’agit pas d’une liste exhaustive, mais renommer ou désactiver toutes les commandes de cette liste peut aider à améliorer la sécurité de votre magasin de données. Que vous deviez désactiver ou renommer une commande donnée dépendra de vos besoins spécifiques. Si vous savez que vous n’utiliserez jamais une commande qui peut être abusée, vous pouvez la désactiver. Sinon, vous devriez la renommer à la place.

Tout comme le mot de passe d’authentification, le renommage ou la désactivation des commandes est configuré dans la section SECURITY du fichier /etc/redis.conf. Pour activer ou désactiver les commandes Redis, ouvrez à nouveau le fichier de configuration pour l’éditer :

  1. sudo nano /etc/redis.conf

NOTE: Ce ne sont que des exemples. Vous devriez choisir de désactiver ou de renommer les commandes qui ont du sens pour vous. Vous pouvez en apprendre davantage sur les commandes Redis et déterminer comment elles pourraient être mal utilisées sur redis.io/commands.

Pour désactiver ou supprimer une commande, renommez-la en une chaîne vide, comme ceci :

/etc/redis.conf
# Il est également possible de complètement supprimer 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 dans les exemples ci-dessous. Les commandes renommées doivent être difficiles à deviner pour les autres, mais faciles à retenir pour vous :

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

Sauvegardez vos modifications et fermez le fichier. Ensuite, appliquez les modifications en redémarrant Redis :

  1. sudo systemctl restart redis.service

Pour tester vos nouvelles commandes, entrez dans la ligne de commande Redis :

  1. redis-cli

Authentifiez-vous en utilisant le mot de passe que vous avez défini précédemment :

  1. auth your_redis_password
Output
OK

En supposant que vous avez renommé la commande CONFIG en ASC12_CONFIG, tenter d’utiliser la commande config échouera :

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

Appeler la commande renommée sera par contre réussi. Notez que les commandes Redis ne sont pas sensibles à la casse :

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

Enfin, vous pouvez quitter redis-cli :

  1. exit

Avertissement: En ce qui concerne le renommage des commandes, il y a une déclaration de prudence à la fin de la section SECURITY dans le fichier /etc/redis.conf, qui se lit :

/etc/redis.conf
. . .

# Veuillez noter que le changement du nom des commandes qui sont enregistrées dans le fichier
# AOF ou transmises à des répliques peut causer des problèmes.

. . .

Cela signifie que si la commande renommée n’est pas dans le fichier AOF, ou si elle y est mais que le fichier AOF n’a pas été transmis aux répliques, alors il ne devrait pas y avoir de problème. Gardez cela à l’esprit lorsque vous renommez 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 n’ait été déployée).

Étape 5 — Définition de la propriété du répertoire de données et des permissions de fichiers

Cette étape passera en revue quelques modifications de propriété et de permissions que vous devrez peut-être faire pour améliorer le profil de sécurité de votre installation Redis. Cela implique de s’assurer que seul l’utilisateur qui a besoin d’accéder à Redis a la permission de lire ses données. Cet utilisateur est, par défaut, l’utilisateur redis.

Vous pouvez vérifier cela en utilisant grep pour le répertoire de données Redis dans une liste longue de son répertoire parent. Cette commande et sa sortie sont données ci-dessous :

  1. ls -l /var/lib | grep redis
Output
drwxr-x---. 2 redis redis 22 Sep 6 22:22 redis

Cette sortie indique que le répertoire de données Redis est détenu par l’utilisateur redis, avec un accès secondaire accordé au groupe redis. Ce paramétrage de propriété est sécurisé tout comme les autorisations du dossier, qui, en utilisant la notation octale, sont définies à 750.

Si les autorisations du répertoire de données Redis sont peu sécurisées, vous pouvez vous assurer que seul l’utilisateur et le groupe Redis ont accès au dossier et à son contenu en exécutant la commande chmod. L’exemple suivant modifie les autorisations de ce dossier pour les régler à 770:

  1. sudo chmod 770 /var/lib/redis

L’autre autorisation que vous pouvez avoir besoin de modifier est celle du fichier de configuration Redis. Par défaut, il a une autorisation de fichier de 640 et est détenu par root, avec une propriété secondaire par le groupe root:

  1. ls -l /etc/redis.conf
Output
-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis.conf

Cette autorisation (640) signifie que le fichier de configuration Redis n’est lisible que par l’utilisateur redis et le groupe root. Comme le fichier de configuration contient le mot de passe non crypté que vous avez configuré à l’étape 4, redis.conf doit être détenu par l’utilisateur redis, avec une propriété secondaire par le groupe redis. Pour le faire, exécutez la commande suivante:

  1. sudo chown redis:redis /etc/redis.conf

Ensuite, changez les autorisations afin que seul le propriétaire du fichier puisse le lire et écrire:

  1. sudo chmod 600 /etc/redis.conf

Vous pouvez vérifier la nouvelle propriété et les autorisations en exécutant à nouveau les commandes ls précédentes:

  1. ls -l /var/lib | grep redis
Output
total 40 drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
  1. ls -l /etc/redis.conf
Output
total 40 -rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf

Enfin, redémarrez Redis pour refléter ces changements:

  1. sudo systemctl restart redis

Avec cela, votre installation Redis est sécurisée.

Conclusion

Gardez à l’esprit que dès qu’une personne est connectée à votre serveur, il est possible de contourner les fonctionnalités de sécurité spécifiques à Redis que vous avez mises en place. C’est pourquoi la fonctionnalité de sécurité la plus importante abordée dans ce tutoriel est le pare-feu, car il empêche les utilisateurs inconnus de se connecter à votre serveur en premier lieu.

Si vous essayez de sécuriser la communication Redis à travers un réseau non fiable, vous devrez utiliser un proxy SSL, comme le recommandent les développeurs Redis dans le guide de sécurité officiel de Redis.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-rocky-linux-8