Введение
Redis – это хранилище ключ-значение в памяти, известное своей гибкостью, производительностью и поддержкой многих языков. В этом руководстве показано, как установить, настроить и обезопасить Redis на сервере Ubuntu 22.04.
Предварительные требования
Для завершения этого руководства вам понадобится доступ к серверу Ubuntu 22.04, на котором есть не-root пользователь с правами sudo
и настроенный брандмауэр с ufw
. Вы можете настроить это, следуя нашему руководству по начальной настройке сервера для Ubuntu 22.04.
Шаг 1 — Установка и настройка Redis
Мы будем использовать менеджер пакетов APT для установки Redis из официальных репозиториев Ubuntu. На момент написания данного руководства версия, доступная в репозиториях по умолчанию, составляет 6.0.16.
Начните с обновления локального кэша пакетов apt
:
Затем установите Redis, набрав:
Это скачает и установит Redis и его зависимости. После этого необходимо внести одно важное изменение в файл конфигурации Redis, который был сгенерирован автоматически во время установки.
Откройте этот файл с помощью вашего предпочтительного текстового редактора:
Внутри файла найдите директиву supervised
. Эта директива позволяет вам объявить систему инициализации для управления Redis в качестве службы, предоставляя вам больше контроля над его работой. По умолчанию директива supervised
установлена в no
. Поскольку вы используете Ubuntu, которая использует систему инициализации systemd, измените ее на systemd
:
. . .
# Если вы запускаете 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, чтобы отобразить изменения, внесенные в файл конфигурации:
Таким образом, вы установили и настроили Redis, и он запущен на вашем компьютере. Однако, прежде чем начать его использовать, разумно сначала проверить, функционирует ли Redis правильно.
Шаг 2 — Тестирование Redis
Как и с любым недавно установленным программным обеспечением, рекомендуется убедиться, что Redis работает как ожидалось, прежде чем вносить дальнейшие изменения в его конфигурацию. В этом шаге мы рассмотрим несколько способов проверить, что Redis работает правильно.
Начните с проверки, что служба 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 вручную каждый раз при загрузке сервера, вы можете настроить это с помощью следующей команды:
Чтобы проверить, что Redis функционирует правильно, подключитесь к серверу, используя redis-cli
, командный интерфейс Redis:
В появившемся приглашении проверьте соединение с помощью команды ping
:
OutputPONG
Этот вывод подтверждает, что соединение с сервером еще активно. Затем проверьте возможность установки ключей, запустив:
OutputOK
Получите значение, введя:
Предполагая, что все работает, вы сможете извлечь сохраненное значение:
Output"It's working!"
Подтвердив, что вы можете получить значение, выйдите из приглашения Redis, чтобы вернуться в оболочку:
В качестве последнего теста проверим, способен ли Redis сохранять данные даже после остановки или перезапуска. Для этого сначала перезапустите экземпляр Redis:
Затем снова подключитесь с помощью командного интерфейса:
И подтвердите, что ваше тестовое значение еще доступно:
Значение вашего ключа должно быть доступно:
Output"It's working!"
Выходите обратно в оболочку, когда закончите:
С этого момента ваша установка Redis полностью функциональна и готова к использованию. Однако некоторые из ее настроек по умолчанию небезопасны и предоставляют злоумышленникам возможности для атаки и доступа к вашему серверу и его данным. Оставшиеся шаги в этом руководстве описывают методы для смягчения этих уязвимостей, как рекомендует официальный веб-сайт Redis. Хотя эти шаги являются необязательными, и Redis будет продолжать работать, если вы решите не следовать им, настоятельно рекомендуется выполнить их, чтобы укрепить безопасность вашей системы.
Шаг 3 — Привязка к localhost
По умолчанию Redis доступен только с localhost. Однако, если вы установили и настроили Redis, следуя другому руководству, чем это, возможно, вы обновили файл конфигурации, чтобы разрешить соединения отовсюду. Это не так безопасно, как привязка к localhost.
Чтобы исправить это, откройте файл конфигурации Redis для редактирования:
Найдите эту строку и убедитесь, что она раскомментирована (удалите символ #
, если он есть):
. . .
bind 127.0.0.1 ::1
. . .
Сохраните и закройте файл после завершения (нажмите CTRL + X
, затем Y
, а затем ENTER
).
Затем перезапустите службу, чтобы убедиться, что systemd прочитал ваши изменения:
Чтобы проверить, что это изменение вступило в силу, выполните следующую команду netstat
:
Outputtcp 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
может быть недоступна на вашей системе по умолчанию. Если это так, вы можете установить ее (вместе с рядом других удобных сетевых инструментов) с помощью следующей команды:
Этот вывод показывает, что программа 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
, поэтому откройте этот файл снова с помощью вашего предпочтительного редактора:
Прокрутите до раздела SECURITY
и найдите закомментированную директиву, которая выглядит следующим образом:
. . .
# requirepass foobared
. . .
Раскомментируйте её, удалив символ #
, и замените foobared
на безопасный пароль.
Примечание: Выше директивы requirepass
в файле redis.conf
есть закомментированное предупреждение:
. . .
# Предупреждение: поскольку Redis довольно быстрый, внешний пользователь может попробовать до
# 150 тыс. паролей в секунду на хорошем сервере. Это означает, что вам следует
# использовать очень сильный пароль, иначе его будет очень легко взломать.
#
. . .
Поэтому важно указать очень сильное и очень длинное значение в качестве пароля. Вместо того чтобы придумывать пароль самостоятельно, вы можете использовать команду openssl
для его генерации случайным образом, как показано в следующем примере. Перенаправив вывод первой команды на вторую команду openssl
, как показано здесь, это удалит все переводы строк, созданные первой командой:
Эта команда вернет вывод вроде этого:
OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
После копирования и вставки вывода этой команды в качестве нового значения для requirepass
, он должен выглядеть так:
/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
После установки пароля сохраните и закройте файл. Затем перезапустите Redis:
Чтобы проверить, что пароль работает, откройте клиент Redis:
Ниже показана последовательность команд, используемых для проверки работы пароля Redis. Первая команда пытается установить ключ на значение до аутентификации:
Это не сработает, потому что вы не аутентифицировались, поэтому Redis возвращает ошибку:
Output(error) NOAUTH Authentication required.
Следующая команда аутентифицируется с паролем, указанным в файле конфигурации Redis:
Redis подтверждает:
OutputOK
После этого повторный запуск предыдущей команды выполнится успешно:
OutputOK
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, откройте файл конфигурации еще раз:
Предупреждение: Приведенные ниже шаги, показывающие, как отключить и переименовать команды, являются примерами. Вы должны выбирать только те команды, которые имеют смысл для вас. Вы можете самостоятельно ознакомиться с полным списком команд и определить, как они могут быть злоупотреблены на сайте redis.io/commands.
Чтобы отключить команду, переименуйте ее в пустую строку (обозначается парой кавычек без символов между ними), как показано ниже:
. . .
# Также возможно полностью отключить команду, переименовав ее в
# пустую строку:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .
Чтобы переименовать команду, дайте ей другое имя, как показано в примерах ниже. Переименованные команды должны быть сложными для других пользователей, чтобы угадать, но легкими для вас запомнить:
. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .
Сохраните ваши изменения и закройте файл.
После переименования команды примените изменения, перезапустив Redis:
Чтобы протестировать новую команду, введите командную строку Redis:
Затем, выполните аутентификацию:
OutputOK
Предположим, что вы переименовали команду CONFIG
в ASC12_CONFIG
, как в предыдущем примере. Сначала попробуйте использовать оригинальную команду CONFIG
. Она должна завершиться ошибкой, потому что вы ее переименовали:
Output(error) ERR unknown command `config`, with args beginning with:
Вызов переименованной команды будет успешным. Регистр не имеет значения:
Output1) "requirepass"
2) "your_redis_password"
Наконец, вы можете выйти из redis-cli
:
Обратите внимание, что если вы уже используете командную строку Redis, а затем перезапускаете Redis, вам нужно будет повторно аутентифицироваться. В противном случае вы получите эту ошибку при вводе команды:
OutputNOAUTH Authentication required.
Предупреждение: В отношении практики переименования команд есть предостерегающее заявление в конце раздела SECURITY
в файле /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