Comment se connecter à une instance Redis gérée sur TLS avec Stunnel et redis-cli

introduction

Une instanceRedis gérée peut offrir des avantages tels que la haute disponibilité et les mises à jour automatisées. Cependant, chaque fois que vous vous connectez à un serveur de base de données distant, vous courez le risque d'acteurs malveillantssniffing les informations sensibles que vous lui envoyez.

redis-cli, l’interface de ligne de commande Redis, ne prend pas en charge nativement les connexions surTLS, un protocole cryptographique qui permet des communications sécurisées sur un réseau. Cela signifie que sans configuration supplémentaire,redis-cli n'est pas un moyen sécurisé de se connecter à un serveur Redis distant. Une façon d'établir une connexion sécurisée à une instance Redis gérée consiste à créer untunnel qui utilise le protocole TLS.

Stunnel est un proxy open-source utilisé pour créer des tunnels sécurisés, vous permettant de communiquer avec d'autres machines via TLS. Dans ce guide, nous allons parcourir l'installation et la configuration de stunnel afin que vous puissiez vous connecter à une instance Redis gérée via TLS avecredis-cli.

Conditions préalables

Pour compléter ce guide, vous aurez besoin de:

  • Accès à un serveur Ubuntu 18.04. Ce serveur doit avoir un utilisateur non root avec des privilèges administratifs et un pare-feu configuré avecufw. Pour configurer cela, suivez nosinitial server setup guide for Ubuntu 18.04.

  • Une instance de base de données Redis gérée. Les étapes décrites dans ce didacticiel ont été testées sur une base de données Redis DigitalOcean Managed, bien qu'elles devraient généralement fonctionner pour les bases de données gérées de tout fournisseur de cloud. Pour provisionner une base de données Redis gérée par DigitalOcean, suivez nosManaged Redis product documentation.

[[step-1 -—- Installing-stunnel-and-redis-cli]] == Étape 1 - Installation de Stunnel et redis-cli

Lorsque vous installez un serveur Redis, il est généralement livré avecredis-cli. Cependant, vous pouvez installerredis-cli sans le serveur Redis en installant le packageredis-tools à partir des référentiels Ubuntu par défaut. Vous pouvez également installer stunnel à partir des référentiels Ubuntu par défaut en téléchargeant le packagestunnel4.

Tout d’abord, mettez à jour l’index des paquets de votre serveur si vous ne l’avez pas fait récemment:

sudo apt update

Ensuite, installez les packagesredis-tools etstunnel4 avec APT:

sudo apt install redis-tools stunnel4

Lorsque vous y êtes invité, appuyez surENTER pour confirmer que vous souhaitez installer les packages.

Vous pouvez vérifier si stunnel a été installé correctement et que son servicesystemd fonctionne en exécutant la commande suivante:

sudo systemctl status stunnel4
Output● stunnel4.service - LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons)
   Loaded: loaded (/etc/init.d/stunnel4; generated)
   Active: active (exited) since Thu 2019-09-12 14:34:05 UTC; 8s ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 0 (limit: 2362)
   CGroup: /system.slice/stunnel4.service

Sep 12 14:34:05 stunnel systemd[1]: Starting LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons)...
Sep 12 14:34:05 stunnel stunnel4[2034]: TLS tunnels disabled, see /etc/default/stunnel4
Sep 12 14:34:05 stunnel systemd[1]: Started LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons).

Ici, vous pouvez voir que le service Stunnel est actif, bien que le processus se termine immédiatement. Cela nous indique que Stunnel est en cours d’exécution, mais qu’il ne peut rien faire car nous ne l’avons pas encore configuré.

[[step-2 -—- configuring-stunnel]] == Étape 2 - Configuration de Stunnel

Les systèmes Linux modernes s'appuient sur systemd pour initialiser et gérer les services et les démons. Cependant, stunnel utilise un script d'initialisation de style SysV, basé sur l'ancien système d'initialisation deUNIX System V, pour le démarrage. Vous devrez modifier le fichier/etc/default/stunnel4 pour activer ce script d’initialisation.

