Herstellen einer Verbindung zu einer verwalteten Redis-Instanz über TLS mit Stunnel und redis-cli

Einführung

Die Instanz einer verwaltetenRediskann Vorteile wie Hochverfügbarkeit und automatisierte Updates bieten. Jedes Mal, wenn Sie eine Verbindung zu einem entfernten Datenbankserver herstellen, besteht jedoch das Risiko, dass böswillige Akteuresniffingder vertraulichen Informationen sind, die Sie an ihn senden.

redis-cli, die Redis-Befehlszeilenschnittstelle, unterstützt keine Verbindungen überTLS, ein kryptografisches Protokoll, das eine sichere Kommunikation über ein Netzwerk ermöglicht. Dies bedeutet, dassredis-cli ohne weitere Konfiguration keine sichere Möglichkeit ist, eine Verbindung zu einem Remote-Redis-Server herzustellen. Eine Möglichkeit, eine sichere Verbindung zu einer verwalteten Redis-Instanz herzustellen, besteht darin, eintunnelzu erstellen, das das TLS-Protokoll verwendet.

Stunnel ist ein Open-Source-Proxy zum Erstellen sicherer Tunnel, mit dem Sie über TLS mit anderen Computern kommunizieren können. In diesem Handbuch werden wir durch die Installation und Konfiguration von stunnel gehen, damit Sie mitredis-cli über TLS eine Verbindung zu einer verwalteten Redis-Instanz herstellen können.

Voraussetzungen

Um diesen Leitfaden zu vervollständigen, benötigen Sie:

  • Zugriff auf einen Ubuntu 18.04 Server. Dieser Server sollte einen Nicht-Root-Benutzer mit Administratorrechten und eine mitufw konfigurierte Firewall haben. Befolgen Sie dazu unsereinitial server setup guide for Ubuntu 18.04.

  • Eine verwaltete Redis-Datenbankinstanz. Die in diesem Lernprogramm beschriebenen Schritte wurden auf einer DigitalOcean Managed Redis-Datenbank getestet, sollten jedoch im Allgemeinen für verwaltete Datenbanken von jedem Cloud-Anbieter funktionieren. Befolgen Sie unsereManaged Redis product documentation, um eine von DigitalOcean verwaltete Redis-Datenbank bereitzustellen.

[[Schritt-1 -—- Installieren von Stunnel-and-Redis-Cli]] == Schritt 1 - Installieren von Stunnel und Redis-Cli

Wenn Sie einen Redis-Server installieren, wird dieser normalerweise mitredis-cli geliefert. Sie könnenredis-cli jedoch ohne den Redis-Server installieren, indem Sie das Paketredis-tools aus den Standard-Ubuntu-Repositorys installieren. Sie können stunnel auch aus den Standard-Ubuntu-Repositorys installieren, indem Sie das Paketstunnel4herunterladen.

Aktualisieren Sie zunächst den Paketindex Ihres Servers, falls Sie dies in letzter Zeit nicht getan haben:

sudo apt update

Installieren Sie dann die Paketeredis-tools undstunnel4 mit APT:

sudo apt install redis-tools stunnel4

Wenn Sie dazu aufgefordert werden, drücken SieENTER, um zu bestätigen, dass Sie die Pakete installieren möchten.

Sie können überprüfen, ob stunnel korrekt installiert wurde und der Dienstsystemdfunktioniert, indem Sie den folgenden Befehl ausführen:

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

Hier können Sie sehen, dass der Stunnel-Dienst aktiv ist, obwohl der Prozess sofort beendet wurde. Dies teilt uns mit, dass stunnel ausgeführt wird, aber tatsächlich nichts tun kann, da wir es noch nicht konfiguriert haben.

[[Schritt-2 - Konfigurieren des Stunnels]] == Schritt 2 - Konfigurieren des Stunnels

Moderne Linux-Systeme verwenden systemd zum Initialisieren und Verwalten von Diensten und Daemons. Stunnel verwendet jedoch zum Start ein Init-Skript im SysV-Stil, das auf dem Init-System des älterenUNIX System Vbasiert. Sie müssen die/etc/default/stunnel4-Datei ändern, um dieses Init-Skript zu aktivieren.

Öffnen Sie diese Datei mit Ihrem bevorzugten Texteditor. Hier verwenden wirnano:

sudo nano /etc/default/stunnel4

