Поиск по сайту:

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


Введение

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

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

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

Предпосылки

Для выполнения этого руководства вам понадобится сервер под управлением Rocky Linux 9. На этом сервере должен быть пользователь без полномочий root с правами администратора и брандмауэр, настроенный с помощью firewalld. Чтобы настроить это, следуйте нашему руководству по начальной настройке сервера для Rocky Linux 9.

Шаг 1 — Установка и запуск Redis

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

  1. sudo dnf install redis nano

Эта команда предложит вам подтвердить, что вы хотите установить выбранные пакеты. Нажмите y, затем ENTER, чтобы сделать это:

Output
. . . Total download size: 2.0 M Installed size: 7.4 M Is this ok [y/N]: y

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

Откройте этот файл в предпочитаемом вами текстовом редакторе. Здесь мы будем использовать nano:

  1. sudo nano /etc/redis/redis.conf

Внутри файла найдите директиву supervised. Эта директива позволяет вам объявить систему инициализации для управления Redis как службой, предоставляя вам больший контроль над ее работой. По умолчанию для директивы supervised установлено значение no. Поскольку вы используете Rocky Linux, который использует систему инициализации systemd, при необходимости раскомментируйте строку (удалив # в начале) и измените ее на 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 на данный момент, поэтому сохраните и закройте его, когда закончите. Если вы использовали nano для редактирования файла, вы сохраняете и выходите с помощью CTRL + X, затем при появлении запроса Y и затем Enter.

После редактирования файла запустите службу Redis:

  1. sudo systemctl start redis.service

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

  1. sudo systemctl enable redis

Обратите внимание, что эта команда не включает суффикс .service после имени файла модуля. Обычно этот суффикс можно не указывать в командах systemctl, поскольку он может быть автоматически проанализирован из имен служб.

Вы можете проверить статус Redis, выполнив следующее:

  1. 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 действительно работает, вы можете проверить его функциональность с помощью этой команды:

  1. redis-cli ping

Это должно напечатать PONG в качестве ответа:

Output
PONG

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

Шаг 2 — Настройка Redis и его защита с помощью брандмауэра

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

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

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

  1. sudo nano /etc/redis/redis.conf

Найдите строку, начинающуюся с bind, и убедитесь, что она не закомментирована или отключена, удалив знак # в начале строки. из необходимого:

. . .
bind 127.0.0.1 -::1

Если вам нужно привязать Redis к другому IP-адресу (например, в тех случаях, когда вы будете получать доступ к Redis с отдельного хоста), вам следует настоятельно рассмотреть возможность привязки его к частному IP-адресу. Привязка к общедоступному IP-адресу увеличивает доступность вашего интерфейса Redis для внешних сторон:

. . .
bind your_private_ip

Убедившись, что директива bind не закомментирована, вы можете сохранить и закрыть файл.

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

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

Для начала добавьте выделенную зону Redis в свою политику firewalld:

  1. sudo firewall-cmd --permanent --new-zone=redis

Затем укажите, какой порт вы хотите открыть. Redis по умолчанию использует порт 6379:

  1. sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp

Затем укажите любые частные IP-адреса, которым должен быть разрешен проход через брандмауэр и доступ к Redis:

  1. sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP

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

  1. sudo firewall-cmd --reload

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

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

Шаг 3 — Настройка пароля Redis

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

  1. sudo nano /etc/redis/redis.conf

Прокрутите до раздела БЕЗОПАСНОСТЬ и найдите закомментированную директиву, которая гласит:

. . .
# requirepass foobared

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

Примечание. Вместо того, чтобы придумывать пароль самостоятельно, вы можете использовать для его создания такой инструмент, как apg или pwgen. Если вы не хотите устанавливать приложение только для генерации пароля, вы можете использовать приведенную ниже команду. Эта команда отображает строковое значение и передает его следующей команде sha256sum, которая отображает контрольную сумму строки SHA256.

Имейте в виду, что ввод этой команды в том виде, в котором она написана, будет каждый раз генерировать один и тот же пароль. Чтобы создать уникальный пароль, измените строку в кавычках на любое другое слово или фразу:

  1. echo "digital-ocean" | sha256sum

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

. . .
requirepass password_copied_from_output

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

  1. echo "digital-ocean" | sha1sum

После установки пароля сохраните и закройте файл, затем перезапустите Redis:

  1. sudo systemctl restart redis

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

  1. redis-cli

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

  1. set key1 10

Это не сработает, поскольку вы еще не авторизовались, поэтому Redis возвращает ошибку:

Output
(error) NOAUTH Authentication required.

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

  1. auth your_redis_password

Redis подтвердит, что вы прошли аутентификацию:

Output
OK

После этого повторный запуск предыдущей команды должен быть успешным:

  1. set key1 10
Output
OK

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

  1. get key1
Output
"10"

Эта последняя команда завершает работу redis-cli. Вы также можете использовать exit:

  1. quit

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

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

Шаг 4 — Переименование опасных команд

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

  • FLUSHDB
  • ПРОМЫВКА
  • КЛЮЧИ
  • PEXPIRE
  • DEL
  • КОНФИГУРАЦИЯ
  • ВЫКЛЮЧЕНИЕ
  • BGREWRITEAOF
  • СОХРАНИТЬ БГС
  • СОХРАНИТЬ
  • СПОП
  • SREM
  • ПЕРЕИМЕНОВАТЬ
  • ОТЛАДКА

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

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

  1. sudo nano /etc/redis/redis.conf

ПРИМЕЧАНИЕ. Это примеры. Вы должны отключить или переименовать команды, которые имеют смысл для вас. Вы можете узнать больше о командах Redis и определить, как они могут быть неправильно использованы, на 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 ""

Чтобы переименовать команду, дайте ей другое имя, как в примерах ниже. Команды с переименованием должны быть трудными для понимания другими, но легко запоминающимися для вас:

# 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 SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

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

  1. sudo systemctl restart redis.service

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

  1. redis-cli

Аутентифицируйтесь, используя пароль, который вы определили ранее:

  1. auth your_redis_password
Output
OK

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

  1. config get requirepass
Output
(error) ERR unknown command 'config'

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

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

Наконец, вы можете выйти из redis-cli:

  1. exit

Предупреждение. Что касается команд переименования, в конце раздела 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 не был передан репликам, то проблем быть не должно. Помните об этом, когда будете переименовывать команды. Лучшее время для переименования команды — это когда вы не используете сохраняемость AOF или сразу после установки (то есть до того, как ваше приложение, использующее Redis, будет развернуто).

Шаг 5 — Установка владельца каталога данных и прав доступа к файлам

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

Вы можете проверить это, выполнив команду grep для каталога данных Redis в длинном списке его родительского каталога. Эта команда и ее вывод приведены ниже:

  1. ls -l /var/lib | grep redis
Output
drwxr-x---. 2 redis redis 22 Sep 6 22:22 redis

Эти выходные данные указывают на то, что каталог данных Redis принадлежит пользователю redis с дополнительным доступом, предоставленным группе redis. Этот параметр владения является безопасным, как и права доступа к папке, для которых в восьмеричном представлении установлено значение 750.

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

  1. sudo chmod 770 /var/lib/redis

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

  1. ls -l /etc/redis/redis.conf
Output
-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis/redis.conf

Это разрешение (640) означает, что файл конфигурации Redis доступен для чтения только пользователю Redis и корневой группе. Поскольку файл конфигурации содержит незашифрованный пароль, который вы настроили на шаге 4, redis.conf должен принадлежать пользователю redis, а вторичному владельцу — группе redis. Чтобы установить это, выполните следующую команду:

  1. sudo chown redis:redis /etc/redis/redis.conf

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

  1. sudo chmod 600 /etc/redis/redis.conf

Вы можете проверить нового владельца и разрешения, снова выполнив предыдущие команды ls:

  1. ls -l /var/lib | grep redis
Output
total 40 drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
  1. ls -l /etc/redis/redis.conf
Output
total 40 -rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis/redis.conf

Наконец, перезапустите Redis, чтобы отразить эти изменения:

  1. sudo systemctl restart redis

Таким образом, ваша установка Redis защищена.

Заключение

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

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