So sichern Sie Ihre Redis-Installation unter Ubuntu 18.04

Einführung

Redis ist ein speicherinterner NoSQL-Schlüsselwert-Cache und -Speicher, der auch auf der Festplatte gespeichert werden kann. Es wurde für die Verwendung durchtrusted clients intrusted environment entwickelt, ohne eigene robuste Sicherheitsfunktionen. Um diesen Punkt zu unterstreichen, hier ein Zitat ausofficial Redis website:

Auf Redis können vertrauenswürdige Clients in vertrauenswürdigen Umgebungen zugreifen. Dies bedeutet, dass es normalerweise keine gute Idee ist, die Redis-Instanz direkt dem Internet oder im Allgemeinen einer Umgebung auszusetzen, in der nicht vertrauenswürdige Clients direkt auf den Redis-TCP-Port oder den UNIX-Socket zugreifen können.

Im Allgemeinen ist Redis nicht für maximale Sicherheit optimiert, sondern für maximale Leistung und Einfachheit.

Trotzdem sind in Redis einige grundlegende Sicherheitsfunktionen integriert. Dazu gehören die Möglichkeit, ein unverschlüsseltes Kennwort zu erstellen, und die Freiheit, Befehle umzubenennen und zu deaktivieren. Insbesondere fehlt ein echtes Zugangskontrollsystem.

Diese Funktionen allein können die Sicherheit Ihrer Redis-Installation nicht gewährleisten. Ihre Konfiguration ist jedoch noch ein großer Schritt, nachdem Ihre Datenbank vollständig ungesichert ist.

In diesem Lernprogramm erfahren Sie, wie Sie die wenigen Sicherheitsfunktionen von Redis konfigurieren und einige Änderungen an der Systemkonfiguration vornehmen, um die Sicherheit einer eigenständigen Redis-Installation auf einem Ubuntu-Server zu verbessern.

Beachten Sie, dass dieses Handbuch nicht Situationen behandelt, in denen sich der Redis-Server und die Client-Anwendungen auf unterschiedlichen Hosts oder in unterschiedlichen Rechenzentren befinden. Installationen, bei denen Redis-Verkehr ein unsicheres oder nicht vertrauenswürdiges Netzwerk durchlaufen muss, erfordern zusätzlich zu den hier angegebenen Konfigurationen völlig andere Konfigurationen, z. B. das Einrichten eines SSL-Proxys oder einesVPNzwischen den Redis-Computern.

Voraussetzungen

Für dieses Tutorial benötigen Sie:

[[Schritt 1 - Überprüfen, ob Redis ausgeführt wird]] == Schritt 1 - Überprüfen, ob Redis ausgeführt wird

Zuerst müssen Sie mit Ihrem Nicht-Root-Benutzer SSH auf Ihrem Server ausführen.

Um zu überprüfen, ob Redis funktioniert, öffnen Sie eine Redis-Befehlszeile mit dem Befehlredis-cli:

redis-cli

[.Hinweis]##

Note: Wenn Sie bereits ein Kennwort für Redis festgelegt haben, müssen Sie sich nach dem Herstellen der Verbindung mit dem Befehlauth authentifizieren:

auth your_redis_password
OutputOK

Wenn Sie kein Kennwort für Redis festgelegt haben, können Sie in Schritt 4 dieses Lernprogramms nachlesen, wie das geht.

Testen Sie die Verbindung mit dem Befehlping:

ping

Wenn Redis ordnungsgemäß funktioniert, wird Folgendes angezeigt:

OutputPONG

Beenden Sie anschließend die Redis-Befehlszeile:

quit

Nachdem Sie bestätigt haben, dass Redis ausgeführt wird und ordnungsgemäß funktioniert, können Sie mit dem wichtigsten Schritt fortfahren, um die Sicherheit Ihres Servers zu verbessern: Konfigurieren einer Firewall.

[[Schritt 2 - Sichern des Servers mit ufw]] == Schritt 2 - Sichern des Servers mit UFW

Redis ist nur eine Anwendung, die auf Ihrem Server ausgeführt wird. Da es nur wenige grundlegende Sicherheitsfunktionen besitzt, müssen Sie zunächst den Server sichern, auf dem es ausgeführt wird. Bei einem öffentlich zugänglichen Server wie Ihrem Ubuntu 18.04-Server ist die Konfiguration einer Firewall wie inInitial Server Setup Guide for Ubuntu 18.04beschrieben der erste Schritt. Follow that link and set up your firewall now if you haven’t already done so.

