So sichern Sie Ihre Redis-Installation unter Ubuntu 14.04

Einführung

Redis ist ein speicherinterner NoSQL-Schlüsselwert-Cache und -Speicher, der auch auf der Festplatte gespeichert werden kann.

Dieses Tutorial zeigt, wie die grundlegende Sicherheit für einen Redis-Server implementiert wird.

Beachten Sie jedoch, dass Redis für die Verwendung durchtrusted clients intrusted environment ohne eigene robuste Sicherheitsfunktionen konzipiert wurde. 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.

Leistung und Einfachheit ohne Sicherheit sind ein Rezept für eine Katastrophe. Auch die wenigen Sicherheitsmerkmale, die Redis hat, sind wirklich nichts, wovon man schwärmen muss. Dazu gehören: ein einfaches unverschlüsseltes Kennwort sowie das Umbenennen und Deaktivieren von Befehlen. Es fehlt ein echtes Zugangskontrollsystem.

Das Konfigurieren der vorhandenen Sicherheitsfunktionen ist jedoch noch ein großer Schritt nach oben, da Ihre Datenbank nicht gesichert ist.

In diesem Tutorial erfahren Sie, wie Sie die wenigen Sicherheitsfunktionen von Redis und einige andere Systemsicherheitsfunktionen konfigurieren, die die Sicherheit einer eigenständigen Redis-Installation unter Ubuntu 14.04 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:

  • Ein Ubuntu 14.04-Server mit einem hinzugefügten Sudo-Benutzer ausinitial server setup

  • Mitthis iptables guide konfigurierte iptables bis zum Schritt(Optional) Update Nameservers (wenn Sie den Nameserver-Konfigurationsteil nicht ausführen, funktioniert APT nicht). Nach der Konfiguration der Nameserver sind Sie fertig

  • Redis installiert und arbeitet mit Anweisungen aus der Nur-Master-Installation vonthis Redis guide bis zum SchrittStep 2 — Configure Redis Master

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

Melden Sie sich zuerst mit SSH bei Ihrem Server an:

ssh username@server-ip-address

Verwenden Sie die Redis-Befehlszeile, um zu überprüfen, ob Redis funktioniert. Der Befehlredis-cli wird verwendet, um auf die Redis-Befehlszeile zuzugreifen.

redis-cli

[.Hinweis]##

Wenn Sie bereits ein Passwort für Redis festgelegt haben, müssen Sie nach dem Herstellen der Verbindungauth eingeben.

auth your_redis_password

Ausgabe

OK

Testen Sie den Datenbankserver:

ping

Antwort:

Ausgabe

PONG

Ausgang:

quit

[[Schritt 2 - Sichern des Servers mit Iptables]] == Schritt 2 - Sichern des Servers mit Iptables

Wenn Sie die Voraussetzungen für iptables erfüllt haben, können Sie diesen Schritt überspringen. Oder Sie können es jetzt tun.

Redis ist nur eine Anwendung, die auf Ihrem Server ausgeführt wird. Da sie keine eigenen Sicherheitsfunktionen aufweist, müssen Sie zunächst den Server sichern, auf dem sie ausgeführt wird.

Bei einem öffentlich zugänglichen Server wie Ihrem Ubuntu 14.04-Server ist die Konfiguration einer Firewall gemäßthis iptables guide der erste Schritt. Follow that link and set up your firewall now.

Wenn Sie die Firewall-Regeln mithilfe dieses Handbuchs implementiert haben, müssen Sie keine zusätzliche Regel für Redis hinzufügen, da der gesamte eingehende Datenverkehr standardmäßig gelöscht wird, sofern dies nicht ausdrücklich gestattet ist. Da bei einer eigenständigen Standardinstallation von Redis Server nur die Loopback-Schnittstelle (127.0.0.1 oder localhost) überwacht wird, sollte der eingehende Datenverkehr auf dem Standardport keine Rolle spielen.

Wenn Sie eine IP-Adresse für Redis speziell zulassen müssen, können Sie überprüfen, welche IP-Adresse Redis abhört und an welchen Port es gebunden ist, indemgrepdie Ausgabe des Befehlsnetstat ausgibt. Die vierte Spalte -127.0.0.1:6379 hier - gibt die mit Redis verknüpfte Kombination aus IP-Adresse und Port an:

sudo netstat -plunt | grep -i redis

Ausgabe

tcp   0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      8562/redis-server 1

Stellen Sie sicher, dass diese IP-Adresse in Ihrer Firewall-Richtlinie zulässig ist. Weitere Informationen zum Hinzufügen von Regeln finden Sie iniptables basics article.

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

Standardmäßig kann auf den Redis-Server nur von localhost aus zugegriffen werden. Wenn Sie jedoch dem Lernprogramm zum Einrichten eines Redis-Masterservers gefolgt sind, haben Sie die Konfigurationsdatei aktualisiert, um Verbindungen von überall zuzulassen. Dies ist nicht so sicher wie die Bindung an localhost.

