Comment chiffrer le trafic sur Redis avec PeerVPN sur Ubuntu 16.04

introduction

Redis est un magasin de données clé-valeur open source, utilisant un modèle de stockage en mémoire avec des écritures de disque optionnelles pour la persistance. Il comporte des transactions, un modèle de messagerie pub / secondaire et un basculement automatique, entre autres fonctionnalités. Redis a des clients écrits dans la plupart des langues, les recommandées étant présentées surtheir website.

Redis ne fournit aucune fonctionnalité de cryptage propre. Il fonctionne en supposant qu'il a été déployé sur un réseau privé isolé, accessible uniquement aux parties de confiance. Si votre environnement ne correspond pas à cette hypothèse, vous devrez encapsuler le trafic Redis dans un chiffrement séparé.

Dans ce guide, nous montrerons comment chiffrer le trafic Redis en le routant via un simple programme VPN appelé PeerVPN. Tout le trafic entre les serveurs peut être routé de manière sécurisée via le VPN. Contrairement à certaines solutions, cela fournit une solution flexible pour la communication générale de serveur à serveur qui n'est pas liée à un port ou à un service spécifique. Cependant, pour les besoins de ce guide, nous allons nous concentrer sur la configuration de PeerVPN afin de sécuriser le trafic Redis. Nous allons utiliser deux serveurs Ubuntu 16.04 pour démontrer.

Conditions préalables

Pour commencer, vous devez avoir un utilisateur non root avec les privilègessudo configurés sur chacune de vos machines. De plus, ce guide supposera que vous avez un pare-feu de base en place. Vous pouvez suivre nosUbuntu 16.04 initial server setup guide pour remplir ces conditions.

Lorsque vous êtes prêt à continuer, suivez les instructions ci-dessous.

Qu'est-ce que PeerVPN?

PeerVPN est une technologie VPN incroyablement simple qui établit une topologie maillée. Cela signifie qu'il n'y a pas de serveur central qui doit toujours être disponible pour arbitrer la communication entre les nœuds. Ceci est idéal pour les situations dans lesquelles vous souhaitez établir un environnement de confiance entre les parties sans aucune reconfiguration sur les hôtes existants. Tout le trafic entre les nœuds peut être chiffré via le VPN, et les services et le pare-feu peuvent être configurés pour accepter le trafic uniquement sur l'interface VPN.

Certains avantages de l’utilisation de PeerVPN sont les suivants:

  • Configuration simple et intuitive. Contrairement à de nombreux VPN, PeerVPN peut être configuré avec très peu de travail et ne nécessite pas de serveur central.

  • Une solution polyvalente pour la communication réseau cryptée. Contrairement à certaines options de tunneling, un VPN fournit un réseau sécurisé pour le traficany. La communication cryptée ne doit être configurée qu'une seule fois et est utilisable par tous les services.

  • Une seule connexion est nécessaire pour la communication serveur à serveur. Contrairement aux solutions de tunneling, une seule configuration est nécessaire pour que deux serveurs Redis puissent communiquer.

Certains inconvénients sont:

  • Ubuntu n'a actuellement pas de paquet pour PeerVPN dans les référentiels par défaut.

  • Il n'y a pas de script init inclus, vous devez donc en créer un pour créer automatiquement les connexions nécessaires au démarrage.

Avec ces caractéristiques à l’esprit, commençons.

Installer les packages serveur et client Redis

Avant de commencer, le serveur Redis doit être installé sur une machine et les packages client disponibles sur l’autre. Si vous avez déjà configuré l’un ou les deux, n'hésitez pas à passer à l’avant.

[.note] #Note: Les instructions du serveur Redis définissent une clé de test qui sera utilisée pour tester la connexion ultérieurement. Si vous avez déjà installé le serveur Redis, vous pouvez continuer et définir cette clé ou utiliser toute autre clé connue lorsque nous testons la connexion.
#

Installer le serveur Redis

Nous utiliseronsChris Lea’s Redis server PPA pour installer une version à jour de Redis. Soyez toujours prudent lorsque vous utilisez un référentiel tiers. Dans ce cas, Chris Lea est un emballeur de confiance qui gère des packages de haute qualité et mis à jour pour plusieurs projets open source populaires.

Ajoutez le PPA et installez le logiciel serveur Redis sur votre première machine en tapant:

sudo apt-add-repository ppa:chris-lea/redis-server
sudo apt-get update
sudo apt-get install redis-server

TapezEnter pour accepter les invites pendant ce processus.

Une fois l'installation terminée, vérifiez que vous pouvez vous connecter au service Redis localement en tapant:

redis-cli ping

Si le logiciel est installé et en cours d'exécution, vous devriez voir:

