One place for hosting & domains

      So installieren und sichern Sie Redis unter Ubuntu 20.04


      Eine frühere Version dieses Tutorials wurde von Justin Ellingwood verfasst

      Einführung

      Redis ist ein In-Memory-Schlüsselwertspeicher, der für seine Flexibilität, Leistung und breite Sprachunterstützung bekannt ist. Dieses Tutorial zeigt, wie Sie Redis auf einem Ubuntu 20.04-Server installieren, konfigurieren und sichern.

      Voraussetzungen

      Um diesen Leitfaden auszuführen, benötigen Sie Zugriff auf einen Ubuntu 20.04-Server, der einen non-root user mit sudo-Berechtigungen und eine mit ufw konfigurierte Firewall aufweist. Hierzu können Sie unserem Leitfaden zur Ersteinrichtung eines Servers unter Ubuntu 20.04 folgen.

      Schritt 1 — Installieren und Konfigurieren von Redis

      Wir verwenden den APT-Paketmanager, um Redis aus den offiziellen Ubuntu-Repositorys zu installieren. Zum Zeitpunkt dieses Schreibens ist die in den Standard-Repositorys verfügbare Version 5.0.7.

      Als Erstes aktualisieren Sie Ihren lokalen apt-Paketcache:

      Installieren Sie anschließend Redis, indem Sie Folgendes eingeben:

      • sudo apt install redis-server

      Dadurch werden Redis und seine Abhängigkeiten heruntergeladen und installiert. Danach müssen Sie eine wichtige Konfigurationsänderung in der Redis-Konfigurationsdatei vornehmen, die bei der Installation automatisch generiert wurde.

      Öffnen Sie diese Datei mit Ihrem bevorzugten Texteditor:

      • sudo nano /etc/redis/redis.conf

      Suchen Sie in der Datei die Anweisung supervised. Mit dieser Anweisung können Sie ein Init-System deklarieren, um Redis als Dienst zu verwalten. Damit erhalten Sie mehr Kontrolle über seine Funktion. Die Anweisung supervised ist standardmäßig auf no eingestellt. Da Ubuntu das Init-System systemd verwendet, ändern Sie die Anweisung zu systemd:

      /etc/redis/redis.conf

      . . .
      
      # If you run Redis from upstart or systemd, Redis can interact with your
      # supervision tree. Options:
      #   supervised no      - no supervision interaction
      #   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
      #   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
      #   supervised auto    - detect upstart or systemd method based on
      #                        UPSTART_JOB or NOTIFY_SOCKET environment variables
      # Note: these supervision methods only signal "process is ready."
      #       They do not enable continuous liveness pings back to your supervisor.
      supervised systemd
      
      . . .
      

      Das ist die einzige Änderung, die Sie an dieser Stelle in der Redis-Konfigurationsdatei vornehmen müssen. Wenn Sie fertig sind, speichern und schließen Sie die Datei. Wenn Sie nano zum Bearbeiten der Datei verwendet haben, drücken Sie dazu STRG + X, Y und dann ENTER.

      Starten Sie dann den Redis-Dienst neu, damit die Änderungen, die Sie in der Konfigurationsdatei vorgenommen haben, angewendet werden:

      • sudo systemctl restart redis.service

      Redis ist nun installiert und konfiguriert und läuft auf Ihrem Rechner. Bevor Sie Redis benutzen, ist es jedoch ratsam, zunächst zu prüfen, ob es korrekt funktioniert.

      Schritt 2 — Testen von Redis

      Wie bei jeder neu installierten Software ist es sinnvoll, sicherzustellen, dass Redis wie erwartet funktioniert, bevor weitere Änderungen an der Konfiguration vorgenommen werden. Wir behandeln in diesem Schritt verschiedene Möglichkeiten, um zu prüfen, ob Redis korrekt funktioniert.

      Zuerst überprüfen Sie, ob der Redis-Dienst ausgeführt wird:

      • sudo systemctl status redis

      Wenn er ohne Fehler ausgeführt wird, gibt dieser Befehl eine Ausgabe, die der folgenden ähnelt:

      Output

      ● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-04-30 23:26:54 UTC; 4s ago Docs: http://redis.io/documentation, man:redis-server(1) Process: 36552 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS) Main PID: 36561 (redis-server) Tasks: 4 (limit: 2345) Memory: 1.8M CGroup: /system.slice/redis-server.service └─36561 /usr/bin/redis-server 127.0.0.1:6379 . . .

      Hier können Sie sehen, dass Redis ausgeführt wird und bereits aktiviert ist. Das bedeutet, dass Redis bei jedem Boot des Servers automatisch startet.

      Anmerkung: Diese Einstellung ist für viele häufige Anwendungsfälle von Redis wünschenswert. Falls Sie Redis lieber manuell bei jedem Boot des Servers starten möchten, können Sie das mit folgendem Befehl konfigurieren:

      • sudo systemctl disable redis

      Um zu testen, ob Redis richtig funktioniert, stellen Sie mit dem Redis-Befehlszeilenclient redis-cli eine Verbindung zum Server her:

      Testen Sie in der folgenden Eingabeaufforderung die Verbindung mit dem Befehl ping:

      Output

      PONG

      Diese Ausgabe bestätigt, dass die Serververbindung nach wie vor besteht. Als Nächstes überprüfen Sie, ob Sie Schlüssel festlegen können, indem Sie Folgendes ausführen:

      Output

      OK

      Rufen Sie den Wert ab, indem Sie Folgendes eingeben:

      Wenn alles funktioniert, können Sie den gespeicherten Wert abrufen:

      Output

      "It's working!"

      Nachdem Sie die Bestätigung haben, dass Sie den Wert abrufen können, beenden Sie die Redis-Eingabeaufforderung, um wieder zur Shell zu gelangen:

      Als Letztes testen wir, ob Redis auch nach einem Stopp oder Neustart die Daten noch enthält. Dazu starten Sie die Redis-Instanz zunächst neu:

      • sudo systemctl restart redis

      Stellen Sie dann erneut mit dem Befehlszeilenclient eine Verbindung her:

      Bestätigen Sie, dass Ihr Testwert immer noch verfügbar ist:

      Der Wert Ihres Schlüssels sollte immer noch zugänglich sein:

      Output

      "It's working!"

      Wenn Sie fertig sind, beenden Sie und kehren zur Shell zurück:

      Damit ist die Redis-Installation voll funktionsfähig und kann von Ihnen verwendet werden. Einige der Standardkonfigurationseinstellungen sind jedoch unsicher und bieten böswilligen Akteuren die Möglichkeit, Ihren Server und seine Daten anzugreifen und sich Zugang dazu zu verschaffen. Die verbleibenden Schritte in diesem Tutorial behandeln Methoden zur Milderung dieser Schwachstellen, wie sie in der offiziellen Redis-Website beschrieben sind. Diese Schritte sind optional und Redis wird auch dann noch funktionieren, wenn Sie sie nicht befolgen. Es wird jedoch dringend empfohlen, die Schritte auszuführen, um die Sicherheit Ihres Systems zu erhöhen.

      Schritt 3 — Binden an localhost

      Standardmäßig ist Redis nur von localhost zugänglich. Wenn Sie Redis jedoch mit einem anderen Tutorial als diesem installiert und konfiguriert haben, haben Sie die Konfigurationsdatei eventuell so geändert, dass sie Verbindungen von überall zulässt. Das ist nicht so sicher wie eine Bindung an localhost.

      Um dies zu korrigieren, öffnen Sie die Redis-Konfigurationsdatei zur Bearbeitung:

      • sudo nano /etc/redis/redis.conf

      Suchen Sie diese Zeile und stellen Sie sicher, dass die Kommentierung aufgehoben ist (entfernen Sie das #, falls vorhanden):

      /etc/redis/redis.conf

      bind 127.0.0.1 ::1
      

      Danach speichern und schließen Sie die Datei (drücken Sie STRG + X, Y und dann ENTER).

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

      • sudo systemctl restart redis

      Um zu prüfen, ob diese Änderung angenommen wurde, führen Sie den folgenden netstat-Befehl aus:

      • sudo netstat -lnp | grep redis

      Output

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

      Anmerkung: Der Befehl netstat ist möglicherweise nicht standardmäßig auf Ihrem System verfügbar. In diesem Fall können Sie ihn (sowie eine Reihe anderer praktischer Netzwerktools) mit dem folgenden Befehl installieren:

      • sudo apt install net-tools

      Die Ausgabe zeigt, dass das redis-server-Programm an localhost (127.0.0.1) gebunden ist und zeigt die Änderung, die Sie gerade in der Konfigurationsdatei vorgenommen haben. Wenn Sie eine andere IP-Adresse in dieser Spalte sehen, z. B. (0.0.0.0), sollten Sie überprüfen, ob Sie die Kommentierung in der korrekten Zeile aufgehoben haben und den Redis-Dienst erneut starten.

      Nachdem die Redis-Installation nun nur auf localhost lauscht, wird es für böswillige Akteure schwieriger, Anfragen zu stellen oder Zugriff auf Ihren Server zu erhalten. Allerdings ist Redis derzeit nicht so eingestellt, dass Benutzer sich authentifizieren müssen, bevor sie Änderungen an der Konfiguration oder den gespeicherten Daten von Redis vornehmen können. Um hier Abhilfe zu schaffen, können Sie mit Redis verlangen, dass Benutzer sich mit einem Passwort authentifizieren, bevor sie Änderungen über den Redis-Client redis-cli vornehmen.

      Schritt 4 — Konfigurieren eines Redis-Passworts

      Durch die Konfiguration eines Redis-Passworts wird eine der beiden in Redis integrierten Sicherheitsfunktionen befähigt – der Befehl auth, mit dem sich Clients für den Zugriff auf die Datenbank authentifizieren müssen. Das Passwort wird direkt in der Konfigurationsdatei von Redis, /etc/redis/redis.conf, konfiguriert. Öffnen Sie diese Datei erneut mit Ihrem bevorzugten Editor:

      • sudo nano /etc/redis/redis.conf

      Scrollen Sie zum Abschnitt SECURITY und suchen Sie eine Anweisung mit der Kommentierung:

      /etc/redis/redis.conf

      . . .
      # requirepass foobared
      . . .
      

      Heben Sie die Kommentierung auf, indem Sie # entfernen, und ändern Sie foobared in ein sicheres Passwort.

      Anmerkung: Über der Anweisung requirepass in der Datei redis.conf gibt es 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 Ihr Passwort angeben. Anstatt ein Passwort selbst einzurichten, können Sie den Befehl openssl verwenden, um ein Zufallspasswort zu generieren, wie im folgenden Beispiel. Durch Weiterleiten der Ausgabe des ersten Befehls an den zweiten openssl-Befehl, wie hier gezeigt, werden alle durch den ersten Befehl erzeugten Zeilenumbrüche entfernt:

      • openssl rand 60 | openssl base64 -A

      Ihre Ausgabe sollte ungefähr wie folgt aussehen:

      Output

      RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

      Nach dem Kopieren und Einfügen der Ausgabe dieses Befehls als den neuen Wert für requirepass sollte es so aussehen:

      /etc/redis/redis.conf

      requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

      Nach dem Einrichten des Passworts speichern und schließen Sie die Datei. Starten Sie erneut Redis:

      • sudo systemctl restart redis.service

      Öffnen Sie den Redis-Client, um zu testen, ob das Passwort funktioniert:

      Folgendes zeigt eine Sequenz von Befehlen, mit denen getestet wird, ob das Redis-Passwort funktioniert. Der erste Befehl versucht, einen Schlüssel auf einen Wert vor der Authentifizierung einzustellen:

      Das funktioniert nicht, da Sie keine Authentifizierung durchgeführt haben. Daher gibt Redis einen Fehler aus:

      Output

      (error) NOAUTH Authentication required.

      Der nächste Befehl führt die Authentifizierung mit dem Passwort durch, das in der Redis-Konfigurationsdatei angegeben ist:

      Redis bestätigt:

      Output

      OK

      Danach wird der vorherige Befehl erfolgreich ausgeführt:

      Output

      OK

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

      Output

      "10"

      Nachdem Sie die Bestätigung haben, dass Sie Befehle im Redis ausführen können, beenden Sie redis-cli:

      Als Nächstes befassen wir uns mit der Umbenennung von Redis-Befehlen, die Ihrem Rechner schweren Schaden zufügen können, falls sie versehentlich oder durch einen bösartigen Akteur eingegeben werden.

      Schritt 5 — Umbenennen von gefährlichen Befehlen

      Die andere in Redis integrierte Sicherheitsfunktion besteht in der Umbenennung oder vollständigen Deaktivierung bestimmter Befehle, die als gefährlich eingestuft werden.

      Diese Befehle können von unautorisierten Benutzern dazu verwendet werden, Ihre Daten anders zu konfigurieren, zu zerstören oder anderweitig zu löschen. Wie das Authentifizierungs-Passwort wird das Umbenennen oder Deaktivieren von Befehlen im gleichen SECURITY-Abschnitt der Datei /etc/redis/redis.conf konfiguriert.

      Einige der Befehle, die als gefährlich eingestuft werden, sind: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME und DEBUG. Die Liste ist nicht umfassend, aber das Umbenennen oder Deaktivieren aller Befehle in dieser Liste ist ein guter Ausgangspunkt, um die Sicherheit Ihres Redis-Servers zu erhöhen.

      Ob Sie einen Befehl deaktivieren oder umbenennen sollten, hängt von Ihren spezifischen Bedürfnissen oder von denen Ihrer Website ab. Wenn Sie für einen Befehl, der missbraucht werden könnte, keine Verwendung haben, können Sie ihn deaktivieren. Andernfalls liegt es in Ihrem Interesse, diesen umzubenennen.

      Um Redis-Befehle umzubenennen oder zu deaktivieren, öffnen Sie erneut die Konfigurationsdatei:

      • sudo nano /etc/redis/redis.conf

      Achtung: 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 unter redis.io/commands selbst überprüfen und eruieren, wie diese missbraucht werden könnten.

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

      /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 ""
      . . .
      

      Zur Umbenennung eines Befehls geben Sie diesem wie bei den unten gezeigten Beispielen einen anderen Namen. Umbenannte Befehle sollten für andere schwierig zu erraten und für Sie selbst leicht zu merken sein:

      /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.

      Nach der Umbenennung eines Befehls wenden Sie die Änderung an, indem Sie Redis neu starten:

      • sudo systemctl restart redis.service

      Um den neuen Befehl zu testen, gehen Sie in die Redis-Befehlszeile:

      Führen Sie eine Authentifizierung durch:

      Output

      OK

      Nehmen wir an, dass Sie den Befehl CONFIG so wie im voherigen Beispiel in ASC12_CONFIG umbenannt haben. Versuchen Sie zunächst, den ursprünglichen Befehl CONFIG zu verwenden. Das sollte fehlschlagen, da Sie diesen umbenannt haben:

      Output

      (error) ERR unknown command `config`, with args beginning with:

      Der umbenannte Befehl kann jedoch erfolgreich aufgerufen werden. Die Groß- und Kleinschreibung muss nicht beachtet werden:

      • asc12_config get requirepass

      Output

      1) "requirepass" 2) "your_redis_password"

      Zum Schluss können Sie redis-cli verlassen:

      Beachten Sie, dass Sie sich erneut authentifizieren müssen, wenn Sie bereits die Befehlszeile von Redis verwenden und Redis neu starten. Andernfalls erhalten Sie diesen Fehler, wenn Sie einen Befehl eingeben:

      Output

      NOAUTH Authentication required.

      Bezüglich der Umbenennung von Befehlen wird am Ende des Abschnitts SECURITY in /etc/redis/redis.conf folgende Warnung angegeben:

      /etc/redis/redis.conf

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

      Hinweis: Das Redis-Projekt verwendet die Begriffe „master“ und „slave“, während DigitalOcean generell die Alternativen „primary“ und „secondary“ bevorzugt. Um Verwirrungen zu vermeiden, werden an dieser Stelle die in der Redis-Dokumentation genutzten Begriffe verwendet.

      Das bedeutet, dass es kein Problem geben sollte, wenn der umbenannte Befehl nicht in der AOF-Datei enthalten ist, oder wenn er enthalten ist, aber die AOF-Datei nicht an Slaves übertragen wurde.

      Denken Sie bitte daran, wenn Sie Befehle umbenennen möchten. Der beste Zeitpunkt zur Umbenennung eines Befehls ist dann, wenn Sie keine AOF-Persistenz nutzen. Ein anderer Zeitpunkt ist direkt nach der Installation, bevor die Anwendung bereitgestellt wird, die Redis verwendet.

      Wenn Sie AOF verwenden und mit einer Master-Slave-Installation arbeiten, sollten Sie diese Antwort von der GitHub-Frageseite des Projekts beachten. Nachfolgend eine Antwort auf die Frage des Autors:

      Die Befehle werden in der AOF protokolliert und auf die gleiche Weise, in der sie gesendet werden, an den Slave repliziert. Wenn Sie also versuchen, die AOF auf einer Instanz, die nicht die gleiche Umbenennung hat, erneut wiederzugeben, kann es zu Inkonsistenzen kommen, da der Befehl nicht ausgeführt werden kann (dasselbe gilt für Slaves).

      Daher ist es in Fällen wie diesen am besten, bei der Umbenennung sicherzustellen, dass umbenannte Befehle auf alle Instanzen in Master-Slave-Installationen angewendet werden.

      Zusammenfassung

      In diesem Tutorial haben Sie Redis installiert und konfiguriert, die korrekte Funktion Ihrer Redis-Installation überprüft und die integrierten Sicherheitsfunktionen genutzt, um sie weniger anfällig für Angriffe böswilliger Akteure zu machen.

      Denken Sie daran, dass die Sicherheitsfunktionen von Redis, die wir eingerichtet haben, sehr leicht zu umgehen sind, sobald sich jemand auf Ihrem Server angemeldet hat. Daher ist die wichtigste Sicherheitseinrichtung auf Ihrem Redis-Server Ihre Firewall (die Sie konfiguriert haben, wenn Sie in den Voraussetzungen dem Leitfaden zur Ersteinrichtung eines Servers gefolgt sind). Diese Barriere ist für böswillige Akteure nur sehr schwer zu überwinden.



      Source link

      Установка и обеспечение безопасности Redis в Ubuntu 20.04 [Краткое руководство]


      Введение

      Redis — это быстрое хранилище данных типа «ключ‑значение», известное своей гибкостью, производительностью и широким выбором поддерживаемых языков. В этом кратком руководстве описывается установка, настройка и обеспечение безопасности Redis на сервере Ubuntu 20.04.

      Предварительные требования

      Для выполнения данного руководства вам потребуется сервер Ubuntu 20.04 с пользователем без прав root с привилегиями sudo и брандмауэром с конфигурацией ufw. Вы можете выполнить настройку, следуя указаниям документа Начальная настройка сервера для Ubuntu 20.04​​​.

      Шаг 1 — Установка и настройка Redis

      Начните с обновления кэша локальных пакетов apt:

      Затем установите Redis. Для этого введите следующее:

      • sudo apt install redis-server

      Далее откройте файл конфигурации Redis в любом текстовом редакторе:

      • sudo nano /etc/redis/redis.conf

      Внутри файла найдите директиву supervised, которая позволяет декларировать систему инициализации для управления Redis как службой. Поскольку вы работаете в Ubuntu, которая использует систему инициализации systemd, измените значение с no на systemd:

      /etc/redis/redis.conf

      . . .
      
      # If you run Redis from upstart or systemd, Redis can interact with your
      # supervision tree. Options:
      #   supervised no      - no supervision interaction
      #   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
      #   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
      #   supervised auto    - detect upstart or systemd method based on
      #                        UPSTART_JOB or NOTIFY_SOCKET environment variables
      # Note: these supervision methods only signal "process is ready."
      #       They do not enable continuous liveness pings back to your supervisor.
      supervised systemd
      
      . . .
      

      Сохраните файл и закройте его после завершения. Если вы использовали nano для редактирования файла, нажмите CTRL + X, Y, а затем ENTER.

      Перезапустите службу Redis, чтобы изменения в файле конфигурации вступили в силу:

      • sudo systemctl restart redis.service

      Чтобы убедиться, что Redis работает правильно, подключитесь к серверу с помощью клиента командной строки Redis redis-cli:

      В появившемся диалоговом окне протестируйте подключение с помощью команды ping:

      Output

      PONG

      Данный вывод подтверждает, что подключение сервера активно. Затем проверьте, что вы можете задать ключи:

      Output

      OK

      Запросите значение с помощью следующей команды:

      Если все работает корректно, вы получите сохраненное значение:

      Output

      "It's working!"

      Убедившись, что вы можете получить значение, закройте диалоговое окно Redis и вернитесь в командную строку:

      Шаг 2 — Настройка пароля Redis

      Вы можете настроить пароль Redis непосредственно в файле конфигурации Redis /etc/redis/redis.conf. Откройте этот файл еще раз в предпочитаемом редакторе:

      • sudo nano /etc/redis/redis.conf

      Прокрутите содержимое файла до раздела SECURITY и найдите следующую закомментированную директиву:

      /etc/redis/redis.conf

      . . .
      # requirepass foobared
      . . .
      

      Раскомментируйте ее, удалив символ #, и измените foobared на безопасный пароль:

      /etc/redis/redis.conf

      . . .
      requirepass your_redis_password
      . . .
      

      После установки пароля сохраните и закройте файл, а потом перезапустите Redis:

      • sudo systemctl restart redis.service

      Чтобы проверить, работает ли пароль, откройте клиент Redis:

      Ниже показана последовательность команд, используемых для проверки работы пароля Redis. Первая команда пытается задать ключ для значения перед аутентификацией:

      Это не сработает, потому что вы не выполнили аутентификацию, поэтому Redis возвращает ошибку:

      Output

      (error) NOAUTH Authentication required.

      Следующая команда выполняет аутентификацию с паролем, указанным в файле конфигурации Redis:

      Redis принимает пароль:

      Output

      OK

      После этого запуск предыдущей команды будет успешным:

      Output

      OK

      get key1 запрашивает в Redis значение нового ключа.

      Output

      "10"

      Подтвердив, что вы можете выполнять команды в клиенте Redis после аутентификации, вы можете закрыть redis-cli:

      Шаг 3 — Переименование опасных команд

      Другой элемент безопасности, встроенные в Redis, подразумевает переименование или полное удаление определенных команд, которые считаются опасными. Список команд, которые считаются опасными, включает: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF,BGSAVE, SAVE, SPOP, SREM, RENAME и DEBUG. Деактивировав или переименовав эти и другие команды, вы можете помешать несанкционированным пользователям изменить, уничтожить или стереть ваши данные каким-либо иным способом.

      Чтобы переименовать или отключить команды Redis, откройте файл конфигурации еще раз:

      • sudo nano /etc/redis/redis.conf

      Предупреждение. Следующие шаги с демонстрацией отключения или переименования команд являются примерами. Вы должны отключить или переименовать команды, имеющие смысл для вас. Вы можете просмотреть полный список команд самостоятельно и узнать, как они могут использоваться злоумышленниками, по адресу redis.io/commands.

      Чтобы отключить команду, просто укажите пустую строку в качестве имени (обозначается парой кавычек без символов между ними), как показано ниже:

      /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 ""
      . . .
      

      Чтобы переименовать команду, дайте ей другое имя, как показано в приведенных ниже примерах. Переименованные команды должно быть трудно подобрать, но легко запомнить:

      /etc/redis/redis.conf

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

      Сохраните изменения и закройте файл.

      После переименования команды примените изменения, перезапустив Redis:

      • sudo systemctl restart redis.service

      Чтобы протестировать новую команду, откройте командную строку Redis:

      Затем выполните аутентификацию:

      Output

      OK

      Если вы переименовали команду CONFIG в ASC12_CONFIG, как в предыдущем примере, попробуйте использовать первоначальную команду CONFIG. Команда не будет выполнена, потому что вы переименовали ее:

      Output

      (error) ERR unknown command `config`, with args beginning with:

      Вызов переименованной команды будет успешным. Регистр не имеет значения:

      • asc12_config get requirepass

      Output

      1) "requirepass" 2) "your_redis_password"

      Заключение

      С помощью этого краткого обучающего руководства вы установили и настроили Redis, убедились, что ваша установка Redis работает корректно, а также использовали встроенные функции безопасности, чтобы сделать ее менее уязвимой к атакам злоумышленников.



      Source link

      Установка и обеспечение безопасности Redis в Ubuntu 20.04


      Предыдущая версия данного обучающего руководства была написана Джастином Эллингвудом

      Введение

      Redis — это быстрое хранилище данных типа «ключ‑значение», известное своей гибкостью, производительностью и широким выбором поддерживаемых языков. В этом руководстве описывается установка, настройка и обеспечение безопасности Redis на сервере Ubuntu 20.04.

      Предварительные требования

      Для выполнения данного руководства вам потребуется сервер Ubuntu 20.04 с non-root user с привилегиями sudo и брандмауэром с конфигурацией ufw. Вы можете выполнить настройку, следуя указаниям документа Начальная настройка сервера для Ubuntu 20.04​​​.

      Шаг 1 — Установка и настройка Redis

      Мы будем использовать диспетчер пакетов APT для установки redis из официальных репозиториев Ubuntu. На момент написания этой статьи в репозиториях по умолчанию доступна версия 5.0.7.

      Начните с обновления кэша локальных пакетов apt:

      Затем установите Redis. Для этого введите следующее:

      • sudo apt install redis-server

      После этого будет выполнена загрузка и установка Redis и ее зависимостей. После этого в файл конфигурации Redis, созданный автоматически при установке, необходимо внести одно важное изменение.

      Откройте этот файл в предпочитаемом текстовом редакторе:

      • sudo nano /etc/redis/redis.conf

      Внутри файла найдите директиву supervised. Эта директива позволяет объявить систему инициализации для управления Redis как службой, предоставляя вам более широкий контроль за ее работой. Для директивы supervised по умолчанию установлено значение no. Поскольку вы запускаете Ubuntu, которая использует систему инициализации systemd, измените значение на systemd:

      /etc/redis/redis.conf

      . . .
      
      # If you run Redis from upstart or systemd, Redis can interact with your
      # supervision tree. Options:
      #   supervised no      - no supervision interaction
      #   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
      #   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
      #   supervised auto    - detect upstart or systemd method based on
      #                        UPSTART_JOB or NOTIFY_SOCKET environment variables
      # Note: these supervision methods only signal "process is ready."
      #       They do not enable continuous liveness pings back to your supervisor.
      supervised systemd
      
      . . .
      

      Это единственное изменение, которое вам нужно внести в файл конфигурации Redis на данный момент,поэтому сохраните и закройте его после завершения редактирования. Если вы использовали nano для редактирования файла, нажмите CTRL + X, Y, а затем ENTER.

      Перезапустите службу Redis, чтобы изменения в файле конфигурации вступили в силу:

      • sudo systemctl restart redis.service

      После этого установка и настройка Redis будет закончена, и вы можете запускать его на вашем компьютере. Перед началом использования Redis рекомендуется сначала проверить корректность работы системы.

      Шаг 2 — Тестирование Redis

      Как и с любым вновь устанавливаемым программным обеспечением, лучше убедиться, что Redis работает ожидаемым образом перед внесением дальнейших изменений в конфигурацию. Мы пройдемся по целому ряду способов, которые позволяют убедиться, что Redis работает правильно.

      Сначала проверьте, что служба Redis запущена:

      • sudo systemctl status redis

      Если она запускается без ошибок, при вводе данной команды вы должны получить примерно следующий результат:

      Output

      ● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-04-30 23:26:54 UTC; 4s ago Docs: http://redis.io/documentation, man:redis-server(1) Process: 36552 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS) Main PID: 36561 (redis-server) Tasks: 4 (limit: 2345) Memory: 1.8M CGroup: /system.slice/redis-server.service └─36561 /usr/bin/redis-server 127.0.0.1:6379 . . .

      Здесь вы можете видеть, что служба Redis запущена и уже активирована, т.е. для нее настроен запуск при загрузке сервера.

      Примечание: данную опцию рекомендуется использовать во многих стандартных случаях использования Redis. Однако если вы предпочитаете запускать Redis каждый раз вручную при загрузке сервера, воспользуйтесь следующей командой:

      • sudo systemctl disable redis

      Чтобы убедиться, что Redis работает правильно, подключитесь к серверу с помощью клиента командной строки Redis redis-cli:

      В появившемся диалоговом окне протестируйте подключение с помощью команды ping:

      Output

      PONG

      Данный вывод подтверждает, что подключение сервера активно. Затем проверьте, что вы можете задать ключи:

      Output

      OK

      Запросите значение с помощью следующей команды:

      Если все работает корректно, вы получите сохраненное значение:

      Output

      "It's working!"

      Убедившись, что вы можете получить значение, закройте диалоговое окно Redis и вернитесь в командную строку:

      В качестве последнего теста мы проверим, может ли Redis сохранять данные даже после остановки или перезапуска. Для этого необходимо перезапустить Redis:

      • sudo systemctl restart redis

      Затем снова выполните подключение с помощью клиента командной строки:

      И убедитесь, что ваше тестовое значение все еще доступно.

      Значение вашего ключа должно оставаться доступным:

      Output

      "It's working!"

      Выйдите в командную строку после завершения:

      После этого установку Redis можно считать выполненной и готовой к работе. Однако некоторые настройки по умолчанию являются небезопасными и предоставляют злоумышленникам возможность атаковать ваш сервер и получить доступ к данным.Остальные шаги в этом руководстве описывают методы для устранения этих факторов уязвимости, как указано на официальном веб-сайте Redis. Хотя эти шаги не являются обязательными, и Redis будет функционировать, если вы решите не выполнять эти действия, но мы настоятельно рекомендуем вам выполнить описанные ниже шаги, чтобы повысить безопасность вашей системы.

      Шаг 3 — Привязка к localhost

      По умолчанию доступ к Redis осуществляется только из localhost. Если вы установили и настроили Redis с помощью другого руководства, вы могли обновить файл конфигурации, чтобы разрешить подключение из любого места. Подобный подход менее безопасен, чем привязка к localhost.

      Чтобы исправить это, откройте файл конфигурации Redis для редактирования:

      • sudo nano /etc/redis/redis.conf

      Найдите эту строку и убедитесь, что она незакомментирована (удалите символ #, если он существует):

      /etc/redis/redis.conf

      bind 127.0.0.1 ::1
      

      Сохраните и закройте файл после завершения (нажмите CTRL + X, Y, затем ENTER).

      Затем перезапустите службу, чтобы systemd распознала изменения:

      • sudo systemctl restart redis

      Чтобы убедиться, что изменение вступило в силу, запустите следующую команду netstat:

      • sudo netstat -lnp | grep redis

      Output

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

      Примечание: команда netstat может отсутствовать по умолчанию в вашей системе. В этом случае вы можете установить ее (а также многие другие удобные сетевые инструменты) с помощью следующей команды:

      • sudo apt install net-tools

      Данный вывод указывает, что программа redis-server привязана к localhost (127.0.0.1), отражая изменения, которые вы только что внесли в файл конфигурации. Если вы увидите другой IP-адрес в этой колонке (например, 0.0.0.0), вам нужно еще раз проверить, что вы не закомментировали нужную строку и перезапустить службу Redis.

      Теперь, когда Redis использует только localhost, злоумышленникам будет труднее выполнять запросы или получить доступ к вашему серверу. Однако для Redis в настоящее время не настроено требование аутентификации пользователей перед внесением изменений в конфигурацию или данные, которые она хранит. Чтобы исправить это, Redis позволяет настроить требование аутентификации с помощью пароля перед внесением изменений через клиент Redis (redis-cli).

      Шаг 4 — Настройка пароля Redis

      Настройка пароля Redis позволяет использовать одну из двух встроенных функций безопасности — команду auth, которая требует аутентификации клиентов для доступа к базе данных. Пароль настраивается непосредственно в файле конфигурации Redis, /etc/redis/redis.conf, поэтому вам нужно снова открыть этот файл в предпочитаемом редакторе:

      • sudo nano /etc/redis/redis.conf

      Прокрутите содержимое файла до раздела SECURITY и найдите следующую закомментированную директиву:

      /etc/redis/redis.conf

      . . .
      # requirepass foobared
      . . .
      

      Разкомментируйте ее, удалив символ # и измените foobared на безопасный пароль.

      Примечание: над директивой requirepass в файле redis.conf располагается закомментированное предупреждение:

      /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.
      #
      . . .
      

      Таким образом, очень важно, чтобы вы указали очень надежный и очень длинный пароль. Вместо того чтобы придумать пароль самостоятельно, вы можете использовать команду openssl для генерации случайного пароля, как в следующем примере. Использовав вывод первой команды во второй команде openssl, как показано здесь, вы сможете удалить любые переносы строк, созданные при выполнении первой команды:

      • openssl rand 60 | openssl base64 -A

      Вывод должен выглядеть следующим образом:

      Output

      RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

      Скопируйте и вставьте вывод этой команды в качестве нового значения для requirepass. Оно должно выглядеть следующим образом:

      /etc/redis/redis.conf

      requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

      После установки пароля сохраните и закройте файл, а потом перезапустите Redis:

      • sudo systemctl restart redis.service

      Чтобы проверить, работает ли пароль, откройте клиент Redis:

      Ниже показана последовательность команд, используемых для проверки работы пароля Redis. Первая команда пытается задать ключ для значения перед аутентификацией:

      Это не сработает, потому что вы не выполнили аутентификацию, поэтому Redis возвращает ошибку:

      Output

      (error) NOAUTH Authentication required.

      Следующая команда выполняет аутентификацию с паролем, указанным в файле конфигурации Redis:

      Redis принимает пароль:

      Output

      OK

      После этого запуск предыдущей команды будет успешным:

      Output

      OK

      get key1 запрашивает в Redis значение нового ключа.

      Output

      "10"

      Подтвердив, что вы можете выполнять команды в клиенте Redis после аутентификации, вы можете закрыть redis-cli:

      Затем мы рассмотрим переименование команд Redis, которые при ошибочном вводе или вводе злоумышленником могут причинить серьезный ущерб вашему компьютеру.

      Шаг 5 — Переименование опасных команд

      Другой элемент безопасности, встроенные в Redis, подразумевает переименование или полное удаление определенных команд, которые считаются опасными.

      При использовании неавторизованными пользователями, такие команды могут использоваться для изменения конфигурации, уничтожения или выведения из строя ваших данных. Как и в случае пароля для аутентификации, переименование или отключение команд выполняется в том же разделе SECURITY в файле /etc/redis/redis.conf.

      Список команд, которые считаются опасными, включает: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME и DEBUG. Данный список не является всеобъемлющим, но переименование или удаление всех команд в этом списке служит хорошим отправным пунктом для повышения безопасности вашего сервера Redis.

      Решение о том, нужно ли отключить или переименовать команду, зависит от ваших потребностей или потребностей вашего сайта. Если вы знаете, что вы не будете использовать команду, которая может быть использована злоумышленниками, тогда вы можете отключить ее. В другом случае мы рекомендуем вам переименовать ее.

      Чтобы переименовать или отключить команды Redis, откройте файл конфигурации еще раз:

      • sudo nano /etc/redis/redis.conf

      Предупреждение. Седующие шаги с демонстрацией отключения или переименования команд являются примерами. Вы должны отключить или переименовать команды, имеющие смысл для вас. Вы можете просмотреть полный список команд самостоятельно и узнать, как они могут использоваться злоумышленниками, по адресу redis.io/commands.

      Чтобы отключить команду, просто укажите пустую строку в качестве имени (обозначается парой кавычек без символов между ними), как показано ниже:

      /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 ""
      . . .
      

      Чтобы переименовать команду, дайте ей другое имя, как показано в приведенных ниже примерах. Переименованные команды должно быть трудно подобрать, но легко запомнить:

      /etc/redis/redis.conf

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

      Сохраните изменения и закройте файл.

      После переименования команды примените изменения, перезапустив Redis:

      • sudo systemctl restart redis.service

      Чтобы протестировать новую команду, откройте командную строку Redis:

      Затем выполните аутентификацию:

      Output

      OK

      Предположим, вы переименовали команду CONFIG в ASC12_CONFIG, как показано в предыдущем примере. Сначала попробуйте воспользоваться первоначальной команду CONFIG. Команда не будет выполнена, потому что вы переименовали ее:

      Output

      (error) ERR unknown command `config`, with args beginning with:

      Вызов переименованной команды будет успешным. Регистр не имеет значения:

      • asc12_config get requirepass

      Output

      1) "requirepass" 2) "your_redis_password"

      После этого вы можете закрыть redis-cli:

      Обратите внимание, что если вы уже используете командную строку Redis, а затем перезапустите Redis, вам нужно будет повторно выполнить аутентификацию. Иначе вы получите следующую ошибку при вводе команды:

      Output

      NOAUTH Authentication required.

      В отношении практики переименования команд в конце раздела SECURITY файла /etc/redis/redis.conf есть следующее предостережение:

      /etc/redis/redis.conf

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

      Примечание: проект Redis предпочитает использовать термины «master» и «slave», в то время как DigitalOcean предпочитает использовать варианты «primary» и «secondary». Чтобы не допустить путаницы, мы решили использовать здесь термины, используемые в документации Redis.

      Это значит, что, если переименованная команда не содержится в файле AOF, либо содержится, но AOF файл не передается «slave» компонентам, не будет никаких проблем.

      Учитывайте этот момент, когда будете переименовать команды. Лучшее всего переименовать команду, пока вы не используете AOF сохранение или сразу после установки, т.е. до развертывания использующего Redis приложения.

      Если вы используете AOF и работаете с конфигурацией master-slave, изучите этот ответ на странице проблем проекта на GitHub. Ниже приводится ответ на вопрос автора:

      Команды сохраняются в AOF и воспроизводятся в «slave» компоненте в таком же виде, как были отправлены, поэтому если вы попытаетесь использовать AOF для экземпляра, где не было выполнено переименование, могут возникнуть противоречия, так как команда не может быть выполнена (то же самое характерно для «slave» компонентов).

      Таким образом, при переименовании необходимо убедиться, что переименованные команды применяются во всех экземплярах на установках типа «master-slave».

      Заключение

      С помощью этого руководства вы установили и настроили Redis, подтвердили, что установка Redis работает правильно, и воспользовались встроенными функциями безопасности, чтобы сделать Redis менее уязвимой для атак злоумышленников.

      Обратите внимание, что после входа на ваш сервер очень легко будет обойти защитные функции Redis, которые мы настроили. Поэтому наиболее важным элементом безопасности на вашем сервере Redis является ваш брандмауэр (который вы должны были настроить на этапе первоначальной настройки сервера), поскольку злоумышленникам очень трудно преодолеть эту преграду.



      Source link