So verschlüsseln Sie Datenverkehr zu Redis mit Stunnel 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 der Redis-Verkehr mit einem sicheren Tunnelprogramm namensstunnel verschlüsselt wird. Der Datenverkehr zwischen Redis-Clients und -Servern wird über einen dedizierten SSL-verschlüsselten Tunnel weitergeleitet. 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 Stunnel?

Für die einfache verschlüsselte Kommunikation ist das Dienstprogrammstunneleinfach zu installieren und zu konfigurieren. Es ermöglicht die verschlüsselte Weiterleitung zwischen zwei Maschinen. Der Client stellt eine Verbindung zu einem lokalen Port her und wird vonstunnel verschlüsselt, bevor er an den Remote-Server weitergeleitet wird. Auf der Serverseite überwachtstunnel 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 der Verwendung vonstunnel sind:

  • Ubuntu verwaltet Pakete fürstunnel in seinen Standard-Repositorys

  • Ubuntu enthält ein Init-Skript, um den Prozess beim Booten automatisch zu starten

  • Die Konfiguration ist einfach und intuitiv

  • Für jeden Zweck wird ein neuer Tunnel 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).

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. Wir werden versuchen, von unserem Client-Computer aus auf diesen Schlüssel zuzugreifen, nachdem wirstunnel konfiguriert haben.

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 und aktivieren Sie stunnel auf jedem Computer

Als Nächstes müssen Siestunnel auf jedem der Server und Clients installieren. Ubuntu enthält die vierte Version des Dienstprogramms namensstunnel4 in seinen Standard-Repositorys. Wenn Sie im vorherigen Abschnitt nichts installieren mussten, stellen Sie sicher, dass Sie den Befehlsudo apt-get update einschließen, um Ihren Paketindex vor der Installation zu aktualisieren:

# sudo apt-get update
sudo apt-get install stunnel4

Der Dienststunnelunter Ubuntu verwendet zum Starten ein älteres SysVinit-Skript, das von systemd verwaltet werden kann. Anstatt native systemd-Methoden zu verwenden, müssen Sie zum Konfigurieren des Dienstes für den Start beim Booten die Datei/etc/default/stunnel4ändern:

sudo nano /etc/default/stunnel4

Aktivieren Sie den Dienst, um beim Booten zu starten, indem Sie die OptionENABLED auf "1" setzen:

/etc/default/stunnel4

. . .
ENABLED=1
. . .

Speichern und schließen Sie die Datei auf jedem Server.

Als Nächstes erstellen wir ein selbstsigniertes SSL-Zertifikat und einen selbstsignierten Schlüssel, mit denen die Kommunikation verschlüsselt wird.

Erstellen Sie ein selbstsigniertes SSL-Zertifikat und einen selbstsignierten Schlüssel auf dem Redis-Server

Erstellen Sie auf Ihrem Redis-Server ein selbstsigniertes SSL-Zertifikat und geben Sie das Verzeichnis/etc/stunnelein. Dies wird verwendet, um die Verbindung zwischen den beiden Instanzen vonstunnel zu verschlüsseln. Wir werden den Namenredis-server verwenden, um auf die Zertifikat- und Schlüsseldateien zu verweisen:

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/stunnel/redis-server.key -out /etc/stunnel/redis-server.crt

Sie werden aufgefordert, Informationen zu dem von Ihnen erstellten Zertifikat einzugeben. Da dies nur intern verwendet wird, spielen die Werte keine große Rolle. Geben Sie also ein, was Sie möchten. Unten sehen Sie ein Beispiel:

Redis server output. . .
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean
Organizational Unit Name (eg, section) []:Community
Common Name (e.g. server FQDN or YOUR name) []:redis-server
Email Address []:[email protected]

Beschränken Sie den Zugriff auf die generierte.key-Datei, indem Sie Folgendes eingeben:

sudo chmod 600 /etc/stunnel/redis-server.key

Nachdem wir über ein SSL-Zertifikat und einen SSL-Schlüssel verfügen, können wir die Konfigurationsdateistunnelunseres Redis-Servers erstellen.

Erstellen Sie die Redis Server-Stunnel-Konfigurationsdatei

Öffnen Sie eine Datei mit der Endung.conf im Verzeichnis/etc/stunnel auf dem Redis-Server, um loszulegen:

sudo nano /etc/stunnel/redis.conf

