So installieren und sichern Sie Redis unter Centos7

Einführung

Redis ist ein Open-Source-In-Memory-Datenstrukturspeicher, der sich beim Caching auszeichnet. Redis ist eine nicht relationale Datenbank, die für ihre Flexibilität, Leistung, Skalierbarkeit und umfassende Sprachunterstützung bekannt ist.

Redis wurde für die Verwendung durch vertrauenswürdige Clients in einer vertrauenswürdigen Umgebung entwickelt und verfügt über keine eigenen zuverlässigen Sicherheitsfunktionen. Redis verfügt jedoch übera few security features, die ein einfaches unverschlüsseltes Kennwort sowie das Umbenennen und Deaktivieren von Befehlen enthalten. Dieses Tutorial enthält Anweisungen zum Konfigurieren dieser Sicherheitsfunktionen sowie einige andere Einstellungen, die die Sicherheit einer eigenständigen Redis-Installation unter CentOS 7 erhöhen können.

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. Für Installationen, bei denen der Redis-Verkehr ein unsicheres oder nicht vertrauenswürdiges Netzwerk durchlaufen muss, sind andere Konfigurationen erforderlich, z. B. das Einrichten eines SSL-Proxys oder einVPN zwischen den Redis-Computern.

Voraussetzungen

Um diesem Tutorial folgen zu können, benötigen Sie:

Unter diesen Voraussetzungen können Sie Redis installieren und einige Aufgaben zur Erstkonfiguration ausführen.

[[Schritt-1 - Installation von Redis]] == Schritt 1 - Installation von Redis

Bevor wir Redis installieren können, müssen wir zuerstExtra Packages for Enterprise Linux (EPEL) repository zu den Paketlisten des Servers hinzufügen. EPEL ist ein Paket-Repository, das eine Reihe von Open-Source-Add-On-Softwarepaketen enthält, von denen die meisten vom Fedora-Projekt verwaltet werden.

Wir können EPEL mityum installieren:

sudo yum install epel-release

Nach Abschluss der EPEL-Installation können Sie Redis erneut mityum installieren:

sudo yum install redis -y

Dies kann einige Minuten dauern. Starten Sie nach Abschluss der Installation den Redis-Dienst:

sudo systemctl start redis.service

Wenn Sie möchten, dass Redis beim Booten gestartet wird, können Sie es mit dem Befehlenable aktivieren:

sudo systemctl enable redis

Sie können den Status von Redis überprüfen, indem Sie Folgendes ausführen:

sudo systemctl status redis.service
Output● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/redis.service.d
           └─limit.conf
   Active: active (running) since Thu 2018-03-01 15:50:38 UTC; 7s ago
 Main PID: 3962 (redis-server)
   CGroup: /system.slice/redis.service
           └─3962 /usr/bin/redis-server 127.0.0.1:6379

Nachdem Sie bestätigt haben, dass Redis tatsächlich ausgeführt wird, testen Sie das Setup mit folgendem Befehl:

redis-cli ping

Dies solltePONG als Antwort ausgeben. In diesem Fall wird Redis jetzt auf Ihrem Server ausgeführt, und wir können mit der Konfiguration beginnen, um die Sicherheit zu erhöhen.

