So verschlüsseln Sie Datenverkehr zu Redis mit Spiped 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 verfasst sind. Die empfohlenen Sprachen finden Sie auf their website.

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 Redis-Datenverkehr mit einem sicheren Piping-Programm mit dem Namen "+ spiped +" verschlüsselt wird. Der Datenverkehr zwischen Redis-Clients und -Servern wird über einen dedizierten, verschlüsselten Tunnel geleitet, ähnlich einem dedizierten SSH-Tunnel. Wir werden zwei Ubuntu 16.04 Server verwenden, um dies zu demonstrieren.

Voraussetzungen

Zu Beginn sollten Sie einen Nicht-Root-Benutzer mit "+ sudo +" - Berechtigungen auf jedem Ihrer Computer haben. In diesem Handbuch wird außerdem davon ausgegangen, dass eine grundlegende Firewall vorhanden ist. Sie können unseren Ubuntu 16.04 Einrichtungsanleitung für Server folgen, um diese Anforderungen zu erfüllen.

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

Was ist gepeitscht?

Das Dienstprogramm + spiped + ist einfach zu installieren und für die sichere Kommunikation zwischen zwei Netzwerk-Sockets (reguläre Netzwerk-Ports oder Unix-Sockets) konfiguriert. Hiermit kann die verschlüsselte Kommunikation zwischen zwei Remoteservern konfiguriert werden. Der Client stellt eine Verbindung zu einem lokalen Port her und "+ spiped " verschlüsselt ihn, bevor er ihn an den Remote-Server weiterleitet. Auf der Serverseite überwacht ` spiped +` den konfigurierten Port und entschlüsselt den Datenverkehr, bevor er an einen lokalen Port weitergeleitet wird (in unserem Fall den Port, den der Redis-Server überwacht).

Einige Vorteile von + spiped + sind:

  • Ubuntu verwaltet Pakete für "+ spiped +" in seinen Standard-Repositories.

  • Das Projekt http://redis.io/topics/encryption[Redis schlägt derzeit vor, den Datenverkehr mit + spiped + zu verschlüsseln.

  • Die Konfiguration ist einfach und intuitiv.

  • Für jeden Zweck wird ein neues Rohr verwendet. Dies kann in einigen Situationen von Nachteil sein, bietet jedoch eine differenzierte Kontrolle über den Zugriff.

Einige Nachteile sind:

  • Clients stellen eine Verbindung zum Remotecomputer her, indem sie eine Verbindung zu einem nicht standardmäßigen lokalen Port herstellen, der zunächst möglicherweise nicht intuitiv ist.

  • Wenn Sie zwei Redis-Server für die Replikation oder das Clustering verbinden, müssen auf jedem Computer zwei Tunnel für die Server-zu-Server-Kommunikation konfiguriert werden (einer für ausgehenden und einer für eingehenden Datenverkehr).

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

Installation des Redis-Servers

Wir werden Chris 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 Sie * Enter * 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 * test * Schlüssel auf den Wert + success + gesetzt. Wir werden versuchen, auf diesen Schlüssel von unserem Client-Rechner aus zuzugreifen, nachdem wir "+ spiped +" konfiguriert haben.

Redis Client installieren

Der andere Ubuntu 16.04-Rechner fungiert als Client. Die gesamte Software, die wir benötigen, finden Sie im Paket "+ redis-tools +" im Standard-Repository:

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 spiped auf jedem Computer

Als nächstes müssen Sie "+ spiped " auf jedem Server und Client installieren. Wenn Sie im vorherigen Abschnitt nichts installieren mussten, müssen Sie den Befehl ` sudo apt-get update +` einschließen, um Ihren Paketindex vor der Installation zu aktualisieren:

sudo apt-get install spiped

Nachdem wir die erforderliche Software installiert haben, können wir einen sicheren Schlüssel generieren, mit dem + spiped + den Verkehr zwischen unseren beiden Maschinen verschlüsseln kann.

Generieren Sie einen Verschlüsselungsschlüssel auf dem Redis-Server

Als nächstes erstellen Sie ein "+ spiped " - Konfigurationsverzeichnis in " / etc +" auf Ihrem Redis-Server, um den Schlüssel zu speichern, den wir für die Verschlüsselung generieren:

sudo mkdir /etc/spiped

Generieren Sie einen sicheren Schlüssel, indem Sie Folgendes eingeben:

sudo dd if=/dev/urandom of=/etc/spiped/redis.key bs=32 count=1

