Comment installer et sécuriser Redis sur Centos7

introduction

Redis est un magasin de structure de données en mémoire open source qui excelle dans la mise en cache. Base de données non relationnelle, Redis est reconnue pour sa flexibilité, ses performances, son évolutivité et sa prise en charge linguistique étendue.

Redis a été conçu pour être utilisé par des clients sécurisés dans un environnement sécurisé et ne dispose pas de fonctionnalités de sécurité robustes. Redis dispose cependant dea few security features qui incluent un mot de passe de base non chiffré et une commande de renommage et de désactivation. Ce didacticiel fournit des instructions sur la configuration de ces fonctions de sécurité et couvre également quelques autres paramètres susceptibles d'améliorer la sécurité d'une installation Redis autonome sur CentOS 7.

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écessiteront un ensemble différent de configurations, telles que la configuration d'un proxy SSL ou d'unVPN entre les machines Redis.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

Avec ces conditions préalables en place, nous sommes prêts à installer Redis et à effectuer certaines tâches de configuration initiale.

[[step-1 -—- Installing-redis]] == Étape 1 - Installation de Redis

Avant de pouvoir installer Redis, nous devons d’abord ajouterExtra Packages for Enterprise Linux (EPEL) repository aux listes de paquets du serveur. EPEL est un référentiel de packages contenant un certain nombre de packages de logiciels complémentaires open-source, dont la plupart sont gérés par le projet Fedora.

Nous pouvons installer EPEL en utilisantyum:

sudo yum install epel-release

Une fois l'installation d'EPEL terminée, vous pouvez installer Redis, à nouveau en utilisantyum:

sudo yum install redis -y

Cela peut prendre quelques minutes à compléter. Une fois l’installation terminée, 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 commandeenable:

sudo systemctl enable redis

Vous pouvez vérifier l’état de Redis en lançant:

sudo systemctl status redis.service
Output● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/redis.service.d
           └─limit.conf
   Active: active (running) since Thu 2018-03-01 15:50:38 UTC; 7s ago
 Main PID: 3962 (redis-server)
   CGroup: /system.slice/redis.service
           └─3962 /usr/bin/redis-server 127.0.0.1:6379

Une fois que vous avez confirmé que Redis est en cours d’exécution, testez la configuration à l’aide de cette commande:

redis-cli ping

Cela devrait afficherPONG comme réponse. Si tel est le cas, cela signifie que Redis est maintenant installé sur votre serveur et que nous pouvons commencer à le configurer pour améliorer sa sécurité.

[[step-2 -—- binding-redis-and-secure-it-with-a-firewall]] == Étape 2 - Lier Redis et le sécuriser avec un pare-feu

Un moyen efficace de protéger Redis consiste à sécuriser le serveur sur lequel il est exécuté. Pour ce faire, assurez-vous que Redis est uniquement lié à localhost ou à une adresse IP privée et que le serveur dispose d’un pare-feu opérationnel.

Cependant, si vous avez choisi de configurer un cluster Redis à l'aide dethis tutorial, vous aurez mis à jour le fichier de configuration pour autoriser les connexions de n'importe où, ce qui n'est pas aussi sécurisé que la liaison à localhost ou à une adresse IP privée.

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

sudo vi /etc/redis.conf

Recherchez la ligne commençant parbind 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 séparé), nous vous encourageonsstronglyà le lier à une adresse IP privée. La liaison à une adresse IP publique augmente l'exposition de votre interface Redis à des tiers.

/etc/redis.conf

bind your_private_ip

Si vous avez suivi les conditions préalables et installé firewalld 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. Puisqu'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 aucun problème pour le trafic entrant sur son port par défaut.

Si, cependant, vous prévoyez d'accéder à Redis depuis un autre hôte, vous devrez apporter des modifications à la configuration de votre firewalld à l'aide de la commandefirewall-cmd. Encore une fois, vous ne devriez autoriser l'accès à votre serveur Redis que depuis 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 firewall:

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

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

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