Suchen Sie die OptionENABLED oben in der Datei. Es wird standardmäßig auf0 gesetzt, aber ändern Sie dies in1, damit der Stunnel beim Booten starten kann:

/etc/default/stunnel4

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

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

Speichern und schließen Sie die Datei. Wenn Sienano zum Bearbeiten der Datei verwendet haben, drücken Sie dazuCTRL+X,Y und dannENTER.

Als Nächstes müssen Sie eine Konfigurationsdatei für stunnel erstellen, die dem Programm mitteilt, wohin der Datenverkehr weitergeleitet werden soll.

Öffnen Sie eine neue Datei mit dem Namenstunnel.conf im Verzeichnis/etc/stunnel:

sudo nano /etc/stunnel/stunnel.conf

Fügen Sie dieser Datei den folgenden Inhalt hinzu:

/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

Die ersten fünf Zeilen in der Datei sindglobal options, was bedeutet, dass sie für jeden Dienst gelten, den Sie in diese Datei aufnehmen:

  • fips: Aktiviert oder deaktiviert den FIPS 140-2-Modus des Stunnels. In diesem Modus überprüft stunnel, ob die VerbindungFederal Information Processing Standard erfüllt. Wenn Sie dies aufno setzen, wird diese Funktion deaktiviert. Beachten Sie, dass das Deaktivieren nicht weniger sicher ist. Wenn Sie es jedoch aktivieren (standardmäßig), ist eine zusätzliche Konfiguration erforderlich.

  • setuid: Definiert die Unix-Benutzer-ID, unter der der Stunnel ausgeführt wird. Standardmäßig gehört der Stunnel-Prozess dem Benutzerroot. Diestunnel documentation recommends, für die Sie nach dem Start des Tunnels Administratorrechte löschen, stellen jedoch ein Sicherheitsrisiko dar, wenn Sie dies nicht tun. Wenn Sie den Parametersetuid aufnobody setzen, übernimmtnobody, ein nicht privilegierter Benutzer, die Verantwortung für den Stunnel-Prozess, sobald der Tunnel eingerichtet wurde.

  • setgid: Definiert die Unix-Gruppen-ID, unter der der Stunnel ausgeführt wird. Wie beisetuid gibt diese Konfiguration eine Gruppe ohne besondere Berechtigungen an -nogroup -, um potenzielle Sicherheitsprobleme zu vermeiden.

  • pid: Definiert einen Dateispeicherort, an dem stunnel eine.pid-Datei erstellt, einen Dateityp, derPID eines Prozesses enthält. .pid Dateien werden normalerweise von anderen Programmen verwendet, um die PID eines laufenden Prozesses zu ermitteln. Standardmäßig erstellt stunnel eine.pid-Datei im Verzeichnis/var/run/stunnel4/. Da der Benutzer vonnobodykeine Berechtigung zum Zugriff auf dieses Verzeichnis hat, wird der Tunnel nicht ordnungsgemäß gestartet. Wenn Sie in dieser Konfiguration kein Argument für den Parameterpidangeben, deaktivieren wir dieses Verhalten, da eine.pid-Datei für die Zwecke dieses Lernprogramms nicht erforderlich ist. Wenn Sie jedoch eine.pid-Datei für Ihren Anwendungsfall benötigen, stellen Sie sicher, dass diese auf eine Datei festgelegt ist, in dienobody schreiben darf.

  • debug: Legt die Debugging-Stufe des Stunnels fest, die von0 bis7 reichen kann. In diesem Beispiel setzen wir es auf7, die höchste verfügbare Ebene, da dies die detailliertesten Informationen liefert, wenn der Stunnel auf Probleme stößt. Sie können eine beliebige Stufe einstellen. Beachten Sie jedoch, dass die Standardeinstellung5 ist.