Beschränken Sie den Zugriff auf die generierte Schlüsseldatei, indem Sie die Berechtigungen anpassen:

sudo chmod 600 /etc/spiped/redis.key

Nachdem wir den Schlüssel auf dem Redis-Server verfügbar haben, können wir auf dem Server mithilfe einer systemd-Unit-Datei "+ spiped +" einrichten.

Erstellen Sie eine systemd Unit-Datei für Redis-Server

Das Dienstprogramm + spiped + ist sehr einfach und unterstützt das Lesen einer Konfigurationsdatei nicht. Da jede Pipe manuell konfiguriert werden muss, enthält das Ubuntu-Paket kein Init-Skript, um eine Pipe beim Booten automatisch zu starten.

Um diese Probleme zu beheben, erstellen wir eine einfache System-Unit-Datei. Öffnen Sie eine neue Unit-Datei im Verzeichnis "+ / etc / systemd / system", um zu beginnen:

sudo nano /etc/systemd/system/spiped-receive.service

Erstellen Sie im Inneren einen Abschnitt "+ [Einheit] +", um die Einheit zu beschreiben, und legen Sie die Reihenfolge fest, damit diese Einheit gestartet wird, nachdem das Netzwerk verfügbar ist:

/etc/systemd/system/spiped-receive.service