Wenn Sie nicht sicher sind, ob Sie eine Firewall eingerichtet haben oder ob diese aktiv ist, können Sie dies folgendermaßen überprüfen:

sudo ufw status

Wenn Sie das Handbuch zur Ersteinrichtung des Servers für Ubuntu 18.04 befolgt haben, wird die folgende Ausgabe angezeigt:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Wenn Sie die Firewall-Regeln mithilfe dieses Handbuchs implementiert haben, müssen Sie keine zusätzliche Regel für Redis hinzufügen, da UFW standardmäßig den gesamten eingehenden Datenverkehr löscht, sofern dies nicht ausdrücklich gestattet ist. Da eine eigenständige Standardinstallation des Redis-Servers nur die Loopback-Schnittstelle (127.0.0.1 oderlocalhost) überwacht, sollte es keine Bedenken hinsichtlich des eingehenden Datenverkehrs an seinem Standardport geben.

Weitere Informationen zum Hinzufügen von Regeln finden Sie inguide on common UFW rules and commands.

[[Schritt 3 - Bindung an den lokalen Host]] == Schritt 3 - Bindung an den lokalen Host

Standardmäßig ist Redis nur überlocalhost zugänglich. Wenn Sie jedoch ein anderes als das im Abschnitt "Voraussetzungen" angegebene Lernprogramm zur Konfiguration von Redis verwendet haben, haben Sie möglicherweise die Konfigurationsdatei aktualisiert, um Verbindungen von jedem Ort aus zuzulassen. Dies ist nicht so sicher wie die Bindung anlocalhost.

Öffnen Sie die Redis-Konfigurationsdatei zum Bearbeiten:

sudo nano /etc/redis/redis.conf

