Einführung
Redis ist ein In-Memory-Key-Value-Store, der für seine Flexibilität, Leistung und breite Sprachenunterstützung bekannt ist. Dieses Tutorial zeigt, wie man Redis auf einem Ubuntu 22.04 Server installiert, konfiguriert und absichert.
Voraussetzungen
Um diesen Leitfaden abzuschließen, benötigen Sie Zugriff auf einen Ubuntu 22.04 Server, der über einen Nicht-Root-Benutzer mit sudo
-Berechtigungen und eine Firewall konfiguriert mit ufw
verfügt. Sie können dies einrichten, indem Sie unserem Initial Server Setup-Leitfaden für Ubuntu 22.04 folgen.
Schritt 1 – Redis installieren und konfigurieren
Wir werden den APT-Paketmanager verwenden, um Redis aus den offiziellen Ubuntu-Repositories zu installieren. Zum Zeitpunkt dieser Abfassung ist die verfügbare Version in den Standard-Repositories 6.0.16.
Beginnen Sie damit, Ihren lokalen apt
-Paketcache zu aktualisieren:
Dann installieren Sie Redis, indem Sie folgendes eingeben:
Dies lädt Redis und seine Abhängigkeiten herunter und installiert sie. Anschließend gibt es eine wichtige Konfigurationsänderung, die in der Redis-Konfigurationsdatei vorgenommen werden muss, die automatisch während der Installation generiert wurde.
Öffnen Sie diese Datei mit Ihrem bevorzugten Texteditor:
In der Datei suchen Sie die supervised
-Anweisung. Diese Anweisung ermöglicht es Ihnen, ein Init-System zu deklarieren, um Redis als Dienst zu verwalten und Ihnen mehr Kontrolle über seinen Betrieb zu geben. Die supervised
-Anweisung ist standardmäßig auf no
eingestellt. Da Sie Ubuntu verwenden, das das systemd-Init-System verwendet, ändern Sie dies auf systemd
:
. . .
# Wenn Sie Redis von upstart oder systemd ausführen, kann Redis mit Ihrem
# Überwachungsbaum interagieren. Optionen:
# supervised no - keine Überwachungsinteraktion
# supervised upstart - signalisieren Sie upstart, indem Sie Redis in den SIGSTOP-Modus versetzen
# supervised systemd - signalisieren Sie systemd, indem Sie READY=1 in $NOTIFY_SOCKET schreiben
# supervised auto - Erkennung der Methode upstart oder systemd basierend auf
# UPSTART_JOB oder NOTIFY_SOCKET Umgebungsvariablen
# Hinweis: Diese Überwachungsmethoden signalisieren nur "Prozess ist bereit."
# Sie aktivieren keine kontinuierlichen Lebensfähigkeitsprüfungen zurück an Ihren Überwacher.
supervised systemd
. . .
Das ist die einzige Änderung, die Sie an der Redis-Konfigurationsdatei vornehmen müssen. Speichern Sie sie und schließen Sie sie, wenn Sie fertig sind. Wenn Sie die Datei mit nano
bearbeitet haben, tun Sie dies, indem Sie STRG + X
, Y
und dann ENTER
drücken.
Dann starten Sie den Redis-Dienst neu, um die Änderungen an der Konfigurationsdatei zu übernehmen:
Damit haben Sie Redis installiert und konfiguriert, und es läuft auf Ihrem Rechner. Bevor Sie es jedoch verwenden, ist es ratsam, zuerst zu überprüfen, ob Redis ordnungsgemäß funktioniert.
Schritt 2 — Redis testen
Wie bei jeder neu installierten Software ist es eine gute Idee, sicherzustellen, dass Redis wie erwartet funktioniert, bevor weitere Änderungen an der Konfiguration vorgenommen werden. In diesem Schritt werden wir einige Möglichkeiten durchgehen, um zu überprüfen, ob Redis ordnungsgemäß funktioniert.
Beginnen Sie damit, zu überprüfen, ob der Redis-Dienst läuft:
Wenn er ohne Fehler läuft, wird dieser Befehl eine Ausgabe ähnlich der folgenden erzeugen:
Output● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-04-20 20:40:52 UTC; 4s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Main PID: 2899 (redis-server)
Status: "Ready to accept connections"
Tasks: 5 (limit: 2327)
Memory: 2.5M
CPU: 65ms
CGroup: /system.slice/redis-server.service
└─2899 "/usr/bin/redis-server 127.0.0.1:6379
. . .
Diese Ausgabe zeigt an, dass Redis läuft und bereits aktiviert ist, was bedeutet, dass es so eingestellt ist, dass es jedes Mal startet, wenn der Server hochfährt.
Hinweis: Diese Einstellung ist für viele gängige Anwendungsfälle von Redis wünschenswert. Wenn Sie jedoch bevorzugen, Redis manuell jedes Mal zu starten, wenn Ihr Server hochfährt, können Sie dies mit dem folgenden Befehl konfigurieren:
Um zu testen, ob Redis ordnungsgemäß funktioniert, verbinden Sie sich mit dem Server über redis-cli
, dem Befehlszeilenclient von Redis:
In der anschließenden Eingabeaufforderung testen Sie die Konnektivität mit dem Befehl ping
:
OutputPONG
Dieser Output bestätigt, dass die Serververbindung noch aktiv ist. Überprüfen Sie als nächstes, ob Sie Schlüssel setzen können, indem Sie folgenden Befehl ausführen:
OutputOK
Holen Sie den Wert ab, indem Sie Folgendes eingeben:
Vorausgesetzt, alles funktioniert, sollten Sie den gespeicherten Wert abrufen können:
Output"It's working!"
Nach Bestätigung, dass Sie den Wert abrufen können, verlassen Sie die Redis-Eingabeaufforderung, um zur Shell zurückzukehren:
Als abschließenden Test werden wir überprüfen, ob Redis in der Lage ist, Daten auch nach dem Stoppen oder Neustarten zu speichern. Dazu starten Sie zunächst die Redis-Instanz neu:
Dann verbinden Sie sich erneut mit dem Befehlszeilenclient:
Und bestätigen, dass Ihr Testwert immer noch verfügbar ist:
Der Wert Ihres Schlüssels sollte immer noch zugänglich sein:
Output"It's working!"
Verlassen Sie die Shell erneut, wenn Sie fertig sind:
Mit diesen Schritten ist Ihre Redis-Installation voll funktionsfähig und bereit für den Einsatz. Einige der Standardkonfigurationseinstellungen sind jedoch unsicher und bieten böswilligen Akteuren Möglichkeiten, Ihren Server und dessen Daten anzugreifen und darauf zuzugreifen. Die verbleibenden Schritte in diesem Tutorial behandeln Methoden zur Minderung dieser Schwachstellen, wie sie von der offiziellen Redis-Website empfohlen werden. Obwohl diese Schritte optional sind und Redis weiterhin funktioniert, wenn Sie sich dafür entscheiden, sie nicht auszuführen, wird dringend empfohlen, sie abzuschließen, um die Sicherheit Ihres Systems zu erhöhen.
Schritt 3 — Binden an localhost
Standardmäßig ist Redis nur von localhost aus zugänglich. Wenn Sie jedoch Redis gemäß einer anderen Anleitung als dieser installiert und konfiguriert haben, haben Sie möglicherweise die Konfigurationsdatei aktualisiert, um Verbindungen von überall zuzulassen. Dies ist nicht so sicher wie das Binden an localhost.
Um dies zu korrigieren, öffnen Sie die Redis-Konfigurationsdatei zum Bearbeiten:
Suchen Sie diese Zeile und stellen Sie sicher, dass sie nicht auskommentiert ist (entfernen Sie das #
, wenn es existiert):
. . .
bind 127.0.0.1 ::1
. . .
Speichern und schließen Sie die Datei, wenn Sie fertig sind (drücken Sie STRG + X
, dann Y
und ENTER
).
Dann starten Sie den Dienst neu, um sicherzustellen, dass systemd Ihre Änderungen liest:
Um zu überprüfen, ob diese Änderung wirksam geworden ist, führen Sie den folgenden netstat
-Befehl aus:
Outputtcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server
tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server
Hinweis: Der netstat
-Befehl ist möglicherweise nicht standardmäßig auf Ihrem System verfügbar. In diesem Fall können Sie ihn (zusammen mit einer Reihe anderer nützlicher Netzwerktools) mit dem folgenden Befehl installieren:
Dies zeigt, dass das Programm redis-server
an localhost gebunden ist (127.0.0.1
), was die von Ihnen gerade vorgenommene Änderung in der Konfigurationsdatei widerspiegelt. Wenn eine andere IP-Adresse in dieser Spalte angezeigt wird (0.0.0.0
zum Beispiel), sollten Sie sicherstellen, dass Sie die richtige Zeile nicht auskommentiert haben, und den Redis-Dienst erneut starten.
Nun, da Ihre Redis-Installation nur auf localhost lauscht, wird es für bösartige Akteure schwieriger sein, Anfragen zu stellen oder Zugriff auf Ihren Server zu erhalten. Redis ist jedoch derzeit nicht so eingestellt, dass Benutzer sich authentifizieren müssen, bevor sie Änderungen an seiner Konfiguration oder den von ihm gehaltenen Daten vornehmen können. Um dies zu beheben, können Sie Redis so konfigurieren, dass Benutzer sich mit einem Passwort authentifizieren müssen, bevor sie Änderungen über den Redis-Client (redis-cli
) vornehmen können.
Schritt 4 — Konfiguration eines Redis-Passworts
Die Konfiguration eines Redis-Passworts ermöglicht eine der beiden integrierten Sicherheitsfunktionen — den Befehl auth
, der von Clients eine Authentifizierung erfordert, um auf die Datenbank zuzugreifen. Das Passwort wird direkt in der Redis-Konfigurationsdatei, /etc/redis/redis.conf
, konfiguriert. Öffnen Sie daher diese Datei erneut mit Ihrem bevorzugten Editor:
Scrollen Sie zum Abschnitt SECURITY
und suchen Sie eine auskommentierte Direktive, die lautet:
. . .
# requirepass foobared
. . .
Entkommentieren Sie sie, indem Sie das #
entfernen, und ändern Sie foobared
in ein sicheres Passwort.
Hinweis: Über der Direktive requirepass
in der Datei redis.conf
gibt es eine auskommentierte Warnung:
. . .
# Achtung: Da Redis ziemlich schnell ist, kann ein externer Benutzer bis zu
150.000 Passwörter pro Sekunde gegen eine gute Box ausprobieren. Das bedeutet, dass Sie
ein sehr starkes Passwort verwenden sollten, da es sonst sehr einfach zu knacken ist.
#
. . .
Es ist daher wichtig, dass Sie einen sehr starken und sehr langen Wert als Ihr Passwort angeben. Anstatt ein Passwort selbst zu erstellen, können Sie den openssl
-Befehl verwenden, um ein zufälliges Passwort zu generieren, wie im folgenden Beispiel gezeigt. Indem Sie die Ausgabe des ersten Befehls an den zweiten openssl
-Befehl leiten, wie hier gezeigt, werden alle Zeilenumbrüche entfernt, die durch den ersten Befehl erzeugt wurden:
Dieser Befehl gibt eine Ausgabe wie folgt zurück:
OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Nachdem Sie die Ausgabe dieses Befehls als neuen Wert für requirepass
kopiert und eingefügt haben, sollte es wie folgt lauten:
/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Nachdem Sie das Passwort festgelegt haben, speichern Sie die Datei und schließen Sie sie. Starten Sie dann Redis neu:
Um zu testen, ob das Passwort funktioniert, öffnen Sie den Redis-Client:
Die folgende Sequenz von Befehlen zeigt, wie getestet wird, ob das Redis-Passwort funktioniert. Der erste Befehl versucht, einen Schlüssel auf einen Wert zu setzen, bevor eine Authentifizierung erfolgt:
Das wird nicht funktionieren, weil Sie sich nicht authentifiziert haben, daher gibt Redis einen Fehler zurück:
Output(error) NOAUTH Authentication required.
Der nächste Befehl authentifiziert sich mit dem im Redis-Konfigurationsfile angegebenen Passwort:
Redis bestätigt:
OutputOK
Danach wird der vorherige Befehl erfolgreich ausgeführt:
OutputOK
get key1
fragt Redis nach dem Wert des neuen Schlüssels.
Output"10"
Nach Bestätigung, dass Sie Befehle im Redis-Client nach der Authentifizierung ausführen können, können Sie redis-cli
beenden:
Als nächstes werden wir die Umbenennung von Redis-Befehlen durchgehen, die bei versehentlichem Eingeben oder durch einen bösartigen Akteur ernsthafte Auswirkungen auf Ihre Daten haben könnten.
Schritt 5 — Umbenennung gefährlicher Befehle
Das andere Sicherheitsmerkmal, das in Redis integriert ist, beinhaltet das Umbenennen oder vollständige Deaktivieren bestimmter Befehle, die als gefährlich betrachtet werden.
Wenn sie von nicht autorisierten Benutzern ausgeführt werden, können solche Befehle verwendet werden, um Ihre Daten neu zu konfigurieren, zu zerstören oder anderweitig zu löschen. Wie das Authentifizierungspasswort wird das Umbenennen oder Deaktivieren von Befehlen im gleichen SECURITY
-Abschnitt der Datei /etc/redis/redis.conf
konfiguriert.
Einige der als gefährlich betrachteten Befehle sind: FLUSHDB
, FLUSHALL
, KEYS
, PEXPIRE
, DEL
, CONFIG
, SHUTDOWN
, BGREWRITEAOF
, BGSAVE
, SAVE
, SPOP
, SREM
, RENAME
und DEBUG
. Dies ist keine umfassende Liste, aber das Umbenennen oder Deaktivieren aller Befehle in dieser Liste ist ein guter Ausgangspunkt zur Verbesserung der Sicherheit Ihres Redis-Servers.
Ob Sie einen Befehl deaktivieren oder umbenennen sollten, hängt von Ihren spezifischen Anforderungen oder denen Ihrer Website ab. Wenn Sie wissen, dass Sie einen Befehl, der missbraucht werden könnte, niemals verwenden werden, können Sie ihn deaktivieren. Andernfalls ist es möglicherweise am besten, ihn umzubenennen.
Um Redis-Befehle umzubenennen oder zu deaktivieren, öffnen Sie erneut die Konfigurationsdatei:
Warnung: Die folgenden Schritte zur Deaktivierung und Umbenennung von Befehlen sind Beispiele. Sie sollten nur die Befehle deaktivieren oder umbenennen, die für Sie sinnvoll sind. Sie können die vollständige Liste der Befehle selbst überprüfen und feststellen, wie sie missbraucht werden könnten unter redis.io/commands.
Um einen Befehl zu deaktivieren, benennen Sie ihn in einen leeren String um (durch ein Paar Anführungszeichen ohne Zeichen dazwischen angezeigt), wie unten gezeigt:
. . .
# Es ist auch möglich, einen Befehl vollständig zu deaktivieren, indem man ihn in
# einen leeren String umbenennt:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .
Um einen Befehl umzubenennen, geben Sie ihm einen anderen Namen, wie in den folgenden Beispielen gezeigt. Umbenannte Befehle sollten für andere schwer zu erraten sein, aber für Sie leicht zu merken:
. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .
Speichern Sie Ihre Änderungen und schließen Sie die Datei.
Nachdem Sie einen Befehl umbenannt haben, wenden Sie die Änderung an, indem Sie Redis neu starten:
Um den neuen Befehl zu testen, geben Sie die Redis-Befehlszeile ein:
Dann authentifizieren Sie sich:
OutputOK
Annehmen, Sie haben den Befehl CONFIG
in ASC12_CONFIG
umbenannt, wie im vorherigen Beispiel gezeigt. Versuchen Sie zuerst, den originalen CONFIG
-Befehl zu verwenden. Er sollte fehlschlagen, weil Sie ihn umbenannt haben:
Output(error) ERR unknown command `config`, with args beginning with:
Das Aufrufen des umbenannten Befehls wird jedoch erfolgreich sein. Es ist nicht auf Groß- und Kleinschreibung sensitive:
Output1) "requirepass"
2) "your_redis_password"
Zum Schluss können Sie redis-cli
verlassen:
Beachten Sie, dass Sie, wenn Sie bereits die Redis-Befehlszeile verwenden und dann Redis neu starten, sich erneut authentifizieren müssen. Andernfalls erhalten Sie diesen Fehler, wenn Sie einen Befehl eingeben:
OutputNOAUTH Authentication required.
Warnung: In Bezug auf die Praxis, Befehle umzubenennen, gibt es eine warnende Aussage am Ende des Abschnitts SECURITY
in /etc/redis/redis.conf
, die lautet:
. . .
# Bitte beachten Sie, dass das Ändern des Namens von Befehlen, die in die
# AOF-Datei protokolliert oder an Replikate übertragen werden, Probleme verursachen kann.
. . .
Hinweis: Das Redis-Projekt verwendet die Begriffe „Master“ und „Slave“, während DigitalOcean im Allgemeinen die Alternativen „Primary“ und „Secondary“ bevorzugt. Um Verwirrung zu vermeiden, haben wir uns entschieden, hier die im Redis-Handbuch verwendeten Begriffe zu verwenden.
Das bedeutet, dass es keine Probleme geben sollte, wenn der umbenannte Befehl nicht in der AOF-Datei enthalten ist oder wenn er es ist, aber die AOF-Datei nicht an die Replikate übertragen wurde.
Also, behalten Sie das im Hinterkopf, wenn Sie versuchen, Befehle umzubenennen. Der beste Zeitpunkt, um einen Befehl umzubenennen, ist, wenn Sie keine AOF-Persistenz verwenden, oder kurz nach der Installation, d.h. bevor Ihre Redis-Anwendung bereitgestellt wurde.
Wenn Sie AOF verwenden und eine Master-Slave-Installation haben, sollten Sie diese Antwort auf der GitHub-Issue-Seite des Projekts in Betracht ziehen. Die folgende Antwort bezieht sich auf die Frage des Autors:
Die Befehle werden im AOF protokolliert und genauso repliziert, wie sie gesendet werden. Wenn Sie also versuchen, den AOF auf einer Instanz wiederzugeben, die nicht dieselbe Umbenennung hat, können Inkonsistenzen auftreten, da der Befehl nicht ausgeführt werden kann (das gilt auch für Slaves).
Daher ist der beste Weg, Umbenennungen in solchen Fällen zu behandeln, sicherzustellen, dass umbenannte Befehle auf allen Instanzen in Master-Slave-Installationen angewendet werden.
Fazit
In diesem Tutorial haben Sie Redis installiert und konfiguriert, validiert, dass Ihre Redis-Installation korrekt funktioniert, und seine integrierten Sicherheitsfunktionen genutzt, um sie weniger anfällig für Angriffe von bösartigen Akteuren zu machen.
Beachten Sie, dass es, sobald sich jemand auf Ihrem Server angemeldet hat, sehr einfach ist, die Redis-spezifischen Sicherheitsfunktionen zu umgehen, die wir implementiert haben. Daher ist die wichtigste Sicherheitsfunktion auf Ihrem Redis-Server Ihre Firewall (die Sie konfiguriert haben, wenn Sie dem Voraussetzungen-Initial Server Setup-Tutorial gefolgt sind), da dies es bösartigen Akteuren äußerst schwer macht, diese Barriere zu überwinden.
Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-22-04