Redis server outputPONG

Définissons une clé que nous pourrons utiliser plus tard:

redis-cli set test 'success'

Nous avons défini la clétest sur la valeursuccess. Nous allons essayer d'accéder à cette clé à partir de notre ordinateur client après la configuration de PeerVPN.

Installation du client Redis

L'autre machine Ubuntu 16.04 fonctionnera en tant que client. Tous les logiciels dont nous avons besoin sont disponibles dans le packageredis-tools dans le référentiel par défaut:

sudo apt-get update
sudo apt-get install redis-tools

Avec la configuration par défaut du serveur Redis distant et un pare-feu actif, nous ne pouvons pas actuellement nous connecter à l’instance Redis distante à tester.

Installer PeerVPN sur chaque ordinateur

Ensuite, vous devrez installer PeerVPN sur chacun des serveurs et des clients. Comme mentionné ci-dessus, Ubuntu n’inclut pas pour l’instant les packages PeerVPN dans ses référentiels.

Heureusement,project’s website inclut un binaire compilé pour Linux dans la sectionDownload. Cliquez avec le bouton droit de la souris et copiez le lien du binaire Linux lié statiquement sur cette page pour vous assurer que vous disposez de la version la plus récente.

Sur chacune de vos machines, accédez au répertoire/tmp puis utilisezcurl pour télécharger le lien que vous avez copié:

cd /tmp
curl -LO https://peervpn.net/files/peervpn-0-044-linux-x86.tar.gz

Extrayez l'archive téléchargée en tapant:

tar xzvf peervpn*

Copiez le binaire dans le répertoire/usr/local/bin et l'exemple de fichier de configuration dans le répertoire/etc:

sudo cp /tmp/peervpn*/peervpn /usr/local/bin
sudo cp /tmp/peervpn*/peervpn.conf /etc

PeerVPN est maintenant installé sur le système et prêt à être utilisé.

Configurer le réseau PeerVPN

Avec l'exécutable et le fichier de configuration à leur place, nous pouvons configurer PeerVPN sur chacune de nos machines.

Générer une clé secrète sécurisée

PeerVPN utilise un secret partagé de 512 caractères au maximum pour authentifier les machines légitimes sur le réseau. Il est important d'utiliser des valeurs fortes pour protéger l'intégrité du trafic de votre réseau. Comme il s’agit d’un secret partagé, nous n’avons besoin que d’une valeur unique pour notre réseau (nous utiliserons le serveur Redis pour le faire, mais le choix de votre choix importe peu).

OpenSSL est un moyen simple de générer un secret puissant de longueur maximale. Vérifiez qu'il produit une sortie à 512 caractères ou moins avecwc (vous pouvez ajuster le 382 dans cette commande pour affecter la longueur de sortie):

openssl rand -base64 382 | tr -d '\n' | wc
Redis server output      0       1     512

Si la longueur est correcte, supprimez leswc pour générer un secret d'entropie élevée. Nous ajouterons unecho à la fin pour mettre une dernière ligne:

openssl rand -base64 382 | tr -d '\n' && echo

Vous devriez voir quelque chose comme ceci(do not copy the below value!):

Redis server outputajHpYYMJYtv+m0K6yZbYmk8npPujlcv9QDozQZ06ucV2gsHoMGqyfd50X8OnY6hicj5iFNjDN/9QVTB3nhMOV2ufU/kfWCbtskUuk1zHWYZsvy71KnLRhA8W8dnu+NEKdIh28H2qUsiay7On5kOZPcrONvv/pHHYbxmFI2G9TyYT+CZWIAxUV/vUWl41VycjASmZYaSI6lWgYONopncNfDF5Z6oznPH8ge6sQsszbe1ZjNqLRUrx/jgL3fy7SXSLCIrsSuifBv/pb36d9/y+YPZEbxsMInoK5QEWrpIf/xjbMFlndtGc20olhh05h66qz/GiimLMivrN8g+PibVaBRUmWav/pngUvKYsEEPSc0wrr5ZuvpvBGTTKqPdR+soCnd/iWPzmwRBW56vBGxed3GNbkgmjDpTSnvNEN+gKPt07drHSbGqfFbdMdsKbjE+IWiqiVO1aviJsNpMhBO/o9uIcKxPmuze6loZKTh7/qjJuY62E//SsgFzDHDhP2w==

Copiez votre sortie générée afin de pouvoir l'utiliser dans votre configuration PeerVPN.

Définir la configuration de PeerVPN

Pour configurer PeerVPN, ouvrez le fichier/etc/peervpn.conf sur chaque serveur:

sudo nano /etc/peervpn.conf