Suchen Sie diese Zeile und stellen Sie sicher, dass sie nicht kommentiert ist (entfernen Sie die#, falls vorhanden):

/etc/redis/redis.conf

bind 127.0.0.1

Speichern und schließen Sie die Datei, wenn Sie fertig sind (drücken SieCTRL + X,Y, dannENTER).

Starten Sie dann den Dienst neu, um sicherzustellen, dass systemd Ihre Änderungen liest:

sudo systemctl restart redis

Führen Sie den folgenden Befehlnetstataus, um zu überprüfen, ob diese Änderung wirksam wurde:

sudo netstat -lnp | grep redis
Outputtcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      2855/redis-server 1

Diese Ausgabe zeigt, dass das Programmredis-server anlocalhost (127.0.0.1) gebunden ist, was die Änderung widerspiegelt, die Sie gerade an der Konfigurationsdatei vorgenommen haben. Wenn in dieser Spalte eine andere IP-Adresse angezeigt wird (z. B.0.0.0.0), sollten Sie überprüfen, ob Sie die richtige Zeile auskommentiert haben, und den Redis-Dienst erneut starten.

Da Ihre Redis-Installation nurlocalhost abhört, ist es für böswillige Akteure schwieriger, Anforderungen zu stellen oder Zugriff auf Ihren Server zu erhalten. Derzeit verlangt Redis jedoch nicht, dass Benutzer sich authentifizieren, bevor sie Änderungen an der Konfiguration oder den darin enthaltenen Daten vornehmen. Um dies zu beheben, können Sie von Redis verlangen, dass Benutzer sich mit einem Kennwort authentifizieren, bevor sie Änderungen über den Redis-Client (redis-cli) vornehmen.

[[Schritt-4 - Konfigurieren eines Redis-Passworts]] == Schritt 4 - Konfigurieren eines Redis-Passworts

Durch das Konfigurieren eines Redis-Kennworts wird eine der beiden integrierten Sicherheitsfunktionen aktiviert - der Befehlauth, bei dem sich Clients authentifizieren müssen, um auf die Datenbank zugreifen zu können. Das Kennwort wird direkt in der Redis-Konfigurationsdatei/etc/redis/redis.conf konfiguriert. Öffnen Sie diese Datei daher erneut mit Ihrem bevorzugten Editor:

sudo nano /etc/redis/redis.conf

Scrollen Sie zum AbschnittSECURITY und suchen Sie nach einer kommentierten Anweisung, die lautet:

/etc/redis/redis.conf

# requirepass foobared

Kommentieren Sie es aus, indem Sie# entfernen undfoobared in ein sicheres Kennwort ändern.

[.Hinweis]##

Note: Über der Anweisungrequirepass in der Dateiredis.conf befindet sich eine kommentierte Warnung:

/etc/redis/redis.conf

# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#

Daher ist es wichtig, dass Sie einen sehr starken und sehr langen Wert als Kennwort angeben. Anstatt selbst ein Passwort zu erstellen, können Sie den Befehlopenssl verwenden, um ein zufälliges zu generieren, wie im folgenden Beispiel. Die Pipe zum zweiten Befehlopenssl entfernt alle Zeilenumbrüche, die vom ersten Befehl ausgegeben werden:

openssl rand 60 | openssl base64 -A

Ihre Ausgabe sollte ungefähr so ​​aussehen:

OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Nach dem Kopieren und Einfügen der Ausgabe dieses Befehls als neuen Wert fürrequirepass sollte Folgendes lauten:

/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Speichern Sie nach dem Festlegen des Kennworts die Datei und starten Sie Redis neu:

sudo systemctl restart redis.service

Um zu testen, ob das Passwort funktioniert, greifen Sie auf die Redis-Befehlszeile zu:

redis-cli

Im Folgenden wird eine Befehlsfolge gezeigt, mit der getestet wird, ob das Redis-Kennwort funktioniert. Der erste Befehl versucht, vor der Authentifizierung einen Schlüssel auf einen Wert zu setzen:

set key1 10

Dies funktioniert nicht, da 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 in der Redis-Konfigurationsdatei angegebenen Passwort:

auth your_redis_password

Redis erkennt an:

OutputOK

Danach kann der vorherige Befehl erneut ausgeführt werden:

set key1 10
OutputOK

get key1 fragt Redis nach dem Wert des neuen Schlüssels ab.

get key1
Output"10"

Nachdem Sie bestätigt haben, dass Sie nach der Authentifizierung Befehle im Redis-Client ausführen können, können Sieredis-cli beenden:

quit

Als nächstes betrachten wir das Umbenennen von Redis-Befehlen, die, wenn sie versehentlich oder von einem böswilligen Akteur eingegeben werden, ernsthafte Schäden an Ihrem Computer verursachen können.

[[Schritt-5 - Umbenennen von gefährlichen Befehlen]] == Schritt 5 - Umbenennen gefährlicher Befehle

Die andere in Redis integrierte Sicherheitsfunktion umfasst das Umbenennen oder vollständige Deaktivieren bestimmter Befehle, die als gefährlich eingestuft werden.

Wenn diese Befehle versehentlich oder von nicht autorisierten Benutzern ausgeführt werden, können sie verwendet werden, um Ihre Daten neu zu konfigurieren, zu zerstören oder auf andere Weise zu löschen. Wie das Authentifizierungskennwort wird das Umbenennen oder Deaktivieren von Befehlen im selben AbschnittSECURITYder Datei/etc/redis/redis.confkonfiguriert.

Einige der Befehle, die als gefährlich eingestuft werden, umfassen:FLUSHDB,FLUSHALL,KEYS,PEXPIRE,DEL,CONFIG,SHUTDOWN,BGREWRITEAOF,BGSAVE,SAVE,SPOP,SREM,RENAME undDEBUG. Dies ist keine umfassende Liste, aber das Umbenennen oder Deaktivieren aller Befehle in dieser Liste ist ein guter Ausgangspunkt für die Verbesserung der Sicherheit Ihres Redis-Servers.

Ob Sie einen Befehl deaktivieren oder umbenennen sollten, hängt von Ihren spezifischen Anforderungen oder denen Ihrer Site ab. Wenn Sie wissen, dass Sie niemals einen Befehl verwenden werden, der missbraucht werden könnte, können Sie ihn deaktivieren. Andernfalls kann es in Ihrem Interesse sein, es umzubenennen.

Öffnen Sie die Konfigurationsdatei erneut, um die Redis-Befehle zu aktivieren oder zu deaktivieren:

sudo nano  /etc/redis/redis.conf

[.warning] #Warning: Die folgenden Schritte zum Deaktivieren und Umbenennen von Befehlen sind Beispiele. Sie sollten nur die für Sie sinnvollen Befehle deaktivieren oder umbenennen. Sie können die vollständige Liste der Befehle selbst überprüfen und feststellen, wie sie beiredis.io/commands.
# missbraucht werden können.

Um einen Befehl zu deaktivieren, benennen Sie ihn einfach in eine leere Zeichenfolge um (gekennzeichnet durch ein Paar Anführungszeichen ohne andere Zeichen dazwischen), wie unten gezeigt:

/etc/redis/redis.conf

. . .
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
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:

/etc/redis/redis.conf

. . .
rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .

Speichern Sie Ihre Änderungen und schließen Sie die Datei.

Übernehmen Sie nach dem Umbenennen eines Befehls die Änderung, indem Sie Redis neu starten:

sudo systemctl restart redis.service

Geben Sie die Redis-Befehlszeile ein, um den neuen Befehl zu testen:

redis-cli

Als nächstes authentifizieren Sie:

auth your_redis_password
OutputOK

Nehmen wir an, Sie haben den BefehlCONFIG wie im vorherigen Beispiel inASC12_CONFIG umbenannt. Versuchen Sie zunächst, den ursprünglichen BefehlCONFIG zu verwenden. Es sollte fehlschlagen, da Sie es umbenannt haben:

config get requirepass
Output(error) ERR unknown command 'config'

Das Aufrufen des umbenannten Befehls ist jedoch erfolgreich. Es wird nicht zwischen Groß- und Kleinschreibung unterschieden:

asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"

Schließlich können Sieredis-cli verlassen:

exit

Beachten Sie, dass Sie sich erneut authentifizieren müssen, wenn Sie bereits die Redis-Befehlszeile verwenden und anschließend Redis neu starten. Andernfalls wird dieser Fehler angezeigt, wenn Sie einen Befehl eingeben:

OutputNOAUTH Authentication required.

[.Warnung]##

In Bezug auf die Praxis des Umbenennens von Befehlen befindet sich am Ende des AbschnittsSECURITYin/etc/redis/redis.conf ein Warnhinweis mit der Aufschrift:

Please note that changing the name of commands that are logged into the AOF file or transmitted to slaves may cause problems.

Hinweis: Das Redis-Projekt verwendet die Begriffe "Master" und "Slave", während DigitalOcean im Allgemeinen die Alternativen "primär" und "sekundär" bevorzugt. Um Verwirrung zu vermeiden, haben wir uns dafür entschieden, die in der Redis-Dokumentation verwendeten Begriffe zu verwenden.

Das heißt, wenn sich der umbenannte Befehl nicht in der AOF-Datei befindet oder die AOF-Datei nicht an Slaves übertragen wurde, sollte es kein Problem geben.

Denken Sie also daran, wenn Sie versuchen, Befehle umzubenennen. Die beste Zeit zum Umbenennen eines Befehls ist, wenn Sie keine AOF-Persistenz verwenden oder direkt nach der Installation, d. H. Bevor Ihre Redis-using-Anwendung bereitgestellt wurde.

Wenn Sie AOF verwenden und mit einer Master-Slave-Installation arbeiten, sollten Siethis answer from the project’s GitHub issue page berücksichtigen. Das Folgende ist eine Antwort auf die Frage des Autors:

Die Befehle werden in der AOF protokolliert und auf dieselbe Weise wie beim Senden an den Slave repliziert. Wenn Sie also versuchen, die AOF auf einer Instanz abzuspielen, die nicht dieselbe Umbenennung aufweist, können Inkonsistenzen auftreten, da der Befehl nicht ausgeführt werden kann ( Gleiches gilt für Sklaven.

Der beste Weg, um das Umbenennen in solchen Fällen zu handhaben, besteht darin, sicherzustellen, dass umbenannte Befehle auf alle Instanzen in Master-Slave-Installationen angewendet werden.

Fazit

Denken Sie daran, dass es sehr einfach ist, die von uns eingerichteten Redis-spezifischen Sicherheitsfunktionen zu umgehen, sobald sich jemand bei Ihrem Server angemeldet hat. Das wichtigste Sicherheitsmerkmal ist daher Ihre Firewall, die es böswilligen Akteuren extrem schwer macht, über diesen Zaun zu springen.

Wenn Sie versuchen, die Redis-Kommunikation über ein nicht vertrauenswürdiges Netzwerk zu sichern, müssen Sie einen SSL-Proxy verwenden, wie von den Redis-Entwicklern inofficial Redis security guideempfohlen.