Ensuite, spécifiez toutes les adresses IP privées devant être autorisées à passer à travers 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 implémenter les nouvelles règles:

sudo firewall-cmd --reload

Dans cette configuration, lorsque le pare-feu voit un paquet 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 zonepublic 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) dans la zone Redis car ces règles seront automatiquement appliquées à cette connexion.

Si vous avez choisiset up a firewall using Iptables, vous devrez accorder à vos hôtes secondaires l'accès au port que Redis utilise avec les commandes suivantes:

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 6397 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -P INPUT DROP

Assurez-vous de sauvegarder vos règles de pare-feu Iptables en utilisant le mécanisme fourni par votre distribution. Vous pouvez en savoir plus sur Iptables en jetant un œil à nosIptables essentials guide.

N'oubliez pas que l'utilisation de l'un ou l'autre des outils de pare-feu fonctionnera. L’important est que le pare-feu soit opérationnel et que des inconnus ne puissent pas accéder à votre serveur. Dans l'étape suivante, nous allons configurer Redis pour qu'il ne soit accessible qu'avec un mot de passe fort.

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

Si vous avez installé Redis à l'aide du didacticielHow To Configure a Redis Cluster on CentOS 7, vous devez avoir configuré un mot de passe pour celui-ci. À votre discrétion, vous pouvez créer un mot de passe plus sécurisé maintenant en suivant cette section. Si vous n'avez pas encore défini de mot de passe, les instructions de cette section expliquent comment définir le mot de passe du serveur de base de données.

La configuration d'un mot de passe Redis active l'une de ses fonctionnalités de sécurité intégrées - la commandeauth - qui oblige les clients à s'authentifier avant d'être autorisés à accéder à la base de données. Comme le paramètrebind, le mot de passe est configuré directement dans le fichier de configuration de Redis,/etc/redis.conf. Rouvrez ce fichier:

sudo vi /etc/redis.conf

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

/etc/redis.conf

# requirepass foobared

Décommentez-le en supprimant les# et remplacezfoobared par un mot de passe très fort de votre choix. Plutôt que de créer un mot de passe vous-même, vous pouvez utiliser un outil commeapg oupwgen 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.

Notez 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 différent de celui que cela générerait, remplacez le mot entre guillemets par un autre mot ou une autre phrase.

echo "digital-ocean" | sha256sum

Bien que le mot de passe généré ne soit pas prononçable, il est très fort et très 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 pourrequirepass, elle devrait lire:

/etc/redis.conf

requirepass password_copied_from_output

Si vous préférez un mot de passe plus court, utilisez plutôt le résultat de la commande ci-dessous. Encore une fois, changez le mot entre guillemets pour qu'il ne génère pas le même mot de passe que celui-ci:

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

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

redis-cli

Voici 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 nous n’avons pas encore été authentifiés, 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 nous avons été authentifiés:

OutputOK

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

set key1 10
OutputOK

La commandeget key1 demande à Redis la valeur de la nouvelle clé.

get key1
Output"10"

Cette dernière commande quitteredis-cli. Vous pouvez également utiliserexit:

quit

Il devrait maintenant être très difficile pour les utilisateurs non autorisés d’accéder à votre installation Redis. Notez cependant que sans SSL ou VPN, le mot de passe non chiffré sera toujours visible par les tiers si vous vous connectez à Redis à distance.

Nous verrons ensuite comment renommer les commandes Redis afin de protéger davantage Redis des acteurs malveillants.

[[step-4 -—- renaming-dangerous-commands]] == É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 connues pour être dangereuses incluent:

  • FLUSHDB

  • FLUSHALL

  • KEYS

  • PEXPIRE

  • DEL

  • CONFIG

  • SHUTDOWN

  • BGREWRITEAOF

  • BGSAVE

  • SAVE

  • SPOP

  • SREM RENAME DEBUG

Ce n'est pas une liste complète, mais renommer ou désactiver toutes les commandes de cette liste est un bon point de départ.

