So verschlüsseln Sie Datenverkehr zu Redis mit PeerVPN unter Ubuntu 16.04

Einführung

Redis ist ein Open-Source-Schlüsselwertdatenspeicher, der ein In-Memory-Speichermodell mit optionalen Festplattenschreibvorgängen für die Persistenz verwendet. Es bietet unter anderem Transaktionen, ein Pub / Sub-Messaging-Muster und automatisches Failover. Redis hat Kunden, die in den meisten Sprachen geschrieben sind, wobei empfohlene auftheir website angegeben sind.

Redis bietet keine eigenen Verschlüsselungsfunktionen. Es wird davon ausgegangen, dass es in einem isolierten privaten Netzwerk bereitgestellt wurde, auf das nur vertrauenswürdige Parteien zugreifen können. Wenn Ihre Umgebung nicht mit dieser Annahme übereinstimmt, müssen Sie den Redis-Datenverkehr separat verschlüsseln.

In diesem Handbuch wird gezeigt, wie Sie Redis-Datenverkehr verschlüsseln, indem Sie ihn über ein einfaches VPN-Programm namens PeerVPN weiterleiten. Der gesamte Datenverkehr zwischen den Servern kann sicher über das VPN geleitet werden. Im Gegensatz zu einigen Lösungen bietet dies eine flexible Lösung für die allgemeine Server-zu-Server-Kommunikation, die nicht an einen bestimmten Port oder Dienst gebunden ist. Für die Zwecke dieses Handbuchs konzentrieren wir uns jedoch auf die Konfiguration von PeerVPN, um den Redis-Datenverkehr abzusichern. Wir werden zwei Ubuntu 16.04 Server verwenden, um dies zu demonstrieren.

Voraussetzungen

Zu Beginn sollten Sie einen Nicht-Root-Benutzer mitsudo-Berechtigungen auf jedem Ihrer Computer konfigurieren. In diesem Handbuch wird außerdem davon ausgegangen, dass eine grundlegende Firewall vorhanden ist. Sie können unserenUbuntu 16.04 initial server setup guide folgen, um diese Anforderungen zu erfüllen.

Wenn Sie fortfahren möchten, folgen Sie den nachstehenden Anweisungen.

Was ist PeerVPN?

PeerVPN ist eine unglaublich einfache VPN-Technologie, die eine Maschentopologie erstellt. Dies bedeutet, dass es keinen zentralen Server gibt, der immer verfügbar sein muss, um die Kommunikation zwischen Knoten zu vermitteln. Dies ist ideal für Situationen, in denen Sie eine vertrauenswürdige Umgebung zwischen Parteien einrichten möchten, ohne auf vorhandenen Hosts etwas neu zu konfigurieren. Der gesamte Datenverkehr zwischen Knoten kann über das VPN verschlüsselt werden, und beide Dienste und die Firewall können so konfiguriert werden, dass nur Datenverkehr über die VPN-Schnittstelle akzeptiert wird.

Einige Vorteile der Verwendung von PeerVPN sind:

  • Einfache und intuitive Konfiguration. Im Gegensatz zu vielen VPNs kann PeerVPN mit sehr geringem Aufwand eingerichtet werden und erfordert keinen zentralen Server.

  • Eine universelle Lösung für die verschlüsselte Netzwerkkommunikation. Im Gegensatz zu einigen Tunneloptionen bietet ein VPN ein sicheres Netzwerk füranydes Datenverkehrs. Die verschlüsselte Kommunikation muss nur einmal konfiguriert werden und kann von allen Diensten genutzt werden.

  • Für die Server-zu-Server-Kommunikation ist nur eine einzige Verbindung erforderlich. Im Gegensatz zu Tunneling-Lösungen ist nur eine Konfiguration erforderlich, damit zwei Redis-Server kommunizieren können.

Einige Nachteile sind:

  • Ubuntu hat derzeit kein Paket für PeerVPN in den Standard-Repositories.

  • Da kein Init-Skript enthalten ist, muss eines erstellt werden, um die erforderlichen Verbindungen beim Booten automatisch herzustellen.

Beginnen wir mit diesen Merkmalen.

Installieren Sie die Redis Server- und Client-Pakete

Bevor wir beginnen, sollten wir den Redis-Server auf einem Computer installiert und die Client-Pakete auf dem anderen verfügbar haben. Wenn Sie bereits eines oder beide konfiguriert haben, können Sie fortfahren.

[.note] #Note: In den Anweisungen des Redis-Servers wird ein Testschlüssel festgelegt, mit dem die Verbindung später getestet wird. Wenn Sie den Redis-Server bereits installiert haben, können Sie diesen Schlüssel festlegen oder einen anderen bekannten Schlüssel verwenden, wenn wir die Verbindung testen.
#

Installation des Redis-Servers

