Comment installer et sécuriser Redis sur CentOS 8
- Introduction
Redis est un magasin de données clé-valeur open source en mémoire qui excelle dans la mise en cache. Base de données non relationnelle, Redis est connue pour sa flexibilité, ses performances, son évolutivité et sa large prise en charge linguistique.
Redis a été conçu pour être utilisé par des clients de confiance dans un environnement de confiance et ne possède pas de fonctionnalités de sécurité robustes. Cependant, Redis dispose de quelques fonctionnalités de sécurité comme un mot de passe de base non chiffré ainsi que le renommage et la désactivation des commandes. Ce didacticiel 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 CentOS 8.
Notez que ce guide ne traite pas des situations où le serveur Redis et les applications clientes se trouvent 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 approuvé nécessiteront un ensemble différent de configurations, telles que la configuration d'un proxy SSL ou d'un VPN entre les machines Redis.
- Conditions préalables
Pour terminer ce didacticiel, vous aurez besoin d'un serveur exécutant CentOS 8. Ce serveur doit avoir un utilisateur non root avec des privilèges administratifs et un pare-feu configuré avec firewalld
. Pour le configurer, suivez notre Guide de configuration initiale du serveur pour CentOS 8.
- Étape 1 — Installation et démarrage de Redis
Vous pouvez installer Redis avec le gestionnaire de packages DNF. La commande suivante installera 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 :
sudo dnf install redis nano
Cette commande vous demandera de confirmer que vous souhaitez installer les packages sélectionnés. Appuyez sur y
puis ENTER
pour cela :
Output. . . Total download size: 1.5 M Installed size: 5.4 M Is this ok [y/N]: y
Suite à cela, il y a un changement de configuration important à faire 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
:
sudo nano /etc/redis/redis.conf
Dans le fichier, recherchez la directive supervised
. Cette directive vous permet de déclarer un système init pour gérer Redis en tant que service, vous offrant ainsi plus de contrôle sur son fonctionnement. La directive supervised
est définie sur no
par défaut. Puisque vous exécutez CentOS, qui utilise le système d'initialisation systemd, remplacez-le 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 . . .
C'est la seule modification 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 éditer le fichier, faites-le en appuyant sur CTRL + X
, Y
, puis ENTER
.
Après avoir modifié le fichier, démarrez le service Redis :
sudo systemctl start redis.service
Si vous souhaitez que Redis démarre au démarrage, vous pouvez l'activer avec la commande enable
:
sudo systemctl enable redis
Notez 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 hors des commandes systemctl
, car il est généralement implicite lors de l'interaction avec systemd.
Vous pouvez vérifier l'état de Redis en exécutant ce qui suit :
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 Wed 2020-09-30 20:05:24 UTC; 13s ago Main PID: 13734 (redis-server) Tasks: 4 (limit: 11489) Memory: 6.6M CGroup: /system.slice/redis.service └─13734 /usr/bin/redis-server 127.0.0.1:6379
Une fois que vous avez confirmé que Redis est bien en cours d'exécution, vous pouvez tester sa fonctionnalité avec cette commande :
redis-cli ping
Cela devrait imprimer PONG
comme réponse :
OutputPONG
Si tel est le cas, cela signifie que vous avez maintenant Redis en cours d'exécution sur votre serveur et que vous pouvez commencer à le configurer pour améliorer sa sécurité.
Étape 2 - Configurer Redis et le sécuriser avec un pare-feu
Un moyen efficace de protéger Redis consiste à sécuriser le serveur sur lequel il s'exécute. Vous pouvez le faire en vous assurant que Redis est lié uniquement à l'hôte local ou à une adresse IP privée et également que le serveur dispose d'un pare-feu opérationnel.
Cependant, si vous avez choisi de configurer Redis à l'aide d'un autre didacticiel, vous avez peut-être mis à jour le fichier de configuration pour autoriser les connexions depuis n'importe où. Ce n'est pas aussi sûr que la liaison à localhost ou à une adresse IP privée.
Pour y remédier, ouvrez à nouveau le fichier de configuration Redis avec votre éditeur de texte préféré :
sudo nano /etc/redis.conf
Localisez la ligne commençant par bind
et assurez-vous qu'elle n'est pas commentée :
/etc/redis.conf
. . . bind 127.0.0.1
Si vous avez besoin de lier Redis à une autre adresse IP (comme dans les cas où vous accéderez à Redis à partir d'un hôte distinct), nous fortement vous encourageons à le lier à une adresse IP privée. La liaison à une adresse IP publique augmente l'exposition de votre interface Redis aux tiers :
/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 didacticiel de configuration initiale du serveur préalable et que a installé un pare-feu sur votre serveur , et que vous ne prévoyez pas de vous connecter à Redis à partir d'un autre hôte, vous n'avez pas besoin d'ajouter de règles de pare-feu supplémentaires pour Redis. . Après tout, tout trafic entrant sera supprimé par défaut, sauf autorisation explicite des règles de 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 pas y avoir de souci pour le trafic entrant sur son port par défaut.
Si, toutefois, vous prévoyez d'accéder à Redis depuis un autre hôte, vous devrez apporter quelques modifications à la configuration de votre pare-feu à l'aide de la commande firewall-cmd
. Encore une fois, vous ne devez 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 auxquels votre service est exposé.
Pour commencer, ajoutez une zone Redis dédiée à votre politique de pare-feu :
sudo firewall-cmd --permanent --new-zone=redis
Spécifiez ensuite le port que vous souhaitez ouvrir. Redis utilise le port 6379
par défaut :
sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp
Ensuite, spécifiez toutes les adresses IP privées qui doivent être autorisées à traverser le pare-feu et à accéder à Redis :
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 :
sudo firewall-cmd --reload
Dans cette configuration, lorsque le pare-feu rencontre un paquet provenant de l'adresse IP de votre client, il applique les règles de la zone Redis dédiée à cette connexion. Toutes les autres connexions seront traitées par la zone public
par défaut. Les services de la zone par défaut s'appliquent à toutes les connexions, 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 automatiquement appliquées à cette connexion.
N'oubliez pas que l'utilisation de n'importe quel outil de pare-feu fonctionnera, que vous utilisiez firewalld
, ufw
ou iptables
. Ce qui est important, c'est que le pare-feu soit opérationnel afin que des inconnus ne puissent pas accéder à votre serveur. À l'étape suivante, vous configurerez Redis pour qu'il ne soit accessible qu'avec un mot de passe fort.
- Étape 3 - Configuration d'un mot de passe Redis
La configuration d'un mot de passe Redis active l'une de ses fonctions de sécurité intégrées - la commande auth
- qui oblige les clients à s'authentifier 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
. Rouvrez ce fichier :
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-le en supprimant le #
et remplacez foobared
par un mot de passe très fort de votre choix.
Remarque : Plutôt que de créer 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 uniquement 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 dirige vers la commande sha256sum
suivante, qui affichera la somme de contrôle SHA256 de la chaîne.
Sachez que la saisie 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, remplacez la chaîne entre guillemets par tout autre mot ou expression :
echo "digital-ocean" | sha256sum
Bien que le mot de passe généré ne soit pas prononçable, il sera très fort et long, ce qui est exactement le 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 indiquer :
/etc/redis.conf
. . . requirepass password_copied_from_output
Alternativement, si vous préférez un mot de passe plus court, vous pouvez utiliser à la place la sortie de la commande suivante. Encore une fois, changez le mot entre guillemets afin qu'il ne génère pas le même mot de passe que cette commande :
echo "digital-ocean" | sha1sum
Après avoir défini le mot de passe, enregistrez et fermez le fichier puis redémarrez Redis :
sudo systemctl restart redis
Pour tester que le mot de passe fonctionne, ouvrez le client Redis :
redis-cli
Voici 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 :
set key1 10
Cela ne fonctionnera pas car vous ne vous êtes pas encore 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îtra que vous avez été authentifié :
OutputOK
Après cela, réexécuter la commande précédente devrait réussir :
set key1 10
OutputOK
La commande get key1
demande à Redis la valeur de la nouvelle clé :
get key1
Output"10"
Cette dernière commande quitte redis-cli
. Vous pouvez également utiliser exit
:
quit
Il devrait maintenant être très difficile pour les utilisateurs non autorisés d'accéder à votre installation Redis. Sachez que si vous utilisez déjà le client Redis, puis redémarrez Redis, vous devrez vous authentifier à nouveau. Veuillez également noter que sans SSL ou VPN, le mot de passe non crypté sera toujours visible pour les tiers si vous vous connectez à Redis à distance.
Ensuite, ce guide passera en revue le changement de nom des commandes Redis pour mieux protéger Redis des acteurs malveillants.
Étape 4 - Renommer les commandes dangereuses
L'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
Cette liste n'est pas exhaustive, mais renommer ou désactiver toutes les commandes de cette liste peut contribuer à 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 susceptible d'être utilisée de manière abusive, vous pouvez la désactiver. Sinon, vous devriez le renommer à la place.
Comme le mot de passe d'authentification, le changement de nom 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 le fichier de configuration pour le modifier une fois de plus :
sudo nano /etc/redis.conf
REMARQUE : Ce sont des exemples. Vous devez choisir de désactiver ou de renommer les commandes qui ont du sens pour vous. Vous pouvez en savoir plus sur les commandes de Redis et déterminer comment elles pourraient être utilisées à mauvais escient sur redis.io/commands.
Pour désactiver ou tuer une commande, renommez-la en une chaîne vide, comme ceci :
/etc/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 dans les exemples ci-dessous. Les commandes renommées devraient être difficiles à deviner pour les autres, mais faciles à retenir pour vous :
/etc/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 "" rename-command SHUTDOWN SHUTDOWN_MENOT rename-command CONFIG ASC12_CONFIG
Enregistrez vos modifications et fermez le fichier. Appliquez ensuite les modifications en redémarrant Redis :
sudo systemctl restart redis.service
Pour tester vos nouvelles commandes, saisissez la ligne de commande Redis :
redis-cli
Authentifiez-vous en utilisant le mot de passe que vous avez défini précédemment :
auth your_redis_password
OutputOK
En supposant que vous ayez renommé la commande CONFIG
en ASC12_CONFIG
, la tentative d'utilisation de la commande config
échouera :
config get requirepass
Output(error) ERR unknown command 'config'
L'appel de la commande renommée à la place réussira. Notez que les commandes Redis ne sont pas sensibles à la casse :
asc12_config get requirepass
Output1) "requirepass" 2) "your_redis_password"
Enfin, vous pouvez quitter redis-cli
:
exit
Avertissement : concernant les commandes de changement de nom, il y a une mise en garde à la fin de la section SECURITY
dans le fichier /etc/redis.conf
, qui indique :
/etc/redis.conf
. . . # Please note that changing the name of commands that are logged into the # AOF file or transmitted to slaves may cause problems. . . .
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 répliques, 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 le déploiement de votre application utilisant Redis).
Lorsque vous utilisez AOF et traitez la réplication Redis, considérez cette réponse de la page de problème GitHub du projet . Voici une réponse à la question de l'auteur :
Les commandes sont enregistrées dans 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).
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 à l'instance principale ainsi qu'à chaque instance secondaire dans une installation Redis.
Étape 5 - Définition de la propriété du répertoire de données et des autorisations de fichier
Cette étape passera par quelques modifications de propriété et d'autorisations que vous devrez peut-être apporter 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 est autorisé à lire ses données. Cet utilisateur est, par défaut, l'utilisateur redis.
Vous pouvez le vérifier en grep
-ing pour le répertoire de données Redis dans une longue liste de son répertoire parent. Cette commande et sa sortie sont données ci-dessous :
ls -l /var/lib | grep redis
Outputdrwxr-x---. 2 redis redis 22 Sep 30 20:15 redis
Cette sortie indique que le répertoire de données Redis appartient à l'utilisateur redis, avec un accès secondaire accordé au groupe redis. Ce paramètre de propriété est sécurisé, tout comme les autorisations du dossier qui, en notation octale, sont définies sur 750
.
Si votre répertoire de données Redis a des autorisations non sécurisées (par exemple, il est lisible par tout le monde), vous pouvez vous assurer que seuls l'utilisateur et le groupe Redis ont accès au dossier et à son contenu en exécutant la commande chmod
. L'exemple suivant modifie le paramètre d'autorisations de ce dossier sur 770
:
sudo chmod 770 /var/lib/redis
L'autre autorisation que vous devrez peut-être modifier est celle du fichier de configuration Redis. Par défaut, il a une autorisation de fichier de 640
et appartient à root, avec une propriété secondaire par le groupe root :
ls -l /etc/redis.conf
Output-rw-r-----. 1 redis root 62344 Sep 30 20:14 /etc/redis.conf
Cette autorisation (640
) signifie que le fichier de configuration Redis est lisible uniquement par l'utilisateur redis et le groupe root. Étant donné que le fichier de configuration contient le mot de passe non chiffré que vous avez configuré à l'étape 4, redis.conf
doit appartenir à l'utilisateur redis, avec une propriété secondaire au groupe redis. Pour le définir, exécutez la commande suivante :
sudo chown redis:redis /etc/redis.conf
Modifiez ensuite les autorisations afin que seul le propriétaire du fichier puisse y accéder en lecture et en écriture :
sudo chmod 600 /etc/redis.conf
Vous pouvez vérifier le nouveau propriétaire et les nouvelles autorisations en exécutant à nouveau les commandes ls
précédentes :
ls -l /var/lib | grep redis
Outputtotal 40 drwxrwx---. 2 redis redis 22 Sep 30 20:15 redis
ls -l /etc/redis.conf
Outputtotal 40 -rw-------. 1 redis redis 62344 Sep 30 20:14 /etc/redis.conf
Enfin, redémarrez Redis pour refléter ces modifications :
sudo systemctl restart redis
Avec cela, votre installation Redis a été sécurisée.
Conclusion
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 vous avez mises en place. C'est pourquoi la fonctionnalité de sécurité la plus importante abordée dans ce didacticiel est le pare-feu, car cela empêche les utilisateurs inconnus de se connecter à votre serveur en premier lieu.
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 le guide de sécurité Redis officiel.