À l'intérieur, vous trouverez des commentaires décrivant chacune des options de configuration. N'hésitez pas à les lire pour vous familiariser avec les paramètres disponibles. Notre configuration sera très simple. Vous pouvez ajouter les lignes de configuration en haut du fichier ou rechercher, décommenter et définir les lignes appropriées dans les commentaires tout au long du fichier.

Commencez par définirnetworkname etpsk, qui doivent tous deux être identiques sur chacune des machines de votre VPN. Le nom du réseau est un identifiant arbitraire pour ce réseau particulier, tandis que lepsk est le secret partagé mentionné précédemment:

/etc/peervpn.conf

networkname RedisNet
psk your_generated_secret

Ensuite, définissez explicitement lesport que PeerVPN peut utiliser pour se connecter à des pairs afin que nous puissions ajuster notre pare-feu facilement (nous utiliserons 7000 dans ce guide). Réglezenabletunneling pour que cette machine soit une partie active du réseau. Définissez un nom pour le réseauinterface qui apparaîtra dans des outils tels queip etifconfig.

/etc/peervpn.conf

networkname RedisNet
psk your_generated_secret

port 7000
enabletunneling yes
interface peervpn0

Vous devrez sélectionner une taille de réseau VPN et attribuer une adresse IP VPN unique à chaque serveur en utilisant la directiveifconfig4. Ceci est fait en utilisantCIDR notation. Nous définirons le réseau VPN comme étant 10.8.0.0/24. Cela nous donnera 254 adresses potentielles (beaucoup plus que ce dont nous avons besoin), toutes commençant par 10.8.0. Puisque chaque adresse doit être unique, nous utiliserons:

  • 10.8.0.1/24 pour notre serveur Redis

  • 10.8.0.2/24 pour notre serveur client

Enfin, utilisezinitpeers pour spécifier les autres serveurs qui feront partie du réseau. PeerVPN n'utilisant pas de serveur de gestion centralisé, ces hôtes seront contactés lors de l'initialisation afin de rejoindre le réseau VPN. Après la connexion, le serveur recevra automatiquement des informations sur les pairs supplémentaires présents sur le réseau.