Wir werdenChris Lea’s Redis server PPA verwenden, um eine aktuelle Version von Redis zu installieren. Seien Sie immer vorsichtig, wenn Sie ein Repository eines Drittanbieters verwenden. In diesem Fall ist Chris Lea ein vertrauenswürdiger Paketanbieter, der hochwertige, aktuelle Pakete für mehrere beliebte Open-Source-Projekte verwaltet.

Fügen Sie die PPA hinzu und installieren Sie die Redis-Serversoftware auf Ihrem ersten Computer, indem Sie Folgendes eingeben:

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

Geben SieEnter ein, um die Eingabeaufforderungen während dieses Vorgangs zu akzeptieren.

Testen Sie nach Abschluss der Installation, ob Sie lokal eine Verbindung zum Redis-Dienst herstellen können, indem Sie Folgendes eingeben:

redis-cli ping

Wenn die Software installiert ist und ausgeführt wird, sollte Folgendes angezeigt werden:

Redis server outputPONG

Legen wir einen Schlüssel fest, den wir später verwenden können:

redis-cli set test 'success'

Wir haben den Schlüsseltest auf den Wertsuccess gesetzt. Nach der Konfiguration von PeerVPN versuchen wir, von unserem Client-Computer aus auf diesen Schlüssel zuzugreifen.

Redis Client installieren

Der andere Ubuntu 16.04-Rechner fungiert als Client. Die gesamte benötigte Software ist im Paketredis-toolsim Standard-Repository verfügbar:

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

Mit der Standardkonfiguration des Remote-Redis-Servers und einer aktiven Firewall können wir derzeit keine Verbindung zur Remote-Redis-Instanz herstellen, um sie zu testen.

Installieren Sie PeerVPN auf jedem Computer

Als Nächstes müssen Sie PeerVPN auf jedem Server und Client installieren. Wie oben erwähnt, enthält Ubuntu derzeit keine PeerVPN-Pakete in seinen Repositorys.

Glücklicherweise enthältproject’s website eine kompilierte Binärdatei für Linux im AbschnittDownload. Klicken Sie mit der rechten Maustaste und kopieren Sie den Link für die statisch verknüpfte Linux-Binärdatei auf dieser Seite, um sicherzustellen, dass Sie über die neueste Version verfügen.

Wechseln Sie auf jedem Ihrer Computer in das Verzeichnis/tmp und laden Sie den von Ihnen kopierten Link mitcurl herunter:

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

Extrahieren Sie den heruntergeladenen Tarball, indem Sie Folgendes eingeben:

tar xzvf peervpn*

Kopieren Sie die Binärdatei in das Verzeichnis/usr/local/bin und die Beispielkonfigurationsdatei in das Verzeichnis/etc:

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

PeerVPN ist jetzt auf dem System installiert und kann verwendet werden.

Konfigurieren Sie das PeerVPN-Netzwerk

Mit der ausführbaren Datei und der Konfigurationsdatei an der richtigen Stelle können wir PeerVPN auf jedem unserer Computer konfigurieren.

Generieren eines sicheren geheimen Schlüssels

PeerVPN verwendet ein gemeinsames Geheimnis mit bis zu 512 Zeichen, um legitime Computer im Netzwerk zu authentifizieren. Es ist wichtig, starke Werte zu verwenden, um die Integrität Ihres Netzwerkverkehrs zu schützen. Da dies ein gemeinsames Geheimnis ist, müssen wir nur einen Wert für unser Netzwerk erstellen (wir werden den Redis-Server verwenden, um dies zu tun, aber es spielt keine Rolle, welchen Sie wählen).

Eine einfache Möglichkeit, ein starkes Geheimnis mit maximaler Länge zu generieren, ist OpenSSL. Überprüfen Sie, ob mitwc eine Ausgabe mit oder unter 512 Zeichen erzeugt wird (Sie können den 382 in diesem Befehl anpassen, um die Ausgabelänge zu beeinflussen):

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

Wenn die Länge korrekt ist, entfernen Siewc, um ein Geheimnis mit hoher Entropie zu erzeugen. Wir werden am Ende einecho hinzufügen, um eine letzte neue Zeile einzufügen:

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

Sie sollten so etwas wie(do not copy the below value!) sehen:

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==

Kopieren Sie die generierte Ausgabe, damit Sie sie in Ihrer PeerVPN-Konfiguration verwenden können.

Definition der PeerVPN-Konfiguration

Öffnen Sie zum Konfigurieren von PeerVPN die Datei/etc/peervpn.confauf jedem Server:

sudo nano /etc/peervpn.conf

Im Inneren finden Sie Kommentare, die die einzelnen Konfigurationsoptionen beschreiben. Lesen Sie diese, um sich mit den verfügbaren Einstellungen vertraut zu machen. Unsere Konfiguration wird sehr einfach sein. Sie können die Konfigurationszeilen entweder oben in die Datei einfügen oder die entsprechenden Zeilen in den Kommentaren in der gesamten Datei suchen, auskommentieren und definieren.

