Установка и защита Redis в Ubuntu 20.04

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

Требования

Для работы вам понадобится сервер Ubuntu 20.04, настроенный по этому мануалу. Чтобы приступить к установке Redis, войдите в сессию вашего пользователя sudo.

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

Последнюю версию Redis можно установить с помощью стандартного пакетного менеджера APT из официальных репозиториев Ubuntu.

Обновите локальный индекс пакетов:

sudo apt update

А затем установите Redis

sudo apt install redis-server

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

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

sudo nano /etc/redis/redis.conf

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

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

sudo systemctl restart redis.service

Теперь Redis установлен, настроен и запущен на вашем сервере. Давайте протестируем установку.

2: Тестирование 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 Thu 2020-04-30 23:26:54 UTC; 4s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 36552 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 36561 (redis-server)
Tasks: 4 (limit: 2345)
Memory: 1.8M
CGroup: /system.slice/redis-server.service
└─36561 /usr/bin/redis-server 127.0.0.1:6379
. . .

Как видите, Redis работает и уже включен как сервис (это значит, что он добавлен в автозагрузку).

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

sudo systemctl disable redis

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

redis-cli

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

ping
PONG

Вывод 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!"

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

exit

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

3: Подключение к localhost

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

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

sudo nano /etc/redis/redis.conf

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

bind 127.0.0.1 ::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      14222/redis-server
tcp6       0      0 ::1:6379                :::*                    LISTEN      14222/redis-server

Примечание: Команда netstat не всегда доступна на сервере по умолчанию. Если у вас она не установлена, установить ее можно с помощью:

sudo apt install net-tools

Этот вывод показывает, что программа 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.
#
. . .

Оно сообщает, что  Redis работает очень быстро, благодаря чему злоумышленник может перебрать до 150000 паролей в секунду. Поэтому очень важно очень сложный и очень длинный пароль. Вместо того, чтобы самостоятельно составлять пароль, вы можете использовать команду 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

После того как 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`, with args beginning with:

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

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 replicas may cause problems.
. . .

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

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

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

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

Заключение

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

Tags: , ,