Сегодня мы поговорим о СУБД Redis, рассмотрим процесс установки и настройки. В отличие от реляционных систем управления базами данных, Redis является СУБД класса NoSQL с открытым исходным кодом, работающей  со структурами данных типа «ключ — значение».

Разберемся для начала с тем, что такое NoSQL. Представим, что у нас есть приложение, которому необходимо быстро и без задержек обрабатывать разные по структуре данные, не имеющие определенной структуры. В таком случае использование “классических”, реляционных баз данных будет не самым лучшим решением, так как нам необходимо будет сначала каким-то образом структурировать эти данные, а уже потом с ними работать. При использовании NoSQL мы можем использовать структуру “ключ-значение” и иметь возможность быстро обрабатывать неструктурированные данные. NoSQL используются как для баз данных, так и для реализации кэшей, брокеров сообщений. При этом, NoSQL стала популярным решением из-за простоты разработки, функционала, высокой производительности и возможности горизонтального масштабирования.

Но, вернемся к СУБД Redis. Redis - это хранилище значений ключей в памяти, известное своей гибкостью, производительностью и широкой языковой поддержкой. Данная система ориентирована на достижение максимальной производительности на атомарных операциях (заявляется о приблизительно 100 тыс. SET- и GET-запросов в секунду на Linux-сервере начального уровня). Написана на Си, интерфейсы доступа созданы для большинства основных языков программирования. Далее мы поговорим о том, как установить и безопасно настроить Redis на сервере Ubuntu 22.04.

Установка

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

sudo apt update

sudo apt install redis-server

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

 sudo nano /etc/redis/redis.conf

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

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

sudo systemctl restart redis.service

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

Для этого мы воспользуемся командой

redis-cli

и затем выполним ping:

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

Переходим к защите

При использовании настроек по умолчанию наша СУБД доступна только с локального узла. Для того, чтобы убедиться в этом снова откроем конфигурационный файл /etc/redis/redis.conf. Далее найдем строку bind. Убедимся, что эта строка раскомментирована и содержит значение 127.0.0.1

. . .
bind 127.0.0.1 ::1
. . .

В случае, если вам пришлось внести в файл какие-либо изменения, необходимо перезапустить сервис:

sudo systemctl restart redis

И посмотрим, какие порты у нас слушаются системой:

sudo netstat -lnp | grep redis

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

Теперь, когда ваша установка Redis прослушивает только localhost, злоумышленникам будет сложнее отправлять запросы или получать доступ к вашему серверу. Далее давайте настроим аутентификацию пользователей при работе с redis-cli.

Устанавливаем пароль

Пароль для доступа к Redis настраивается непосредственно в конфигурационном файле Redis, /etc/redis/redis.conf, поэтому откройте этот файл снова и найдите секцию SECURITY.

И в этой секции необходимо раскомментировать ключ requiredpass. Однако, если вы оставите это значение в таком виде, у вас будет использоваться не слишком сложный пароль foobared, поэтому после rerquiredpass укажите достаточно сложный пароль. Он будет использоваться для входа в redis-cli.

 

Сохраняем изменения и перезапускаем Redis:

sudo systemctl restart redis.service

Для проверки корректности настройки пароля запустите redis-cli и войдите в систему.

Небезопасные команды

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

Вот некоторые из команд, которые считаются опасными: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME и DEBUG.

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

rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""

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

rename-command FLUSHDB  "pleaseflushmydb"

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

Заключение

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

Статья подготовлена в рамках запуска курса "Базы данных". На странице курса вы можете подробно ознакомиться с программой, а также зарегистрироваться на бесплатные вебинары про миграцию между кластерами PostgreSQL, а также про формирование аналитической отчетности clickhouse + superset. Регистрируйтесь, будет интересно.

Комментарии (5)


  1. javdet12
    27.10.2023 14:36
    +1

    Для лучшей безопастности стоит использовать ACL с паролями в хешированном виде. Ну и включить TLS


    1. atygaev
      27.10.2023 14:36

      а там в редиске все еще нельзя нормальные имена для бд заводить? все еще числами?


      1. barazbay
        27.10.2023 14:36

        Все еще числами. Я рекомендую использовать подход с key patterns вместо баз. Чем свежее версия редис, тем больше возможностей. Например, в 7 версии можно управлять доступами, например

        For a concrete example, consider a user with ACL rules +@all ~app1:* (+@read ~app2:*). This user has full access on app1:* and readonly access on app2:*.  (Из документации https://redis.io/docs/management/security/acl/)


  1. bondeg
    27.10.2023 14:36

    Как минимум нужно добавить данные по настройке синхронизации данных на диск и двух способах хранить эти данные (aof/rdb).


    1. Artarik
      27.10.2023 14:36

      там выше было предложено отключить BGREWRITEAOF и BGSAVE ,SAVE поэтому про персистентность можно забыть)
      В статье так же не сказано, что при перезапуске мы теряем все данные, что будет неприятным сюрпризом для новичков, что по этой статье запустят редиску в прод ( и такое бывает)