Beginnen Sie mit der Einstellung vonnetworkname undpsk, die beide auf jedem Computer in Ihrem VPN gleich sein müssen. Der Netzwerkname ist eine willkürliche Kennung für dieses bestimmte Netzwerk, währendpsk das gemeinsame Geheimnis ist, auf das zuvor Bezug genommen wurde:

/etc/peervpn.conf

networkname RedisNet
psk your_generated_secret

Legen Sie als Nächstes explizit dieportfest, mit denen PeerVPN eine Verbindung zu Peers herstellen kann, damit wir unsere Firewall problemlos anpassen können (in diesem Handbuch werden 7000 verwendet). Stellen Sieenabletunneling so ein, dass dieser Computer ein aktiver Teil des Netzwerks ist. Legen Sie einen Namen für das Netzwerkinterface fest, das in Tools wieip undifconfig angezeigt wird.

/etc/peervpn.conf

networkname RedisNet
psk your_generated_secret

port 7000
enabletunneling yes
interface peervpn0

Sie müssen eine VPN-Netzwerkgröße auswählen und jedem Server mithilfe der Direktiveifconfig4eine eindeutige VPN-IP-Adresse zuweisen. Dies erfolgt mitCIDR notation. Wir werden das VPN-Netzwerk als 10.8.0.0/24 definieren. Dies gibt uns 254 potenzielle Adressen (viel mehr als wir benötigen), beginnend mit 10.8.0. Da jede Adresse eindeutig sein muss, verwenden wir:

  • 10.8.0.1/24 für unseren Redis-Server

  • 10.8.0.2/24 für unseren Client-Server

Verwenden Sie schließlichinitpeers, um andere Server anzugeben, die sich im Netzwerk befinden. Da PeerVPN keinen zentralen Verwaltungsserver verwendet, werden diese Hosts während der Initialisierung kontaktiert, um sich dem VPN-Netzwerk anzuschließen. Nach dem Herstellen der Verbindung erhält der Server automatisch Informationen zu weiteren Peers im Netzwerk.

Peer sollte unter Verwendung seiner öffentlichen IP-Adresse (not der in der PeerVPN-Konfiguration zugewiesenen VPN-IP-Adresse) und des PeerVPN-Überwachungsports angegeben werden. In derselben Zeile können zusätzliche Peers angegeben werden, die ebenfalls durch ein Leerzeichen getrennt sind (Beispiele finden Sie in den Kommentaren in der Datei):

/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

Speichern und schließen Sie die Datei, wenn Sie fertig sind. Beide Computer sollten sehr ähnliche Konfigurationsdateien haben, die sich nur in den Wertenifconfig4 undinitpeersunterscheiden.

Erstellen Sie eine systemd Unit-Datei für PeerVPN

Um PeerVPN als Dienst zu verwalten und unser Netzwerk beim Booten zu starten, erstellen wir eine System-Unit-Datei. Öffnen Sie auf jedem Computer eine neue Einheitendatei im Verzeichnis/etc/systemd/system, um loszulegen:

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

Erstellen Sie im Inneren einen Abschnitt[Unit], um das Gerät zu beschreiben, und legen Sie die Reihenfolge fest, damit dieses Gerät gestartet wird, nachdem das Netzwerk verfügbar ist:

/etc/systemd/system/peervpn.service

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

Öffnen Sie als Nächstes einen Abschnitt[Service], um den tatsächlich auszuführenden Befehl zu definieren. Hier müssen wir nurExecStart verwenden, um diepeervpn-Binärdatei aufzurufen und auf die von uns erstellte Konfigurationsdatei zu verweisen:

/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

Schließlich werden wir einen Abschnitt[Install] einfügen, um systemd mitzuteilen, wann das Gerät automatisch gestartet werden soll, wenn es aktiviert ist:

/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

Wenn Sie fertig sind, speichern und schließen Sie die Datei.

Starten Sie den PeerVPN-Dienst und passen Sie die Firewall an

Starten und aktivieren Sie die neuepeervpn-Einheit auf beiden Computern, indem Sie Folgendes eingeben:

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

Wenn Sie die Dienste überprüfen, die auf Ihren Servern auf Verbindungen warten, sollte PeerVPN auf Port 7000 sowohl für IPv4- als auch für IPv6-Schnittstellen (falls verfügbar) empfangsbereit sein:

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

Obwohl PeerVPN die öffentliche Schnittstelle überwacht, ist die Firewall wahrscheinlich noch nicht so konfiguriert, dass Datenverkehr durchgelassen wird. Wir müssen den Datenverkehr auf Port 7000 zulassen, auf dem PeerVPN auf Verbindungen wartet, sowie den Datenverkehr vom 10.8.0.0/24-Netzwerk selbst:

