Как установить и защитить Redis на Ubuntu 22.04

Введение

Redis – это хранилище ключ-значение в памяти, известное своей гибкостью, производительностью и поддержкой многих языков. В этом руководстве показано, как установить, настроить и обезопасить Redis на сервере Ubuntu 22.04.

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

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

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

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

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

  1. sudo apt update

Затем установите Redis, набрав:

  1. sudo apt install redis-server

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

Откройте этот файл с помощью вашего предпочтительного текстового редактора:

  1. sudo nano /etc/redis/redis.conf

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

/etc/redis/redis.conf
. . .

# Если вы запускаете Redis из upstart или systemd, Redis может взаимодействовать с вашим
# деревом наблюдения. Опции:
#   supervised no      - нет взаимодействия с наблюдением
#   supervised upstart - сигнал upstart, помещая Redis в режим SIGSTOP
#   supervised systemd - сигнал systemd, записывая READY=1 в $NOTIFY_SOCKET
#   supervised auto    - обнаружение метода upstart или systemd на основе
#                        переменных среды UPSTART_JOB или NOTIFY_SOCKET
# Примечание: эти методы наблюдения только сигнализируют "процесс готов".
#       Они не включают непрерывные пинги живости обратно к вашему наблюдателю.
supervised systemd

. . .

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

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

  1. sudo systemctl restart redis.service

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

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

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

Начните с проверки, что служба Redis запущена:

  1. 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 Wed 2022-04-20 20:40:52 UTC; 4s ago Docs: http://redis.io/documentation, man:redis-server(1) Main PID: 2899 (redis-server) Status: "Ready to accept connections" Tasks: 5 (limit: 2327) Memory: 2.5M CPU: 65ms CGroup: /system.slice/redis-server.service └─2899 "/usr/bin/redis-server 127.0.0.1:6379 . . .

Этот вывод указывает на то, что Redis работает и уже включен, что означает, что он настроен на запуск каждый раз при загрузке сервера.

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

  1. sudo systemctl disable redis

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

  1. redis-cli

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

  1. ping
Output
PONG

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

  1. set test "It's working!"
Output
OK

Получите значение, введя:

  1. get test

Предполагая, что все работает, вы сможете извлечь сохраненное значение:

Output
"It's working!"

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

  1. exit

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

  1. sudo systemctl restart redis

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

  1. redis-cli

И подтвердите, что ваше тестовое значение еще доступно:

  1. get test

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

Output
"It's working!"

Выходите обратно в оболочку, когда закончите:

  1. exit

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

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

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

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

  1. sudo nano /etc/redis/redis.conf

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

/etc/redis/redis.conf
. . .
bind 127.0.0.1 ::1
. . .

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

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

  1. sudo systemctl restart redis

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

  1. 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 может быть недоступна на вашей системе по умолчанию. Если это так, вы можете установить ее (вместе с рядом других удобных сетевых инструментов) с помощью следующей команды:

  1. 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, поэтому откройте этот файл снова с помощью вашего предпочтительного редактора:

  1. sudo nano /etc/redis/redis.conf

Прокрутите до раздела SECURITY и найдите закомментированную директиву, которая выглядит следующим образом:

/etc/redis/redis.conf
. . .
# requirepass foobared
. . .

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

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

/etc/redis/redis.conf
. . .
# Предупреждение: поскольку Redis довольно быстрый, внешний пользователь может попробовать до
# 150 тыс. паролей в секунду на хорошем сервере. Это означает, что вам следует
# использовать очень сильный пароль, иначе его будет очень легко взломать.
#
. . .

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

  1. openssl rand 60 | openssl base64 -A

Эта команда вернет вывод вроде этого:

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

После копирования и вставки вывода этой команды в качестве нового значения для requirepass, он должен выглядеть так:

/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

  1. sudo systemctl restart redis.service

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

  1. redis-cli

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

  1. set key1 10

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

Output
(error) NOAUTH Authentication required.

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

  1. auth your_redis_password

Redis подтверждает:

Output
OK

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

  1. set key1 10
Output
OK

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

  1. get key1
Output
"10"

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

  1. quit

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

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

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

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

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

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

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

  1. sudo nano /etc/redis/redis.conf

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

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

/etc/redis/redis.conf
. . .
# Также возможно полностью отключить команду, переименовав ее в
# пустую строку: 
#
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:

  1. sudo systemctl restart redis.service

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

  1. redis-cli

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

  1. auth your_redis_password
Output
OK

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

  1. config get requirepass
Output
(error) ERR unknown command `config`, with args beginning with:

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

  1. asc12_config get requirepass
Output
1) "requirepass" 2) "your_redis_password"

Наконец, вы можете выйти из redis-cli:

  1. exit

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

Output
NOAUTH Authentication required.

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

/etc/redis/redis.conf
. . .
# Обратите внимание, что изменение имени команд, которые записываются в
# файл AOF или передаются репликам, может вызвать проблемы.
. . .

Примечание: Проект Redis использует термины “мастер” и “реплика”, в то время как DigitalOcean в основном предпочитает альтернативные термины “основной” и “вторичный”. Чтобы избежать путаницы, мы решили использовать здесь термины, используемые в документации Redis.

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

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

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

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

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

Вывод

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

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-22-04