Geben Sie im Hauptabschnitt einen Speicherort zum Schreiben der PID-Datei an. Das Verzeichnis/run dient zum Speichern dieser Dateitypen. Daher verwenden wir Folgendes:

/etc/stunnel/redis.conf

pid = /run/stunnel-redis.pid

Erstellen Sie als Nächstes einen Abschnitt, um den Zugriff auf den Redis-Dienst zu konfigurieren. Sie können dies so nennen, wie Sie möchten (wir nennen esredis-server). In diesem Abschnitt wird diese Konfiguration von allen anderen Tunneln getrennt, die Sie möglicherweise zu einem späteren Zeitpunkt auf diesem Computer konfigurieren müssen.

Wir müssen die Speicherorte des eigenen Zertifikats und Schlüssels des Redis-Servers mithilfe der Anweisungencert undkey angeben.

Wir werden hier auch den Tunnel für eingehende Daten definieren. Wir möchten den verschlüsselten Datenverkehr vonacceptan den Standard-Redis-Port (Port 6379) der externen IP-Adresse des Redis-Servers senden. Wir möchten dannconnect diesen Verkehr zum Standard-Redis-Port auf derlocal-Schnittstelle, um den entschlüsselten Verkehr abzulegen. Hier hört der Redis-Dienst tatsächlich:

/etc/stunnel/redis.conf

pid = /run/stunnel-redis.pid

[redis-server]
cert = /etc/stunnel/redis-server.crt
key = /etc/stunnel/redis-server.key
accept = redis_servers_public_IP:6379
connect = 127.0.0.1:6379

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

Starten Sie stunnel neu und konfigurieren Sie die Firewall

Nachdemstunnel auf dem Redis-Server konfiguriert ist, können Sie den Dienst neu starten, indem Sie Folgendes eingeben:

sudo systemctl restart stunnel4.service

Wenn Sie die Dienste überprüfen, die auf Verbindungen auf Ihrem Redis-Server warten, solltestunnelauf Port 6379 der öffentlichen Schnittstelle lauschen. 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 public_IP:6379          0.0.0.0:*               LISTEN      4292/stunnel4
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

Obwohlstunnel 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

Dies eröffnet den Zugriff auf Port 6379 auf Ihrer öffentlichen Schnittstelle, an derstunnel empfangsbereit ist. Der Portstunnelakzeptiert nur verschlüsselten Datenverkehr.

Verteilen Sie das Zertifikat an den Client

Jeder Redis-Client benötigt eine Kopie der Zertifikatdatei des Redis-Servers. Der einfachste Weg, die.crt-Dateien zu verteilen, besteht darin, einfach den Inhalt der Datei auf dem Server auszugeben und ihn dann in eine entsprechende Datei auf den Verbindungscomputern zu kopieren.

Geben Sie den Inhalt der.crt-Datei auf Ihrem Redis-Server aus, indem Sie Folgendes eingeben:

cat /etc/stunnel/redis-server.crt
Redis server output-----BEGIN CERTIFICATE-----
MIIEGTCCAwGgAwIBAgIJALUdz8P8q8UPMA0GCSqGSIb3DQEBCwUAMIGiMQswCQYD
VQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENp

. . .

Tq7WJk77tk4nPI8iGv1WuK8xTAm5aOncxP16VoMpsDMV+GB1p3nBkMQ/GKF8pPXU
fn6BnDWKmeZqAlBM+MGYAfkbZWdBslrWasCJzs+tehTqL0LLJ6d3Gi9biBPb
-----END CERTIFICATE-----

Kopieren Sie das angezeigte Zertifikatincluding the lines marked BEGIN CERTIFICATE and END CERTIFICATE in Ihre Zwischenablage.

Öffnen Sie auf dem Clientcomputer eine Datei mit demselben Namen im Verzeichnis/etc/stunnel:

sudo nano /etc/stunnel/redis-server.crt

Fügen Sie den Inhalt ein, den Sie vom Redis-Server kopiert haben. Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Erstellen Sie die Redis Client-Stunnel-Konfigurationsdatei

Nachdem der Client über eine Kopie des Serverzertifikats verfügt, können wir die Clientseite derstunnel-Konfiguration konfigurieren.

Öffnen Sie eine Datei mit der Endung.conf im Verzeichnis/etc/stunnel auf dem Clientcomputer. Wir werden die Dateiredis.conf erneut aufrufen:

sudo nano /etc/stunnel/redis.conf

Geben Sie im Inneren eine PID-Datei an, in der der Dienst seine Prozess-ID erneut speichert:

/etc/stunnel/redis.conf

pid = /run/stunnel-redis.pid

Fügen Sie als Nächstes einen Abschnitt hinzu, um den Tunnel für ausgehende Daten zu konfigurieren. Sie können dies beliebig benennen (wir nennen esredis-client). In diesem Abschnitt wird diese Konfiguration von allen anderen Tunneln getrennt, die Sie möglicherweise zu einem späteren Zeitpunkt auf diesem Computer konfigurieren müssen.

Wir müssen diesen Abschnitt explizit als Client-Konfiguration unter Verwendung der Direktiveclientmarkieren. Legen Sie die Anweisungaccept fest, um einen nicht verwendeten Port auf der lokalen Schnittstelle abzuhören und Verbindungen von Ihrem lokalen Redis-Client zu verarbeiten (in diesem Beispiel wird Port 8000 verwendet). Setzen Sie die Anweisungconnect auf die öffentliche IP-Adresse des Redis-Servers und den von uns geöffneten Port.

Verwenden Sie dannCAfile, um auf die Kopie des Redis-Serverzertifikats zu verweisen. Wir müssen auchverify auf 4 setzen, wodurchstunnel nur das Zertifikat ohne Berücksichtigung einer Zertifikatkette überprüft (da wir unser Zertifikat selbst signiert haben):

/etc/stunnel/redis.conf

pid = /run/stunnel-redis.pid

[redis-client]
client = yes
accept = 127.0.0.1:8000
connect = remote_server_IP_address:6379
CAfile = /etc/stunnel/redis-server.crt
verify = 4

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

Starten Sie den Client Service neu und testen Sie die Verbindung

Starten Sie den Dienststunnelauf dem Client neu, um die Änderungen zu implementieren:

sudo systemctl restart stunnel4.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      3809/stunnel4
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1714/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1714/sshd

Wie Sie sehen können, wartetstunnel am 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 wirunable sind, um 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 redis_server_public_IP -p 6379 ping
Redis client outputError: Connection reset by peer

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 Paketstunnelauf dem neuen Client

  • Aktivieren Sie die Softwarestunnel, um beim Booten zu starten

  • Kopieren Sie die Zertifikatdatei des Servers in das Verzeichnis/etc/stunnel

  • Kopieren Sie die Client-Konfigurationsdatei vonstunnelauf den neuen Client-Computer

  • Starten Sie den Dienst vonstunnelneu

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 undstunnel

  • Aktivieren Sie die Softwarestunnel, um beim Booten zu starten

  • Generieren Sie ein neues Zertifikat und eine neue Schlüsseldatei für den neuen Redis-Server (verwenden Sie einen eindeutigen Namen für die Dateien).

  • Kopieren Sie jede Zertifikatdatei von einem Server auf den anderen in das Verzeichnis/etc/stunnel

  • Bearbeiten oder erstellen Sie die Konfigurationsdatei vonstunnelauf jedem Server (einschließlich vorhandener Server) so, dass sie Folgendes enthält:

    • Ein Serverabschnitt, der einen externen Port dem lokalen Redis zuordnet

    • Ein Clientabschnitt, der einen lokalen Port dem exponierten 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.

Die Konfigurationsdateien vonstunnelfür beide Server sehen ungefähr so ​​aus:

Stunnel-Konfigurationsdatei für die Server-zu-Server-Kommunikation

pid = /run/stunnel-redis.pid

[redis-server]
cert = /etc/stunnel/this_servers_certificate.crt
key = /etc/stunnel/this_servers_key.key
accept = this_servers_public_IP:6379
connect = 127.0.0.1:6379

[redis-client]
client = yes
accept = 127.0.0.1:arbitrary_local_port
connect = remote_servers_public_IP:6379
CAfile = /etc/stunnel/remote_servers_certificate.crt
verify = 4

Bei Bedarf können auf jedem Computer mehrere Clientabschnitte konfiguriert werden, um lokale Ports Remoteservern zuzuordnen. Stellen Sie in diesen Fällen sicher, dass Sie für jeden Remote-Server einen anderen nicht verwendeten lokalen Port mit der Direktiveaccept 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. Andere Optionen sindtunneling with spiped odersetting up a VPN.