sudo ufw allow 7000
sudo ufw allow from 10.8.0.0/24

Dadurch wird der Zugriff auf Port 7000 auf Ihrer öffentlichen Schnittstelle geöffnet, auf der PeerVPN empfangsbereit ist. Außerdem kann der Datenverkehr über das VPN ungehindert weitergeleitet werden.

Prüfen Sie, ob Sie Ihren anderen Server über die VPN-IP-Adresse erreichen können. Beispielsweise können Sie von Ihrem Redis-Server aus Folgendes eingeben:

ping 10.8.0.2

Sie sollten ohne Probleme eine Verbindung herstellen können.

Passen Sie die Redis Server-Einstellungen an

Nachdem das VPN eingerichtet ist, müssen wir die Schnittstellen anpassen, die Redis abhört. Standardmäßig bindet Redis nur an die lokale Schnittstelle.

Öffnen Sie die Redis-Konfigurationsdatei auf dem Redis-Server:

sudo nano /etc/redis/redis.conf

Suchen Sie im Inneren nach der Direktivebind, die derzeit auf 127.0.0.1 gesetzt sein sollte. Fügen Sie die VPN-IP-Adresse des Redis-Servers an das Ende an:

/etc/redis/redis.conf

. . .
bind 127.0.0.1 10.8.0.1
. . .

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Starten Sie jetzt den Redis-Dienst neu, indem Sie Folgendes eingeben:

sudo systemctl restart redis-server.service

Der Redis-Dienst sollte jetzt für Verbindungen von VPN-Peers verfügbar sein. Sie können dies überprüfen, indem Sie die Überwachungsports erneut überprüfen:

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

In der obersten Zeile dieses Beispiels sehen Sie, dass Redis jetzt die VPN-Schnittstelle überwacht.

Testen Sie die Verbindungen vom Redis-Client

Während das VPN ausgeführt wird und Redis im VPN-Netzwerk lauscht, können wir testen, ob unser Redis-Client-Computer auf den Redis-Server zugreifen kann.

Zeigen Sie dazu mit der Option-hauf die VPN-IP-Adresse des Redis-Servers:

redis-cli -h 10.8.0.1 ping
Redis client outputPONG

Fragen Sie nach dem Testschlüssel, den wir zu Beginn dieses Handbuchs festgelegt haben:

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

Dies bestätigt, dass wir die entfernte Datenbank erfolgreich erreichen können.

Das obige Beispiel für die Kommunikation zwischen mehreren Clients und Servern erweitern

In dem oben beschriebenen Beispiel wurde ein einfaches Beispiel für einen einzelnen Redis-Server und einen einzelnen Client verwendet. Dies kann jedoch leicht erweitert werden, um komplexere Wechselwirkungen zu berücksichtigen.

Da PeerVPN ein Mesh-Netzwerk verwendet, ist das Hinzufügen zusätzlicher Clients oder Server einfach. Der neue Peer sollte die folgenden Schritte ausführen:

  • Installieren Sie PeerVPN, indem Sie den Tarball herunterladen und die Dateien anschließend extrahieren und verteilen

  • Kopieren Sie die PeerVPN-Konfiguration von den anderen Servern und passen Sie diese Anweisungen an:

    • ifconfig4 sollte auf eine nicht verwendete IP-Adresse innerhalb des VPN-Netzwerks eingestellt werden

    • initpeers sollte auf mindestens einen, vorzugsweise jedoch auf jeden vorhandenen Peer verweisen

  • Kopieren Sie die PeerVPN-System-Unit-Datei auf den neuen Client-Computer

  • Starten Sie den PeerVPN-Dienst und aktivieren Sie ihn, um ihn beim Start zu starten

  • Öffnen Sie den externen Port und das VPN-Netzwerk in der Firewall

  • (Nur für Redis-Server) Passen Sie die Redis-Konfiguration an, um sie an die neue VPN-Schnittstelle zu binden

Fazit

Redis ist ein leistungsstarkes und flexibles Tool, das für viele Bereitstellungen von unschätzbarem Wert ist. Der Betrieb von Redis in einer unsicheren Umgebung ist jedoch eine große Gefahr, die Ihre Server und Daten für Angriffe oder Diebstähle anfällig macht. Es ist wichtig, den Datenverkehr auf andere Weise zu sichern, wenn Sie kein isoliertes Netzwerk haben, das nur von vertrauenswürdigen Parteien besetzt ist. Die in diesem Handbuch beschriebene Methode ist nur eine Möglichkeit, die Kommunikation zwischen Redis-Parteien zu sichern. Weitere Optionen sind das Konfigurieren eines verschlüsselten Tunnels mitstunnel oderspiped.