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, indemgrep
die 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 AbschnittSECURITY
der Datei/etc/redis/redis.conf
konfiguriert.
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 Befehlconfig
zu 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 Siegrep
fü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.