Que vous désactiviez ou renommiez une commande est spécifique au site. Si vous savez que vous n'utiliserez jamais une commande pouvant être utilisée de manière abusive, vous pouvez la désactiver. Sinon, vous devriez le renommer à la place.

Tout comme le mot de passe d'authentification, le changement de nom ou la désactivation des commandes est configuré dans la sectionSECURITY 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 vi  /etc/redis.conf

[.note] #NOTE: Ce sont des exemples. Vous devez choisir de désactiver ou de renommer les commandes qui vous conviennent. Vous pouvez vérifier les commandes par vous-même et déterminer comment elles pourraient être mal utilisées àredis.io/commands.
#

Pour désactiver ou supprimer une commande, renommez-la simplement en une chaîne vide, comme indiqué ci-dessous:

/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, attribuez-lui un autre nom, comme dans les exemples ci-dessous. Les commandes renommées devraient être difficiles à deviner, mais faciles à retenir:

/etc/redis.conf

rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

Enregistrez vos modifications et fermez le fichier, puis appliquez la modification en redémarrant Redis:

sudo service redis-server restart

Pour tester la nouvelle commande, entrez 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 avez renommé la commandeCONFIG enASC12_CONFIG, toute tentative d'utilisation de la commandeconfig devrait échouer.

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

L’appel de la commande renommée doit aboutir (sans distinction de 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]##

Concernant les commandes de changement de nom, il y a une mise en garde à la fin de la sectionSECURITY dans le fichier/etc/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.

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. 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 que vous traitez une installation maître-esclave, tenez compte de cette réponse à partir 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'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 à toutes les instances des installations maître-esclave.

[[step-5 -—- setting-data-directory-owner-and-file-permissions]] == Étape 5 - Définition de la propriété du répertoire de données et des autorisations de fichier

Dans cette étape, nous examinerons quelques modifications de propriété et d’autorisations que vous pouvez 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 deredis.

Vous pouvez le vérifier engrep-ing pour le répertoire de données Redis dans une longue liste de son répertoire parent. La commande et sa sortie sont données ci-dessous.

ls -l /var/lib | grep redis
Outputdrwxr-xr-x 2 redis   redis   4096 Aug  6 09:32 redis

Vous pouvez voir que le répertoire de données Redis appartient à l'utilisateurredis, avec un accès secondaire accordé au grouperedis. Ce paramètre de propriété est sécurisé, mais les autorisations du dossier (définies sur 755) ne le sont pas. Pour vous assurer que seul l'utilisateur Redis a accès au dossier et à son contenu, définissez le paramètre d'autorisations sur 770:

sudo chmod 770 /var/lib/redis

L'autre autorisation à modifier est celle du fichier de configuration Redis. Par défaut, il a une autorisation de fichier de 644 et appartient àroot, avec une propriété secondaire par le grouperoot:

ls -l /etc/redis.conf
Output-rw-r--r-- 1 root root 30176 Jan 14  2014 /etc/redis.conf

Cette permission (644) est lisible par tout le monde. Cela pose un problème de sécurité car le fichier de configuration contient le mot de passe non chiffré que vous avez configuré à l’étape 4, ce qui signifie que nous devons modifier la propriété et les autorisations du fichier de configuration. Idéalement, il doit appartenir à l'utilisateurredis, avec une propriété secondaire par le grouperedis. Pour ce faire, 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 lire et / ou écrire dessus:

sudo chmod 660 /etc/redis.conf

Vous pouvez vérifier le nouveau propriétaire et les nouvelles autorisations en utilisant:

ls -l /etc/redis.conf
Outputtotal 40
-rw------- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf

Enfin, redémarrez Redis:

sudo service redis-server restart

Félicitations, votre installation de Redis devrait maintenant être plus sécurisée!

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. C'est pourquoi la fonctionnalité de sécurité la plus importante couverte dans ce didacticiel est le pare-feu, qui empêche les utilisateurs inconnus de se connecter à votre serveur.

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.