Сегодня мы поговорим о СУБД 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)
bondeg
27.10.2023 14:36Как минимум нужно добавить данные по настройке синхронизации данных на диск и двух способах хранить эти данные (aof/rdb).
Artarik
27.10.2023 14:36там выше было предложено отключить
BGREWRITEAOF
иBGSAVE
,SAVE
поэтому про персистентность можно забыть)
В статье так же не сказано, что при перезапуске мы теряем все данные, что будет неприятным сюрпризом для новичков, что по этой статье запустят редиску в прод ( и такое бывает)
javdet12
Для лучшей безопастности стоит использовать ACL с паролями в хешированном виде. Ну и включить TLS
atygaev
а там в редиске все еще нельзя нормальные имена для бд заводить? все еще числами?
barazbay
Все еще числами. Я рекомендую использовать подход с key patterns вместо баз. Чем свежее версия редис, тем больше возможностей. Например, в 7 версии можно управлять доступами, например
For a concrete example, consider a user with ACL rules
+@all ~app1:* (+@read ~app2:*)
. This user has full access onapp1:*
and readonly access onapp2:*
. (Из документации https://redis.io/docs/management/security/acl/)