Ouvrez ce fichier avec votre éditeur de texte préféré. Ici, nous utiliseronsnano:

sudo nano /etc/default/stunnel4

Recherchez l'optionENABLED en haut du fichier. Il sera défini sur0 par défaut, mais remplacez-le par1 pour permettre à stunnel de démarrer au démarrage:

/etc/default/stunnel4

# /etc/default/stunnel
# Julien LEMOINE 
# September 2003

# Change to one to enable stunnel automatic startup
ENABLED=1
. . .

Enregistrez et fermez le fichier. Si vous avez utilisénano pour éditer le fichier, faites-le en appuyant surCTRL+X,Y, puisENTER.

Ensuite, vous devrez créer un fichier de configuration pour stunnel qui indiquera au programme où il doit acheminer le trafic.

Ouvrez un nouveau fichier appeléstunnel.conf sous le répertoire/etc/stunnel:

sudo nano /etc/stunnel/stunnel.conf

Ajoutez le contenu suivant à ce fichier:

/etc/stunnel/stunnel.conf

fips = no
setuid = nobody
setgid = nogroup
pid =
debug = 7
[redis-cli]
  client = yes
  accept = 127.0.0.1:8000
  connect = managed_redis_hostname_or_ip:managed_redis_port

Les cinq premières lignes du fichier sontglobal options, ce qui signifie qu'elles s'appliqueront à chaque service que vous incluez dans ce fichier:

  • fips: active ou désactive le mode FIPS 140-2 de stunnel. Dans ce mode, stunnel validera que la connexion répond auxFederal Information Processing Standard. Le paramétrer surno désactive cette fonction. Notez que le désactiver n'est pas moins sécurisé, mais le garder activé (comme par défaut) nécessiterait une configuration supplémentaire.

  • setuid: définit l'ID utilisateur Unix sous lequel stunnel fonctionnera. Par défaut, le processus stunnel appartient à l'utilisateurroot. Cependant, lesstunnel documentation recommends pour lesquels vous supprimez les privilèges administratifs une fois le tunnel démarré, car ne pas le faire présente un risque de sécurité. Si vous définissez le paramètresetuid surnobody,nobody, un utilisateur sans privilège, s'appropriera le processus d'étourdissement une fois le tunnel établi.

  • setgid: définit l'ID de groupe Unix sous lequel stunnel fonctionnera. Comme poursetuid, cette configuration spécifie un groupe sans privilèges spéciaux -nogroup - pour éviter tout problème de sécurité potentiel.

  • pid: définit un emplacement de fichier où stunnel créera un fichier.pid, un type de fichier contenant lesPID d'un processus. Les fichiers.pid sont généralement utilisés par d'autres programmes pour trouver le PID d'un processus en cours d'exécution. Par défaut, stunnel crée un fichier.pid dans le répertoire/var/run/stunnel4/. Étant donné que l'utilisateur denobodyn'a pas l'autorisation d'accéder à ce répertoire, cela empêchera le tunnel de démarrer correctement. En ne fournissant aucun argument au paramètrepid dans cette configuration, nous désactivons ce comportement, car un fichier.pid n'est pas nécessaire pour les besoins de ce didacticiel. Si vous avez besoin d'un fichier.pid pour votre cas d'utilisation, assurez-vous de le définir sur un fichier dans lequelnobody est autorisé à écrire.

  • debug: définit le niveau de débogage de stunnel, qui peut aller de0 à7. Dans cet exemple, nous allons le définir sur7, le niveau le plus élevé disponible, car cela fournira les informations les plus détaillées si stunnel rencontre des problèmes. Vous pouvez le régler à n'importe quel niveau de votre choix, mais sachez que le paramètre par défaut est5.