[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target

Öffnen Sie als Nächstes einen Abschnitt "+ [Service] ", um den auszuführenden Befehl zu definieren. Wir werden die folgenden Optionen mit ` spiped +` verwenden:

  • + -F +: Im Vordergrund laufen. Das systemd init-System ist so konzipiert, dass im Vordergrund ausgeführte Dienste nach Möglichkeit verwaltet werden. Das Ausführen im Vordergrund vereinfacht die erforderliche Konfiguration.

  • + -d +: Entschlüsselt den Datenverkehr vom Quell-Socket. Dies teilt + spiped + die Richtung der Verschlüsselung mit, sodass der Datenverkehr von der Quelle entschlüsselt und der Datenverkehr vom Ziel verschlüsselt werden kann.

  • + -s +: Definiert den Quell-Socket. IP-Adressen müssen in eckigen Klammern stehen, gefolgt von einem Doppelpunkt und dem Port. Für den Redis-Server sollte dies auf die öffentliche IP-Adresse und den Redis-Port eingestellt sein.

  • + -t +: Der Zielsocket. Hier wird der Datenverkehr nach der Entschlüsselung weitergeleitet. Redis hört standardmäßig Port 6379 auf dem lokalen Host ab, daher müssen wir diesen verwenden.

  • + -k +: Gibt die zu verwendende Schlüsseldatei an. Dies sollte auf den Verschlüsselungsschlüssel verweisen, den wir zuvor generiert haben.

Alle diese Optionen werden in einer einzigen "+ ExecStart +" - Direktive zusammengefasst. Dies ist der einzige Punkt, den wir in diesem Abschnitt benötigen:

/etc/systemd/system/spiped-receive.service

[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/spiped -F -d -s []:6379 -t [127.0.0.1]:6379 -k /etc/spiped/redis.key

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

/etc/systemd/system/spiped-receive.service

[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/spiped -F -d -s []:6379 -t [127.0.0.1]:6379 -k /etc/spiped/redis.key

[Install]
WantedBy=multi-user.target

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

Starten Sie den Dienst spiped und passen Sie die Firewall auf dem Redis-Server an

Starten und aktivieren Sie die neue Einheit + spiped +, indem Sie Folgendes eingeben:

sudo systemctl start spiped-receive.service
sudo systemctl enable spiped-receive.service

Wenn Sie die Dienste überprüfen, die auf Verbindungen auf Ihrem Redis-Server warten, sollte auf der öffentlichen Schnittstelle "+ spiped +" für Port 6379 angezeigt werden. Sie sollten auch sehen, dass Redis denselben Port auf der lokalen Schnittstelle überwacht:

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 :6379          0.0.0.0:*               LISTEN      4292/spiped
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      2679/redis-server 1
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1720/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1720/sshd

Obwohl "+ spiped +" die öffentliche Schnittstelle überwacht, ist die Firewall wahrscheinlich noch nicht so konfiguriert, dass Datenverkehr durchgelassen wird.

Geben Sie Folgendes ein, um den gesamten Datenverkehr zu Port 6379 zuzulassen:

sudo ufw allow 6379

Dadurch wird der Zugriff auf Port 6379 auf Ihrer öffentlichen Schnittstelle geöffnet, auf der "+ spiped " empfangsbereit ist. Der " spiped +" - Port akzeptiert nur verschlüsselten Datenverkehr.

Übertragen Sie den Verschlüsselungsschlüssel auf den Client

Um den Verschlüsselungsschlüssel auf den Client zu übertragen, müssen wir eine sichere Verbindung zwischen unseren beiden Servern herstellen. Wir werden "+ ssh +" verwenden, da dies uns erlaubt, unsere bestehende Konfiguration zu nutzen.

Wenn Sie die schlüsselbasierte Authentifizierung verwenden, müssen Sie Ihren SSH-Schlüssel an den Redis-Server weiterleiten, um die Verbindung herzustellen. Dies ist für kennwortbasierte Systeme nicht erforderlich.

Zusätzliche Schritte für die schlüsselbasierte Authentifizierung

Trennen Sie die Verbindung zu Ihrem Redis-Server:

exit

Stellen Sie nun auf Ihrem lokalen Computer sicher, dass ein SSH-Agent ausgeführt wird und Ihr privater Schlüssel hinzugefügt wurde:

eval `ssh-agent`
ssh-add

Verbinden Sie sich jetzt wieder mit Ihrem Redis-Server und fügen Sie das "+ -" - "+" -Flag "hinzu, um Ihre Schlüssel weiterzuleiten:

ssh -A @

Sie können nun mit den folgenden Schritten fortfahren.

Schlüssel übergeben

Wir stellen eine Verbindung vom Redis-Server zum Client her, da für unsere Schlüsseldatei lokale "+ sudo +" - Berechtigungen für den Zugriff erforderlich sind. Jetzt können wir die Datei übertragen und dabei sicherstellen, dass der Doppelpunkt am Ende des folgenden Befehls steht:

sudo -E scp /etc/spiped/redis.key @:

+ scp +, um in das Home-Verzeichnis Ihres Benutzers auf dem Client-Computer zu schreiben.

Erstellen Sie nach der Übertragung des Schlüssels das Verzeichnis "+ / etc / spiped +" auf dem Client-Computer:

sudo mkdir /etc/spiped

Verschieben Sie den Verschlüsselungsschlüssel in das neue Verzeichnis:

sudo mv ~/redis.key /etc/spiped

Sperren Sie die Berechtigungen, um den Zugriff einzuschränken:

sudo chmod 600 /etc/spiped/redis.key

Nachdem der Client über eine Kopie des Verschlüsselungsschlüssels des Servers verfügt, können wir die Clientseite der "+ spiped +" - Konfiguration konfigurieren.

Erstellen Sie eine systemd Unit-Datei für Redis Clients

Wir müssen auf der Client-Seite eine systemd-Unit-Datei für "+ spiped +" erstellen, so wie wir es auf dem Redis-Server getan haben.

Öffnen Sie eine neue System-Unit-Datei, indem Sie Folgendes eingeben:

sudo nano /etc/systemd/system/spiped-send.service

Öffnen Sie im Inneren einen Abschnitt "+ [Unit] +", um den Dienst zu beschreiben und festzustellen, ob er von der Netzwerkverfügbarkeit abhängt:

/etc/systemd/system/spiped-send.service

[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target

Öffnen Sie als nächstes einen Abschnitt "+ [Service] ", um den " spiped +" -Prozess auszuführen. Die hier verwendeten Optionen sind denen auf dem Redis-Server sehr ähnlich, mit den folgenden Unterschieden:

  • + -e +: Gibt an, dass der in den Quell-Socket eingehende Datenverkehr verschlüsselt werden muss. Dadurch wird die Beziehung zwischen den Quell- und Zielsockets hergestellt.

  • + -s +: Definiert den Quell-Socket wie zuvor. In diesem Fall ist die Quelle jedoch ein beliebiger verfügbarer Port auf der lokalen Schnittstelle, zu dem der lokale Redis-Client eine Verbindung herstellen kann.

  • + -t +: Definiert den Zielsocket wie zuvor. Für den Client ist dies die öffentliche IP-Adresse des Remote-Redis-Servers und der Port, der geöffnet wurde.

Diese werden wieder mit der Anweisung + ExecStart + gesetzt:

/etc/systemd/system/spiped-send.service

[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/spiped -F -e -s [127.0.0.1]:8000 -t []:6379 -k /etc/spiped/redis.key

Fügen Sie abschließend einen Abschnitt "+ [Install] +" hinzu, um zu definieren, wann das Gerät gestartet wird, wenn es aktiviert ist:

/etc/systemd/system/spiped-send.service

[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/spiped -F -e -s [127.0.0.1]:8000 -t []:6379 -k /etc/spiped/redis.key

[Install]
WantedBy=multi-user.target

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

Starten Sie den gespipten Dienst auf dem Client und testen Sie die Verbindung

Jetzt können wir unseren "+ spiped +" - Dienst auf dem Client starten und ihn beim Booten automatisch starten lassen:

sudo systemctl start spiped-send.service
sudo systemctl enable spiped-send.service

Überprüfen Sie, ob der Tunnel auf dem Client ordnungsgemäß eingerichtet wurde:

sudo netstat -plunt
Redis client 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:8000          0.0.0.0:*               LISTEN      3264/spiped
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1705/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1705/sshd

Wie Sie sehen können, wartet + spiped + auf dem lokalen Port 8000 auf Verbindungen.

Jetzt sollten Sie in der Lage sein, eine Verbindung zur Remote-Redis-Instanz herzustellen, indem Sie Ihren Client auf Port 8000 auf Ihrer lokalen Schnittstelle verweisen:

redis-cli -p 8000 ping
Redis client outputPONG

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

redis-cli -p 8000 get test
Redis client output"success"

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

Um zu bestätigen, dass wir unfähig sind, mit dem Remote-Redis-Server zu kommunizieren, ohne den Tunnel zu verwenden, können wir versuchen, eine direkte Verbindung zum Remote-Port herzustellen:

redis-cli -h  -p 6379 ping
Redis client outputError: Protocol error, got "\xac" as reply type byte

Wie Sie sehen, wird der Datenverkehr auf dem Remote-Redis-Port nur akzeptiert, wenn er korrekt durch den Tunnel verschlüsselt wurde.

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. Dieselben Methoden können jedoch auf komplexere Wechselwirkungen angewendet werden.

Das Erweitern dieses Beispiels auf mehrere Clients ist unkompliziert. Sie müssten die folgenden oben beschriebenen Aktionen ausführen.

  • Installieren Sie die Redis-Client-Software und das Paket "+ spiped +" auf dem neuen Client

  • Übertragen Sie den Verschlüsselungsschlüssel auf den neuen Client

  • Kopieren Sie die Unit-Datei + spiped + systemd auf den neuen Client-Rechner

  • Starten Sie den Dienst + spiped + und aktivieren Sie ihn, um beim Booten zu starten

Um eine sichere Server-zu-Server-Kommunikation einzurichten (z. B. für Replikation oder Clustering), müssen Sie zwei parallele Tunnel einrichten:

  • Installieren Sie auf dem neuen Server das Redis-Serverpaket und + spiped +

  • Generieren Sie einen neuen Verschlüsselungsschlüssel für den neuen Redis-Server (verwenden Sie einen eindeutigen Namen für die Datei)

  • Kopieren Sie den Verschlüsselungsschlüssel von einem Server auf den anderen in das Verzeichnis "+ / etc / spiped +"

  • Erstellen Sie auf jedem Server (einschließlich vorhandener Server) eine "+ spiped +" - System-Unit-Datei, so dass jeder Server eine Datei für jede Rolle hat:

  • Eine Empfangsgerätedatei, die einen externen Port dem lokalen Redis zuordnet

  • Eine Sendeeinheitendatei, die einen lokalen Port dem freigelegten Port des Remote-Servers zuordnet

  • Öffnen Sie den externen Port in der Firewall auf dem neuen Redis-Server

  • Konfigurieren Sie jede Redis-Instanz so, dass sie eine Verbindung zum lokal zugeordneten Port herstellt, um auf den Remote-Server zuzugreifen, indem Sie die Redis-Konfigurationsdatei anpassen (die erforderlichen Anweisungen hängen von der Beziehung der Server ab). Weitere Informationen finden Sie in den Redis-Dokumenten.

Bei Bedarf können auf jedem Computer mehrere Client-Einheitendateien konfiguriert werden, um lokale Ports Remote-Servern zuzuordnen. Stellen Sie in diesen Fällen sicher, dass Sie einen anderen nicht verwendeten lokalen Port in der Quell-Socket-Spezifikation in der Sendeeinheitendatei auswählen.

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 tunneling with stunnel oder https: // www.digitalocean.com/community/tutorials/Wie-zum-Verschlüsseln-Verkehr-zum-Reduzieren-mit-Peervpn-on-ubuntu-16-04 Einrichten eines VPN].