Установка и защита Redis в Centos 7

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

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

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

Требования

1: Установка Redis

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

Установить EPEL можно с помощью yum:

sudo yum install epel-release

Теперь можно установить Redis:

sudo yum install redis -y

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

sudo systemctl start redis.service

Чтобы добавить Redis в автозагрузку, введите команду:

sudo systemctl enable redis

Проверьте состояние Redis:

sudo systemctl status redis.service
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 работает, можно начать его настройку для повышения безопасности.

2: Защита Redis с помощью брандмауэра

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

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

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

sudo vi /etc/redis.conf

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

bind 127.0.0.1

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

bind your_private_ip

Если вы выполнили предварительные требования к мануалу и установили firewalld на свой сервер, и вы не планируете подключаться к Redis с другого хоста, вам не нужно добавлять дополнительные правила брандмауэра для Redis. В конце концов, любой входящий трафик по умолчанию будет сброшен, если его явно не разрешают правила брандмауэра. Поскольку автономная установка сервера Redis по умолчанию прослушивает только интерфейс loopback (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 – эти правила будут применяться к соединению автоматически.

Если вы используете брандмауэр 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: общие правила и команды брандмауэра

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

3: Настройка пароля Redis

Если вы установили Redis с помощью мануала Настройка кластера Redis на CentOS 7, вам необходимо настроить для него пароль.

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

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

sudo vi /etc/redis.conf

Найдите раздел SECURITY и найдите закомментированную директиву:

# requirepass foobared

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

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

echo "help-me" | sha256sum

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

requirepass password_copied_from_output

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

echo "help-me" | sha1sum

Установив пароль, сохраните и закройте файл.

Перезапустите Redis:

sudo systemctl restart redis.service

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

redis-cli

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

set key1 10

Она не сработает, так как для выполнения операции нужен пароль.

(error) NOAUTH Authentication required.

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

auth your_redis_password

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

OK

После этого повторите предыдущую команду, теперь операция будет выполнена успешно:

set key1 10
OK

Эта команда извлечет значение нового ключа:

get key1
"10"

Эта команда закроет redis-cli:

quit

Можно также использовать exit.

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

4: Переименование команд

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

  • FLUSHDB
  • FLUSHALL
  • KEYS
  • PEXPIRE
  • DEL
  • CONFIG
  • SHUTDOWN
  • BGREWRITEAOF
  • BGSAVE
  • SAVE
  • SPOP
  • SREM RENAME DEBUG

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

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

Как и пароль, переименование или отключение команд настраивается в разделе SECURITY файла /etc/redis.conf. Откройте файл:

sudo vi  /etc/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 service redis-server restart

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

redis-cli

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

auth your_redis_password
OK

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

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

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

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

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

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

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

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

5: Права на файлы и каталог данных

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

Чтобы проверить это, используйте grep:

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

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

sudo chmod 770 /var/lib/redis

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

ls -l /etc/redis.conf
-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
total 40
-rw------- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf

Перезапустите Redis:

sudo service redis-server restart

Заключение

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

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

Tags: ,