Les lignes restantes sontservice-level options et ne s'appliquent qu'au tunnel que nous allons créer pourredis-cli:

  • [redis-cli]: Ceci est unservice name et spécifie que les lignes suivantes représentent une configuration de service individuelle pour un programme client. Vous pouvez avoir plusieurs services dans un fichier de configuration stunnel, bien que chacun d’eux soit associé à une application cliente existante et que vous ne pouvez pas avoir deux services pour la même application.

  • client: définir ce paramètre suryes indique à stunnel de s'exécuter en mode client, ce qui signifie que stunnel se connectera à un serveur TLS (l'instance Redis gérée) plutôt que d'agir comme un serveur TLS.

  • accept: définit l'hôte et le port sur lesquels stunnel acceptera les connexions du client. Ici, nous spécifions l'adresse IP127.0.0.1, qui est une adresse de bouclage IPv4 utilisée pour représenterlocalhost et le port8000. Cela signifie que stunnel écoutera les connexions provenant du serveur Ubuntu sur le port8000 et les chiffrera. Notez que vous pouvez définir le port sur n’importe quel numéro de port de votre choix tant qu’il n’est pas déjà utilisé.

  • connect: définit l'adresse distante et le port vers lesquels stunnel établira la connexion. Veillez à modifier ce paramètre pour l’aligner sur le port, le nom d’hôte ou l’adresse IP de votre base de données gérée.

[.Remarque]##

Note: Le nom d'hôte ou l'adresse IP et le port que vous devez spécifier dans la directiveconnect seront spécifiques à votre propre base de données Redis gérée. Ceux-ci se trouvent généralement dans l'interface utilisateur de gestion de base de données de votre fournisseur de cloud où vous avez provisionné votre instance Redis.

Si vous utilisez une base de données Redis gérée par DigitalOcean, vous pouvez trouver ces informations en accédant à vosControl Panel et en cliquant surDatabases dans le menu latéral de gauche. Ensuite, cliquez sur le nom de l'instance Redis à laquelle vous souhaitez vous connecter et faites défiler jusqu'à la sectionConnection Details. Vous y trouverez des champs décrivant leshost etport de votre base de données.

Il s’agit d’une configuration plutôt minimale qui laisse en place de nombreux paramètres par défaut de stunnel. Le programme propose de nombreuses options pour créer des tunnels adaptés à vos besoins. Voirthe official documentation pour plus de détails.

Après avoir ajouté ce contenu, enregistrez et fermez le fichier.

Ensuite, redémarrez le servicestunnel4 pour que stunnel lise le nouveau fichier de configuration:

sudo systemctl restart stunnel4

Ensuite, vous pouvez tester si stunnel a créé avecnetstat, un utilitaire de ligne de commande utilisé pour afficher les connexions réseau. Exécutez la commande suivante, qui achemine la sortienetstat dans une commandegrep, qui la recherche ensuite pour chaque instance destunnel:

sudo netstat -plunt | grep stunnel
Output tcp        0      0 127.0.0.1:8000         0.0.0.0:*               LISTEN      17868/stunnel

Cette sortie montre que stunnel écoute les connexions sur le port local8000.

Vous pouvez également confirmer que l'utilisateurnobody a pris en charge le processus stunnel avecps, un programme qui affiche tous les processus en cours d'exécution:

ps aux | grep stunnel
Output nobody   15674  0.0  0.1 121912  3180 ?        Ssl  19:28   0:00 /usr/bin/stunnel4 /etc/stunnel/stunnel.conf
. . .

Ici, vous pouvez voir quenobody a effectivement repris le processus d'étourdissement.

Stunnel est maintenant entièrement configuré et en cours d'exécution sur votre système. Vous êtes prêt à vous connecter à votre instance Redis gérée et à vérifier que le tunnel fonctionne comme prévu.

[[step-3 -—- connection-to-your-managed-database-over-tls]] == Étape 3 - Connexion à votre base de données gérée via TLS

Maintenant que vous avez installéredis-cli et configuré stunnel sur votre serveur, vous êtes prêt à vous connecter à votre base de données gérée via TLS.