[[Schritt-2 - Binden von Redis und Sichern mit einer Firewall] == Schritt 2 - Binden von Redis und Sichern mit einer Firewall

Eine effektive Möglichkeit, Redis zu schützen, besteht darin, den Server zu sichern, auf dem es ausgeführt wird. Sie können dies tun, indem Sie sicherstellen, dass Redis nur an localhost oder an eine private IP-Adresse gebunden ist und auf dem Server eine Firewall ausgeführt wird.

Wenn Sie sich jedoch dafür entschieden haben, einen Redis-Cluster mitthis tutorial einzurichten, haben Sie die Konfigurationsdatei aktualisiert, um Verbindungen von überall zu ermöglichen, was nicht so sicher ist wie die Bindung an localhost oder eine private IP.

Um dies zu beheben, öffnen Sie die Redis-Konfigurationsdatei zum Bearbeiten:

sudo vi /etc/redis.conf

Suchen Sie die Zeile, die mitbind beginnt, und stellen Sie sicher, dass sie nicht kommentiert ist:

/etc/redis.conf

bind 127.0.0.1

Wenn Sie Redis an eine andere IP-Adresse binden müssen (wie in Fällen, in denen Sie von einem separaten Host aus auf Redis zugreifen), empfehlen wir Ihnen, es an eine private IP-Adresse zu binden. Durch das Binden an eine öffentliche IP-Adresse wird die Sichtbarkeit Ihrer Redis-Schnittstelle für Dritte erhöht.

/etc/redis.conf

bind your_private_ip

Wenn Sie die Voraussetzungen erfüllt und die Firewall auf Ihrem Server installiert haben und keine Verbindung von einem anderen Host zu Redis herstellen möchten, müssen Sie keine zusätzlichen Firewall-Regeln für Redis hinzufügen. Schließlich wird eingehender Datenverkehr standardmäßig gelöscht, sofern die Firewall-Regeln dies nicht ausdrücklich zulassen. Da eine eigenständige Standardinstallation des Redis-Servers nur die Loopback-Schnittstelle (127.0.0.1 oder localhost) überwacht, sollte es keine Bedenken hinsichtlich des eingehenden Datenverkehrs an seinem Standardport geben.

Wenn Sie jedoch von einem anderen Host aus auf Redis zugreifen möchten, müssen Sie mit dem Befehlfirewall-cmdeinige Änderungen an Ihrer Firewall-Konfiguration vornehmen. Auch hier sollten Sie den Zugriff auf Ihren Redis-Server von Ihren Hosts nur unter Verwendung ihrer privaten IP-Adressen zulassen, um die Anzahl der Hosts zu begrenzen, denen Ihr Dienst ausgesetzt ist.

Fügen Sie Ihrer Firewallrichtlinie zunächst eine dedizierte Redis-Zone hinzu:

sudo firewall-cmd --permanent --new-zone=redis

Geben Sie dann an, welcher Port offen sein soll. Redis verwendet standardmäßig Port6397:

sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp

Geben Sie als Nächstes alle privaten IP-Adressen an, die die Firewall passieren und auf Redis zugreifen dürfen:

sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP

Laden Sie nach dem Ausführen dieser Befehle die Firewall neu, um die neuen Regeln zu implementieren:

sudo firewall-cmd --reload

Wenn die Firewall in dieser Konfiguration ein Paket von der IP-Adresse Ihres Clients sieht, wendet sie die Regeln in der dedizierten Redis-Zone auf diese Verbindung an. Alle anderen Verbindungen werden von der Standardzonepublicverarbeitet. Die Dienste in der Standardzone gelten für jede Verbindung, nicht nur für diejenigen, die nicht explizit übereinstimmen. Sie müssen also keine weiteren Dienste hinzufügen (z. SSH) in die Redis-Zone, da diese Regeln automatisch auf diese Verbindung angewendet werden.

Wenn Sieset up a firewall using Iptables gewählt haben, müssen Sie Ihren sekundären Hosts mit den folgenden Befehlen Zugriff auf den von Redis verwendeten Port gewähren:

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 6397 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -P INPUT DROP

Stellen Sie sicher, dass Sie Ihre Iptables-Firewallregeln mit dem von Ihrer Distribution bereitgestellten Mechanismus speichern. Sie können mehr über Iptables erfahren, indem Sie sich unsereIptables essentials guideansehen.

Beachten Sie, dass die Verwendung eines der beiden Firewall-Tools funktioniert. Wichtig ist, dass die Firewall aktiv ist und unbekannte Personen nicht auf Ihren Server zugreifen können. Im nächsten Schritt werden wir Redis so konfigurieren, dass es nur mit einem sicheren Passwort zugänglich ist.

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

Wenn Sie Redis mithilfe des Lernprogramms vonHow To Configure a Redis Cluster on CentOS 7installiert 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 Sie noch kein Kennwort eingerichtet haben, wird anhand der Anweisungen in diesem Abschnitt erläutert, wie Sie das Kennwort für den Datenbankserver festlegen.

Durch das Konfigurieren eines Redis-Kennworts wird eine der integrierten Sicherheitsfunktionen aktiviert - der Befehlauth-, bei dem sich Clients authentifizieren müssen, bevor sie auf die Datenbank zugreifen können. Wie die Einstellungbind wird das Kennwort direkt in der Redis-Konfigurationsdatei/etc/redis.conf konfiguriert. Öffne die Datei erneut:

sudo vi /etc/redis.conf

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

/etc/redis.conf

# requirepass foobared

Kommentieren Sie es aus, indem Sie# entfernen undfoobared in ein sehr sicheres Kennwort Ihrer Wahl ändern. Anstatt selbst ein Passwort zu erstellen, können Sie ein Tool wieapg oderpwgen verwenden, um ein Passwort zu generieren. Wenn Sie jedoch keine Anwendung installieren möchten, nur um ein Kennwort zu generieren, können Sie den folgenden Befehl verwenden.

Beachten Sie, dass bei der Eingabe dieses Befehls in der angegebenen Form jedes Mal dasselbe Kennwort generiert wird. Ändern Sie das Wort in Anführungszeichen in ein beliebiges anderes Wort oder einen anderen Ausdruck, um ein anderes Kennwort als das hierdurch generierte zu erstellen.

echo "digital-ocean" | sha256sum

Obwohl das generierte Passwort nicht ausgesprochen werden kann, ist es sehr stark und sehr lang. 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.conf

requirepass password_copied_from_output

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

Speichern und schließen 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

Das Folgende ist eine Folge von Befehlen, mit denen getestet wird, ob das Redis-Passwort funktioniert. Der erste Befehl versucht, vor der Authentifizierung einen Schlüssel auf einen Wert zu setzen.

set key1 10

Dies funktioniert nicht, da wir noch nicht authentifiziert wurden. Daher gibt Redis einen Fehler zurück.

Output(error) NOAUTH Authentication required.

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

auth your_redis_password

Redis wird bestätigen, dass wir authentifiziert wurden:

OutputOK

Danach sollte das erneute Ausführen des vorherigen Befehls erfolgreich sein:

set key1 10
OutputOK

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

get key1
Output"10"

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

quit

Es sollte nun für nicht autorisierte Benutzer sehr schwierig sein, auf Ihre Redis-Installation zuzugreifen. Beachten Sie jedoch, dass das unverschlüsselte Kennwort auch ohne SSL oder VPN für Dritte sichtbar ist, wenn Sie eine Remoteverbindung zu Redis herstellen.

Als nächstes werden wir Redis-Befehle umbenennen, um Redis vor böswilligen Akteuren zu schützen.

[[Schritt-4 - Umbenennen von gefährlichen Befehlen]] == Schritt 4 - 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. Zu den als gefährlich bekannten Befehlen gehören:

  • FLUSHDB

  • FLUSHALL

  • KEYS

  • PEXPIRE

  • DEL

  • CONFIG

  • SHUTDOWN

  • BGREWRITEAOF

  • BGSAVE

  • SAVE

  • SPOP

  • SREM RENAME DEBUG

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 sollten Sie es stattdessen umbenennen.

Wie das Authentifizierungskennwort wird das Umbenennen oder Deaktivieren von Befehlen im AbschnittSECURITYder Datei/etc/redis.confkonfiguriert. Öffnen Sie zum Aktivieren oder Deaktivieren von Redis-Befehlen die Konfigurationsdatei erneut, um sie zu bearbeiten:

sudo vi  /etc/redis.conf

[.note] #NOTE: Dies sind Beispiele. Sie sollten die für Sie sinnvollen Befehle deaktivieren oder umbenennen. 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.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 sein, aber für Sie leicht zu merken:

/etc/redis.conf

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

Speichern Sie Ihre Änderungen, schließen Sie die Datei und übernehmen Sie 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

Authentifizieren Sie sich mit dem zuvor festgelegten Passwort:

auth your_redis_password
OutputOK

Angenommen, Sie haben den BefehlCONFIG inASC12_CONFIG umbenannt, sollte der Versuch, den Befehlconfig zu verwenden, fehlschlagen.

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

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

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 das Umbenennen von Befehlen befindet sich am Ende des AbschnittsSECURITYin der Datei/etc/redis.confeine 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 die AOF-Datei nicht an Slaves übertragen wurde, sollte es kein Problem geben. Denken Sie daran, wenn Sie Befehle umbenennen. 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 von Master-Slave-Installationen angewendet werden.

[[Schritt 5 - Festlegen von Datenverzeichnisbesitz- und Dateiberechtigungen]] == Schritt 5 - Festlegen von Datenverzeichnisbesitz- 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
Outputdrwxr-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. Diese Besitzereinstellung ist sicher, die Berechtigungen des Ordners (die auf 755 festgelegt sind) jedoch nicht. Um sicherzustellen, dass nur der Redis-Benutzer Zugriff auf den Ordner und seinen Inhalt hat, ändern Sie die Berechtigungseinstellung auf 770:

sudo chmod 770 /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.conf
Output-rw-r--r-- 1 root root 30176 Jan 14  2014 /etc/redis.conf

Diese Erlaubnis (644) ist weltweit lesbar. Dies stellt ein Sicherheitsproblem dar, da die Konfigurationsdatei das unverschlüsselte Kennwort enthält, das Sie in Schritt 4 konfiguriert haben. Dies bedeutet, dass wir den Besitz und die Berechtigungen der Konfigurationsdatei ändern müssen. Im Idealfall sollte es dem Benutzer vonredisgehören, während das sekundäre Eigentum der Gruppe vonredisgehört. Führen Sie dazu den folgenden Befehl aus:

sudo chown redis:redis /etc/redis.conf

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

sudo chmod 660 /etc/redis.conf

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

ls -l /etc/redis.conf
Outputtotal 40
-rw------- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf

Zum Schluss starten Sie Redis neu:

sudo service redis-server restart

Herzlichen Glückwunsch, Ihre Redis-Installation sollte jetzt sicherer sein!

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. Aus diesem Grund ist das wichtigste Sicherheitsmerkmal, das in diesem Tutorial behandelt wird, die Firewall, da sich unbekannte Benutzer erst gar nicht an Ihrem Server anmelden können.

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.