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

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

Требования

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

1: Установка и настройка Redis

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

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

sudo apt update

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

sudo apt install redis-server

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

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

sudo nano /etc/redis/redis.conf

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

. . .
# 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 на данный момент. Сохраните и закройте файл, когда закончите.

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

sudo systemctl restart redis.service

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

2: Тестирование Redis

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

Сначала мы убедимся, что Redis запущен:

sudo systemctl status redis

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

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

sudo systemctl disable redis

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

redis-cli

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

ping

Вы получите результат:

PONG

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

set test "It's working!"

Вы увидите:

OK

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

get test

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

"It's working!"

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

exit

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

sudo systemctl restart redis

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

redis-cli

Убедитесь, что значение, которое вы внесли ранее, все еще доступно:

get test

Значение должно быть доступно:

"It's working!"

Когда закончите, снова вернитесь в оболочку:

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

3: Привязка к локальному хосту

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

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

sudo nano /etc/redis/redis.conf

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

. . .
bind 127.0.0.1 ::1
. . .

Сохраните и закройте файл, когда закончите.

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

sudo systemctl restart redis

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

sudo netstat -lnp | grep redis

Вы получите результат:

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 привязана к локальному хосту (127.0.0.1) – а это отражает изменение, которое вы только что внесли в конфигурационный файл. Если в этом столбце указан другой IP-адрес (например, 0.0.0.0), вам следует убедиться, что вы раскомментировали правильную строку, и снова перезапустить Redis.

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

4: Настройка пароля Redis

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

sudo nano /etc/redis/redis.conf

Найдите раздел SECURITY и закомментированную директиву:

. . .
# requirepass foobared
. . .

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

Примечание: Над директивой requirepass в файле 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

Эта команда вернет вывод следующим образом:

RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

sudo systemctl restart redis.service

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

redis-cli

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

set key1 10

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

(error) NOAUTH Authentication required.

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

auth your_redis_password

Вы получите ответ:

OK

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

set key1 10

Результат будет:

OK

Команда get key1 запросит у Redis значение нового ключа:

get key1

Вы получите:

"10"

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

quit

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

5: Переименование опасных команд Redis

Еще одна функция безопасности, встроенная в 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.

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

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

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

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

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

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

sudo systemctl restart redis.service

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

redis-cli

Введите пароль:

auth your_redis_password

Предположим, вы переименовали команду CONFIG в ASC12_CONFIG, как в предыдущем примере. Во-первых, попробуйте использовать исходную команду CONFIG. Это должно выдать ошибку, потому что вы переименовали ее:

config get requirepass

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

Однако вызов переименованной команды будет успешным. Команды не чувствительны к регистру.

asc12_config get requirepass

1) "requirepass"

2) "your_redis_password"

Закройте командную строку:

exit

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

NOAUTH Authentication required.

Важно! Что касается переименования команд, в конце раздела SECURITY в файле /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.
. . .

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

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

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

Заключение

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

Tags:

Добавить комментарий