Как установить и защитить Redis на Centos7

Вступление

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

Redis был разработан для использования доверенными клиентами в доверенной среде и не имеет собственных надежных функций безопасности. Однако в Redis естьa few security features, которые включают в себя базовый незашифрованный пароль, а также переименование и отключение команд. В этом руководстве приведены инструкции по настройке этих функций безопасности, а также некоторые другие параметры, которые могут повысить безопасность автономной установки Redis в CentOS 7.

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

Предпосылки

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

  • Одна дроплет CentOS 7 настроена с использованием нашегоInitial Server Setup for CentOS 7.

  • Firewalld устанавливается и настраивается с использованиемthis guide, вплоть до шага «Включение межсетевого экрана».

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

[[step-1 -—- install-redis]] == Шаг 1. Установка Redis

Прежде чем мы сможем установить Redis, мы должны сначала добавитьExtra Packages for Enterprise Linux (EPEL) repository в списки пакетов сервера. EPEL - это репозиторий пакетов, содержащий несколько пакетов дополнительных программ с открытым исходным кодом, большинство из которых поддерживаются проектом Fedora.

Мы можем установить EPEL, используяyum:

sudo yum install epel-release

После завершения установки EPEL вы можете установить Redis, снова используяyum:

sudo yum install redis -y

Это может занять несколько минут. После завершения установки запустите службу Redis:

sudo systemctl start redis.service

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

sudo systemctl enable redis

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

sudo systemctl status redis.service
Output● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/redis.service.d
           └─limit.conf
   Active: active (running) since Thu 2018-03-01 15:50:38 UTC; 7s ago
 Main PID: 3962 (redis-server)
   CGroup: /system.slice/redis.service
           └─3962 /usr/bin/redis-server 127.0.0.1:6379

Как только вы подтвердите, что Redis действительно работает, протестируйте установку с помощью этой команды:

redis-cli ping

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

[[step-2 -—- binding-redis-and-securing-it-with-a-firewall]] == Шаг 2. Связывание Redis и его защита с помощью брандмауэра

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

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

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

sudo vi /etc/redis.conf

Найдите строку, начинающуюся сbind, и убедитесь, что она не прокомментирована:

/etc/redis.conf

bind 127.0.0.1

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

/etc/redis.conf

bind your_private_ip

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

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

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

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

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

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, поскольку эти правила будут применяться к этому соединению автоматически.

Если вы выбралиset up a firewall using Iptables, вам нужно будет предоставить вашим вторичным хостам доступ к порту, который использует Redis, с помощью следующих команд:

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 6397 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -P INPUT DROP

Обязательно сохраните правила брандмауэра Iptables, используя механизм, предоставляемый вашим дистрибутивом. Вы можете узнать больше об Iptables, взглянув на нашIptables essentials guide.

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

[[step-3 -—- configuring-a-redis-password]] == Шаг 3. Настройка пароля Redis

Если вы установили Redis с помощью руководстваHow To Configure a Redis Cluster on CentOS 7, вы должны были настроить для него пароль. На ваше усмотрение, вы можете сделать более безопасный пароль, следуя этому разделу. Если вы еще не установили пароль, инструкции в этом разделе показывают, как установить пароль сервера базы данных.

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

sudo vi /etc/redis.conf

Прокрутите до разделаSECURITY и найдите прокомментированную директиву, которая гласит:

/etc/redis.conf

# requirepass foobared

Раскомментируйте его, удалив#, и заменитеfoobared на очень надежный пароль по вашему выбору. Вместо того, чтобы придумывать пароль самостоятельно, вы можете использовать такой инструмент, какapg илиpwgen для его создания. Если вы не хотите устанавливать приложение только для генерации пароля, вы можете использовать приведенную ниже команду.

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

echo "digital-ocean" | sha256sum

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

/etc/redis.conf

requirepass password_copied_from_output

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

echo "digital-ocean" | sha1sum

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

sudo systemctl restart redis.service

Чтобы проверить, работает ли пароль, откройте командную строку 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. Тем не менее, обратите внимание, что без SSL или VPN незашифрованный пароль все равно будет виден внешним лицам, если вы подключаетесь к Redis удаленно.

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

[[step-4 -—- renaming-dangerous-commands]] == Шаг 4. Переименование опасных команд

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

  • FLUSHDB

  • FLUSHALL

  • KEYS

  • PEXPIRE

  • DEL

  • CONFIG

  • SHUTDOWN

  • BGREWRITEAOF

  • BGSAVE

  • SAVE

  • SPOP

  • SREM RENAME DEBUG

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

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

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

sudo vi  /etc/redis.conf

[.note] #NOTE: Это примеры. Вам следует отключить или переименовать те команды, которые имеют для вас смысл. Вы можете сами проверить команды и определить, как они могут быть использованы неправильно наredis.io/commands.
#

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

/etc/redis.conf

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

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

/etc/redis.conf

rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

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

sudo service redis-server restart

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

redis-cli

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

auth your_redis_password
OutputOK

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

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

Вызов переименованной команды должен быть успешным (без учета регистра):

asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"

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

exit

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

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

Когда вы используете AOF и имеете дело с установкой master-slave, обдумайте этот ответ на странице проекта GitHub. Ниже приводится ответ на вопрос автора:

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

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

[[step-5 -—- setting-data-directory-owner-and-file-permissions]] == Шаг 5 - Установка прав собственности на каталог данных и прав доступа к файлам

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

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

ls -l /var/lib | grep redis
Outputdrwxr-xr-x 2 redis   redis   4096 Aug  6 09:32 redis

Вы можете видеть, что каталог данных Redis принадлежит пользователюredis, а вторичный доступ предоставлен группеredis. Этот параметр владения является безопасным, но разрешения папки (которые установлены на 755) - нет. Чтобы гарантировать, что только пользователь Redis имеет доступ к папке и ее содержимому, измените настройку разрешений на 770:

sudo chmod 770 /var/lib/redis

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

ls -l /etc/redis.conf
Output-rw-r--r-- 1 root root 30176 Jan 14  2014 /etc/redis.conf

Это разрешение (644) доступно для чтения всем. Это создает проблему безопасности, так как файл конфигурации содержит незашифрованный пароль, который вы настроили на шаге 4, а это означает, что нам нужно изменить владельца файла конфигурации и разрешения. В идеале он должен принадлежать пользователюredis, а второстепенное право собственности - группеredis. Для этого выполните следующую команду:

sudo chown redis:redis /etc/redis.conf

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

sudo chmod 660 /etc/redis.conf

Вы можете подтвердить новое право собственности и разрешения, используя:

ls -l /etc/redis.conf
Outputtotal 40
-rw------- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf

Наконец, перезапустите Redis:

sudo service redis-server restart

Поздравляем, ваша установка Redis теперь должна быть более безопасной!

Заключение

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

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

Related