Die verbleibenden Zeilen sindservice-level options und gelten nur für den Tunnel, den wir fürredis-cli erstellen:

  • [redis-cli]: Dies ist einservice name und gibt an, dass die folgenden Zeilen eine individuelle Dienstkonfiguration für ein Client-Programm darstellen. Sie können mehr als einen Dienst in einer Stunnel-Konfigurationsdatei haben, obwohl jeder mit einer vorhandenen Client-Anwendung verknüpft sein muss und Sie nicht zwei Dienste für dieselbe Anwendung haben können.

  • client: Wenn Sie diesen Wert aufyes setzen, wird stunnel angewiesen, im Client-Modus ausgeführt zu werden. Dies bedeutet, dass stunnel eine Verbindung zu einem TLS-Server (der verwalteten Redis-Instanz) herstellt und nicht als TLS-Server fungiert.

  • accept: Definiert den Host und den Port, an dem der Stunnel Verbindungen vom Client akzeptiert. Hier geben wir die IP-Adresse127.0.0.1 an, eine IPv4-Loopback-Adresse, die zur Darstellung vonlocalhost und Port8000 verwendet wird. Dies bedeutet, dass stunnel auf Port8000 auf Verbindungen wartet, die vom Ubuntu-Server stammen, und diese verschlüsselt. Beachten Sie, dass Sie den Port auf eine beliebige Portnummer einstellen können, solange diese noch nicht verwendet wird.

  • connect: Definiert die Remote-Adresse und den Port, zu dem der Stunnel die Verbindung herstellen soll. Stellen Sie sicher, dass Sie diesen Parameter an den Port und den Hostnamen oder die IP-Adresse Ihrer verwalteten Datenbank anpassen.

[.Hinweis]##

Note: Der Hostname oder die IP-Adresse und der Port, die Sie in der Direktiveconnect angeben sollten, sind spezifisch für Ihre eigene verwaltete Redis-Datenbank. Diese befinden sich normalerweise auf der Benutzeroberfläche Ihres Cloud-Anbieters für die Datenbankverwaltung, auf der Sie Ihre Redis-Instanz bereitgestellt haben.

Wenn Sie eine von DigitalOcean verwaltete Redis-Datenbank verwenden, können Sie diese Informationen finden, indem Sie zuControl Panel gehen und im Menü der linken Seitenleiste aufDatabases klicken. Klicken Sie dann auf den Namen der Redis-Instanz, zu der Sie eine Verbindung herstellen möchten, und scrollen Sie zum AbschnittConnection Details. Dort finden Sie Felder, die diehost undport Ihrer Datenbank beschreiben.

Dies ist eine ziemlich minimale Konfiguration, bei der viele der Standardeinstellungen von stunnel beibehalten werden. Das Programm bietet Ihnen viele Optionen, um Tunnel zu erstellen, die Ihren speziellen Anforderungen entsprechen. Weitere Informationen finden Sie unterthe official documentation.

Speichern und schließen Sie die Datei, nachdem Sie diesen Inhalt hinzugefügt haben.

Starten Sie dann den Dienst vonstunnel4neu, damit stunnel die neue Konfigurationsdatei liest:

sudo systemctl restart stunnel4

Anschließend können Sie testen, ob mitnetstat, einem Befehlszeilenprogramm zum Anzeigen von Netzwerkverbindungen, ein Stunnel erstellt wurde. Führen Sie den folgenden Befehl aus, der die Ausgabe vonnetstat in einen Befehlgrep umleitet, der sie dann nach jeder Instanz vonstunnel durchsucht:

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

Diese Ausgabe zeigt, dass stunnel auf Verbindungen am lokalen Port8000 wartet.

Sie können auch mitps, einem Programm, das alle aktuell ausgeführten Prozesse anzeigt, bestätigen, dass der Benutzer vonnobodyden Besitz des Stunnel-Prozesses übernommen hat:

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

Hier können Sie sehen, dassnobody tatsächlich den Stunnel-Prozess übernommen hat.

Stunnel ist jetzt vollständig konfiguriert und läuft auf Ihrem System. Sie können eine Verbindung zu Ihrer verwalteten Redis-Instanz herstellen und testen, ob der Tunnel wie erwartet funktioniert.

[[Schritt 3 - Verbindung zu Ihrer verwalteten Datenbank über TLS herstellen]] == Schritt 3 - Herstellen einer Verbindung zu Ihrer verwalteten Datenbank über TLS

Nachdem Sieredis-cli installiert und stunnel auf Ihrem Server konfiguriert haben, können Sie über TLS eine Verbindung zu Ihrer verwalteten Datenbank herstellen.

Basierend auf den Einstellungen, die in der in Schritt 2 erstellten Konfigurationsdatei definiert wurden, stellen Sie mit dem folgenden Befehl eine Verbindung zu Ihrer verwalteten Datenbank her:

redis-cli -h localhost -p 8000

