Как установить и защитить 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
, но мы будем использовать его в примерах в этом руководстве:
- 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
:
- 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:
- 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 привязан только к локальному хосту или к частному IP-адресу, а также что на сервере установлен и работает брандмауэр.
Однако, если вы решили настроить Redis с помощью другого учебника, возможно, вы обновили файл конфигурации, чтобы разрешить подключения из любого места. Это не так безопасно, как привязка к локальному хосту или частному IP-адресу.
Чтобы исправить это, снова откройте файл конфигурации Redis в предпочитаемом вами текстовом редакторе:
- 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:
- 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/redis.conf
. Снова откройте этот файл:
- sudo nano /etc/redis/redis.conf
Прокрутите до раздела БЕЗОПАСНОСТЬ
и найдите закомментированную директиву, которая гласит:
. . .
# 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 для дополнительной защиты Redis от злоумышленников.
Шаг 4 — Переименование опасных команд
Еще одна функция безопасности, встроенная в Redis, позволяет переименовывать или полностью отключать определенные команды, которые считаются опасными. При запуске неавторизованными пользователями эти команды могут использоваться для перенастройки, уничтожения или иного стирания ваших данных. Некоторые из команд, которые считаются опасными, включают:
FLUSHDB
ПРОМЫВКА
КЛЮЧИ
PEXPIRE
DEL
КОНФИГУРАЦИЯ
ВЫКЛЮЧЕНИЕ
BGREWRITEAOF
СОХРАНИТЬ БГС
СОХРАНИТЬ
СПОП
SREM
ПЕРЕИМЕНОВАТЬ
ОТЛАДКА
Это неполный список, но переименование или отключение всех команд в этом списке может помочь повысить безопасность вашего хранилища данных. Следует ли вам отключить или переименовать данную команду, зависит от ваших конкретных потребностей. Если вы знаете, что никогда не будете использовать команду, которой можно злоупотреблять, вы можете отключить ее. В противном случае вам следует переименовать его.
Как и пароль аутентификации, команды переименования или отключения настраиваются в разделе SECURITY
файла /etc/redis/redis.conf
. Чтобы включить или отключить команды Redis, откройте файл конфигурации для редактирования еще раз:
- 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:
- 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/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 в длинном списке его родительского каталога. Эта команда и ее вывод приведены ниже:
- 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 с дополнительным владением корневой группой:
- 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. Чтобы установить это, выполните следующую команду:
- sudo chown redis:redis /etc/redis/redis.conf
Затем измените разрешения, чтобы только владелец файла мог читать и писать в него:
- sudo chmod 600 /etc/redis/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/redis.conf
Outputtotal 40
-rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis/redis.conf
Наконец, перезапустите Redis, чтобы отразить эти изменения:
- sudo systemctl restart redis
Таким образом, ваша установка Redis защищена.
Заключение
Имейте в виду, что как только кто-то войдет на ваш сервер, вы сможете обойти встроенные вами функции безопасности Redis. Вот почему наиболее важной функцией безопасности, описанной в этом руководстве, является брандмауэр, поскольку он в первую очередь предотвращает вход неизвестных пользователей на ваш сервер.
Если вы пытаетесь защитить связь Redis через ненадежную сеть, вам придется использовать прокси-сервер SSL, как это рекомендовано разработчиками Redis в официальном руководстве по безопасности Redis.