L'homologue doit être spécifié à l'aide de son adresse IP publique (not l'adresse IP VPN attribuée dans la configuration PeerVPN) et du port d'écoute PeerVPN. Des pairs supplémentaires peuvent être spécifiés sur la même ligne, également séparés par un espace (voir les commentaires dans le fichier pour des exemples):

/etc/peervpn.conf

networkname RedisNet<^>
psk your_generated_secret

port 7000
enabletunneling yes
interface peervpn0

# Increment the IP address below for each additional server
# For example, the second node on the network could be 10.8.0.2/24
ifconfig4 10.8.0.1/24
initpeers other_server_public_IP 7000

Enregistrez et fermez le fichier lorsque vous avez terminé. Vos deux machines doivent avoir des fichiers de configuration très similaires, ne variant que dans les valeursifconfig4 etinitpeers.

Créer un fichier unité systemd pour PeerVPN

Afin de gérer PeerVPN en tant que service et de démarrer notre réseau au démarrage, nous allons créer un fichier unité systemd. Ouvrez un nouveau fichier d'unité dans le répertoire/etc/systemd/system sur chaque machine pour commencer:

sudo nano /etc/systemd/system/peervpn.service

À l'intérieur, créez une section[Unit] pour décrire l'unité et établir l'ordre afin que cette unité soit démarrée une fois la mise en réseau disponible:

/etc/systemd/system/peervpn.service

[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target

Ensuite, ouvrez une section[Service] pour définir la commande réelle à exécuter. Ici, nous devons juste utiliserExecStart pour appeler le binaire depeervpn et le pointer sur le fichier de configuration que nous avons créé:

/etc/systemd/system/peervpn.service

[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf

Enfin, nous inclurons une section[Install] pour indiquer à systemd quand démarrer automatiquement l'unité si elle est activée:

/etc/systemd/system/peervpn.service

[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf

[Install]
WantedBy=multi-user.target

Lorsque vous avez terminé, enregistrez et fermez le fichier.

Démarrer le service PeerVPN et ajuster le pare-feu

Démarrez et activez la nouvelle unitépeervpn sur les deux machines en tapant:

sudo systemctl start peervpn.service
sudo systemctl enable peervpn.service

Si vous vérifiez que les services écoutent les connexions sur vos serveurs, vous devriez voir PeerVPN écouter sur le port 7000 pour les interfaces IPv4 et IPv6 (le cas échéant):

sudo netstat -plunt
OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      2662/redis-server 1
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1724/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1724/sshd
udp        0      0 0.0.0.0:7000            0.0.0.0:*                           4609/peervpn
udp6       0      0 :::7000                 :::*                                4609/peervpn

Bien que PeerVPN écoute sur l'interface publique, le pare-feu n'est probablement pas configuré pour laisser passer le trafic. Nous devons autoriser le trafic sur le port 7000 où PeerVPN écoute les connexions, ainsi que sur le trafic du réseau 10.8.0.0/24 lui-même:

sudo ufw allow 7000
sudo ufw allow from 10.8.0.0/24

Cela ouvrira l'accès au port 7000 de votre interface publique où PeerVPN est à l'écoute. Cela permettra également au trafic de circuler librement à partir du VPN.

Vérifiez si vous pouvez atteindre votre autre serveur en utilisant l'adresse IP du VPN. Par exemple, depuis votre serveur Redis, vous pouvez taper:

ping 10.8.0.2

Vous devriez pouvoir vous connecter sans problème.

Ajuster les paramètres du serveur Redis

Maintenant que le VPN est configuré, nous devons ajuster les interfaces écoutées par Redis. Par défaut, Redis se lie uniquement à l'interface locale.

Ouvrez le fichier de configuration Redis sur le serveur Redis:

sudo nano /etc/redis/redis.conf

À l'intérieur, recherchez la directivebind, qui devrait actuellement être définie sur 127.0.0.1. Ajoutez l’adresse IP VPN du serveur Redis à la fin:

/etc/redis/redis.conf

. . .
bind 127.0.0.1 10.8.0.1
. . .

Enregistrez et fermez le fichier lorsque vous avez terminé.

Maintenant, redémarrez le service Redis en tapant:

sudo systemctl restart redis-server.service

Le service Redis devrait maintenant être disponible pour les connexions des homologues VPN. Vous pouvez le vérifier en revérifiant les ports d'écoute:

sudo netstat -plunt
Redis server outputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 10.8.0.1:6379           0.0.0.0:*               LISTEN      4767/redis-server 1
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      4767/redis-server 1
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1724/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1724/sshd
udp        0      0 0.0.0.0:7000            0.0.0.0:*                           4609/peervpn
udp6       0      0 :::7000                 :::*                                4609/peervpn

Vous pouvez voir sur la ligne supérieure de cet exemple que Redis écoute maintenant l'interface VPN.

Tester les connexions à partir du client Redis

Avec le VPN en cours d’exécution et l’écoute Redis sur le réseau VPN, nous pouvons effectuer des tests pour nous assurer que notre ordinateur client Redis peut accéder au serveur Redis.

Pour ce faire, pointez votre client vers l’adresse IP VPN du serveur Redis à l’aide de l’option-h:

redis-cli -h 10.8.0.1 ping
Redis client outputPONG

Requête pour la clé de test que nous avons définie au début de ce guide:

redis-cli -h 10.8.0.1 get test
Redis client output"success"

Cela confirme que nous sommes en mesure d'atteindre la base de données distante avec succès.

Extension de l'exemple ci-dessus pour la communication multi-client et serveur à serveur

L'exemple décrit ci-dessus utilise un exemple simple d'un serveur Redis et d'un client. Toutefois, cela peut être facilement étendu pour permettre des interactions plus complexes.

Comme PeerVPN utilise un réseau maillé, l’ajout de clients ou de serveurs est simple. Le nouvel homologue doit suivre les étapes suivantes:

  • Installez PeerVPN en téléchargeant l'archive, puis en extrayant et en distribuant les fichiers.

  • Copiez la configuration PeerVPN à partir des autres serveurs et ajustez ces directives:

    • ifconfig4 doit être défini sur une adresse IP inutilisée dans le réseau VPN

    • initpeers doit pointer vers au moins un, mais de préférence chaque pair existant

  • Copiez le fichier d'unité PeerVPN systemd sur le nouvel ordinateur client.

  • Démarrer le service PeerVPN et lui permettre de démarrer au démarrage

  • Ouvrez le port externe et le réseau VPN dans le pare-feu

  • (Uniquement pour les serveurs Redis) Ajustez la configuration Redis pour établir une liaison avec la nouvelle interface VPN.

Conclusion

Redis est un outil puissant et flexible, d’une valeur inestimable pour de nombreux déploiements. Toutefois, l’utilisation de Redis dans un environnement non sécurisé est une lourde responsabilité qui rend vos serveurs et vos données vulnérables aux attaques et au vol. Il est essentiel de sécuriser le trafic par d'autres moyens si vous ne disposez pas d'un réseau isolé peuplé uniquement de parties de confiance. La méthode décrite dans ce guide n'est qu'un moyen de sécuriser la communication entre les parties Redis. D'autres options incluent la configuration d'un tunnel chiffré avecstunnel ouspiped.