Dieser Befehl enthält das Flag-h, dasredis-cli mitteilt, dass das nächste Argument der Host ist, zu dem eine Verbindung hergestellt werden soll. In diesem Fall ist eslocalhost, da wir eine Verbindung zu einem lokal auf dem Server erstellten Tunnel herstellen. Danach befindet sich das-p-Flag, das vor dem Port des lokalen Tunnels steht, zu dem wir eine Verbindung herstellen. In diesem Fall handelt es sich um Port8000.

Nachdem Sie diesen Befehl ausgeführt haben, werden Sie mit Ihrem verwalteten Redis-Server verbunden. Ihre Eingabeaufforderung ändert sich, um anzuzeigen, dass Sie verbunden sind und sich im interaktiven Modus vonredis-clibefinden:

[.Hinweis]##

Note: In verwalteten Datenbanken sind Benutzer häufig so konfiguriert, dass sie sich beim Herstellen einer Verbindung mit einem Kennwort authentifizieren müssen. Wenn für Ihre verwaltete Redis-Instanz ein Kennwort erforderlich ist, können Sie das Flag-a in den Befehlredis-cli aufnehmen, gefolgt von Ihrem Kennwort:

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

Alternativ können Sie sich authentifizieren, indem Sie den Befehlauth gefolgt von Ihrem Kennwort ausführen, nachdem Sie die Verbindung hergestellt haben:

auth password

Wenn Sie eine von DigitalOcean verwaltete Datenbank verwenden, finden Sie das Kennwort Ihrer Redis-Instanz an der Stelle, an der Sie den Hostnamen und den Port gefunden haben. Klicken Sie in IhrenControl Panel im Menü der linken Seitenleiste aufDatabases. Klicken Sie anschließend auf den Namen der Redis-Instanz, mit der Sie verbunden sind. Scrollen Sie zum AbschnittConnection Details und dort finden Sie ein Feld mit der Bezeichnungpassword. Klicken Sie auf die Schaltflächeshow, um das Kennwort anzuzeigen, kopieren Sie es und fügen Sie es in einen dieser Befehle ein. Ersetzen Siepassword, um.
zu authentifizieren

Sie können testen, ob der Tunnel wie erwartet funktioniert, indem Sie den Befehlpingim interaktiven Modus von Redis ausführen:

ping

Wenn die Verbindung aktiv ist, wirdPONG zurückgegeben:

Output PONG

Wenn stunnel den Datenverkehr von Ihrem Server zu Ihrer Redis-Instanz jedoch nicht ordnungsgemäß tunnelt, wird möglicherweise die folgende Fehlermeldung angezeigt, bevor die Verbindung zu Redis getrennt wird:

Output Error: Server closed the connection

Wenn Sie diesen oder einen ähnlichen Fehler erhalten, überprüfen Sie noch einmal, ob Sie den Hostnamen und den Port Ihrer Redis-Instanz korrekt in die Dateistunnel.confeingegeben haben. Stellen Sie ebenfalls sicher, dass Sie die richtige Portnummer in den Befehlredis-clieingegeben haben.

Sobald Sie bestätigt haben, dass der Tunnel funktioniert, trennen Sie die Verbindung zu Ihrer Redis-Instanz:

exit

Wenn Sie jemals die Konfiguration von stunnel ändern, müssen Sie denstunnel4-Dienst neu laden oder neu starten, damit stunnel die Änderungen bemerkt:

sudo systemctl reload stunnel4

Wenn Sie den TLS-Tunnel jedoch zu einem späteren Zeitpunkt schließen möchten, können Sie ihn nicht mitsystemctl schließen. Stattdessen müssen Sie den Prozess mit dem Befehlpkillabbrechen:

sudo pkill stunnel

Nachdem der Tunnel geschlossen wurde, können Sie den Tunnel erneut öffnen, indem Sie den Dienst neu starten:

sudo systemctl restart stunnel4

Nachdem Sie stunnel erfolgreich konfiguriert haben, können Sie Ihrer verwalteten Redis-Instanz mitredis-cli Daten hinzufügen.

Fazit

Stunnel ist ein praktisches Tool zum Erstellen von TLS-Tunneln und zum Herstellen sicherer Verbindungen zu Remoteservern. Dies ist besonders in Fällen nützlich, in denen der sichere Transport von Informationen zwischen Maschinen von entscheidender Bedeutung ist, wie bei einer entfernten Datenbank.

Von hier aus können Sie Redis erkunden und in Ihre nächste Anwendung integrieren. Wenn Sie neu in der Arbeit mit Redis sind, finden Sie unsere Serie zuHow To Manage a Redis Databasemöglicherweise hilfreich.