Selon les paramètres définis dans le fichier de configuration créé à l'étape 2, vous vous connecterez à votre base de données gérée à l'aide de la commande suivante:

redis-cli -h localhost -p 8000

Cette commande inclut l'indicateur-h, qui indique àredis-cli que le prochain argument sera l'hôte auquel se connecter. Dans ce cas, il s’agit delocalhostcar nous nous connectons à un tunnel créé localement sur le serveur. Après cela, se trouve le drapeau-p, qui précède le port du tunnel local auquel nous nous connectons, qui dans ce cas est le port8000.

Après avoir exécuté cette commande, vous serez connecté à votre serveur Redis géré. Votre invite changera pour indiquer que vous êtes connecté et que vous êtes en mode interactif deredis-cli:

[.Remarque]##

Note: Souvent, les bases de données gérées sont configurées pour obliger les utilisateurs à s'authentifier avec un mot de passe lorsqu'ils se connectent. Si votre instance Redis gérée nécessite un mot de passe, vous pouvez inclure l'indicateur-a dans votre commanderedis-cli, suivi de votre mot de passe:

redis-cli -h localhost -p 8000 -a password

Vous pouvez également vous authentifier en exécutant la commandeauth suivie de votre mot de passe après l'établissement de la connexion:

auth password

Si vous utilisez une base de données gérée DigitalOcean, vous pouvez trouver le mot de passe de votre instance Redis au même endroit où vous avez trouvé son nom d'hôte et son port. Dans vosControl Panel, cliquez surDatabases dans le menu latéral de gauche. Cliquez ensuite sur le nom de l'instance Redis à laquelle vous vous êtes connecté. Faites défiler jusqu'à la sectionConnection Details, et vous y trouverez un champ intitulépassword. Cliquez sur le boutonshow pour révéler le mot de passe, puis copiez-le et collez-le dans l'une de ces commandes - en remplacement depassword - afin de vous authentifier.

Vous pouvez tester si le tunnel fonctionne comme prévu en exécutant la commandeping à partir du mode interactif de Redis:

ping

Si la connexion est active, elle retourneraPONG:

Output PONG

Si, toutefois, Stunnel ne tunnelise pas correctement le trafic de votre serveur vers votre instance Redis, un message d'erreur semblable à celui-ci peut s'afficher avant d'être déconnecté de Redis:

Output Error: Server closed the connection

Si vous recevez cette erreur ou une erreur similaire, vérifiez que vous avez correctement saisi le nom d'hôte et le port de votre instance Redis dans votre fichierstunnel.conf. De même, assurez-vous que vous avez entré le numéro de port correct dans votre commanderedis-cli.

Une fois que vous avez confirmé que le tunnel fonctionne, continuez et déconnectez-vous de votre instance Redis:

exit

Si jamais vous modifiez la configuration de stunnel, vous devrez recharger ou redémarrer le servicestunnel4 pour que stunnel remarque les changements:

sudo systemctl reload stunnel4

Cependant, si à un moment donné dans le futur vous souhaitez fermer le tunnel TLS, vous ne pourrez pas le fermer avecsystemctl. Au lieu de cela, vous devrez arrêter le processus avec la commandepkill:

sudo pkill stunnel

Une fois le tunnel fermé, vous pouvez le rouvrir en redémarrant le service:

sudo systemctl restart stunnel4

Maintenant que vous avez correctement configuré stunnel, vous êtes prêt à commencer à ajouter des données à votre instance Redis gérée avecredis-cli.

Conclusion

Stunnel est un outil pratique pour créer des tunnels TLS et établir des connexions sécurisées avec des serveurs distants. Ceci est particulièrement utile dans les cas où le transport sécurisé d'informations entre des machines est essentiel, comme dans le cas d'une base de données distante.

À partir de là, vous pouvez commencer à explorer Redis et à l'intégrer à votre prochaine application. Si vous débutez avec Redis, vous trouverez peut-être notre série surHow To Manage a Redis Database utile.