Ö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

Wir werden diese Datei weiterhin verwenden. Lassen Sie sie also vorerst geöffnet.

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

Wenn Sie Redis mit dem ArtikelHow To Configure a Redis Cluster on Ubuntu 14.04installiert haben, sollten Sie ein Kennwort dafür konfiguriert haben. Sie können jetzt nach eigenem Ermessen ein sichereres Kennwort erstellen, indem Sie diesem Abschnitt folgen. Wenn nicht, zeigen die Anweisungen in diesem Abschnitt, wie das Datenbankserverkennwort festgelegt wird.

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, die Sie im vorherigen Schritt noch geöffnet haben sollten.

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 auf einen sehr starken und sehr langen Wert ändern.

Anstatt selbst ein Passwort zu erstellen, können Sie ein Tool wieapg oderpwgen verwenden, um eines zu generieren. Wenn Sie keine Anwendung installieren möchten, nur um ein Kennwort zu generieren, können Sie den folgenden Einzeiler verwenden. Ändern Sie das Wort in Anführungszeichen, um ein anderes Kennwort als das generierte zu generieren.

echo "digital-ocean" | sha256sum

Ihre Ausgabe sollte ungefähr so ​​aussehen:

Ausgabe

960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

Obwohl das generierte Passwort nicht ausgesprochen werden kann, erhalten Sie ein sehr starkes und sehr langes Passwort. Dies ist genau die Art von Passwort, die für Redis erforderlich ist. Nach dem Kopieren und Einfügen der Ausgabe dieses Befehls als neuen Wert fürrequirepass sollte Folgendes lauten:

/etc/redis/redis.conf

requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

Wenn Sie ein kürzeres Kennwort bevorzugen, verwenden Sie stattdessen die Ausgabe des folgenden Befehls. Ändern Sie das Wort in Anführungszeichen, damit nicht dasselbe Kennwort wie das folgende generiert wird:

echo "digital-ocean" | sha1sum

Diesmal erhalten Sie eine etwas kürzere Ausgabe:

Ausgabe

10d9a99851a411cdae8c3fa09d7290df192441a9

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

sudo service redis-server restart

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

redis-cli

Die folgende Ausgabe zeigt eine Folge von Befehlen, mit denen geprüft wird, ob das Redis-Kennwort funktioniert. Der erste Befehl versucht, vor der Authentifizierung einen Schlüssel auf einen Wert zu setzen.

set key1 10

Das funktioniert nicht, daher gibt Redis einen Fehler zurück.

Ausgabe

(error) NOAUTH Authentication required.

Der zweite Befehl authentifiziert sich mit dem in der Redis-Konfigurationsdatei angegebenen Kennwort.

auth your_redis_password

Redis bestätigt.

Ausgabe

OK

Danach ist es erfolgreich, den vorherigen Befehl erneut auszuführen.

set key1 10

Ausgabe

OK

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

get key1

Ausgabe

"10"

Der letzte Befehl beendetredis-cli. Sie können auchexit verwenden:

quit

Als Nächstes betrachten wir das Umbenennen von Redis-Befehlen.

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

Mit der anderen in Redis integrierten Sicherheitsfunktion können Sie bestimmte Befehle, die als gefährlich eingestuft werden, umbenennen oder vollständig deaktivieren.

Wenn diese Befehle von nicht autorisierten Benutzern ausgeführt werden, können sie zum Neukonfigurieren, Zerstören oder sonstigen Löschen Ihrer Daten verwendet werden. Wie das Authentifizierungskennwort wird das Umbenennen oder Deaktivieren von Befehlen im selben AbschnittSECURITYder Datei/etc/redis/redis.confkonfiguriert.

Einige der Befehle, von denen bekannt ist, dass sie gefährlich sind, 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.

Ob Sie einen Befehl deaktivieren oder umbenennen, hängt von der jeweiligen Site ab. Wenn Sie wissen, dass Sie niemals einen Befehl verwenden, der missbraucht werden kann, können Sie ihn deaktivieren. Andernfalls benennen Sie es um.

Öffnen Sie zum Aktivieren oder Deaktivieren von Redis-Befehlen die Konfigurationsdatei erneut, um sie zu bearbeiten:

sudo nano  /etc/redis/redis.conf

These are examples. You should choose to disable or rename the commands that make sense for you. Sie können die Befehle selbst überprüfen und feststellen, wie sie beiredis.io/commands missbraucht werden können.

Um einen Befehl zu deaktivieren oder zu beenden, benennen Sie ihn einfach in einen leeren String um, 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. Umbenannte Befehle sollten für andere schwer zu erraten, für Sie jedoch leicht zu merken sein. Machen Sie sich das Leben nicht schwer.

/etc/redis/redis.conf

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

Speichern Sie Ihre Änderungen.

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

sudo service redis-server restart

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

