Введение
Redis – это open-source, хранилище данных типа ключ-значение в памяти, которое отлично подходит для кэширования. Redis – это нереляционная база данных, известная своей гибкостью, производительностью, масштабируемостью и широкой поддержкой языков.
Redis был разработан для использования доверенными клиентами в доверенной среде и не имеет собственных надежных функций безопасности. Тем не менее, у Redis есть несколько функций безопасности, таких как аутентификация по паролю и возможность переименовать или отключить некоторые команды. В этом руководстве приведены инструкции по установке Redis и настройке этих функций безопасности. Также рассматриваются несколько других параметров, которые могут повысить безопасность автономной установки Redis на Rocky Linux 8.
Обратите внимание, что в данном руководстве не рассматриваются ситуации, когда сервер Redis и приложения-клиенты находятся на разных хостах или в разных центрах обработки данных. Установки, где трафик Redis должен проходить через небезопасную или ненадежную сеть, потребуют другого набора конфигураций, таких как настройка SSL-прокси или VPN между машинами Redis.
Также вы можете использовать управляемый сервис Redis от DigitalOcean.
Предварительные требования
Для завершения этого учебного пособия вам понадобится сервер, работающий под управлением Rocky Linux 8. На этом сервере должен быть создан не-root пользователь с административными привилегиями, а также настроен брандмауэр с помощью firewalld
. Чтобы настроить это, следуйте нашему руководству по Начальной настройке сервера для Rocky Linux 8.
Шаг 1 — Установка и запуск Redis
Вы можете установить Redis с помощью менеджера пакетов DNF. Используя DNF, вы можете установить Redis, его зависимости и nano
, удобный текстовый редактор для пользователей. Вы не обязаны устанавливать nano
, но мы будем использовать его в примерах на протяжении этого руководства:
- sudo dnf install redis nano
Эта команда попросит вас подтвердить, что вы хотите установить выбранные пакеты. Нажмите y
, а затем ENTER
, чтобы сделать это:
Output. . .
Total download size: 1.5 M
Installed size: 5.4 M
Is this ok [y/N]: y
После этого нужно внести одно важное изменение в файл конфигурации Redis, который был сгенерирован автоматически во время установки.
Откройте этот файл с помощью вашего предпочитаемого текстового редактора. Здесь мы будем использовать nano
:
- sudo nano /etc/redis.conf
Внутри файла найдите директиву supervised
. Эта директива позволяет вам объявить систему инициализации для управления Redis как службой, обеспечивая вам больший контроль над ее работой. По умолчанию директива supervised
установлена в no
. Поскольку вы используете Rocky Linux, который использует систему инициализации 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:
- sudo systemctl start redis.service
Если вы хотите, чтобы Redis запускался при загрузке, вы можете включить его с помощью команды enable
:
- sudo systemctl enable redis
Обратите внимание, что эта команда не включает суффикс .service
после имени файла модуля. Обычно вы можете опустить этот суффикс в командах systemctl
, потому что он может быть автоматически обработан из имен служб.
Вы можете проверить состояние Redis, запустив следующее:
- sudo systemctl status redis
Output● redis.service - Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/redis.service.d
└─limit.conf
Active: active (running) since Tue 2022-09-06 22:11:52 UTC; 40s ago
Main PID: 14478 (redis-server)
Tasks: 4 (limit: 11152)
Memory: 6.6M
CGroup: /system.slice/redis.service
└─14478 /usr/bin/redis-server 127.0.0.1:6379
После того, как вы убедитесь, что Redis действительно запущен, вы можете проверить его функциональность этой командой:
- redis-cli ping
Это должно вывести PONG
в ответ:
OutputPONG
Если это так, значит, Redis запущен на вашем сервере, и вы можете начать его настройку для повышения безопасности.
Шаг 2 — Настройка Redis и защита его с помощью брандмауэра
Эффективным способом защиты Redis является обеспечение безопасности сервера, на котором он работает. Вы можете сделать это, убедившись, что Redis привязан только к localhost или к частному IP-адресу, а также что на сервере запущен брандмауэр.
Однако, если вы выбрали установку Redis с использованием другого руководства, то, возможно, вы обновили файл конфигурации, чтобы разрешить подключения отовсюду. Это не так безопасно, как привязка к localhost или частному IP-адресу.
Для исправления этого откройте снова файл конфигурации Redis с помощью выбранного вами текстового редактора:
- sudo nano /etc/redis.conf
Найдите строку, начинающуюся с bind
, и убедитесь, что она не закомментирована или отключена, удалив символ #
в начале строки, если необходимо:
. . .
bind 127.0.0.1
Если вам нужно привязать Redis к другому IP-адресу (например, при доступе к Redis с другого хоста), настоятельно рекомендуется привязать его к частному IP-адресу. Привязка к общедоступному IP-адресу увеличивает доступ к вашему интерфейсу Redis извне:
. . .
bind your_private_ip
После подтверждения того, что директива bind
не закомментирована, сохраните и закройте файл.
Если вы следовали предварительному учебнику по начальной настройке сервера и установили firewalld на вашем сервере, и вы не планируете подключаться к Redis с другого хоста, то вам не нужно добавлять дополнительные правила брандмауэра для Redis. В конце концов, любой входящий трафик будет блокироваться по умолчанию, если его явно не разрешат правила брандмауэра. Поскольку автономная установка сервера Redis по умолчанию слушает только интерфейс обратной связи (127.0.0.1
или localhost), не должно быть беспокойства из-за входящего трафика на его стандартном порту.
Однако, если вы планируете получать доступ к Redis с другого хоста, вам нужно внести некоторые изменения в конфигурацию firewalld с использованием команды firewall-cmd
. Опять же, следует разрешить доступ к вашему серверу Redis только с ваших хостов, используя их частные IP-адреса, чтобы ограничить количество хостов, к которым предоставлен ваш сервис.
Для начала добавьте выделенную зону Redis в политику вашего брандмауэра:
- sudo firewall-cmd --permanent --new-zone=redis
Затем укажите, какой порт вы хотели бы открыть. Redis использует порт 6379
по умолчанию:
- sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp
Далее укажите любые частные IP-адреса, которым следует разрешить проход через брандмауэр и доступ к Redis:
- sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP
После выполнения этих команд перезагрузите брандмауэр, чтобы применить новые правила:
- sudo firewall-cmd --reload
При такой конфигурации, когда брандмауэр обнаруживает пакет с IP-адресом вашего клиента, он применяет правила в специальной зоне Redis к этому соединению. Все остальные соединения будут обрабатываться по умолчанию в зоне public
. Службы в зоне по умолчанию применяются ко всем соединениям, а не только к тем, которые не соответствуют явно, поэтому вам не нужно добавлять другие службы (например, SSH) в зону Redis, потому что эти правила будут автоматически применены к этому соединению.
Помните, что любое средство брандмауэра будет работать, будь то firewalld
, ufw
или iptables
. Важно, чтобы брандмауэр был включен и работал, чтобы неизвестные лица не могли получить доступ к вашему серверу. В следующем шаге вы настроите Redis так, чтобы он был доступен только с использованием сильного пароля.
Шаг 3 — Настройка пароля Redis
Настройка пароля Redis активирует одну из встроенных функций безопасности — команду auth
, которая требует аутентификации клиентов перед предоставлением доступа к базе данных. Как и параметр bind
, пароль настраивается непосредственно в конфигурационном файле Redis, /etc/redis.conf
. Переоткройте этот файл:
- sudo nano /etc/redis.conf
Прокрутите до раздела SECURITY
и найдите закомментированную директиву, которая выглядит следующим образом:
. . .
# requirepass foobared
Разкомментируйте ее, убрав символ #
, и измените foobared
на очень надежный пароль на ваш выбор.
Примечание: Вместо того чтобы придумывать пароль самостоятельно, вы можете использовать инструменты типа apg
или pwgen
для его генерации. Если вы не хотите устанавливать приложение только для генерации пароля, вы можете воспользоваться следующей командой. Эта команда выводит строковое значение и передает его в следующую команду sha256sum
, которая отобразит SHA256-хеш строки.
Обратите внимание, что ввод этой команды, как написано, будет генерировать одинаковый пароль каждый раз. Чтобы создать уникальный пароль, измените строку в кавычках на любое другое слово или фразу:
- echo "digital-ocean" | sha256sum
Хотя сгенерированный пароль может быть не запоминающимся, он будет очень надежным и длинным, что именно требуется для Redis. После копирования и вставки вывода этой команды в качестве нового значения для requirepass
, он должен выглядеть следующим образом:
. . .
requirepass password_copied_from_output
В качестве альтернативы, если вы предпочитаете более короткий пароль, вы можете использовать вывод другой контрольной суммы. Снова измените слово в кавычках, чтобы избежать генерации того же самого пароля, что и у этой команды:
- echo "digital-ocean" | sha1sum
После установки пароля сохраните и закройте файл, затем перезапустите Redis:
- sudo systemctl restart redis
Чтобы проверить, что пароль работает, откройте клиент Redis:
- redis-cli
Ниже приведена последовательность команд, используемых для проверки корректности пароля Redis. Первая команда пытается установить ключ со значением до аутентификации:
- set key1 10
Это не сработает, так как вы еще не прошли аутентификацию, поэтому Redis возвращает ошибку:
Output(error) NOAUTH Authentication required.
Следующая команда выполняет аутентификацию с паролем, указанным в файле конфигурации Redis:
- auth your_redis_password
Redis подтвердит, что вы прошли аутентификацию:
OutputOK
После этого повторное выполнение предыдущей команды должно быть успешным:
- set key1 10
OutputOK
Команда get key1
запрашивает у Redis значение нового ключа:
- get key1
Output"10"
Последняя команда завершает работу redis-cli
. Вы также можете использовать exit
:
- quit
Теперь должно быть очень сложно для неавторизованных пользователей получить доступ к вашей установке Redis. Обратите внимание, что если вы уже используете командную строку Redis, а затем перезапустите Redis, вам придется повторно пройти аутентификацию. Также имейте в виду, что без SSL или VPN этот пароль все равно может быть перехвачен внешними лицами, если вы подключаетесь к Redis удаленно:
Далее, в данном руководстве будет рассмотрено переименование команд Redis для дополнительной защиты от злонамеренных действий.
Шаг 4 — Переименование опасных команд
Еще одна функция безопасности, встроенная в Redis, позволяет переименовывать или полностью отключать определенные команды, которые считаются опасными. Когда эти команды выполняются неавторизованными пользователями, они могут быть использованы для переконфигурации, уничтожения или иным образом стирания ваших данных. Некоторые из команд, считающихся опасными, включают:
FLUSHDB
FLUSHALL
KEYS
PEXPIRE
DEL
CONFIG
SHUTDOWN
BGREWRITEAOF
BGSAVE
SAVE
SPOP
SREM
RENAME
DEBUG
Это не исчерпывающий список, но переименование или отключение всех команд из этого списка может помочь улучшить безопасность вашего хранилища данных. Необходимость отключения или переименования определенной команды будет зависеть от ваших конкретных потребностей. Если вы знаете, что никогда не будете использовать команду, которая может быть злоупотреблена, то можете ее отключить. В противном случае вам следует переименовать ее.
Как и пароль аутентификации, переименование или отключение команд настраивается в разделе SECURITY
файла /etc/redis.conf
. Чтобы включить или отключить команды Redis, откройте файл конфигурации для редактирования еще раз:
- sudo nano /etc/redis.conf
ПРИМЕЧАНИЕ: Это примеры. Вы можете выбрать отключить или переименовать команды, которые имеют смысл для вас. Вы можете узнать больше о командах Redis и определить, как они могут быть злоупотреблены по адресу redis.io/commands.
Чтобы отключить или удалить команду, переименуйте ее в пустую строку, как показано ниже:
# Также возможно полностью уничтожить команду, переименовав ее в
# пустую строку:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
Чтобы переименовать команду, дайте ей другое имя, как показано в примерах ниже. Переименованные команды должны быть сложными для догадок других, но легкими для вас запомнить:
# Также возможно полностью уничтожить команду, переименовав ее в
# пустую строку:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
Сохраните ваши изменения и закройте файл. Затем примените изменения, перезапустив Redis:
- sudo systemctl restart redis.service
Чтобы протестировать новые команды, введите командную строку Redis:
- redis-cli
Аутентифицируйтесь, используя пароль, который вы определили ранее:
- auth your_redis_password
OutputOK
Предположим, что вы переименовали команду CONFIG
в ASC12_CONFIG
. Попытка использовать команду config
завершится неудачей:
- config get requirepass
Output(error) ERR unknown command 'config'
Вызов переименованной команды, напротив, будет успешным. Обратите внимание, что команды Redis не чувствительны к регистру:
- asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"
Наконец, вы можете выйти из redis-cli
:
- exit
Предупреждение: В отношении переименования команд есть предостережение в конце раздела SECURITY
в файле /etc/redis.conf
, которое гласит:
. . .
# Пожалуйста, обратите внимание, что изменение имени команд, которые записываются в файл
AOF или передаются репликам, может вызвать проблемы.
. . .
Это означает, что если переименованная команда не находится в файле AOF, или если она там есть, но файл AOF еще не был передан репликам, то проблем не должно возникнуть. Имейте это в виду, когда переименовываете команды. Лучшее время для переименования команды – когда вы не используете постоянное сохранение AOF или сразу после установки (то есть до развертывания вашего приложения, использующего Redis).
Шаг 5 — Настройка собственности каталога данных и прав доступа к файлам
В этом шаге будет рассмотрено несколько изменений в собственности и разрешениях, которые вам может потребоваться сделать для улучшения профиля безопасности вашей установки Redis. Это включает в себя убеждение в том, что только пользователь, который должен получать доступ к Redis, имеет разрешение на чтение его данных. Этим пользователем по умолчанию является пользователь redis.
Вы можете подтвердить это, выполнив команду grep
для каталога данных Redis в длинном списке его родительского каталога. Эта команда и ее вывод приведены ниже:
- ls -l /var/lib | grep redis
Outputdrwxr-x---. 2 redis redis 22 Sep 6 22:22 redis
Этот вывод указывает, что каталог данных Redis принадлежит пользователю redis, с дополнительным доступом предоставленным группе redis. Эта настройка собственности является безопасной, также как и права доступа к каталогу, которые, используя восьмеричную нотацию, установлены в 750
.
Если у вашего каталога данных Redis небезопасные разрешения, вы можете убедиться, что к каталогу и его содержимому имеют доступ только пользователь и группа Redis, выполнив команду chmod
. В следующем примере эти разрешения каталога изменяются на 770
:
- sudo chmod 770 /var/lib/redis
Другое разрешение, которое вам может потребоваться изменить, – это разрешение файла конфигурации Redis. По умолчанию у него разрешение файла 640
и принадлежит пользователю root, с дополнительной принадлежностью группе root:
- ls -l /etc/redis.conf
Output-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis.conf
Это разрешение (640
) означает, что файл конфигурации Redis читается только пользователем redis и группой root. Поскольку файл конфигурации содержит незашифрованный пароль, настроенный на Шаге 4, redis.conf
должен принадлежать пользователю redis, с дополнительной принадлежностью группе redis. Для этого выполните следующую команду:
- sudo chown redis:redis /etc/redis.conf
Затем измените разрешения так, чтобы только владелец файла мог читать и записывать в него:
- sudo chmod 600 /etc/redis.conf
Вы можете проверить новую собственность и разрешения, выполнив предыдущие команды ls
снова:
- ls -l /var/lib | grep redis
Outputtotal 40
drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
- ls -l /etc/redis.conf
Outputtotal 40
-rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf
Наконец, перезапустите Redis, чтобы отразить эти изменения:
- sudo systemctl restart redis
С этим ваша установка Redis обеспечена безопасностью.
Заключение
Имейте в виду, что после того, как кто-то вошел в систему на вашем сервере, можно обойти установленные вами специфические для Redis функции безопасности. Поэтому наиболее важной функцией безопасности, рассмотренной в этом руководстве, является межсетевой экран, так как это предотвращает вход неизвестных пользователей на ваш сервер в первую очередь.
Если вы пытаетесь обеспечить безопасность обмена данными Redis в ненадежной сети, вам придется использовать SSL-прокси, как рекомендуют разработчики Redis в официальном руководстве по безопасности Redis.
Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-rocky-linux-8