Защита Redis на сервере Ubuntu 18.04

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

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

В общем, Redis оптимизирован не для максимальной безопасности, а для максимальной производительности и простоты.

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

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

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

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

Читайте также: Настройка сервера OpenVPN в Ubuntu 18.04

Требования

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

Создайте SSH-подключение как пользователь с правами sudo.

Сначала установку Redis нужно проверить. Откройте командную строку:

redis-cli

Примечание: Если вы уже настроили парольную аутентификацию, сначала вам нужно авторизоваться:

auth your_redis_password
OK

Подробнее о настройке аутентификации – в разделе 4.

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

ping

Если Redis работает правильно, вы увидите ответ:

PONG

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

exit

Теперь вы знаете, что установка Redis полностью работоспособна и готова к использованию. Пора заняться безопасностью сервера.

2: Настройка UFW

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

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

sudo ufw status

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

Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Если вы настроили правила брандмауэра с помощью этого руководства, вам не нужно добавлять дополнительное правило для Redis, потому что по умолчанию UFW сбрасывает весь входящий трафик, если он явно не разрешен. Поскольку автономная установка сервера Redis по умолчанию работает только на интерфейсе loopback (127.0.0.1 или localhost), по поводу входящего трафика на его порт по умолчанию можно не беспокоиться.

Читайте также: Основы UFW: общие правила и команды фаервола

3: Привязка к localhost

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

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

sudo nano /etc/redis/redis.conf

Найдите эту строку и раскомментируйте ее:

bind 127.0.0.1

Сохраните и закройте файл (CTRL + X, Y, ENTER).

Перезапустите сервис:

sudo systemctl restart redis

Убедитесь, что настройки обновились:

sudo netstat -lnp | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      2855/redis-server 1

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

Теперь, когда установка 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 укажите надежный пароль.

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

# 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:

/etc/redis/redis.conf
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

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

set key1 10
OK

Запросите свой новый ключ:

get key1
"10"

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

quit

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

5: Переименование команд

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

  • FLUSHDB
  • FLUSHALL
  • KEYS
  • PEXPIRE
  • DEL
  • CONFIG
  • SHUTDOWN
  • BGREWRITEAOF
  • BGSAVE
  • SAVE
  • SPOP
  • SREM RENAME DEBUG

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

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

Откройте файл:

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
OK

Предположим, что вы переименовали команду CONFIG в ASC12_CONFIG; в таком случае попытка запустить команду config должна завершиться ошибкой.

config get requirepass
(error) ERR unknown command 'config'

Теперь сработает переименованная команда:

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

Закройте redis-cli:

exit

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

NOAUTH Authentication required.

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

Please note that changing the name of commands that are logged into the AOF file or transmitted to slaves may cause problems.

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

Если вы используете AOF в установке master-slave, GitHub советует вот что:

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

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

Заключение

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

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

Tags: , ,