redis-cli

Unter der Annahme, dass Sie den BefehlCONFIG inASC12_CONFIG umbenannt haben, zeigt die folgende Ausgabe, wie Sie testen, ob der neue Befehl angewendet wurde.

Nach der Authentifizierung:

auth your_redis_password

Ausgabe

OK

Der erste Versuch, den Befehlconfigzu verwenden, sollte fehlschlagen, da er umbenannt wurde.

config get requirepass

Ausgabe

(error) ERR unknown command 'config'

Das Aufrufen des umbenannten Befehls sollte erfolgreich sein (Groß- und Kleinschreibung wird nicht berücksichtigt):

asc12_config get requirepass

Ausgabe

1) "requirepass"
2) "your_redis_password"

Schließlich können Sieredis-cli verlassen:

exit

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

Ausgabe

NOAUTH Authentication required.

[.Warnung]##

In Bezug auf das Umbenennen von Befehlen befindet sich am Ende des AbschnittsSECURITY in/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.

Das heißt, wenn sich der umbenannte Befehl nicht in der AOF-Datei befindet oder wenn dies der Fall ist, aber 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 sich mit einer Master-Slave-Installation befassen, lesen Sie diese Antwort auf der GitHub-Seite des Projekts. 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.

[[Schritt-6 - Festlegen von Datenverzeichnis-Besitz- und Dateiberechtigungen]] == Schritt 6 - Festlegen von Datenverzeichnis-Besitz- und Dateiberechtigungen

In diesem Schritt werden einige Eigentums- und Berechtigungsänderungen berücksichtigt, die Sie vornehmen können, um das Sicherheitsprofil Ihrer Redis-Installation zu verbessern. Hierbei muss sichergestellt werden, dass nur der Benutzer, der auf Redis zugreifen muss, die Berechtigung zum Lesen seiner Daten hat. Dieser Benutzer ist standardmäßig der Benutzer vonredis.

Sie können dies überprüfen, indem Siegrepfür das Redis-Datenverzeichnis in einer langen Liste des übergeordneten Verzeichnisses eingeben. Der Befehl und seine Ausgabe sind unten angegeben.

ls -l /var/lib | grep redis

Ausgabe

drwxr-xr-x 2 redis   redis   4096 Aug  6 09:32 redis

Sie können sehen, dass das Redis-Datenverzeichnis dem Benutzerredisgehört und der Grupperedisekundären Zugriff gewährt. Dieser Teil ist gut.

Der Teil, der nicht ist, sind die Berechtigungen des Ordners (755). Um sicherzustellen, dass nur der Redis-Benutzer Zugriff auf den Ordner und seinen Inhalt hat, ändern Sie die Berechtigung auf 700:

sudo chmod 700 /var/lib/redis

Die andere Berechtigung, die Sie ändern sollten, ist die der Redis-Konfigurationsdatei. Standardmäßig hat es eine Dateiberechtigung von 644 und gehörtroot, wobei die Grupperoot sekundäres Eigentum besitzt:

ls -l /etc/redis/redis.conf

Ausgabe

-rw-r--r-- 1 root root 30176 Jan 14  2014 /etc/redis/redis.conf

Diese Berechtigung (644) ist weltweit lesbar, was keine gute Idee ist, da sie das in Schritt 4 konfigurierte unverschlüsselte Kennwort enthält.

Wir müssen den Besitz und die Berechtigungen ändern. Idealerweise sollte es dem Benutzer vonredisgehören, während der Benutzer vonrootdem Eigentümer gehört. Führen Sie dazu den folgenden Befehl aus:

sudo chown redis:root /etc/redis/redis.conf

Ändern Sie dann den Eigentümer, sodass nur der Eigentümer der Datei lesen und / oder schreiben kann:

sudo chmod 600 /etc/redis/redis.conf

Sie können den neuen Besitz und die neue Berechtigung überprüfen, indem Sie Folgendes verwenden:

ls -l /etc/redis/redis.conf

Ausgabe

total 40
-rw------- 1 redis root 29716 Sep 22 18:32 /etc/redis/redis.conf

Zum Schluss starten Sie Redis neu:

sudo service redis-server restart

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 also eines, das es extrem schwierig macht, über diesen Zaun zu springen.

Das sollte deine Firewall sein.

Um Ihre Serversicherheit auf die nächste Stufe zu heben, können Sie ein Intrusion Detection-System wie OSSEC konfigurieren. Informationen zum Konfigurieren von OSSEC unter Ubuntu 14.04 finden Sie unterthis OSSEC guide.

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. Das Einrichten eines SSL-Proxys zur Sicherung der Redis-Kommunikation ist ein separates Thema.

Wir haben keine vollständige Liste der Redis-Befehle in den Umbenennungsbereich aufgenommen. Sie können dies jedoch selbst überprüfen und feststellen, wie sie beiredis.io/commands missbraucht werden können.